public static bool IsCraftRecipeFulfilled(TechType techType)
        {
            if (Inventory.main == null)
            {
                return(false);
            }
            if (!GameModeUtils.RequiresIngredients())
            {
                return(true);
            }

            var       itemContainers = FindAllItemsContainersInRange();
            ITechData techData       = CraftData.Get(techType, false);

            if (techData != null)
            {
                int i = 0;
                int ingredientCount = techData.ingredientCount;
                while (i < ingredientCount)
                {
                    IIngredient ingredient = techData.GetIngredient(i);
                    if (GetTotalPickupCount(ingredient.techType, itemContainers) < ingredient.amount)
                    {
                        return(false);
                    }
                    i++;
                }
                return(true);
            }
            return(false);
        }
        public static bool ConsumeResources(TechType techType)
        {
            if (!IsCraftRecipeFulfilled(techType))
            {
                ErrorMessage.AddWarning(Language.main.Get("DontHaveNeededIngredients"));
                return(false);
            }

            var       itemsContainers = FindAllItemsContainersInRange();
            ITechData techData        = CraftData.Get(techType, false);

            if (techData == null)
            {
                return(false);
            }
            int i = 0;
            int ingredientCount = techData.ingredientCount;

            while (i < ingredientCount)
            {
                IIngredient ingredient = techData.GetIngredient(i);
                TechType    techType2  = ingredient.techType;
                int         j          = 0;
                int         amount     = ingredient.amount;
                while (j < amount)
                {
                    DestroyItemInContainers(techType2, itemsContainers);
                    uGUI_IconNotifier.main.Play(techType2, uGUI_IconNotifier.AnimationType.To, null);
                    j++;
                }
                i++;
            }
            return(true);
        }
Example #3
0
        public static void Postfix(ITechData data, ref List <TooltipIcon> icons)
        {
            if (data == null)
            {
                return;
            }
            var ingredientCount = data.ingredientCount;

            for (var i = 0; i < ingredientCount; i++)
            {
                var ingredient = data.GetIngredient(i);
                var techType   = ingredient.techType;
                if (!KnownTech.Contains(techType) && PDAScanner.ContainsCompleteEntry(techType))
                {
                    KnownTech.Add(techType);
                    continue;
                }
                if (!CrafterLogic.IsCraftRecipeUnlocked(techType))
                {
                    var icon = icons.Find((TooltipIcon) => TooltipIcon.sprite == SpriteManager.Get(techType) && TooltipIcon.text.Contains(Language.main.GetOrFallback(TooltipFactory.techTypeIngredientStrings.Get(techType), techType)));
                    if (icons.Contains(icon))
                    {
                        icons.Remove(icon);
                        var tooltipIcon = new TooltipIcon()
                        {
                            sprite = SpriteManager.Get(TechType.None), text = Main.Config.UnKnownTitle
                        };
                        icons.Add(tooltipIcon);
                    }
                }
            }
        }
 public static void Postfix(ref ITechData __result, ref TechType techType)
 {
     if (Settings.Instance.Recipes.RecipesByType.ContainsKey((int)techType))
     {
         __result = Settings.Instance.Recipes.RecipesByType[(int)techType];
     }
 }
