Example #1
0
        public static void Postfix(Transform elementRoot, Piece.Requirement req, Player player, bool craft, int quality)
        {
            var instance = InventoryGui.instance;

            if ((instance.InCraftTab() || instance.InUpradeTab()) && req?.m_resItem != null)
            {
                var item = req.m_resItem;
                var icon = elementRoot.transform.Find("res_icon").GetComponent <Image>();

                var bgIconTransform = elementRoot.Find("bgIcon");
                if (item.m_itemData.UseMagicBackground())
                {
                    if (bgIconTransform == null)
                    {
                        bgIconTransform      = Object.Instantiate(icon, elementRoot, true).transform;
                        bgIconTransform.name = "bgIcon";
                        bgIconTransform.SetSiblingIndex(icon.transform.GetSiblingIndex());
                    }

                    bgIconTransform.gameObject.SetActive(true);
                    var bgIcon = bgIconTransform.GetComponent <Image>();
                    bgIcon.sprite = EpicLoot.GetMagicItemBgSprite();
                    bgIcon.color  = item.m_itemData.GetRarityColor();
                }
                else if (bgIconTransform != null)
                {
                    bgIconTransform.gameObject.SetActive(false);
                }
            }
        }
Example #2
0
        private static int ComputeItemQuantity(int fromInventory, Piece.Requirement item, Player player)
        {
            Stopwatch delta;

            GameObject pos = player.GetCurrentCraftingStation()?.gameObject;

            if (!pos || !Configuration.Current.CraftFromChest.checkFromWorkbench)
            {
                pos   = player.gameObject;
                delta = Inventory_NearbyChests_Cache.delta;
            }
            else
            {
                delta = GameObjectAssistant.GetStopwatch(pos);
            }

            int lookupInterval = Helper.Clamp(Configuration.Current.CraftFromChest.lookupInterval, 1, 10) * 1000;

            if (!delta.IsRunning || delta.ElapsedMilliseconds > lookupInterval)
            {
                Inventory_NearbyChests_Cache.chests = InventoryAssistant.GetNearbyChests(pos, Helper.Clamp(Configuration.Current.CraftFromChest.range, 1, 50), !Configuration.Current.CraftFromChest.ignorePrivateAreaCheck);
                delta.Restart();
            }

            return(fromInventory + InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(Inventory_NearbyChests_Cache.chests), item.m_resItem.m_itemData));
        }
Example #3
0
            static void Postfix(InventoryGui __instance, Transform elementRoot, Piece.Requirement req, Player player, bool craft, int quality)
            {
                if (!AllowByKey())
                {
                    return;
                }
                Text component3 = elementRoot.transform.Find("res_amount").GetComponent <Text>();

                if (req.m_resItem != null)
                {
                    int invAmount = player.GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name);
                    int amount    = req.GetAmount(quality);
                    if (amount <= 0)
                    {
                        return;
                    }
                    component3.text = amount.ToString();
                    if (invAmount < amount)
                    {
                        List <Container> nearbyContainers = GetNearbyContainers(Player.m_localPlayer.transform.position);
                        foreach (Container c in nearbyContainers)
                        {
                            invAmount += c.GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name);
                        }

                        if (invAmount >= amount)
                        {
                            component3.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? flashColor.Value : unFlashColor.Value);
                        }
                    }
                    component3.text = string.Format(resourceString.Value, invAmount, component3.text);
                }
            }
Example #4
0
        private void CreateRecipe()
        {
            if (StaffPrefab == null || ObjectDB.instance.GetRecipe(StaffPrefab.GetComponent <ItemDrop>().m_itemData) != null)
            {
                return;
            }

            var recipe = ScriptableObject.CreateInstance <Recipe>();

            recipe.name   = "Staff";
            recipe.m_item = StaffPrefab.GetComponent <ItemDrop>();

            var woodDrop = ObjectDB.instance.GetItemPrefab("Wood").GetComponent <ItemDrop>();

            var materials = new Piece.Requirement[] {
                new Piece.Requirement()
                {
                    m_resItem = woodDrop,
                    m_amount  = 4
                }
            };

            recipe.m_resources = materials;

            recipe.m_minStationLevel = 1;
            recipe.m_enabled         = true;

            var namedPrefabsInfo = ZNetScene.instance.GetType().GetField("m_namedPrefabs", BindingFlags.NonPublic | BindingFlags.Instance);
            Dictionary <int, GameObject> namedPrefabs = (Dictionary <int, GameObject>)namedPrefabsInfo.GetValue(ZNetScene.instance);

            recipe.m_repairStation = namedPrefabs["piece_workbench".GetStableHashCode()].GetComponent <CraftingStation>();

            ObjectDB.instance.m_recipes.Add(recipe);
        }
Example #5
0
        private static Recipe RepairRecipe(ItemDrop.ItemData item)
        {
            float  percent    = (item.GetMaxDurability() - item.m_durability) / item.GetMaxDurability();
            Recipe fullRecipe = ObjectDB.instance.GetRecipe(item);
            var    fullReqs   = fullRecipe.m_resources.ToList();

            bool isMagic = false;

            if (epicLootAssembly != null)
            {
                isMagic = (bool)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("IsMagic", BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(ItemDrop.ItemData) }, null).Invoke(null, new[] { item });
            }
            if (isMagic)
            {
                int rarity = (int)epicLootAssembly.GetType("EpicLoot.ItemDataExtensions").GetMethod("GetRarity", BindingFlags.Public | BindingFlags.Static).Invoke(null, new[] { item });
                List <KeyValuePair <ItemDrop, int> > magicReqs = (List <KeyValuePair <ItemDrop, int> >)epicLootAssembly.GetType("EpicLoot.Crafting.EnchantTabController").GetMethod("GetEnchantCosts", BindingFlags.Public | BindingFlags.Static).Invoke(null, new object[] { item, rarity });
                foreach (var kvp in magicReqs)
                {
                    fullReqs.Add(new Piece.Requirement()
                    {
                        m_amount  = kvp.Value,
                        m_resItem = kvp.Key
                    });
                }
            }

            List <Piece.Requirement> reqs = new List <Piece.Requirement>();
            Recipe recipe = ScriptableObject.CreateInstance <Recipe>();

            for (int i = 0; i < fullReqs.Count; i++)
            {
                var req = new Piece.Requirement()
                {
                    m_resItem        = fullReqs[i].m_resItem,
                    m_amountPerLevel = Mathf.FloorToInt(fullReqs[i].m_amountPerLevel * percent * materialRequirementMult.Value),
                    m_amount         = Mathf.FloorToInt(fullReqs[i].m_amount * percent * materialRequirementMult.Value),
                };

                int amount = 0;
                for (int j = item.m_quality; j > 0; j--)
                {
                    amount += req.GetAmount(j);
                }


                if (amount > 0)
                {
                    reqs.Add(req);
                }
            }
            recipe.m_resources = reqs.ToArray();

            if (!reqs.Any())
            {
                return(null);
            }
            return(recipe);
        }
