How Do I Delete a Recipe or Item From Vanilla?
-
- Inserter
- Posts: 23
- Joined: Thu Jan 22, 2015 8:22 pm
- Contact:
How Do I Delete a Recipe or Item From Vanilla?
If I wanted to completely remove the stone furnace from the game through a mod how would I go about doing that? Is it possible?
Re: How Do I Delete a Recipe or Item From Vanilla?
Sure it's possible, for the entity use
data.raw is where the prototypes are stored after data:extend is done. furnace is the type of the prototype and ["stone-furnace"] is the name of the prototype, of course you'd need to do something similar for any recipes and any technologies that may reference it. And either hope that no mods expect it to exist, don't use those mods, or use a for loop to check every recipe and tech and remove references (of course that only works if your mod is loaded AFTER all of the mods that might reference the stone-furnace). AND when it comes to their control.lua referencing it you'd have to manually find that code and remove it, or again, not use that mod
Honestly, I don't recommend it but, it IS possible.
Code: Select all
data.raw.furnace["stone-furnace"] = nil
Honestly, I don't recommend it but, it IS possible.
<I'm really not active any more so these may not be up to date>
~FreeER=Factorio Modding
- Factorio Wiki
- My Factorio Modding Guide
- Wiki Modding Guide
Feel free to pm me
Or drop into #factorio on irc.esper.net
~FreeER=Factorio Modding
- Factorio Wiki
- My Factorio Modding Guide
- Wiki Modding Guide
Feel free to pm me
Or drop into #factorio on irc.esper.net
-
- Inserter
- Posts: 23
- Joined: Thu Jan 22, 2015 8:22 pm
- Contact:
Re: How Do I Delete a Recipe or Item From Vanilla?
I like to tinker and I was thinking about bringing the game back to bare bones as far as crafting was concerned (no craftables), so I could personalize a tech tree. Sometimes I find modding more fun than playing. While I am generally good at doing the easy stuff like writing new objects, etc, I don't really know any LUA so thanks for the help, much appreciated .
PS - I just realized you are the guy that wrote the really helpful step-by-step on modding, you're a legend .
PS - I just realized you are the guy that wrote the really helpful step-by-step on modding, you're a legend .
-
- Inserter
- Posts: 23
- Joined: Thu Jan 22, 2015 8:22 pm
- Contact:
Re: How Do I Delete a Recipe or Item From Vanilla?
I attempted this and it won't recognize stone.furnace?FreeER wrote:Sure it's possible, for the entity usedata.raw is where the prototypes are stored after data:extend is done. furnace is the type of the prototype and ["stone-furnace"] is the name of the prototype, of course you'd need to do something similar for any recipes and any technologies that may reference it. And either hope that no mods expect it to exist, don't use those mods, or use a for loop to check every recipe and tech and remove references (of course that only works if your mod is loaded AFTER all of the mods that might reference the stone-furnace). AND when it comes to their control.lua referencing it you'd have to manually find that code and remove it, or again, not use that modCode: Select all
data.raw.furnace["stone-furnace"] = nil
Honestly, I don't recommend it but, it IS possible.
Re: How Do I Delete a Recipe or Item From Vanilla?
You can simply disable recipe so noone will be able create it, try
Code: Select all
data.raw.recipe["stone-furnace"].enabled = false
Re: How Do I Delete a Recipe or Item From Vanilla?
"stone.furnace"? not sure where you got that fromTheLastRonin wrote:I attempted this and it won't recognize stone.furnace?
the entity would be data.raw.furnace["stone-furnace"], the recipe would be data.raw.recipe["stone-furnace"] and the item would be data.raw.item["stone-furnace"]
remember data.raw["the_type"]["the_name"], if the_type or the_name don't have spaces or '-' (etc.) then you can use the '.' syntax (like data.raw) instead of the [""] bracket syntax.
If you want more specific help with your code then please add the exact code as well
This would work for the stone-furnace since it's enabled by default, but to do it for other items that ARE unlocked you'd either need to do so in-game with control.lua after the onresearchfinished event (and checking if that researched unlocked something you want removed, also using game.players[1].force.recipes[name].disabled = true, assuming player 1 always exists, if not then using a loop to get a player) or remove those items from the technology prototype during loading like shown below.Kexík wrote:You can simply disable recipe so noone will be able create it
Code: Select all
-- noted untested
removed_items = {"item_name_1", "item_name_2"} -- list of all item/fluid names to be removed
disabled_recipes = {} -- table to store name of disabled recipes in, for technologies
-- this loop handles disabling recipes that have ingredients in the removed_items table
for name, recipe in pairs(data.raw.recipe) do
if recipe.result then
for _, removeName in ipairs(removed_items) do
if recipe.result == removeName then
recipe.enabled = false
disabled_recipes[name] = name -- remember that we disabled this one
end
end
elseif recipe.results then
for ingredientIndex, ingredient in pairs(recipe.results) do
for _, removeName in ipairs(removed_items) do
-- fluids will be indexed by name, items typically by numeric index
if (ingredient.name and ingredient.name == removeName) or (ingredient[1] and ingredient[1] == removeName ) then
recipe.enabled = false
disabled_recipes[name] = name -- remember that we disabled this one
-- you might want to be more generous here and simply set
-- recipe.results[ingredientIndex] = nil
-- though, in that case there should probably be a check after
-- the loop for if #recipe.results == 0 then disable the recipe
-- if that caused any issues you'd likely need to loop over
-- recipe.results backwards and use table.remove like I do below
-- though I wouldn't expect it to cause issues, I'm not 100% certain
end
end
end
end
end
for name, technology in pairs(data.raw.technology) do
if technology.effects then -- if there is an effects table, most do, not all
-- loop through effects table backwards, since indexes are numeric
-- and we will be deleting things the indexes would change
-- though if nils are ignored, as I would expect, then that could be
-- done here instead, just wanted it this way for reference mainly
-- fyi, table = {}; table[1] = nil; results in #table == 1
-- whereas table = {}; table['something'] = nil; results in #table == 0
for index=#technology.effects,1,-1 do
local effect = technology.effects[index]
if effect.type == "unlock_recipe" then
if disabled_recipes[effect.recipe] then -- we disabled this recipe
table.remove(technology.effects, index) -- remove it from the table
end
end
end
end
end
-
- Filter Inserter
- Posts: 358
- Joined: Fri Jul 25, 2014 2:53 pm
- Contact:
Re: How Do I Delete a Recipe or Item From Vanilla?
completely removing the stone furnace has some complications though, the burner miner requires it so that will throw an error.
Check out my mods
Re: How Do I Delete a Recipe or Item From Vanilla?
um, cartmen180 did you read my reply? I mean it is the first reply so it isn't like it was hard to see, but it certainly seems like you didn't becausecartmen180 wrote:completely removing the stone furnace has some complications though, the burner miner requires it so that will throw an error.
And then there's the fact that the later posts mentioned simply disabling the recipe (and I provided some relatively decent code for something along those lines). Not that I'm trying to be rude here, but your post wouldn't have been particularly helpful even if no one else had posted (no possible solutions or ways to avoid it) and with the posts that are already here, well kind of just seems like you didn't care enough about helping to even see what has been suggested already.FreeER wrote:...of course you'd need to do something similar for any recipes and any technologies that may reference it. ...
well, that's nice to hear Oh, wait, I should be humble and slightly embarrassed at being 'recognized' right? uh, yeah. thanks...TheLastRonin wrote:PS - I just realized you are the guy that wrote the really helpful step-by-step on modding, you're a legend .
I still need to get that updated though, haven't had the time to really figure out how to redo the graphics for it though.
-
- Filter Inserter
- Posts: 358
- Joined: Fri Jul 25, 2014 2:53 pm
- Contact:
Re: How Do I Delete a Recipe or Item From Vanilla?
i simply read over it as i am using a small phone to catch up on some topics here. As i didn't see that particular bit of information i thought it worth mentioning.
As the op said it wants to completely remove the stone-furnace from the game, simply disabling the recipe is not the solution to his request.
As the op said it wants to completely remove the stone-furnace from the game, simply disabling the recipe is not the solution to his request.
Check out my mods
Re: How Do I Delete a Recipe or Item From Vanilla?
Understandable, though I personally would have waited until I could give a more detailed response about how to accomplish the goal rather than just one difficulty in doing socartmen180 wrote:i simply read over it as i am using a small phone to catch up on some topics here. As i didn't see that particular bit of information i thought it worth mentioning.
True, and my first post covered the step needed for individual items (though not a nice way to loop through and do it automatically for multiple), however the code provided for disabling recipes could be modified to delete items as well as recipes/techs without much trouble (assuming basic understanding of Lua, or someone with that understanding willing to help. And that I didn't make any mistakes writing it since it's untested lol).cartmen180 wrote:As the op said it wants to completely remove the stone-furnace from the game, simply disabling the recipe is not the solution to his request.
Re: How Do I Delete a Recipe or Item From Vanilla?
Not sure if someone of you is looking for this, but I have found out how to remove an ingredient from a recipe.
Tested with 0.16.x.
For example we have in vanilla
The command
Would remove the first ingredient in the list of ingredients, so in this example "piercing-rounds-magazine".
Meanwhile
Removes "grenade" and so on.
Now I am trying to figure out how to reduce the amount of items in a recipe, e.g. the "copper-cable" in
EDIT: a trick workaround could be to remove the ingredient and then add it with other amount:
Tested with 0.16.x.
For example we have in vanilla
Code: Select all
{
type = "recipe",
name = "military-science-pack",
enabled = false,
energy_required = 10,
ingredients =
{
{"piercing-rounds-magazine", 1},
{"grenade", 1},
{"gun-turret", 1}
},
result_count = 2,
result = "military-science-pack"
}
Code: Select all
table.remove(data.raw["recipe"]["military-science-pack"].ingredients,1);
Meanwhile
Code: Select all
table.remove(data.raw["recipe"]["military-science-pack"].ingredients,2);
Now I am trying to figure out how to reduce the amount of items in a recipe, e.g. the "copper-cable" in
Code: Select all
{
type = "recipe",
name = "high-tech-science-pack",
enabled = false,
energy_required = 14,
ingredients =
{
{"battery", 1},
{"processing-unit", 3},
{"speed-module", 1},
{"copper-cable", 30}
},
result_count = 2,
result = "high-tech-science-pack"
}
Code: Select all
table.remove(data.raw["recipe"]["high-tech-science-pack"].ingredients,4);
table.insert(data.raw["recipe"]["high-tech-science-pack"].ingredients,{"copper-cable", 1});
Re: How Do I Delete a Recipe or Item From Vanilla?
Well, I haven't messed with Factorio in a long time now but, it should just be a lua table.Now I am trying to figure out how to reduce the amount of items in a recipe
So data.raw["recipe"]["high-tech-science-pack"].ingredients is the table
Code: Select all
{
{"battery", 1}, -- index 1
{"processing-unit", 3}, -- index 2
{"speed-module", 1}, -- index 3
{"copper-cable", 30} -- index 4
}
Code: Select all
{"copper-cable", 30}
so data.raw["recipe"]["high-tech-science-pack"].ingredients[4][2] would be the number 30 and you should be able to just change that to whatever you wanted.
For robustness however you may not want to use the index 4 to select the copper-cable, since if the order got shifted around then you'd be changing the wrong item count or if some mod removed an item then it wouldn't be at index 4 (there may not even be 4 ingredients). Instead you'd want to loop over the ingredients table and look for one who's first element (the name) matches what you care about.
Code: Select all
local ingredients = data.raw["recipe"]["high-tech-science-pack"].ingredients
local tofind = "copper-cable"
for k,v in ipairs(ingredients) do
if v[1] == tofind then
v[2] = 5 -- or whatever value you want
break
end
end
Code: Select all
local function changeRecipeIngredientCount(recipeName, ingedientName, newCount, isMultiplier, suppressError)
local recipe = data.raw["recipe"][recipeName]
if not recipe then if suppressError then return false else error("Failed to find recipe for " .. recipeName, 2) end end
for k,v in ipairs(recipe.ingredients) do
if v[1] == ingredientName then
if isMultiplier then v[2] = v[2] * newCount
else v[2] = newCount end
return true -- don't check the rest and return success
end
end
end
-- nice names instead of just true/false
local DoMultiplyCount = true
local SetNewValue = false
-- example
changeRecipeIngredientCount('high-tech-science-pack", "copper-cable", 5)
changeRecipeIngredientCount('high-tech-science-pack", "copper-cable", 10, SetNewValue) -- alternative
changeRecipeIngredientCount('high-tech-science-pack", "battery", 10, DoMultiplyCount) -- multiply battery count by 10
changeRecipeIngredientCount('high-tech-science-pack", "battery", 1/5, DoMultiplyCount) -- divide count by 5 aka multiply by 1/5
and yeah, removing the element and readding it would work, but it may also change the order (so hopefully there's no other mods with code that depend on the order of things...)