Example #5
0
        private static bool CheckRequirements(Trashcan __instance, Pickupable item, ITechData techData)
        {
            bool check            = true;
            int  craftCountNeeded = techData.craftAmount;
            IList <InventoryItem> inventoryItems = __instance.storageContainer.container.GetItems(item.GetTechType());

            if (inventoryItems != null && inventoryItems.Count >= craftCountNeeded)
            {
                while (craftCountNeeded > 0)
                {
                    Trashcan_Update.inventoryItems.Add(inventoryItems[craftCountNeeded - 1]);
                    craftCountNeeded--;
                }

                List <TechType> linkedItems = new List <TechType>();
                for (int i = 0; i < techData.linkedItemCount; i++)
                {
                    linkedItems.Add(techData.GetLinkedItem(i));
                }

                foreach (TechType techType in linkedItems)
                {
                    int linkedCountNeeded = linkedItems.FindAll((TechType tt) => tt == techType).Count;
                    IList <InventoryItem> inventoryItems2 = __instance.storageContainer.container.GetItems(techType);
                    IList <InventoryItem> inventoryItems3 = Inventory.main.container.GetItems(techType);
                    int count = (inventoryItems2?.Count ?? 0) + (inventoryItems3?.Count ?? 0);
                    if (count < linkedCountNeeded)
                    {
                        ErrorMessage.AddMessage($"Missing {linkedCountNeeded - (inventoryItems2?.Count + inventoryItems3?.Count)} {techType}");
                        Inventory.main.ForcePickup(item);
                        Trashcan_Update.inventoryItems.Clear();
                        return(false);
                    }

                    int count1 = inventoryItems2?.Count ?? 0;
                    int count2 = inventoryItems3?.Count ?? 0;
                    while (linkedCountNeeded > 0)
                    {
                        if (count1 > 0)
                        {
                            Trashcan_Update.inventoryItems.Add(inventoryItems2[count1 - 1]);
                            count1--;
                        }
                        else if (count2 > 0)
                        {
                            Trashcan_Update.inventoryItems.Add(inventoryItems3[count2 - 1]);
                            count2--;
                        }
                        linkedCountNeeded--;
                    }
                }
            }
            else
            {
                check = false;
            }

            return(check);
        }
Example #6
0
 public static void SetTechData(TechType techType, ITechData techData)
 {
     if (techType == TechType.None)
     {
         throw new ArgumentException("techType == None");
     }
     CraftDataWrapper.techData[techType] = techData;
 }
Example #7
0
 private static bool Prefix(TechType techType, ref ITechData __result)
 {
     if (techData.TryGetValue(techType, out __result))
     {
         return(false);
     }
     return(true);
 }
        private static bool Prefix(ref ITechData __result, ref TechType techType, ref bool skipWarnings)
        {
            ITechData result = BuilderUtils.GetTechData(techType);

            if (result != null)
            {
                __result = result;
                return(false);
            }

            return(true);
        }
        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 Postfix(ref ITechData __result, ref TechType techType)
        {
            var patchedTech = HCPTechData.GetFromTechData(__result);

            for (int i = 0; i < patchedTech.ingredientCount; i++)
            {
                var ingredientTechType      = patchedTech._ingredients[i].techType;
                var patchedIngredientAmount = patchedTech._ingredients[i].amount * HCPSettings.Instance.CraftingCostMultiplier;
                patchedTech._ingredients[i] = new HCPIngredient(ingredientTechType, patchedIngredientAmount);
            }

            __result = patchedTech;
        }
        private void SetTechType(TechType techType)
        {
            this.techType = techType;

            ITechData techData = CraftData.Get(techType, true);

            if (techData == null)
            {
                Logger.Error("Could not find tech data for techtype: " + techType);
                return;
            }

            if (Mod.Left)
            {
                mainIcon = BlueprintTrackerIcon.Create(contents.transform, null, SpriteManager.Get(techType), true, false);
            }
            else
            {
                removeButton = BlueprintTrackerRemoveButton.Create(contents.transform, techType, true, false);
            }

            icons.Clear();
            for (int i = 0; i < techData.ingredientCount; ++i)
            {
                IIngredient  ingredient = techData.GetIngredient(i);
                Atlas.Sprite sprite     = SpriteManager.Get(ingredient.techType);

                var icon = BlueprintTrackerIcon.Create(contents.transform, ingredient, sprite,
                                                       Mod.Left ? false : i == 0,
                                                       Mod.Left ? i == techData.ingredientCount - 1 : false
                                                       );
                icons.Add(icon);
            }

            if (!Mod.Left)
            {
                mainIcon = BlueprintTrackerIcon.Create(contents.transform, null, SpriteManager.Get(techType), false, true);
            }
            else
            {
                removeButton = BlueprintTrackerRemoveButton.Create(contents.transform, techType, false, true);
            }
        }
        public static void WriteIngredients(ITechData data, List <TooltipIcon> icons)
        {
            int ingredientCount = data.ingredientCount;

            ItemsContainer[] itemContainers = FindAllItemsContainersInRange();
            StringBuilder    stringBuilder  = new StringBuilder();

            for (int i = 0; i < ingredientCount; i++)
            {
                stringBuilder.Length = 0;
                IIngredient  ingredient       = data.GetIngredient(i);
                TechType     techType         = ingredient.techType;
                int          totalPickupCount = GetTotalPickupCount(techType, itemContainers);
                int          amount           = ingredient.amount;
                bool         flag             = totalPickupCount >= amount || !GameModeUtils.RequiresIngredients();
                Atlas.Sprite sprite           = SpriteManager.Get(techType);
                if (flag)
                {
                    stringBuilder.Append("<color=#94DE00FF>");
                }
                else
                {
                    stringBuilder.Append("<color=#DF4026FF>");
                }
                string orFallback = Language.main.GetOrFallback(TooltipFactory.techTypeIngredientStrings.Get(techType), techType);
                stringBuilder.Append(orFallback);
                if (amount > 1)
                {
                    stringBuilder.Append(" x");
                    stringBuilder.Append(amount);
                }
                if (totalPickupCount > 0 && totalPickupCount < amount)
                {
                    stringBuilder.Append(" (");
                    stringBuilder.Append(totalPickupCount);
                    stringBuilder.Append(")");
                }
                stringBuilder.Append("</color>");
                icons.Add(new TooltipIcon(sprite, stringBuilder.ToString()));
            }
        }