Example #6
0
    // Token: 0x0600051B RID: 1307 RVA: 0x0002AD30 File Offset: 0x00028F30
    private void SetupPieceInfo(Piece piece)
    {
        if (piece == null)
        {
            this.m_buildSelection.text   = Localization.instance.Localize("$hud_nothingtobuild");
            this.m_pieceDescription.text = "";
            this.m_buildIcon.enabled     = false;
            for (int i = 0; i < this.m_requirementItems.Length; i++)
            {
                this.m_requirementItems[i].SetActive(false);
            }
            return;
        }
        Player localPlayer = Player.m_localPlayer;

        this.m_buildSelection.text   = Localization.instance.Localize(piece.m_name);
        this.m_pieceDescription.text = Localization.instance.Localize(piece.m_description);
        this.m_buildIcon.enabled     = true;
        this.m_buildIcon.sprite      = piece.m_icon;
        for (int j = 0; j < this.m_requirementItems.Length; j++)
        {
            if (j < piece.m_resources.Length)
            {
                Piece.Requirement req = piece.m_resources[j];
                this.m_requirementItems[j].SetActive(true);
                InventoryGui.SetupRequirement(this.m_requirementItems[j].transform, req, localPlayer, false, 0);
            }
            else
            {
                this.m_requirementItems[j].SetActive(false);
            }
        }
        if (piece.m_craftingStation)
        {
            CraftingStation craftingStation = CraftingStation.HaveBuildStationInRange(piece.m_craftingStation.m_name, localPlayer.transform.position);
            GameObject      gameObject      = this.m_requirementItems[piece.m_resources.Length];
            gameObject.SetActive(true);
            Image     component  = gameObject.transform.Find("res_icon").GetComponent <Image>();
            Text      component2 = gameObject.transform.Find("res_name").GetComponent <Text>();
            Text      component3 = gameObject.transform.Find("res_amount").GetComponent <Text>();
            UITooltip component4 = gameObject.GetComponent <UITooltip>();
            component.sprite  = piece.m_craftingStation.m_icon;
            component2.text   = Localization.instance.Localize(piece.m_craftingStation.m_name);
            component4.m_text = piece.m_craftingStation.m_name;
            if (craftingStation != null)
            {
                craftingStation.ShowAreaMarker();
                component.color  = Color.white;
                component3.text  = "";
                component3.color = Color.white;
                return;
            }
            component.color  = Color.gray;
            component3.text  = "None";
            component3.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
        }
    }
        private static Recipe RepairRecipe(ItemDrop.ItemData item, bool log = false)
        {
            float  percent    = (item.GetMaxDurability() - item.m_durability) / item.GetMaxDurability();
            Recipe fullRecipe = ObjectDB.instance.GetRecipe(item);

            if (log)
            {
                Dbgl($"{Localization.instance.Localize(item.m_shared.m_name)}, quality {item.m_quality} is {percent * 10000 / 100}% broken");
            }
            Recipe recipe = ScriptableObject.CreateInstance <Recipe>();

            List <Piece.Requirement> reqs = new List <Piece.Requirement>();

            for (int i = 0; i < fullRecipe.m_resources.Length; i++)
            {
                var req = new Piece.Requirement()
                {
                    m_resItem        = fullRecipe.m_resources[i].m_resItem,
                    m_amountPerLevel = Mathf.FloorToInt(fullRecipe.m_resources[i].m_amountPerLevel * percent * materialRequirementMult.Value),
                    m_amount         = Mathf.FloorToInt(fullRecipe.m_resources[i].m_amount * percent * materialRequirementMult.Value),
                };

                if (log)
                {
                    Dbgl($"full required amounts of {Localization.instance.Localize(fullRecipe.m_resources[i].m_resItem.m_itemData.m_shared.m_name)}: {fullRecipe.m_resources[i].m_amount} {fullRecipe.m_resources[i].m_amountPerLevel}; repair amounts: {req.m_amount} {req.m_amountPerLevel}");
                }


                int amount = 0;
                for (int j = item.m_quality; j > 0; j--)
                {
                    amount += req.GetAmount(j);
                }


                if (amount > 0)
                {
                    if (log)
                    {
                        Dbgl($"required amount of {Localization.instance.Localize(fullRecipe.m_resources[i].m_resItem.m_itemData.m_shared.m_name)} is {amount}");
                    }
                    reqs.Add(req);
                }
            }
            recipe.m_resources = reqs.ToArray();

            if (!reqs.Any())
            {
                if (log)
                {
                    Dbgl($"no resources required");
                }
                return(null);
            }
            return(recipe);
        }
Example #8
0
        /// <summary>
        ///     Converts the <see cref="RequirementConfig">RequirementConfigs</see> to Valheim style <see cref="Piece.Requirement"/> array.
        /// </summary>
        /// <returns>The Valheim <see cref="Piece.Requirement"/> array</returns>
        public Piece.Requirement[] GetRequirements()
        {
            Piece.Requirement[] reqs = new Piece.Requirement[Requirements.Length];

            for (int i = 0; i < reqs.Length; i++)
            {
                reqs[i] = Requirements[i].GetRequirement();
            }

            return(reqs);
        }
Example #9
0
        public static Recipe BuildRecipe(RecipeStub rs, ObjectDB odb)
        {
            var recipe = ScriptableObject.CreateInstance <Recipe>();

            recipe.m_item            = rs.Item;
            recipe.m_craftingStation = odb.GetItemPrefab(rs.CraftingStation)?.GetComponentInChildren <CraftingStation>(true);
            if (recipe.m_craftingStation == null)
            {
                recipe.m_craftingStation = ZNetScene.instance?.GetPrefab(rs.CraftingStation)?.GetComponentInChildren <CraftingStation>(true);
                if (recipe.m_craftingStation == null)
                {
                    Plugin.Log.LogInfo("BuildRecipe couldn't find crafting station " + rs.CraftingStation + " for " + rs.Name);
                    return(null);
                }
            }
            if (!string.IsNullOrWhiteSpace(rs.RepairStation))
            {
                recipe.m_repairStation = odb.GetItemPrefab(rs.RepairStation)?.GetComponentInChildren <CraftingStation>(true);
                if (recipe.m_repairStation == null)
                {
                    recipe.m_repairStation = ZNetScene.instance?.GetPrefab(rs.RepairStation)?.GetComponentInChildren <CraftingStation>(true);
                    if (recipe.m_repairStation == null)
                    {
                        Plugin.Log.LogInfo("BuildRecipe couldn't find declared repair station " + rs.RepairStation + " for " + rs.Name);
                        return(null);
                    }
                }
                if (recipe.m_repairStation == null)
                {
                    return(null);
                }
            }
            recipe.m_minStationLevel = Mathf.Max(1, rs.MinStationLevel);
            List <Piece.Requirement> reqs = new List <Piece.Requirement>();

            foreach (RecipeStub.RequirementStub r in rs.Requirements)
            {
                ItemDrop id = odb.GetItemPrefab(r.Component)?.GetComponentInChildren <ItemDrop>(true);
                if (!id)
                {
                    Plugin.Log.LogInfo("BuildRecipe couldn't get requirement component " + r.Component + " for " + rs.Name);
                    return(null);
                }
                Piece.Requirement pr = new Piece.Requirement();
                pr.m_resItem        = id;
                pr.m_amount         = r.Amount;
                pr.m_amountPerLevel = r.AmountPerLevel;
                pr.m_recover        = r.Recoverable;
                reqs.Add(pr);
            }
            recipe.m_resources = reqs.ToArray();

            return(recipe);
        }
