cannot read recipe subgroup from data.raw
-
- Inserter
- Posts: 23
- Joined: Fri Jun 14, 2024 12:33 am
- Contact:
cannot read recipe subgroup from data.raw
I'm trying to copy recipes in data-final-fixes.lua, and I need to be able to read the subgroup. None of the recipes in data.raw["recipe"] have the subgroup member present. If I deepcopy a recipe, it still has the original subgroup. I can change the subgroup, but i need to be able to modify the subgroup based on the original name.
Re: cannot read recipe subgroup from data.raw
I think I can help you, but I don't understand the explanation.
Can you give me a code or before and after data?
Can you give me a code or before and after data?
Solo entiendo español, pero si tu también lo entiendes, escríbeme


Everything i write in English is translated by Deepl.

-
- Inserter
- Posts: 23
- Joined: Fri Jun 14, 2024 12:33 am
- Contact:
Re: cannot read recipe subgroup from data.raw
Code: Select all
local function process_recipe(name, recipe)
if not recipe.results or next(recipe.results) == nil then return end
if ends_with(name,"_rcomb") then return end
local new_recipe=table.deepcopy(recipe)
new_recipe.name=new_recipe.name.."_rcomb"
new_recipe.hide_from_signal_gui = false
new_recipe.show_amount_in_title = true
local sg = new_recipe.subgroup
-- SG is nil here
new_recipe.subgroup="recipe-subgroup"
--but i can assign it here.
new_recipe.localised_name=recipe.name
data.raw.recipe[name.."_rcomb"]=new_recipe
Re: cannot read recipe subgroup from data.raw
I don't see any error in your code, I think you are missing information.
I suggest changing this line
Code: Select all
new_recipe.localised_name=recipe.name
Code: Select all
new_recipe.localised_name={recipe.name}
--------------------------------------------------------------------------------------
I think your problem is that you have not created the subgroup.
The following is an example of the code to create a sub-group
Code: Select all
data:extend({
{
[ 'type' ] = 'item-subgroup',
[ 'name' ] = 'recipe-subgroup',
[ 'group' ] = 'logistics',
[ 'order' ] = 'a'
}
})
The following is an example of the code of a group
Code: Select all
{
[ 'type' ] = 'item-group',
[ 'name' ] = 'logistics',
[ 'order' ] = 'a',
[ 'icon' ] = '__base__/graphics/item-group/logistics.png',
[ 'icon_size' ] = 128
}
Code: Select all
data.raw["item-group"]
data.raw["item-subgroup"]
I hope I've been helpful, and if not, I'll look forward to hearing from you.
Solo entiendo español, pero si tu también lo entiendes, escríbeme


Everything i write in English is translated by Deepl.