Example #13
0
        private static TechData ConvertToTechData(ITechData iTechData)
        {
            var techData = new TechData()
            {
                craftAmount = iTechData.craftAmount
            };

            for (int i = 0; i < iTechData.ingredientCount; i++)
            {
                IIngredient ingredient    = iTechData.GetIngredient(i);
                var         smlingredient = new Ingredient(ingredient.techType, ingredient.amount);
                techData.Ingredients.Add(smlingredient);
            }

            for (int i = 0; i < iTechData.linkedItemCount; i++)
            {
                techData.LinkedItems.Add(iTechData.GetLinkedItem(i));
            }

            return(techData);
        }
Example #14
0
        public static void Postfix(ref ITechData __result)
        {
            var patchedTech = new TechData()
            {
                craftAmount = __result.craftAmount
            };

            for (int i = 0; i < __result.ingredientCount; i++)
            {
                IIngredient ingredient        = __result.GetIngredient(i);
                Ingredient  patchedIngredient = new Ingredient(ingredient.techType, ingredient.amount * HCPSettings.Instance.CraftingCostMultiplier);
                patchedTech.Ingredients.Add(patchedIngredient);
            }

            for (int i = 0; i < __result.ingredientCount; i++)
            {
                patchedTech.LinkedItems.Add(__result.GetLinkedItem(i));
            }

            __result = patchedTech;
        }
 internal static void AddToCustomTechData(TechType techType, ITechData techData)
 {
     CustomTechData.Add(techType, techData);
 }
        private static void PatchCustomTechData()
        {
            short added    = 0;
            short replaced = 0;

            foreach (TechType techType in CustomTechData.Keys)
            {
                bool      techExists  = CraftData.techData.TryGetValue(techType, out CraftData.TechData techData);
                ITechData smlTechData = CustomTechData[techType];
                bool      sameData    = false;

                if (techExists)
                {
                    sameData = smlTechData.craftAmount == techData.craftAmount &&
                               smlTechData.ingredientCount == techData.ingredientCount &&
                               smlTechData.linkedItemCount == techData.linkedItemCount;

                    if (sameData)
                    {
                        for (int i = 0; i < smlTechData.ingredientCount; i++)
                        {
                            if (smlTechData.GetIngredient(i).techType != techData.GetIngredient(i).techType)
                            {
                                sameData = false;
                                break;
                            }
                            if (smlTechData.GetIngredient(i).amount != techData.GetIngredient(i).amount)
                            {
                                sameData = false;
                                break;
                            }
                        }
                    }

                    if (sameData)
                    {
                        for (int i = 0; i < smlTechData.linkedItemCount; i++)
                        {
                            if (smlTechData.GetLinkedItem(i) != techData.GetLinkedItem(i))
                            {
                                sameData = false;
                                break;
                            }
                        }
                    }
                }

                if (!techExists || !sameData)
                {
                    var techDataInstance = new CraftData.TechData
                    {
                        _techType    = techType,
                        _craftAmount = smlTechData.craftAmount
                    };

                    var ingredientsList = new CraftData.Ingredients();

                    if (smlTechData.ingredientCount > 0)
                    {
                        for (int i = 0; i < smlTechData.ingredientCount; i++)
                        {
                            IIngredient smlIngredient = smlTechData.GetIngredient(i);

                            var ingredient = new CraftData.Ingredient(smlIngredient.techType, smlIngredient.amount);
                            ingredientsList.Add(smlIngredient.techType, smlIngredient.amount);
                        }
                        techDataInstance._ingredients = ingredientsList;
                    }

                    if (smlTechData.linkedItemCount > 0)
                    {
                        var linkedItems = new List <TechType>();
                        for (int l = 0; l < smlTechData.linkedItemCount; l++)
                        {
                            linkedItems.Add(smlTechData.GetLinkedItem(l));
                        }
                        techDataInstance._linkedItems = linkedItems;
                    }

                    if (techExists)
                    {
                        CraftData.techData.Remove(techType);
                        Logger.Log($"{techType} TechType already existed in the CraftData.techData dictionary. Original value was replaced.", LogLevel.Warn);
                        replaced++;
                    }
                    else
                    {
                        added++;
                    }
                    CraftData.techData.Add(techType, techDataInstance);
                }
            }

            if (added > 0)
            {
                Logger.Log($"Added {added} new entries to the CraftData.techData dictionary.", LogLevel.Info);
            }

            if (replaced > 0)
            {
                Logger.Log($"Replaced {replaced} existing entries to the CraftData.techData dictionary.", LogLevel.Info);
            }
        }