Example #10
0
        public static Piece.Requirement Create(string name, int amount = 1, bool recover = true)
        {
            var requirement = new Piece.Requirement
            {
                m_recover = recover,
                m_amount  = amount
            };

            requirement.m_resItem = Mock <ItemDrop> .Create(name);

            return(requirement);
        }
Example #11
0
        public static Piece.Requirement[] CreateArray(Dictionary <string, int> requirements, bool recover = true)
        {
            List <Piece.Requirement> list = new List <Piece.Requirement>();

            foreach (KeyValuePair <string, int> requirement in requirements)
            {
                Piece.Requirement piece = Create(requirement.Key, requirement.Value, recover);
                piece.FixReferences();
                list.Add(piece);
            }

            return(list.ToArray());
        }
Example #12
0
        public static void AddPieceToTool()
        {
            Harmony.CreateAndPatchAll(Assembly.GetExecutingAssembly(), "com.rolopogo.Basement");

            MaterialReplacer.GetAllMaterials();
            // Load from assetbundle
            var bundle = AssetBundle.LoadFromMemory(ResourceUtils.GetResource(Assembly.GetExecutingAssembly(), "Basement.Resources.basement"));

            basementPrefab = bundle.LoadAsset <GameObject>("Basement");
            basementPrefab.AddComponent <Basement>();
            bundle.Unload(false);

            Plugin.basementPrefab.name = "basement.basementprefab";

            // update material references
            MaterialReplacer.ReplaceAllMaterialsWithOriginal(basementPrefab);

            var woodRequirement = MockRequirement.Create("Wood", 100, true);

            woodRequirement.FixReferences();
            var stoneRequirement = MockRequirement.Create("Stone", 100, true);

            stoneRequirement.FixReferences();

            var customRequirements = new Piece.Requirement[]
            {
                woodRequirement,
                stoneRequirement
            };

            var piece = basementPrefab.GetComponent <Piece>();

            piece.m_resources       = customRequirements;
            piece.m_category        = Piece.PieceCategory.Misc;
            piece.m_craftingStation = Mock <CraftingStation> .Create("piece_stonecutter");

            piece.m_clipEverything = true;
            // Add spawn effect
            piece.m_placeEffect = Prefab.Cache.GetPrefab <GameObject>("piece_stonecutter").GetComponent <Piece>().m_placeEffect;

            piece.FixReferences();

            Prefab.NetworkRegister(basementPrefab);

            // Add to tool
            var hammerPrefab     = Prefab.Cache.GetPrefab <GameObject>("Hammer");
            var hammerPieceTable = hammerPrefab.GetComponent <ItemDrop>().m_itemData.m_shared.m_buildPieces;

            hammerPieceTable.m_pieces.Add(basementPrefab.gameObject);
        }
Example #13
0
        private void SetupPieceInfo(Piece piece)
        {
            Player localPlayer = Player.m_localPlayer;

            Hud.instance.m_buildSelection.text   = Localization.instance.Localize(piece.m_name);
            Hud.instance.m_pieceDescription.text = Localization.instance.Localize(piece.m_description);
            Hud.instance.m_buildIcon.enabled     = true;
            Hud.instance.m_buildIcon.sprite      = piece.m_icon;
            GameObject[] uiRequirementPanels = Hud.instance.m_requirementItems;
            for (int j = 0; j < uiRequirementPanels.Length; j++)
            {
                if (j < piece.m_resources.Length)
                {
                    Piece.Requirement req = piece.m_resources[j];
                    uiRequirementPanels[j].SetActive(value: true);
                    SetupRequirement(uiRequirementPanels[j].transform, req, GetResourceCount(GetResourceName(req)));
                }
                else
                {
                    uiRequirementPanels[j].SetActive(value: false);
                }
            }
            if ((bool)piece.m_craftingStation)
            {
                CraftingStation craftingStation = CraftingStation.HaveBuildStationInRange(piece.m_craftingStation.m_name, localPlayer.transform.position);
                GameObject      obj             = uiRequirementPanels[piece.m_resources.Length];
                obj.SetActive(value: true);
                Image     component  = obj.transform.Find("res_icon").GetComponent <Image>();
                Text      component2 = obj.transform.Find("res_name").GetComponent <Text>();
                Text      component3 = obj.transform.Find("res_amount").GetComponent <Text>();
                UITooltip component4 = obj.GetComponent <UITooltip>();
                component.sprite  = piece.m_craftingStation.m_icon;
                component2.text   = Localization.instance.Localize(piece.m_craftingStation.m_name);
                component4.m_text = piece.m_craftingStation.m_name;
                if (craftingStation != null)
                {
                    craftingStation.ShowAreaMarker();
                    component.color  = Color.white;
                    component3.text  = "";
                    component3.color = Color.white;
                }
                else
                {
                    component.color  = Color.gray;
                    component3.text  = "None";
                    component3.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
                }
            }
        }
Example #14
0
        public static void ScanCultivator()
        {
            if (scanningCultivator)
            {
                return;
            }
            scanningCultivator = true;
            foreach (PieceTable table in Resources.FindObjectsOfTypeAll(typeof(PieceTable)))
            {
                string name = table.gameObject.name;
                if (name.Equals("_CultivatorPieceTable"))
                {
                    foreach (GameObject cultivatorRecipe in table.m_pieces)
                    {
                        Piece piece = cultivatorRecipe.GetComponent <Piece>();

                        Plant plant = piece.GetComponent <Plant>();

                        if (plant)
                        {
                            Piece.Requirement[] requirements = piece.m_resources;
                            if (requirements.Length > 1)
                            {
                                logger.LogWarning("  Multiple seeds required for " + plant.m_name + "? Skipping");
                                continue;
                            }

                            Piece.Requirement requirement = requirements[0];

                            ItemDrop itemData = requirement.m_resItem;
                            if (!seedPrefabMap.ContainsKey(itemData.m_itemData.m_shared.m_name))
                            {
                                logger.LogDebug("Looking for Prefab of " + itemData.m_itemData.m_shared.m_name + " -> " + itemData.gameObject.name);
                                ItemConversion conversion = new ItemConversion
                                {
                                    seedDrop   = requirement.m_resItem,
                                    plantPiece = piece,
                                    plant      = plant
                                };
                                logger.LogDebug("Registering seed type: " + conversion);
                                seedPrefabMap.Add(itemData.m_itemData.m_shared.m_name, conversion);
                            }
                        }
                    }
                }
            }
            scanningCultivator = false;
        }
