public static void CrafterLogic_IsCraftRecipeFulfilled_Postfix(TechType techType, ref bool __result) { if (__result && GameModeUtils.RequiresIngredients()) { Inventory main = Inventory.main; #if SN1 ITechData techData = CraftData.Get(techType, true); if (techData != null) { int i = 0; int ingredientCount = techData.ingredientCount; while (i < ingredientCount) { IIngredient ingredient = techData.GetIngredient(i); #elif BZ IList <Ingredient> ingredients = TechData.GetIngredients(techType); if (ingredients != null) { int i = 0; int ingredientCount = ingredients.Count; while (i < ingredientCount) { Ingredient ingredient = ingredients[i]; #endif int count = 0; IList <InventoryItem> inventoryItems = main.container.GetItems(ingredient.techType); if (inventoryItems != null) { foreach (InventoryItem inventoryItem in inventoryItems) { if (Main.BatteryCheck(inventoryItem.item)) { count++; } } } if (count < ingredient.amount) { __result = false; return; } i++; } __result = true; return; } __result = false; return; } } } }
public static void CrafterLogic_IsCraftRecipeFulfilled_Postfix(TechType techType, ref bool __result) { if (!__result || !GameModeUtils.RequiresIngredients()) { return; } var main = Inventory.main; #if SN1 var techData = CraftData.Get(techType, true); if (techData != null) { var i = 0; var ingredientCount = techData.ingredientCount; while (i < ingredientCount) { var ingredient = techData.GetIngredient(i); #elif BZ IList <Ingredient> ingredients = TechData.GetIngredients(techType); if (ingredients != null) { var i = 0; var ingredientCount = ingredients.Count; while (i < ingredientCount) { var ingredient = ingredients[i]; #endif var count = 0; var inventoryItems = main.container.GetItems(ingredient.techType); if (inventoryItems != null) { count += inventoryItems.Count(inventoryItem => Main.BatteryCheck(inventoryItem.item)); } if (count < ingredient.amount) { __result = false; return; } i++; } __result = true; return; } __result = false; } } }
public static bool PreGetIngredients(ref Recyclotron __instance, ref List <Ingredient> __result) { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Recyclotron_GetIngredients_Patch executing"); #endif List <Ingredient> ingredients = (List <Ingredient>)RecyclotronIngredients.GetValue(null); if (ingredients == null) { #if !RELEASE Logger.Log(Logger.Level.Error, $"Failed to acquire List ingredients through Reflection"); #endif return(true); } Logger.Log(Logger.Level.Debug, $"List ingredients received through Reflection"); HashSet <TechType> batteryTech = (HashSet <TechType>)RecyclotronBatteryTech.GetValue(null); if (batteryTech == null) { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Failed to acquire HashSet batteryTech through Reflection"); #endif return(true); } Logger.Log(Logger.Level.Debug, $"HashSet batteryTech received through Reflection"); #if !RELEASE Logger.Log(Logger.Level.Debug, $"Reflection values received"); #endif ingredients.Clear(); if (__instance.GetWasteCount() == 1) { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Recyclotron found one item in waste list"); #endif Pickupable pickup = __instance.GetCurrent().inventoryItem.item; GameObject gameObject = pickup.gameObject; if (gameObject) { TechType tt = pickup.GetTechType(); Logger.Log(Logger.Level.Debug, $"Item in waste list has TechType {tt.AsString(false)}"); ReadOnlyCollection <Ingredient> readOnlyCollection = TechData.GetIngredients(tt); if (readOnlyCollection == null) // Try the SMLHelper method instead { #if !RELEASE Logger.Log(Logger.Level.Debug, $"TechData.GetIngredients failed for TechType {tt.AsString(false)}, attempting SMLHelper"); #endif List <Ingredient> ingredientsList = CraftDataHandler.GetRecipeData(tt)?.Ingredients; if (ingredientsList != null) { readOnlyCollection = new ReadOnlyCollection <Ingredient>(ingredientsList); } else { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Failed to get ingredients list for TechType {tt.AsString(false)} using SMLHelper"); #endif } } if (readOnlyCollection != null) { foreach (Ingredient ingredient in readOnlyCollection) { #if !RELEASE Logger.Log(Logger.Level.Debug, $"Processing Ingredients member {ingredient.techType}"); #endif if (!batteryTech.Contains(ingredient.techType)) { ingredients.Add(ingredient); } } } //EnergyMixin component = gameObject.GetComponent<EnergyMixin>(); //if (component) if (gameObject.TryGetComponent <EnergyMixin>(out EnergyMixin component)) { GameObject battery = component.GetBatteryGameObject(); if (battery) { ingredients.Add(new Ingredient(CraftData.GetTechType(battery), 1)); } } } } __result = ingredients; return(false); }