Example #17
0
        private static void HandleModifiedRecipe(IModifiedRecipe modifiedRecipe)
        {
            bool overrideRecipe = false;

            ITechData original = CraftData.Get(modifiedRecipe.ItemID);

            var replacement = new TechData();

            // Amount
            if (modifiedRecipe.AmountCrafted.HasValue)
            {
                overrideRecipe         |= true;
                replacement.craftAmount = modifiedRecipe.AmountCrafted.Value;
            }
            else
            {
                replacement.craftAmount = original.craftAmount;
            }

            // Ingredients
            if (modifiedRecipe.IngredientsCount.HasValue)
            {
                overrideRecipe |= true;
                foreach (EmIngredient ingredient in modifiedRecipe.Ingredients)
                {
                    replacement.Ingredients.Add(
                        new Ingredient(
                            ingredient.ItemID,
                            ingredient.Required));
                }
            }
            else
            {
                for (int i = 0; i < original.ingredientCount; i++)
                {
                    replacement.Ingredients.Add(
                        new Ingredient(
                            original.GetIngredient(i).techType,
                            original.GetIngredient(i).amount));
                }
            }

            // Linked Items
            if (modifiedRecipe.LinkedItemsCount.HasValue)
            {
                overrideRecipe |= true;
                foreach (TechType linkedItem in modifiedRecipe.LinkedItems)
                {
                    replacement.LinkedItems.Add(linkedItem);
                }
            }
            else
            {
                for (int i = 0; i < original.linkedItemCount; i++)
                {
                    replacement.LinkedItems.Add(original.GetLinkedItem(i));
                }
            }

            if (overrideRecipe)
            {
                CraftDataHandler.SetTechData(modifiedRecipe.ItemID, replacement);
            }
        }