Example #15
0
        public static void Postfix(Transform elementRoot, Piece.Requirement req, Player player, int quality)
        {
            var amountText = elementRoot.transform.Find("res_amount").GetComponent <Text>();

            if (req.m_resItem != null)
            {
                if (!player.HaveRequirements(new [] { req }, false, quality))
                {
                    amountText.color = Mathf.Sin(Time.time * 10f) > 0.0 ? Color.red : Color.white;
                }
                else
                {
                    amountText.color = Color.white;
                }
            }
        }
Example #16
0
        private static bool Prefix(Transform elementRoot, Piece.Requirement req, Player player, bool craft, int quality, ref bool __result)
        {
            Image     component  = elementRoot.transform.Find("res_icon").GetComponent <Image>();
            Text      component2 = elementRoot.transform.Find("res_name").GetComponent <Text>();
            Text      component3 = elementRoot.transform.Find("res_amount").GetComponent <Text>();
            UITooltip component4 = elementRoot.GetComponent <UITooltip>();

            if (req.m_resItem != null)
            {
                component.gameObject.SetActive(true);
                component2.gameObject.SetActive(true);
                component3.gameObject.SetActive(true);
                component.sprite  = req.m_resItem.m_itemData.GetIcon();
                component.color   = Color.white;
                component4.m_text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                component2.text   = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                int num    = player.GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name);
                int amount = req.GetAmount(quality);

                if (amount <= 0)
                {
                    InventoryGui.HideRequirement(elementRoot);
                    __result = false;
                    return(false);
                }
                component3.text = num + "/" + amount.ToString();

                if (num < amount)
                {
                    component3.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
                }
                else
                {
                    component3.color = Color.white;
                }

                component3.fontSize = 14;
                if (component3.text.Length > 5)
                {
                    component3.fontSize -= component3.text.Length - 5;
                }
            }

            __result = true;
            return(false);
        }
Example #17
0
        static bool Prefix(ref bool __result, Transform elementRoot, Piece.Requirement req, Player player, bool craft, int quality)
        {
            Image     icon       = elementRoot.transform.Find("res_icon").GetComponent <Image>();
            Text      nameText   = elementRoot.transform.Find("res_name").GetComponent <Text>();
            Text      amountText = elementRoot.transform.Find("res_amount").GetComponent <Text>();
            UITooltip tooltip    = elementRoot.GetComponent <UITooltip>();

            if (req.m_resItem != null)
            {
                icon.gameObject.SetActive(true);
                nameText.gameObject.SetActive(true);
                amountText.gameObject.SetActive(true);
                icon.sprite    = req.m_resItem.m_itemData.GetIcon();
                icon.color     = Color.white;
                tooltip.m_text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                nameText.text  = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                int num    = ImprovedBuildHud.GetAvailableItems(req.m_resItem.m_itemData.m_shared.m_name);
                int amount = req.GetAmount(quality);
                if (amount <= 0)
                {
                    InventoryGui.HideRequirement(elementRoot);
                    __result = false;
                    return(false);
                }

                amountText.supportRichText    = true;
                amountText.horizontalOverflow = HorizontalWrapMode.Overflow;
                var inventoryAmount = string.Format(ImprovedBuildHudConfig.InventoryAmountFormat.Value, num);
                if (!string.IsNullOrEmpty(ImprovedBuildHudConfig.InventoryAmountColor.Value))
                {
                    inventoryAmount = $"<color={ImprovedBuildHudConfig.InventoryAmountColor.Value}>{inventoryAmount}</color>";
                }
                amountText.text = $"{amount} {inventoryAmount}";

                if (num < amount)
                {
                    amountText.color = (double)Mathf.Sin(Time.time * 10f) > 0.0 ? Color.red : Color.white;
                }
                else
                {
                    amountText.color = Color.white;
                }
            }
            __result = true;
            return(false);
        }
Example #18
0
        private static int CalculateFinalAmount(ItemDrop.ItemData itemData, Piece.Requirement resource,
                                                double amountToCraftedRecipeAmountPercentage, float recyclingRate)
        {
            var amount = Enumerable.Range(1, itemData.m_quality)
                         .Select(level => resource.GetAmount(level))
                         .Sum();
            var stackCompensated = amount * amountToCraftedRecipeAmountPercentage;
            var realAmount       = Math.Floor(stackCompensated * recyclingRate);
            var finalAmount      = (int)realAmount;

            if (realAmount < 1 && itemData.m_shared.m_maxStackSize == 1 &&
                Plugin.Settings.UnstackableItemsAlwaysReturnAtLeastOneResource.Value)
            {
                finalAmount = 1;
            }
            Plugin.Log.LogDebug("Calculations report.\n" +
                                $" = = = Input: REA:{resource.m_amount} IQ:{itemData.m_quality} STK:{itemData.m_stack}({itemData.m_shared.m_maxStackSize}) SC:{stackCompensated} ATCRAP:{amountToCraftedRecipeAmountPercentage} A:{amount}, RA:{realAmount}: FA:{finalAmount}");
            return(finalAmount);
        }
Example #19
0
        private static void RemoveItemsFromInventoryAndNearbyChests(Player player, Piece.Requirement item, int amount)
        {
            GameObject pos = player.GetCurrentCraftingStation()?.gameObject;

            if (!pos || !Configuration.Current.CraftFromChest.checkFromWorkbench)
            {
                pos = player.gameObject;
            }

            int inventoryAmount = player.m_inventory.CountItems(item.m_resItem.m_itemData.m_shared.m_name);

            player.m_inventory.RemoveItem(item.m_resItem.m_itemData.m_shared.m_name, amount);
            amount -= inventoryAmount;
            if (amount <= 0)
            {
                return;
            }

            InventoryAssistant.RemoveItemInAmountFromAllNearbyChests(pos, Helper.Clamp(Configuration.Current.CraftFromChest.range, 1, 50), item.m_resItem.m_itemData, amount, !Configuration.Current.CraftFromChest.ignorePrivateAreaCheck);
        }
Example #20
0
        public bool SetupRequirement(Transform elementRoot, Piece.Requirement req, int currentAmount)
        {
            Image     imageResIcon  = elementRoot.transform.Find("res_icon").GetComponent <Image>();
            Text      textResName   = elementRoot.transform.Find("res_name").GetComponent <Text>();
            Text      textResAmount = elementRoot.transform.Find("res_amount").GetComponent <Text>();
            UITooltip uiTooltip     = elementRoot.GetComponent <UITooltip>();

            if (req.m_resItem != null)
            {
                imageResIcon.gameObject.SetActive(value: true);
                textResName.gameObject.SetActive(value: true);
                textResAmount.gameObject.SetActive(value: true);
                imageResIcon.sprite = req.m_resItem.m_itemData.GetIcon();
                imageResIcon.color  = Color.white;

                uiTooltip.m_text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                textResName.text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);

                int requiredAmount = req.GetAmount(0);

                int playerAmount = PlayerGetResourceCount(Player.m_localPlayer, req.m_resItem.m_itemData.m_shared.m_name);
                int remaining    = requiredAmount - currentAmount;

                textResAmount.text = currentAmount + "/" + requiredAmount;
                if (remaining > 0 && playerAmount == 0)
                {
                    imageResIcon.color  = Color.gray;
                    textResAmount.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
                }
                else
                {
                    imageResIcon.color  = Color.white;
                    textResAmount.color = Color.white;
                }
            }
            return(true);
        }
