Page 1 of 2

Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 11:30 am
by Molay
I'm working on a set of scenarios and would like to enable the burner leech [mod] functionality during the playthrough with a research (to make players aware of it in an organic way). How would I go about disabling it when loaded and activating it after a certain research?

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 12:18 pm
by darkfrei
Technology: Recipe unlock: leech inserter.

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 2:08 pm
by Molay
It's that easy? Thank you!

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 3:29 pm
by BlueTemplar
It isn't, because it's not a new dedicated inserter, but instead new functionality for burner inserters ?

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 3:40 pm
by Molay
Yes it's a new functionality for an existing entity. I haven't had a chance yet to test it.

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 3:48 pm
by darkfrei
I mean that you need to add new leech inserter on data stage and unlock it as the technology effect.

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 3:58 pm
by AmatorPhasma
Its not that easy, you can't use the build-in function:
https://lua-api.factorio.com/latest/Lua ... rner_leech
it's read only and can only be set in the data stage.

And to todo it with a own script is not that easy, you can look into my script, this also clears the burnt-fuel-inventroy from machines.
"Disclaimer: this script is not the nicest code :D"

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 5:05 pm
by BlueTemplar
darkfrei wrote: Mon Jan 27, 2020 3:48 pm I mean that you need to add new leech inserter on data stage and unlock it as the technology effect.
This would also work poorly with mods adding other burner inserters or those that convert electric inserter to burner ones ?

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 7:01 pm
by darkfrei
BlueTemplar wrote: Mon Jan 27, 2020 5:05 pm
darkfrei wrote: Mon Jan 27, 2020 3:48 pm I mean that you need to add new leech inserter on data stage and unlock it as the technology effect.
This would also work poorly with mods adding other burner inserters or those that convert electric inserter to burner ones ?
Change them as you want.

Code: Select all

for inserter_name, inserter_prototype in pairs (data.raw.inserter) do
  -- do what you want, for example
  inserter_prototype.allow_burner_leech = true
end
Another solution: enable them if they are fuel leeches. Look through all inserter and this list can be used by technology effects.

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 8:06 pm
by Molay
Thank you so much darkfrei! I'm still in the process to getting accustomed to LUA and factorio modding and this has been most helpful. I really want a campaign so I'll have to learn a lot ;) lovely to have such a helpful community around!

Cheers guys

Re: Help: Activating burner leech via research

Posted: Mon Jan 27, 2020 10:20 pm
by Honktown
You can write a control script that does a lot of things when the tech is researched. I don't know how to convert entities doing stuff, but you could create a duplicate inserter in the data phase. When the research finishes, convert all the specific inserters on all surfaces, and then enable a conversion when a player or robot builds it. Not sure how it works with blueprints, but the mining result of the new inserter can be the old one, since it is on building it is changed.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 12:06 am
by BlueTemplar
darkfrei wrote: Mon Jan 27, 2020 7:01 pm
BlueTemplar wrote: Mon Jan 27, 2020 5:05 pm
darkfrei wrote: Mon Jan 27, 2020 3:48 pm I mean that you need to add new leech inserter on data stage and unlock it as the technology effect.
This would also work poorly with mods adding other burner inserters or those that convert electric inserter to burner ones ?
Change them as you want.

Code: Select all

for inserter_name, inserter_prototype in pairs (data.raw.inserter) do
  -- do what you want, for example
  inserter_prototype.allow_burner_leech = true
end
Another solution: enable them if they are fuel leeches. Look through all inserter and this list can be used by technology effects.
AFAIK, both Burner Leech and InserterFuelLeech do quite a bit more than just inserter_prototype.allow_burner_leech ? Could not it get complicated, fast ?

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 6:25 am
by darkfrei
BlueTemplar wrote: Tue Jan 28, 2020 12:06 am AFAIK, both Burner Leech and InserterFuelLeech do quite a bit more than just inserter_prototype.allow_burner_leech ? Could not it get complicated, fast ?
The Inserter Fuel Leech is the fork of Klonan's mod, all stuff is done via the script.

The Burner Leech has both parts, but my opinion is, that the C++ side (vanilla Factorio engine) is enough. I haven't tested it before.

So it must be enough to set inserter_prototype.allow_burner_leech = true in data stage and it works as expected.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 12:40 pm
by BlueTemplar
Zaflis wrote:
kingarthur wrote:all the leech function does is allow a burner inserter to take fuel out of a assembler/furnace to feed its self if its set to pull items out from that entity
But it will only ever pull fuel from the input side of inserter. If it puts in an assembler that already has coal in, it can't take it out.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 1:16 pm
by eradicator
Summary:

1) data-final-fixes method:
Make a copy of every fucking inserter. In on_research_finished replace every fucking normal inserter in the entire world with it's leech-enabled version. Edit: Oh, and replace all assembler recipes and all inserter items in the world, or try and fail to monitor every fucking on_built event.
Benefit: No on_tick UPS cost, relatively low moderate maintenance cost.
Drawback: Huge UPS spike when replacing (not as bad if the scenario only allows small factories), can't be done in pure control.lua.