Example #18
0
        private static void AddCustomTechDataToOriginalDictionary()
        {
            short added    = 0;
            short replaced = 0;

            foreach (TechType techType in CustomTechData.Keys)
            {
                ITechData smlTechData = CustomTechData[techType];

                var techDataInstance = new CraftData.TechData
                {
                    _techType    = techType,
                    _craftAmount = smlTechData.craftAmount
                };

                var ingredientsList = new CraftData.Ingredients();

                if (smlTechData.ingredientCount > 0)
                {
                    for (int i = 0; i < smlTechData.ingredientCount; i++)
                    {
                        IIngredient smlIngredient = smlTechData.GetIngredient(i);

                        var ingredient = new CraftData.Ingredient(smlIngredient.techType, smlIngredient.amount);
                        ingredientsList.Add(smlIngredient.techType, smlIngredient.amount);
                    }
                    techDataInstance._ingredients = ingredientsList;
                }

                if (smlTechData.linkedItemCount > 0)
                {
                    var linkedItems = new List <TechType>();
                    for (int l = 0; l < smlTechData.linkedItemCount; l++)
                    {
                        linkedItems.Add(smlTechData.GetLinkedItem(l));
                    }
                    techDataInstance._linkedItems = linkedItems;
                }

                bool techDataExists = CraftData.techData.ContainsKey(techType);

                if (techDataExists)
                {
                    CraftData.techData.Remove(techType);
                    Logger.Log($"{techType} TechType already existed in the CraftData.techData dictionary. Original value was replaced.", LogLevel.Warn);
                    replaced++;
                }
                else
                {
                    added++;
                }

                CraftData.techData.Add(techType, techDataInstance);
            }

            if (added > 0)
            {
                Logger.Log($"Added {added} new entries to the CraftData.techData dictionary.", LogLevel.Info);
            }

            if (replaced > 0)
            {
                Logger.Log($"Replaced {replaced} existing entries to the CraftData.techData dictionary.", LogLevel.Info);
            }
        }
Example #19
0
        public static bool Prefix(Trashcan __instance)
        {
            if (__instance.biohazard)
            {
                return(true);
            }

            __instance.storageContainer.hoverText        = "Recycling Bin";
            __instance.storageContainer.storageLabel     = "Recycling Bin";
            __instance.storageContainer.container._label = "Recycling Bin";

            inventoryItems   = new List <InventoryItem>();
            forcePickupItems = new List <Pickupable>();

            foreach (Trashcan.Waste waste in __instance.wasteList)
            {
                InventoryItem item = waste.inventoryItem;

                if (item is null)
                {
                    continue;
                }

                TechType techType = item.item.GetTechType();

                ITechData techData = CraftData.Get(techType);

                bool inputcheck = GameInput.GetButtonHeld(GameInput.Button.Deconstruct);

                if (!inputcheck && techType != TechType.Titanium && Main.BatteryCheck(item.item) && techData != null)
                {
                    if (CheckRequirements(__instance, item.item, techData))
                    {
                        for (int i = 0; i < techData.ingredientCount; i++)
                        {
                            IIngredient ingredient = techData.GetIngredient(i);

                            for (int j = 0; j < ingredient.amount; j++)
                            {
                                GameObject gameObject = CraftData.InstantiateFromPrefab(ingredient.techType, false);
                                if (gameObject.GetComponent <LiveMixin>() != null)
                                {
                                    GameObject.Destroy(gameObject);
                                    break;
                                }

                                gameObject.SetActive(true);
                                Pickupable pickupable = gameObject.GetComponent <Pickupable>();
                                pickupable.Pickup(false);
                                forcePickupItems.Add(pickupable);
                            }
                        }
                        break;
                    }
                }
                else
                {
                    if (inputcheck)
                    {
                        inventoryItems.Add(item);
                    }
                    else
                    {
                        forcePickupItems.Add(item.item);
                    }

                    break;
                }
            }
            forcePickupItems.ForEach((rejectedItem) => Inventory.main.ForcePickup(rejectedItem));
            inventoryItems.ForEach((item) => UnityEngine.Object.Destroy(item.item.gameObject));

            return(false);
        }
Example #20
0
 /// <summary>
 /// <para>Allows you to edit recipes, i.e. TechData for TechTypes.</para>
 /// <para>Can be used for existing TechTypes too.</para>
 /// </summary>
 /// <param name="techType">The TechType whose TechData you want to edit.</param>
 /// <param name="techData">The TechData for that TechType.</param>
 /// <seealso cref="TechData"/>
 void ICraftDataHandler.SetTechData(TechType techType, ITechData techData)
 {
     CraftDataPatcher.CustomTechData[techType] = techData;
 }
Example #21
0
 /// <summary>
 /// <para>Allows you to edit recipes, i.e. TechData for TechTypes.</para>
 /// <para>Can be used for existing TechTypes too.</para>
 /// </summary>
 /// <param name="techType">The TechType whose TechData you want to edit.</param>
 /// <param name="techData">The TechData for that TechType.</param>
 /// <seealso cref="TechData"/>
 public static void SetTechData(TechType techType, ITechData techData)
 {
     Main.SetTechData(techType, techData);
 }