Example #21
0
        public Recipe GetRecipe()
        {
            Piece.Requirement[] reqs = new Piece.Requirement[Requirements.Length];

            for (int i = 0; i < reqs.Length; i++)
            {
                reqs[i] = Requirements[i].GetPieceRequirement();
            }

            Recipe     recipe     = ScriptableObject.CreateInstance <Recipe>();
            GameObject itemPrefab = PrefabManager.Instance.GetPrefab(Item);

            if (itemPrefab == null)
            {
                Debug.LogError("Error, recipe contained null item prefab for item: " + Item);
                return(null);
            }

            if (string.IsNullOrEmpty(Name))
            {
                Name = "Recipe_" + Item;
            }

            recipe.name      = Name;
            recipe.m_item    = itemPrefab.GetComponent <ItemDrop>();
            recipe.m_amount  = Amount;
            recipe.m_enabled = Enabled;

            if (CraftingStation != null)
            {
                GameObject      craftingStationPrefab = PrefabManager.Instance.GetPrefab(CraftingStation);
                CraftingStation craftingStation       = craftingStationPrefab.GetComponent <CraftingStation>();

                if (craftingStationPrefab == null || craftingStation == null)
                {
                    Debug.LogError("Crafting station is not valid: " + CraftingStation);
                    return(null);
                }

                recipe.m_craftingStation = craftingStation;
            }

            if (RepairStation != null)
            {
                GameObject      repairStationPrefab = PrefabManager.Instance.GetPrefab(RepairStation);
                CraftingStation repairStation       = repairStationPrefab.GetComponent <CraftingStation>();

                if (repairStationPrefab == null || repairStation == null)
                {
                    Debug.LogError("Repair station is not valid: " + RepairStation);
                    return(null);
                }

                recipe.m_craftingStation = repairStation;
            }

            recipe.m_minStationLevel = MinStationLevel;
            recipe.m_resources       = reqs;

            return(recipe);
        }
