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;
        }
    }
}
Esempio n. 3
0
        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);
        }