2) scripted leech method:
Hope that none of the inserters have have leech enabled in the prototype. Dis/Enable the script as you like.
Benefit: Allows clean dis/enabled in pure control.lua.
Drawback: Scripts have a continous UPS cost and are more prone to bugs. If the licenses allows to steal someone elses code it might not be too bad. And if the scenario implies that burners are not used in huge quantities (early-game-only) the UPS cost might be negligible.

3) fake method:
Add a technology with an empty effect that describes the leech-effect but doesn't actually change anything. This would make the player *aware* of the leech feature.
Benefit: Trivial to implement and maintain.
Drawback: Players can use leech without the technology if they know how to do it.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 2:28 pm
by Honktown
eradicator wrote: Tue Jan 28, 2020 1:16 pm Summary:

1) data-final-fixes method:
Make a copy of every fucking inserter. In on_research_finished replace every fucking normal inserter in the entire world with it's leech-enabled version. Edit: Oh, and replace all assembler recipes and all inserter items in the world, or try and fail to monitor every fucking on_built event.
Benefit: No on_tick UPS cost, relatively low moderate maintenance cost.
Drawback: Huge UPS spike when replacing (not as bad if the scenario only allows small factories), can't be done in pure control.lua.

2) scripted leech method:
Hope that none of the inserters have have leech enabled in the prototype. Dis/Enable the script as you like.
Benefit: Allows clean dis/enabled in pure control.lua.
Drawback: Scripts have a continous UPS cost and are more prone to bugs. If the licenses allows to steal someone elses code it might not be too bad. And if the scenario implies that burners are not used in huge quantities (early-game-only) the UPS cost might be negligible.

3) fake method:
Add a technology with an empty effect that describes the leech-effect but doesn't actually change anything. This would make the player *aware* of the leech feature.
Benefit: Trivial to implement and maintain.
Drawback: Players can use leech without the technology if they know how to do it.
1) The entity replacements can be spread out. Find all inserters on the surfaces, divide by s seconds * 60 ticks, and only replace n inserters per tick. Benefit: to find the number of replaceable inserters, you also have the entity table, and only need to find_entities_filtered on the first tick. If there's more than one kind of inserter, you can spread out that, too. You don't have to replace the recipes nor items, because inserters can be changed on placement/mining (the mining result is static in prototypes, on placement would be control events), they do not need to be changed in inventory(s). Only drawback I see is blueprinting.

2) Haha no. That would be such a massive UPS overhead.

3) I'm trying to think of a better way to restrict an inserter but I can't think of any.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 2:30 pm
by darkfrei
4) partially [1], but the technology unlocks the recipe to convert normal inserters into leeches.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 3:38 pm
by Honktown
darkfrei wrote: Tue Jan 28, 2020 2:30 pm 4) partially [1], but the technology unlocks the recipe to convert normal inserters into leeches.
That's... not a bad idea. The recipe could take .5 seconds and cost nothing, and would be available via upgrade planner and completely bypass blueprinting issues.

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 6:25 pm
by eradicator
darkfrei wrote: Tue Jan 28, 2020 2:30 pm 4) partially [1], but the technology unlocks the recipe to convert normal inserters into leeches.
Congratualtions. 1 was the ugliest option for the programmer. You managed to make it the ugliest option for the player instead :twisted: .

Re: Help: Activating burner leech via research

Posted: Tue Jan 28, 2020 6:54 pm
by darkfrei
Honktown wrote: Tue Jan 28, 2020 3:38 pm
darkfrei wrote: Tue Jan 28, 2020 2:30 pm 4) partially [1], but the technology unlocks the recipe to convert normal inserters into leeches.
That's... not a bad idea. The recipe could take .5 seconds and cost nothing, and would be available via upgrade planner and completely bypass blueprinting issues.
The code wasn't tested, but must be clear. We made the technology and then going through all inserters. If the inserter is not leech, then we made new leech inserter, new recipe to convert old inserter into the new one, then adding this recipe to the technology effects.

Code: Select all

local prototypes = {}

local new_technology = {
    type = "technology",
    name = "leech-inserters",
    icon_size = 128,
    icon = "__new_mod_name__/graphics/technology/leech-inserters.png", -- picture 128x128
    enabled = false, 
    effects = {},
    unit.count = 8,
    unit.ingredients = {{"automation-science-pack", 1}},
    unit.time = 1,
    order = "li-a", 
  }

for inserter_name, inserter_prototype in pairs (data.raw.inserter) do
  if not (inserter_prototype.allow_burner_leech) then
    --create new prototype!
    local new_inserter_prototype = table.deepcopy (inserter_prototype)
    local new_inserter_name = 'leech-' .. inserter_name
    new_inserter_prototype.name = new_inserter_name
    new_inserter_prototype.minable = {mining_time = 0.1, result = new_inserter_name} 
    new_inserter_prototype.allow_burner_leech = true
    table.insert (prototypes, new_inserter_prototype)
    
    -- recipe for it
    local new_recipe = {
        type = 'recipe',
        name = new_inserter_name,
        ingredients = {{inserter_name, 1}},
        result = new_inserter_name
      }
     table.insert (prototypes, new_recipe)
     
     -- add them to the technology effect
     table.insert(new_technology.effects, {type = "unlock-recipe", recipe = new_inserter_name})
  end
end

if #prototypes > 1 then -- vanilla cannot be extended with empty table; you don't need the technology without effects
  table.insert (prototypes, new_technology)
  data:extend (prototypes)
end