Example #22
0
 private static string GetResourceName(Piece.Requirement req)
 {
     return(req.m_resItem.m_itemData.m_shared.m_name);
 }
            public static void Postfix()
            {
                return;

                foreach (KeyValuePair <string, CustomItem> kvp in customItems)
                {
                    CustomItem item         = kvp.Value;
                    GameObject customObject = Instantiate(ObjectDB.instance.GetItemPrefab(item.baseItemName));
                    ItemDrop   itemDrop     = customObject.GetComponent <ItemDrop>();
                    Recipe     recipe       = ObjectDB.instance.GetRecipe(itemDrop.m_itemData);
                    customObject.name = item.id;
                    itemDrop.m_itemData.m_shared.m_name                    = item.name;
                    itemDrop.m_itemData.m_shared.m_dlc                     = item.dlc;
                    itemDrop.m_itemData.m_shared.m_itemType                = item.itemType;
                    itemDrop.m_itemData.m_shared.m_attachOverride          = item.attachOverride;
                    itemDrop.m_itemData.m_shared.m_description             = item.description;
                    itemDrop.m_itemData.m_shared.m_maxStackSize            = item.maxStackSize;
                    itemDrop.m_itemData.m_shared.m_maxQuality              = item.maxQuality;
                    itemDrop.m_itemData.m_shared.m_weight                  = item.weight;
                    itemDrop.m_itemData.m_shared.m_value                   = item.value;
                    itemDrop.m_itemData.m_shared.m_teleportable            = item.teleportable;
                    itemDrop.m_itemData.m_shared.m_questItem               = item.questItem;
                    itemDrop.m_itemData.m_shared.m_equipDuration           = item.equipDuration;
                    itemDrop.m_itemData.m_shared.m_variants                = item.variants;
                    itemDrop.m_itemData.m_shared.m_trophyPos               = item.trophyPos;
                    itemDrop.m_itemData.m_shared.m_buildPieces             = item.buildPieces;
                    itemDrop.m_itemData.m_shared.m_centerCamera            = item.centerCamera;
                    itemDrop.m_itemData.m_shared.m_setName                 = item.setName;
                    itemDrop.m_itemData.m_shared.m_setSize                 = item.setSize;
                    itemDrop.m_itemData.m_shared.m_setStatusEffect         = item.setStatusEffect;
                    itemDrop.m_itemData.m_shared.m_equipStatusEffect       = item.equipStatusEffect;
                    itemDrop.m_itemData.m_shared.m_movementModifier        = item.movementModifier;
                    itemDrop.m_itemData.m_shared.m_food                    = item.food;
                    itemDrop.m_itemData.m_shared.m_foodStamina             = item.foodStamina;
                    itemDrop.m_itemData.m_shared.m_foodBurnTime            = item.foodBurnTime;
                    itemDrop.m_itemData.m_shared.m_foodRegen               = item.foodRegen;
                    itemDrop.m_itemData.m_shared.m_foodColor               = item.foodColor;
                    itemDrop.m_itemData.m_shared.m_armorMaterial           = item.armorMaterial;
                    itemDrop.m_itemData.m_shared.m_helmetHideHair          = item.helmetHideHair;
                    itemDrop.m_itemData.m_shared.m_armor                   = item.armor;
                    itemDrop.m_itemData.m_shared.m_armorPerLevel           = item.armorPerLevel;
                    itemDrop.m_itemData.m_shared.m_damageModifiers         = item.damageModifiers;
                    itemDrop.m_itemData.m_shared.m_blockPower              = item.blockPower;
                    itemDrop.m_itemData.m_shared.m_blockPowerPerLevel      = item.blockPowerPerLevel;
                    itemDrop.m_itemData.m_shared.m_deflectionForce         = item.deflectionForce;
                    itemDrop.m_itemData.m_shared.m_deflectionForcePerLevel = item.deflectionForcePerLevel;
                    itemDrop.m_itemData.m_shared.m_timedBlockBonus         = item.timedBlockBonus;
                    itemDrop.m_itemData.m_shared.m_animationState          = item.animationState;
                    itemDrop.m_itemData.m_shared.m_skillType               = item.skillType;
                    itemDrop.m_itemData.m_shared.m_toolTier                = item.toolTier;
                    itemDrop.m_itemData.m_shared.m_damages                 = item.damages;
                    itemDrop.m_itemData.m_shared.m_damagesPerLevel         = item.damagesPerLevel;
                    itemDrop.m_itemData.m_shared.m_attackForce             = item.attackForce;
                    itemDrop.m_itemData.m_shared.m_backstabBonus           = item.backstabBonus;
                    itemDrop.m_itemData.m_shared.m_dodgeable               = item.dodgeable;
                    itemDrop.m_itemData.m_shared.m_blockable               = item.blockable;
                    itemDrop.m_itemData.m_shared.m_attackStatusEffect      = item.attackStatusEffect;
                    itemDrop.m_itemData.m_shared.m_spawnOnHit              = item.spawnOnHit;
                    itemDrop.m_itemData.m_shared.m_spawnOnHitTerrain       = item.spawnOnHitTerrain;
                    itemDrop.m_itemData.m_shared.m_attack                  = item.attack;
                    itemDrop.m_itemData.m_shared.m_secondaryAttack         = item.secondaryAttack;
                    itemDrop.m_itemData.m_shared.m_useDurability           = item.useDurability;
                    itemDrop.m_itemData.m_shared.m_destroyBroken           = item.destroyBroken;
                    itemDrop.m_itemData.m_shared.m_canBeReparied           = item.canBeReparied;
                    itemDrop.m_itemData.m_shared.m_maxDurability           = item.maxDurability;
                    itemDrop.m_itemData.m_shared.m_durabilityPerLevel      = item.durabilityPerLevel;
                    itemDrop.m_itemData.m_shared.m_useDurabilityDrain      = item.useDurabilityDrain;
                    itemDrop.m_itemData.m_shared.m_durabilityDrain         = item.durabilityDrain;
                    itemDrop.m_itemData.m_shared.m_holdDurationMin         = item.holdDurationMin;
                    itemDrop.m_itemData.m_shared.m_holdStaminaDrain        = item.holdStaminaDrain;
                    itemDrop.m_itemData.m_shared.m_holdAnimationState      = item.holdAnimationState;
                    itemDrop.m_itemData.m_shared.m_ammoType                = item.ammoType;
                    itemDrop.m_itemData.m_shared.m_aiAttackRange           = item.aiAttackRange;
                    itemDrop.m_itemData.m_shared.m_aiAttackRangeMin        = item.aiAttackRangeMin;
                    itemDrop.m_itemData.m_shared.m_aiAttackInterval        = item.aiAttackInterval;
                    itemDrop.m_itemData.m_shared.m_aiAttackMaxAngle        = item.aiAttackMaxAngle;
                    itemDrop.m_itemData.m_shared.m_aiWhenFlying            = item.aiWhenFlying;
                    itemDrop.m_itemData.m_shared.m_aiWhenWalking           = item.aiWhenWalking;
                    itemDrop.m_itemData.m_shared.m_aiWhenSwiming           = item.aiWhenSwiming;
                    itemDrop.m_itemData.m_shared.m_aiPrioritized           = item.aiPrioritized;
                    itemDrop.m_itemData.m_shared.m_aiTargetType            = item.aiTargetType;
                    itemDrop.m_itemData.m_shared.m_hitEffect               = item.hitEffect;
                    itemDrop.m_itemData.m_shared.m_hitTerrainEffect        = item.hitTerrainEffect;
                    itemDrop.m_itemData.m_shared.m_blockEffect             = item.blockEffect;
                    itemDrop.m_itemData.m_shared.m_startEffect             = item.startEffect;
                    itemDrop.m_itemData.m_shared.m_holdStartEffect         = item.holdStartEffect;
                    itemDrop.m_itemData.m_shared.m_triggerEffect           = item.triggerEffect;
                    itemDrop.m_itemData.m_shared.m_trailStartEffect        = item.trailStartEffect;
                    itemDrop.m_itemData.m_shared.m_consumeStatusEffect     = item.consumeStatusEffect;

                    recipe.m_item            = itemDrop;
                    recipe.m_amount          = item.recipe_amount;
                    recipe.m_minStationLevel = item.minStationLevel;
                    List <Piece.Requirement> reqs = new List <Piece.Requirement>();
                    foreach (RequirementData rd in item.requirements)
                    {
                        Piece.Requirement req = new Piece.Requirement();
                        req.m_amount         = rd.amount;
                        req.m_amountPerLevel = rd.amountPerLevel;
                        req.m_recover        = rd.recover;
                        req.m_resItem        = ObjectDB.instance.GetItemPrefab(rd.name).GetComponent <ItemDrop>();
                        reqs.Add(req);
                    }
                    recipe.m_resources = reqs.ToArray();

                    if (ObjectDB.instance.GetItemPrefab(customObject.name) == null)
                    {
                        Dbgl($"Adding new item {customObject.name} to DB");
                        ObjectDB.instance.m_items.Add(customObject);
                        ((Dictionary <int, GameObject>) typeof(ObjectDB).GetField("m_itemByHash", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ObjectDB.instance)).Add(customObject.name.GetStableHashCode(), customObject);
                    }

                    if (ObjectDB.instance.GetRecipe(itemDrop.m_itemData) == null)
                    {
                        Dbgl($"Adding new recipe {customObject.name} to DB");
                        ObjectDB.instance.m_recipes.Add(recipe);
                    }

                    Traverse.Create(Localization.instance).Method("AddWord", new object[] { item.description_key, item.description });
                }
            }
Example #24
0
        private static bool Prefix(Transform elementRoot, Piece.Requirement req, Player player, bool craft, int quality, ref bool __result)
        {
            if (!Configuration.Current.Hud.IsEnabled && !Configuration.Current.CraftFromChest.IsEnabled || !Configuration.Current.Hud.showRequiredItems && !Configuration.Current.CraftFromChest.IsEnabled)
            {
                return(true);
            }

            Image     component  = elementRoot.transform.Find("res_icon").GetComponent <Image>();
            Text      component2 = elementRoot.transform.Find("res_name").GetComponent <Text>();
            Text      component3 = elementRoot.transform.Find("res_amount").GetComponent <Text>();
            UITooltip component4 = elementRoot.GetComponent <UITooltip>();

            if (req.m_resItem != null)
            {
                component.gameObject.SetActive(true);
                component2.gameObject.SetActive(true);
                component3.gameObject.SetActive(true);
                component.sprite  = req.m_resItem.m_itemData.GetIcon();
                component.color   = Color.white;
                component4.m_text = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                component2.text   = Localization.instance.Localize(req.m_resItem.m_itemData.m_shared.m_name);
                int num    = player.GetInventory().CountItems(req.m_resItem.m_itemData.m_shared.m_name);
                int amount = req.GetAmount(quality);

                if (amount <= 0)
                {
                    InventoryGui.HideRequirement(elementRoot);
                    __result = false;
                    return(false);
                }

                if (Configuration.Current.CraftFromChest.IsEnabled)
                {
                    Stopwatch delta;

                    GameObject pos = player.GetCurrentCraftingStation()?.gameObject;
                    if (!pos || !Configuration.Current.CraftFromChest.checkFromWorkbench)
                    {
                        pos   = player.gameObject;
                        delta = Inventory_NearbyChests_Cache.delta;
                    }
                    else
                    {
                        delta = GameObjectAssistant.GetStopwatch(pos);
                    }

                    int lookupInterval = Helper.Clamp(Configuration.Current.CraftFromChest.lookupInterval, 1, 10) * 1000;
                    if (!delta.IsRunning || delta.ElapsedMilliseconds > lookupInterval)
                    {
                        Inventory_NearbyChests_Cache.chests = InventoryAssistant.GetNearbyChests(pos, Helper.Clamp(Configuration.Current.CraftFromChest.range, 1, 50));
                        delta.Restart();
                    }
                    num += InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(Inventory_NearbyChests_Cache.chests), req.m_resItem.m_itemData);
                }

                component3.text = num + "/" + amount.ToString();

                if (num < amount)
                {
                    component3.color = ((Mathf.Sin(Time.time * 10f) > 0f) ? Color.red : Color.white);
                }
                else
                {
                    component3.color = Color.white;
                }

                component3.fontSize = 14;
                if (component3.text.Length > 5)
                {
                    component3.fontSize -= component3.text.Length - 5;
                }
            }

            __result = true;
            return(false);
        }
