Get specific ingredient amount from a recipe

Place to get help with not working mods / modding interface.
kingarthur
Smart Inserter
Smart Inserter
Posts: 1463
Joined: Sun Jun 15, 2014 11:39 am
Contact:

Get specific ingredient amount from a recipe

Post by kingarthur »

is there anyway to get the amount value for a specific item from a recipes list of ingredients. what im trying to do is get the amount value for sulfuric acid in a list of recipes that have sulfuric acid as an ingredient so i can multiply that value by 3.

Code: Select all

if settings.startup["pymods-acid-increase"].value then

recipes = {'concrete-richclay'}

for i, recipename in ipairs(recipes) do
	
	Oldamount = data.raw["recipe"][recipename].ingredients["sulfuric-acid"]["amount"]
	
	OV.patch_recipes({
	{
	name = recipename, ingredients = 
		{
			{
			name = "sulfuric-acid", type = "fluid", amount = 150 <--this needs to be a variable
			--data.raw["recipe"][recipename].ingredients[1] = {"sulfuric-acid", 5 * 3}
			}
		}
	}
	
	})
	end
	
end
the for loop works when i set the amount by hand. i want to be able to get the old value multiply by 3 and set that as the amount.
User avatar
darkfrei
Smart Inserter
Smart Inserter
Posts: 2905
Joined: Thu Nov 20, 2014 11:11 pm
Contact:

Re: Get specific ingredient amount from a recipe

Post by darkfrei »

You are need this function (not tested):

Code: Select all

function dif_recipe_handler (dif_recipe_prototype, item_name, factor)
  local ingredients = dif_recipe_prototype.ingredients
  for i, ingredient in pairs(ingredients) do
    if ingredient.name and ingredient.name == item_name and ingredient.type == 'item' and ingredient.count then
      ingredients[i].count = ingredient.count * factor
    end
    if ingredient[1] and ingredient[1] == item_name and ingredient[2] then
      ingredients[i][2] = ingredient[2] * factor
    end
  end
end
And you can call this function like there (not tested):

Code: Select all

local recipes_list = {'concrete-richclay'}
local items_list = {'sulfuric-acid'}
local factor = 3

for i, recipe_name in pairs (recipes_list) do
  if data.raw.recipe[recipe_name] then
    local recipe_prototype = data.raw.recipe[recipe_name]
    for j, item_name in pairs (items_list) do
      -- normal
      if recipe_prototype.normal and recipe_prototype.normal.ingredients then
        dif_recipe_handler (recipe_prototype.normal, item_name, factor)
      end
      -- expensive
      if recipe_prototype.expensive and recipe_prototype.expensive.ingredients then
        dif_recipe_handler (recipe_prototype.expensive, item_name, factor)
      end
      -- standard
      if recipe_prototype.ingredients then
        dif_recipe_handler (recipe_prototype, item_name, factor)
      end
    end
  end
end
kingarthur
Smart Inserter
Smart Inserter
Posts: 1463
Joined: Sun Jun 15, 2014 11:39 am
Contact:

Re: Get specific ingredient amount from a recipe

Post by kingarthur »

so i wasnt able to get all that to work. but i spent far longer than i proably should have working it over and got a working solution out of it.

Code: Select all

local OV = angelsmods.functions.OV

if settings.startup["pymods-acid-increase"].value then

local recipes_list = {'concrete-richclay','heavy-oleo','oleo-heavy','explosive-glycerol'}
local items_list = {'sulfuric-acid'}
local factor = 3

for i, recipe_name in ipairs(recipes_list) do
	
	local ingredients = data.raw.recipe[recipe_name].ingredients
	for k, ingredient in ipairs(ingredients) do
	for j, item_name in ipairs(items_list) do
	if ingredient.name == item_name then
	
	OV.patch_recipes({
	{
	name = recipe_name, ingredients = 
		{
			{
			name = "sulfuric-acid", type = "fluid", amount = ingredient.amount * factor
			--data.raw.recipe[recipe_name].ingredients[2].amount * factor
			
			}
		}
	}
	
	})
	end
	end
	end
	end
end
User avatar
Arch666Angel
Smart Inserter
Smart Inserter
Posts: 1636
Joined: Sun Oct 18, 2015 11:52 am
Contact:

Re: Get specific ingredient amount from a recipe

Post by Arch666Angel »

Depending on if you want it hardcoded or more dynamic, the recipe builder supports adding values to existing recipe ingredients:

Code: Select all

   OV.patch_recipes({
   {
   name = recipe_name, ingredients = 
      {
         {
         name = "sulfuric-acid", type = "fluid", amount = +value
         },
      }
   }
   })
kingarthur
Smart Inserter
Smart Inserter
Posts: 1463
Joined: Sun Jun 15, 2014 11:39 am
Contact:

Re: Get specific ingredient amount from a recipe

Post by kingarthur »

Arch666Angel wrote:Depending on if you want it hardcoded or more dynamic, the recipe builder supports adding values to existing recipe ingredients:

Code: Select all

   OV.patch_recipes({
   {
   name = recipe_name, ingredients = 
      {
         {
         name = "sulfuric-acid", type = "fluid", amount = +value
         },
      }
   }
   })
ya i got that to work just fine and hard set a value. i could have just hardcoded it but i didnt want to have to figure out the values for the 1 or 2 dozen recipes i needed to adjust for even though im pretty sure i spent more time getting this to work then just doing that would have taken to just update pymods sulfuric acid amounts by hand
Post Reply

Return to “Modding help”