-
- Inserter
- Posts: 23
- Joined: Fri Jun 14, 2024 12:33 am
- Contact:
Re: cannot read recipe subgroup from data.raw
I've created a group and subgroup for my new recipes. I don't have any problem assigning them into that subgroup. The problem though, is that i want to create similarly named subgroups inside my group as the original recipe. However, i can't figure out how to get the original subgroup from the old recipe.
Putting the recipe name in brackets doesn't work, i get unknown key errors
trying
works for some recipes, but not all of them.
Putting the recipe name in brackets doesn't work, i get unknown key errors
trying
Code: Select all
new_recipe.localised_name={"recipe-name."..recipe.name}
Re: cannot read recipe subgroup from data.raw
Is this code complete because a final "end" is missing, whatever.scruffyvoltherder wrote: Fri May 16, 2025 12:48 amCode: Select all
local function process_recipe(name, recipe) if not recipe.results or next(recipe.results) == nil then return end if ends_with(name,"_rcomb") then return end local new_recipe=table.deepcopy(recipe) new_recipe.name=new_recipe.name.."_rcomb" new_recipe.hide_from_signal_gui = false new_recipe.show_amount_in_title = true local sg = new_recipe.subgroup -- SG is nil here new_recipe.subgroup="recipe-subgroup" --but i can assign it here. new_recipe.localised_name=recipe.name data.raw.recipe[name.."_rcomb"]=new_recipe
Some of recipe name is based on the product.
With your function, is your recipe fully functional or what is missing ? Only subgroup ? Did you see recipe in game ?
-
- Inserter
- Posts: 23
- Joined: Fri Jun 14, 2024 12:33 am
- Contact:
Re: cannot read recipe subgroup from data.raw
Yes, they do show up in-game. right now i'm just adding the copied recipes into a subgroup called "recipe-subgroup". What i want to do is create subgroups based on the original recipe's subgroup.
for example, if the original recipe had the "circuit-network" subgroup, i want the copied recipe to have the subgroup "circuit-network-rcomb". all of the rcomb recipes are going to sit in their own tab.
The problem is though, that I cannot read the subgroup from the original recipe. If i were to deepcopy the recipe, and not assign any values to the subgroup member, my copied recipe would end up right next to the original. I don't understand how that information can get transferred from the old recipe to the copy when i do a deepcopy, but cannot be read by my lua script.
deepcopying a recipe gives the new recipe the same subgroup as the old one, but if i try
recipe_subgroup comes back as null, therefore therefore there is no way to derive a name for the subgroup that the new recipe will be in.
for example, if the original recipe had the "circuit-network" subgroup, i want the copied recipe to have the subgroup "circuit-network-rcomb". all of the rcomb recipes are going to sit in their own tab.
The problem is though, that I cannot read the subgroup from the original recipe. If i were to deepcopy the recipe, and not assign any values to the subgroup member, my copied recipe would end up right next to the original. I don't understand how that information can get transferred from the old recipe to the copy when i do a deepcopy, but cannot be read by my lua script.
deepcopying a recipe gives the new recipe the same subgroup as the old one, but if i try
Code: Select all
local recipe_subgroup = recipe.subgroup
local new_recipe_subgroup=recipe_subgroup.."-rcomb"
--check if subgroup for new recipe exists already
--create new subgroup if not
new_recipe.subgroup=new_recipe_subgroup
Re: cannot read recipe subgroup from data.raw
According to your code If recipe_subgroup comes back as nil, you get an error because concatenate nil and string is not possible.(Line 2)
If you get an error when loading, send us the error if it pass can you send us the newly named subgroup
Copying with deepcopy copy all the table, there is no reason you can't access the subgroup or comes back as nil (if it exists)
If you get an error when loading, send us the error if it pass can you send us the newly named subgroup
Copying with deepcopy copy all the table, there is no reason you can't access the subgroup or comes back as nil (if it exists)
Re: cannot read recipe subgroup from data.raw
If you really want to create a new tab (next to the vanilla tabs "Logistics", "Production", "Intermediate products", "Combat"), you don't need an ItemSubGroup, but an ItemGroup. Subgroups are the rows within a tab.scruffyvoltherder wrote: Wed Jun 11, 2025 1:39 am for example, if the original recipe had the "circuit-network" subgroup, i want the copied recipe to have the subgroup "circuit-network-rcomb". all of the rcomb recipes are going to sit in their own tab.
ItemGroup::order determines the position of your tab. ItemSubGroup::order determines the order within a tab (affects the row where the recipe will be listed). RecipePrototype::order affects the order of recipes within a row.
To create a new tab, you must create a new group:
Code: Select all
data:extend({
{
type = "item-group",
name = "my-new-group",
icons = { }, -- Insert your icon for the tab here!
localised_name = {"item-group-name.my-new-group"}, -- Add to locale file!
localised_description = {"item-group-description.my-new-group"},
order = "zzzz" -- Add new tab towards the end
}
})
Code: Select all
data:extend({
-- Create as many subgroups as you need!
{
type = "item-subgroup",
name = "my-subgroup-a",
group = "my-new-group", -- Must be the same for all subgroups in the same tab!
order = "order string" -- Lexical order of string determines row within this tab
}
})
As you've already noticed, RecipePrototype::subgroup may not be set. Notably, this is true for vanilla recipes: (You can open the prototype GUI by hovering the cursor over a recipe icon and using the key combination set in "Settings --> Controls --> Debug --> Open prototype explorer GUI".)
What to do in this case? Well, there already is a hint: the prototype for subgroups is called "ItemSubGroup", not "RecipeSubGroup"! So if you have a recipe that doesn't define a subgroup, its subgroup will be derived from whatever is produced by the recipe (see RecipePrototype::results). If a recipe has >1 results, the subgroup will be derived from what is set as RecipePrototype::main_product.
So to determine the subgroup of a recipe, you should:
- Use recipe.subgroup, if available. This will be set if the recipe produces nothing!
- No subgroup yet?
- recipe.main_product is set (name of an item or a fluid):
Code: Select all
local result = data.raw.item[recipe.main_product] or data.raw.fluid[recipe.main_product] local use_group = result.subgroup
- recipe.results is set: use subgroup of first result
Code: Select all
local result = recipe.results[1] local use_group = data.raw[result.type][result.name].subgroup
- recipe.main_product is set (name of an item or a fluid):
A good mod deserves a good changelog. Here's a tutorial (WIP) about Factorio's way too strict changelog syntax!