Example #25
0
        private static GameObject GetCustomGameObject(string name, bool ready = false)
        {
            CustomItem customItem = customItems[name];
            GameObject baseObject = ObjectDB.instance.GetItemPrefab(customItem.baseItemName);
            GameObject customObject;
            ItemDrop   itemDrop;

            creatingObject = true;
            if (ready)
            {
                customObject = Instantiate(baseObject);
                itemDrop     = customObject.GetComponent <ItemDrop>();
            }
            else
            {
                customObject = new GameObject(name);
                itemDrop     = customObject.AddComponent <ItemDrop>();
                customObject.AddComponent(baseObject.GetComponent <ZNetView>());
                if (baseObject.transform.Find("attach"))
                {
                    Dbgl($"Has attach");
                    Instantiate(baseObject.transform.Find("attach"), customObject.transform);
                }
                else if (baseObject.transform.Find("model"))
                {
                    Dbgl($"Has model");
                    Instantiate(baseObject.transform.Find("model"), customObject.transform);
                }
            }
            creatingObject = false;
            ItemDrop baseItemDrop = baseObject.GetComponent <ItemDrop>();

            customObject.name = name;
            customObject.name = ZNetView.GetPrefabName(customObject);
            objectsToAdd[customObject.name] = customObject;
            customObject.AddComponent <DontDestroy>();
            customItems[name].gameObject = customObject;
            DontDestroyOnLoad(customItems[name].gameObject);


            Dbgl($"baseitemdrop {baseItemDrop?.name} data {baseItemDrop.m_itemData.m_shared.m_name} customObject {customObject?.name}");

            GameObject prefab = Instantiate(objectsToAdd[customObject.name]);

            DontDestroyOnLoad(prefab);
            itemDrop.m_itemData = baseItemDrop.m_itemData.Clone();
            itemDrop.m_itemData.m_dropPrefab = prefab;
            itemDrop.enabled = true;

            Dbgl($"itemdrop {itemDrop.m_itemData.m_dropPrefab.name} data {itemDrop.m_itemData.m_shared.m_name} gameobject {itemDrop.gameObject.name}");

            itemDrop.m_itemData.m_shared = new ItemDrop.ItemData.SharedData
            {
                m_name                    = "$" + customItem.name_key,
                m_dlc                     = customItem.dlc,
                m_itemType                = customItem.itemType,
                m_attachOverride          = customItem.attachOverride,
                m_description             = "$" + customItem.description_key,
                m_maxStackSize            = customItem.maxStackSize,
                m_maxQuality              = customItem.maxQuality,
                m_weight                  = customItem.weight,
                m_value                   = customItem.value,
                m_teleportable            = customItem.teleportable,
                m_questItem               = customItem.questItem,
                m_equipDuration           = customItem.equipDuration,
                m_variants                = customItem.variants,
                m_trophyPos               = customItem.trophyPos,
                m_buildPieces             = customItem.buildPieces,
                m_centerCamera            = customItem.centerCamera,
                m_setName                 = customItem.setName,
                m_setSize                 = customItem.setSize,
                m_setStatusEffect         = customItem.setStatusEffect,
                m_equipStatusEffect       = customItem.equipStatusEffect,
                m_movementModifier        = customItem.movementModifier,
                m_food                    = customItem.food,
                m_foodStamina             = customItem.foodStamina,
                m_foodBurnTime            = customItem.foodBurnTime,
                m_foodRegen               = customItem.foodRegen,
                m_foodColor               = customItem.foodColor,
                m_armorMaterial           = customItem.armorMaterial,
                m_helmetHideHair          = customItem.helmetHideHair,
                m_armor                   = customItem.armor,
                m_armorPerLevel           = customItem.armorPerLevel,
                m_damageModifiers         = customItem.damageModifiers,
                m_blockPower              = customItem.blockPower,
                m_blockPowerPerLevel      = customItem.blockPowerPerLevel,
                m_deflectionForce         = customItem.deflectionForce,
                m_deflectionForcePerLevel = customItem.deflectionForcePerLevel,
                m_timedBlockBonus         = customItem.timedBlockBonus,
                m_animationState          = customItem.animationState,
                m_skillType               = customItem.skillType,
                m_toolTier                = customItem.toolTier,
                m_damages                 = customItem.damages,
                m_damagesPerLevel         = customItem.damagesPerLevel,
                m_attackForce             = customItem.attackForce,
                m_backstabBonus           = customItem.backstabBonus,
                m_dodgeable               = customItem.dodgeable,
                m_blockable               = customItem.blockable,
                m_attackStatusEffect      = customItem.attackStatusEffect,
                m_spawnOnHit              = customItem.spawnOnHit,
                m_spawnOnHitTerrain       = customItem.spawnOnHitTerrain,
                m_attack                  = customItem.attack,
                m_secondaryAttack         = customItem.secondaryAttack,
                m_useDurability           = customItem.useDurability,
                m_destroyBroken           = customItem.destroyBroken,
                m_canBeReparied           = customItem.canBeReparied,
                m_maxDurability           = customItem.maxDurability,
                m_durabilityPerLevel      = customItem.durabilityPerLevel,
                m_useDurabilityDrain      = customItem.useDurabilityDrain,
                m_durabilityDrain         = customItem.durabilityDrain,
                m_holdDurationMin         = customItem.holdDurationMin,
                m_holdStaminaDrain        = customItem.holdStaminaDrain,
                m_holdAnimationState      = customItem.holdAnimationState,
                m_ammoType                = customItem.ammoType,
                m_aiAttackRange           = customItem.aiAttackRange,
                m_aiAttackRangeMin        = customItem.aiAttackRangeMin,
                m_aiAttackInterval        = customItem.aiAttackInterval,
                m_aiAttackMaxAngle        = customItem.aiAttackMaxAngle,
                m_aiWhenFlying            = customItem.aiWhenFlying,
                m_aiWhenWalking           = customItem.aiWhenWalking,
                m_aiWhenSwiming           = customItem.aiWhenSwiming,
                m_aiPrioritized           = customItem.aiPrioritized,
                m_aiTargetType            = customItem.aiTargetType,
                m_hitEffect               = customItem.hitEffect,
                m_hitTerrainEffect        = customItem.hitTerrainEffect,
                m_blockEffect             = customItem.blockEffect,
                m_startEffect             = customItem.startEffect,
                m_holdStartEffect         = customItem.holdStartEffect,
                m_triggerEffect           = customItem.triggerEffect,
                m_trailStartEffect        = customItem.trailStartEffect,
                m_consumeStatusEffect     = customItem.consumeStatusEffect,

                m_icons = baseItemDrop.m_itemData.m_shared.m_icons
            };

            Recipe origRecipe = ObjectDB.instance.GetRecipe(baseItemDrop.m_itemData);

            Recipe recipe = (Recipe)ScriptableObject.CreateInstance("Recipe");

            recipe.m_item            = itemDrop;
            recipe.m_amount          = customItem.recipe_amount;
            recipe.m_minStationLevel = customItem.minStationLevel;
            recipe.m_craftingStation = origRecipe.m_craftingStation;
            recipe.m_repairStation   = origRecipe.m_repairStation;


            //Dbgl($"custom reqs {customItem.requirements.Count}");


            List <Piece.Requirement> reqs = new List <Piece.Requirement>();

            foreach (string str in customItem.requirements)
            {
                RequirementData rd = MakeReqData(str);
                if (rd == null)
                {
                    continue;
                }
                Piece.Requirement req = new Piece.Requirement
                {
                    m_amount         = rd.amount,
                    m_amountPerLevel = rd.amountPerLevel,
                    m_recover        = rd.recover,
                    m_resItem        = ObjectDB.instance.GetItemPrefab(rd.name)?.GetComponent <ItemDrop>()
                };
                // Dbgl($"adding rd {req.m_resItem?.m_itemData?.m_shared?.m_name}");
                reqs.Add(req);
            }

            recipe.m_resources = reqs.ToArray();

            if (ObjectDB.instance.GetItemPrefab(customObject.name) == null)
            {
                Dbgl($"Adding item {customObject.name} to DB");
                ObjectDB.instance.m_items.Add(objectsToAdd[customObject.name]);
                ((Dictionary <int, GameObject>) typeof(ObjectDB).GetField("m_itemByHash", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(ObjectDB.instance)).Add(customObject.name.GetStableHashCode(), objectsToAdd[customObject.name]);
                Dbgl($"Added new item {ObjectDB.instance.GetItemPrefab(customObject.name).name} to DB");
            }

            if (ObjectDB.instance.GetRecipe(itemDrop.m_itemData) == null)
            {
                Dbgl($"Adding recipe {customObject.name} to DB");
                ObjectDB.instance.m_recipes.Add(recipe);
            }
            return(customObject);
        }
Example #26
0
        public void LoadConfig(LazyPieceSettings settings)
        {
            m_resources = new Piece.Requirement[settings.requirements.Length];
            UnityEngine.Debug.Log($"Enumerating reqs {settings.requirements}");
            foreach (var tuple in Utility.enumerate(settings.requirements))
            {
                var itemDef = tuple.Item1;
                var idx     = tuple.Item2;
                UnityEngine.Debug.Log($"Resolving {itemDef.item}");

                m_resources[idx] = new Piece.Requirement {
                    m_resItem = ZNetScene.instance.GetPrefab(itemDef.item).GetComponent <ItemDrop>(),
                    m_amount  = (int)itemDef.amount,
                    m_recover = true
                };
            }

            UnityEngine.Debug.Log($"Enumerating place effects {settings.placeEffects}");
            m_placeEffect.m_effectPrefabs = new EffectList.EffectData[settings.placeEffects.Length];
            foreach (var tuple in Utility.enumerate(settings.placeEffects))
            {
                var fxDef = tuple.Item1;
                var idx   = tuple.Item2;
                UnityEngine.Debug.Log($"Resolving {fxDef.effect}");

                m_placeEffect.m_effectPrefabs[idx] = new EffectList.EffectData {
                    m_prefab  = ZNetScene.instance.GetPrefab(fxDef.effect),
                    m_enabled = true
                };
            }

            UnityEngine.Debug.Log($"Resolving {settings.craftingStation.station}");
            if (settings.craftingStation != null)
            {
                m_craftingStation = ZNetScene.instance.GetPrefab(settings.craftingStation.station).GetComponent <CraftingStation>();
            }

            var wearNTear = GetComponent <WearNTear>();

            UnityEngine.Debug.Log($"Enumerating destroyed effects {settings.destroyedEffects}");
            wearNTear.m_destroyedEffect.m_effectPrefabs = new EffectList.EffectData[settings.destroyedEffects.Length];
            foreach (var tuple in Utility.enumerate(settings.destroyedEffects))
            {
                var fxDef = tuple.Item1;
                var idx   = tuple.Item2;
                UnityEngine.Debug.Log($"Resolving {fxDef.effect}");

                wearNTear.m_destroyedEffect.m_effectPrefabs[idx] = new EffectList.EffectData {
                    m_prefab  = ZNetScene.instance.GetPrefab(fxDef.effect),
                    m_enabled = true
                };
            }

            UnityEngine.Debug.Log($"Enumerating hit effects {settings.hitEffects}");
            wearNTear.m_hitEffect.m_effectPrefabs = new EffectList.EffectData[settings.hitEffects.Length];
            foreach (var tuple in Utility.enumerate(settings.hitEffects))
            {
                var fxDef = tuple.Item1;
                var idx   = tuple.Item2;
                UnityEngine.Debug.Log($"Resolving {fxDef.effect}");

                wearNTear.m_hitEffect.m_effectPrefabs[idx] = new EffectList.EffectData {
                    m_prefab  = ZNetScene.instance.GetPrefab(fxDef.effect),
                    m_enabled = true
                };
            }

            if (settings.itemStand != null)
            {
                UnityEngine.Debug.Log("Resolving itemStand settings");
                var itemStand = GetComponent <ArmorStand>();
                itemStand.m_effects.m_effectPrefabs = new EffectList.EffectData[settings.itemStand.effects.Length];
                foreach (var tuple in Utility.enumerate(settings.itemStand.effects))
                {
                    var fxDef = tuple.Item1;
                    var idx   = tuple.Item2;
                    UnityEngine.Debug.Log($"Resolving {fxDef.effect}");

                    itemStand.m_effects.m_effectPrefabs[idx] = new EffectList.EffectData {
                        m_prefab  = ZNetScene.instance.GetPrefab(fxDef.effect),
                        m_enabled = true
                    };
                }
            }
        }