Page 1 of 1

Remove items with mod

Posted: Wed Sep 14, 2016 4:26 am
by iggyboo
I was wanting to write a quick mod for multiplayer games to remove weapons that can damage other players or items. Turrets would stay so there could be some defence. I've found all over the place where I can add items and recipes, but can't seem to find a way to remove a core item. Not from research, just so players can't go around shooting or blowing each other up. Did I just miss something obvious? Otherwise, maybe I could just change them so they can't use them the same way? Thanks for any help in advance. :)

Re: Remove items with mod

Posted: Wed Sep 14, 2016 5:58 am
by Nexela
To remove something you just nil it..... but Deleting them all might be a bad idea also so lets get rid of all ammo categories :)

probably want to do this in data-final-fixes.lua, Keep in mind this will essentially disable vehicle guns as well as player guns. All that will be left is turrets.

Code: Select all

--The democrats have won! All guns now have mandatory unlockable gun locks that prevent them from being loaded.
for _, gun in pairs(data.raw.gun) do
    gun.attack_parameters.ammo_category = ""
end
This still leaves grenades...

Code: Select all

--whole lotta nothing!
	for i, effect in pairs(data.raw["military-2"].effects) do
		if effect.recipe=="grenade" then data.raw.technology["military-2"].effects[i]=nil end
	end
I will leave you to figure out cluster grenades and poison capsules

Re: Remove items with mod

Posted: Wed Sep 14, 2016 11:25 am
by LuziferSenpai
Nexela wrote:To remove something you just nil it..... but Deleting them all might be a bad idea also so lets get rid of all ammo categories :)

probably want to do this in data-final-fixes.lua, Keep in mind this will essentially disable vehicle guns as well as player guns. All that will be left is turrets.

Code: Select all

--The democrats have won! All guns now have mandatory unlockable gun locks that prevent them from being loaded.
for _, gun in pairs(data.raw.gun) do
    gun.attack_parameters.ammo_category = ""
end
This still leaves grenades...

Code: Select all

--whole lotta nothing!
	for i, effect in pairs(data.raw["military-2"].effects) do
		if effect.recipe=="grenade" then data.raw.technology["military-2"].effects[i]=nil end
	end
I will leave you to figure out cluster grenades and poison capsules
The easy way:

Code: Select all

function remove (nama)
data.raw["item"][nama] = nil
data.raw["recipe"]["nama] = nil
end
Than you only need to remove the Recipe from the Tech.

Re: Remove items with mod

Posted: Wed Sep 14, 2016 12:08 pm
by Adil
LuziferSenpai wrote: The easy way:
Nexela intentionally provided more sophisticated way because this "simplest" one will bite you. Because "only" in "Than you only need to remove the Recipe from the Tech." is actually quite a task.

You've set a couple of items to nil, you're smart, but what happens, when loader encounters another recipe, that references those? Or a technology, that now unlocks unexistent recipe?
We've had this discussion before.

Re: Remove items with mod

Posted: Wed Sep 14, 2016 5:10 pm
by iggyboo
Ah, very nice! I'll try that out tonight and see in how much trouble I can get myself :D

Thanks!

Re: Remove items with mod

Posted: Thu Sep 15, 2016 2:50 am
by iggyboo
Well, I decided to go even simpler:

Code: Select all

for _,gun in pairs(data.raw.gun) do
  gun.attack_parameters.ammo_category = ""
end


for _,projectile in pairs(data.raw.projectile) do
  if projectile.name=="grenade" or projectile.name=="cluster-grenade" or projectile.name=="poison-capsule" then
    projectile.action=nil    
  end
end
Instead of worrying about changing recipes or tech, I just removed the damage completely from them. I figure this would even be more frustrating for trolls. They spend all the time to make it, but they don't even get the satisfaction of seeing it blow up. I loaded a game with this mod and I couldn't shoot any of my weapons and when I tossed a grenade at my factories, "poof", nothing. Very unsatisfying. :)

I wanted to modify the damage only so the explosion would still happen but I just don't quite grasp how to do that. I think I would have to do some type of "insert table" to change that, right? Still learning lua, but I think I'll keep at it.

Thanks for your help!

[edit] Uploaded mod: https://mods.factorio.com/mods/Iggyboo/TrollControl

Re: Remove items with mod

Posted: Thu Sep 15, 2016 6:25 am
by Nexela
I didn't even think about the projectile! Good catch and it is the better way to do.

so I present to you damage free grenades!!!! (there has got to be an easier way to do this!)

Code: Select all

for _,projectile in pairs(data.raw.projectile) do
  for _, action in pairs(projectile.action) do
    if type(action) == "table" then
      if action.type=="area" then
        for _, delivery in pairs(action.action_delivery) do
          if type(delivery) == "table" then
            for _, effects in pairs(delivery) do
              if effects.damage and effects.damage.amount then
                log("damages found for ".. projectile.name)
                effects.damage.amount = 0
              end
            end
          end
        end
      end
    end
  end
end
And Poison (this could be written shorter as it is not guaranteed to catch many mods since I didn't do any loops)

Code: Select all

for _, smoke in pairs(data.raw["smoke-with-trigger"]) do
  if  smoke.action
  and smoke.action.action_delivery
  and smoke.action.action_delivery.target_effects
  and smoke.action.action_delivery.target_effects.action
  and smoke.action.action_delivery.target_effects.action.action_delivery
  and smoke.action.action_delivery.target_effects.action.action_delivery.target_effects
  and smoke.action.action_delivery.target_effects.action.action_delivery.target_effects.damage then
    log ("no poison cloud! ".. smoke.name)
    smoke.action.action_delivery.target_effects.action.action_delivery.target_effects.damage.amount = 0
  end
end

--for just vanilla Could be re-written as 
--data.raw["smoke-with-trigger"]["poison-cloud"].action.action_delivery.target_effects.action.action_delivery.target_effects.damage.amount = 0


Re: Remove items with mod

Posted: Sun Sep 18, 2016 4:38 am
by iggyboo
Ah, I think I see what you did there. That helps me understand how to modify and find values a bit better. Now that I can modify the damage, I'm digging into finding a way to determine a method to see if a player is damaging another player or player created building and then disable that damage. This way I won't have to modify any item at all if I can just block the problem to being with, or, even better, redirect the damage onto the player doing it. :) That, however, seems to be beyond the scope of this post. I'm going to dig around a bit more and see if I can find it. Otherwise I'll post again. Thanks for all your help.