コード例 #1
0
    //Buys additional Smelters
    public void BuySmelter()
    {
        if (CurrencyControl.Cash >= NewSmelterCost)
        {
            CurrencyControl.Cash -= NewSmelterCost;
            //TODO BETTER FORMULA
            NewSmelterCost       = NewSmelterCost * 5;
            SmelterCostText.text = NewSmelterCost.ToString();
            //int SmelterIndex,int Duration,float CurrentTime,Sprite OutputIcon,bool IsSmelting,int CurrentRecipe
            var Smelter = new Smelter(1, 0, 0, Resources.Load <Sprite>("Bars/1CopperBar"), false, -1);
            Smelters.Add(Smelter);
            var smelterIndex = Smelters.Count;
            //instantiate another smelter
            var copy = Instantiate(SmelterUI);
            copy.transform.SetParent(SmelterContent.transform, false);
            copy.transform.localPosition = Vector3.zero;
            copy.name = ("Smelter" + smelterIndex);
            //to index tou kathe smelter, de xreiazete -1 giati ton prwto tha ton valw na ginete instantiate apo research

            copy.GetComponentsInChildren <Button>()[0].onClick.AddListener(() => {
                //opens recipe panel
                StartCoroutine(WaitForSelection(smelterIndex - 1));
            });
            //CANCEL BUTTON
            //Stops production
            copy.GetComponentsInChildren <Button>()[1].onClick.AddListener(() => {
                StopSmelter(smelterIndex - 1);
            });
            RefSmelterList.Add(copy);
        }
    }
コード例 #2
0
 public static void SetSmelterInputAmounts(Smelter instance)
 {
     if (Configuration.Current.ProductionInputAmounts.IsEnabled)
     {
         var prefab = instance.m_nview.GetPrefabName();
         if (prefab == "piece_spinningwheel")
         {
             instance.m_maxOre = Configuration.Current.ProductionInputAmounts.spinningWheelFlachsAmount;
         }
         else if (prefab == "charcoal_kiln")
         {
             instance.m_maxOre = Configuration.Current.ProductionInputAmounts.kilnWoodAmount;
         }
         else if (prefab == "blastfurnace")
         {
             instance.m_maxOre  = Configuration.Current.ProductionInputAmounts.blastfurnaceOreAmount;
             instance.m_maxFuel = Configuration.Current.ProductionInputAmounts.blastfurnaceCoalAmount;
         }
         else if (prefab == "smelter")
         {
             instance.m_maxOre  = Configuration.Current.ProductionInputAmounts.furnaceOreAmount;
             instance.m_maxFuel = Configuration.Current.ProductionInputAmounts.furnaceCoalAmount;
         }
         else if (prefab == "windmill")
         {
             instance.m_maxOre = Configuration.Current.ProductionInputAmounts.windmillBarleyAmount;
         }
     }
 }
コード例 #3
0
    //unlocks production panel and adds 1st Smelter
    public void BuySmelterResearch()
    {
        if (CurrencyControl.Cash >= 1000)
        {
            CurrencyControl.Cash                 -= 1000;
            ProductionPanelBtn.interactable       = true;
            UnlockProductionResearch.interactable = false;

            //int SmelterIndex,int Duration,float CurrentTime,Sprite OutputIcon,bool IsSmelting,int CurrentRecipe
            var Smelter = new Smelter(1, 0, 0, Resources.Load <Sprite>("Bars/1CopperBar"), false, -1);
            Smelters.Add(Smelter);
            var smelterIndex = Smelters.Count;

            var copy = Instantiate(SmelterUI);
            copy.transform.SetParent(SmelterContent.transform, false);
            copy.transform.localPosition = Vector3.zero;
            copy.name = ("Smelter" + smelterIndex);

            //plin 1 giati ksekinaei apo to 0 kai oxi apo to 1 o pinakas
            copy.GetComponentInChildren <Button>().onClick.AddListener(() => {
                //opens recipe panel
                StartCoroutine(WaitForSelection(smelterIndex - 1));
            });
            //CANCEL BUTTON
            //Stops production
            copy.GetComponentsInChildren <Button>()[1].onClick.AddListener(() => {
                StopSmelter((smelterIndex - 1));
            });
            RefSmelterList.Add(copy);
        }
    }
コード例 #4
0
        public static void PatchSmelter(Smelter smelter)
        {
            if (smelter.m_emptyOreSwitch && smelter.m_spawnStack)
            {
                int processedQueueSize = smelter.GetProcessedQueueSize();
                smelter.m_emptyOreSwitch.m_hoverText = $"{smelter.m_name} {processedQueueSize} $piece_smelter_ready \n{useKey} {smelter.m_emptyOreTooltip}";
            }
            int queueSize = smelter.GetQueueSize();

            smelter.m_addOreSwitch.m_hoverText = $"{smelter.m_name} ({queueSize}/{smelter.m_maxOre}) ";

            if (queueSize > 0) // This codeline is run every tick when windmill is on!!
            {
                Debug.Log($"{smelter.GetBakeTimer()}, {smelter.m_secPerProduct}, {queueSize}");

                smelter.m_addOreSwitch.m_hoverText += $"{Helpers.TimeString(smelter.m_secPerProduct * queueSize - smelter.GetBakeTimer())}";
                // 8sec - 10sec (30sec)
                // 9sec - 10sec (30sec)
            }

            if (smelter.m_requiresRoof && !smelter.m_haveRoof && Mathf.Sin(Time.time * 10f) > 0f)
            {
                Switch addOreSwitch = smelter.m_addOreSwitch;
                addOreSwitch.m_hoverText += $" {smelterRoof}";
            }
            Switch addOreSwitch2 = smelter.m_addOreSwitch;

            addOreSwitch2.m_hoverText = $"{addOreSwitch2.m_hoverText} \n{useKey} {smelter.m_addOreTooltip}";
        }
コード例 #5
0
ファイル: Class1.cs プロジェクト: williamhammond/ValheimPlus
            private static void Prefix(ref Smelter __instance)
            {
                if (Config["Furnace"]["enabled"] == "true")
                {
                    int   MaximumOre      = int.Parse(Config["Furnace"]["maximumOre"]);
                    int   MaximumFuel     = int.Parse(Config["Furnace"]["maximumCoal"]);
                    float ProductionSpeed = toFloat(Config["Furnace"]["productionSpeed"]);
                    int   CoalPerProduct  = int.Parse(Config["Furnace"]["coalUsedPerProduct"]);

                    if (!__instance.m_addWoodSwitch && Config["Kiln"]["enabled"] == "true")
                    {
                        float ProductionSpeed_k = toFloat(Config["Kiln"]["productionSpeed"]);

                        __instance.m_secPerProduct = ProductionSpeed_k;
                    }
                    else
                    {
                        // is furnace
                        __instance.m_maxOre         = MaximumOre;
                        __instance.m_maxFuel        = MaximumFuel;
                        __instance.m_secPerProduct  = ProductionSpeed;
                        __instance.m_fuelPerProduct = CoalPerProduct;
                    }
                }
            }
コード例 #6
0
        private static void SetSmelterInputAmounts(On.Smelter.orig_Awake orig, Smelter self)
        {
            orig(self);

            var prefab = self.m_nview.GetPrefabName();

            if (prefab == "piece_spinningwheel")
            {
                self.m_maxOre = ConfigUtil.Get <int>("ProductionInputAmounts", "spinningWheelFlachsAmount");
            }
            else if (prefab == "charcoal_kiln")
            {
                self.m_maxOre = ConfigUtil.Get <int>("ProductionInputAmounts", "kilnWoodAmount");
            }
            else if (prefab == "blastfurnace")
            {
                self.m_maxOre  = ConfigUtil.Get <int>("ProductionInputAmounts", "blastfurnaceOreAmount");
                self.m_maxFuel = ConfigUtil.Get <int>("ProductionInputAmounts", "blastfurnaceCoalAmount");
            }
            else if (prefab == "smelter")
            {
                self.m_maxOre  = ConfigUtil.Get <int>("ProductionInputAmounts", "furnaceOreAmount");
                self.m_maxFuel = ConfigUtil.Get <int>("ProductionInputAmounts", "furnaceCoalAmount");
            }
            else if (prefab == "windmill")
            {
                self.m_maxOre = ConfigUtil.Get <int>("ProductionInputAmounts", "windmillBarleyAmount");
            }
        }
コード例 #7
0
    void NewBlock()
    {
        GameObject     b      = new GameObject(blockName);
        Block          bBlock = b.AddComponent <Block>();
        SpriteRenderer s      = b.AddComponent <SpriteRenderer>();

        b.AddComponent <Snap>();
        b.AddComponent <BoxCollider2D>();
        if (addSmelter)
        {
            Smelter smelt = b.AddComponent <Smelter>();
            smelt.recipe      = recipe;
            smelt.smelterTier = smelterTier;
            if (recipe == null && cancelIfRecipeIsNull)
            {
                Destroy(b);
                Debug.LogError("Error!, can't spawn the object because the smelter recipe is null, change it and try again");
                return;
            }
        }

        bBlock.breakTime          = blockBreakingTime;
        bBlock.minimumMiningPower = blockMinimumMiningPower;
        s.color              = blockColor;
        s.sprite             = blockSprite;
        b.transform.position = Vector3.zero;
        Debug.Log("Block created at " + Vector3.zero);
    }
コード例 #8
0
ファイル: SmelterMod.cs プロジェクト: iliwili/QualityOfLife
        public static void StartSmelter(ref Smelter __instance)
        {
            if (QualityOfLife.EnableSmelterModification.Value)
            {
                QualityOfLife.Log.LogInfo(__instance.m_name);
                switch (__instance.m_name)
                {
                case "$piece_smelter":
                    __instance.m_maxOre  *= QualityOfLife.SmelterOreMultiplier.Value;
                    __instance.m_maxFuel *= QualityOfLife.SmelterFuelMultiplier.Value;

                    if (QualityOfLife.SmelterFuelPerProduct.Value >= 1 && QualityOfLife.SmelterSecPerProduct.Value >= 1)
                    {
                        __instance.m_fuelPerProduct = QualityOfLife.SmelterFuelPerProduct.Value;
                        __instance.m_secPerProduct  = QualityOfLife.SmelterSecPerProduct.Value;
                    }
                    else
                    {
                        QualityOfLife.Log.LogInfo("Smelter fuel per product or smelter sec per product is too low, lowest is 1.");
                    }
                    break;

                case "$piece_blastfurnace":
                    __instance.m_maxOre  *= QualityOfLife.BlastFurnaceOreMultiplier.Value;
                    __instance.m_maxFuel *= QualityOfLife.BlastFurnaceFuelMultiplier.Value;

                    if (QualityOfLife.BlastFurnaceFuelPerProduct.Value >= 1 && QualityOfLife.BlastFurnaceSecPerProduct.Value >= 1)
                    {
                        __instance.m_fuelPerProduct = QualityOfLife.BlastFurnaceFuelPerProduct.Value;
                        __instance.m_secPerProduct  = QualityOfLife.BlastFurnaceSecPerProduct.Value;
                    }
                    else
                    {
                        QualityOfLife.Log.LogInfo("Blast Furnace fuel per product or smelter sec per product is too low, lowest is 1.");
                    }
                    break;

                case "$piece_charcoalkiln":
                    __instance.m_maxOre *= QualityOfLife.CharcoalKilnMultiplier.Value;

                    if (QualityOfLife.CharcoalKilnSecPerProduct.Value >= 1)
                    {
                        __instance.m_secPerProduct = QualityOfLife.CharcoalKilnSecPerProduct.Value;
                    }
                    else
                    {
                        QualityOfLife.Log.LogInfo("Charcoal Kiln sec per product is too low, lowest is 1.");
                    }
                    break;

                default:
                    break;
                }
            }
            else
            {
                QualityOfLife.Log.LogInfo("Smelter mod is disabled.");
            }
        }
コード例 #9
0
            static void Prefix(Smelter __instance)
            {
                SurtlingCoreOverclocking surtlingCoreOverclocking = __instance.GetComponentInParent <SurtlingCoreOverclocking>();

                if (surtlingCoreOverclocking == null)
                {
                    logger.LogInfo("Adding SurtlingCoreOverclocking Component to smelter");
                    __instance.gameObject.AddComponent <SurtlingCoreOverclocking>();
                }
            }
コード例 #10
0
 private static void Postfix(Smelter __instance)
 {
     try
     {
         PostfixEvent?.Invoke(__instance);
     }
     catch (Exception ex)
     {
         Logger.LogError(ex.Message + Environment.NewLine + ex.StackTrace);
     }
 }
コード例 #11
0
ファイル: Smelter.cs プロジェクト: valheimPlus/ValheimPlus
        private static bool PreventUsingSpecificWood(Smelter smelter, Smelter.ItemConversion itemConversion)
        {
            if (smelter.m_name.Equals(SmelterDefinitions.KilnName))
            {
                if (Configuration.Current.Kiln.dontProcessFineWood && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(WoodDefinitions.FineWoodName) ||
                    Configuration.Current.Kiln.dontProcessRoundLog && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(WoodDefinitions.RoundLogName))
                {
                    return(true);
                }
            }

            return(false);
        }
コード例 #12
0
            static void Postfix(Smelter __instance, float __result)
            {
                SurtlingCoreOverclocking surtlingCoreOverclocking = __instance.GetComponentInParent <SurtlingCoreOverclocking>();

                if (surtlingCoreOverclocking)
                {
                    surtlingCoreOverclocking.OnGetFuel(__result);
                }
                else
                {
                    logger.LogWarning("No SurtlingCoreOverclocking component on smelter " + __instance.transform.position);
                }
            }
コード例 #13
0
            static void Prefix(Smelter __instance, ref float fuel)
            {
                SurtlingCoreOverclocking surtlingCoreOverclocking = __instance.GetComponentInParent <SurtlingCoreOverclocking>();

                if (surtlingCoreOverclocking)
                {
                    fuel = surtlingCoreOverclocking.OnSetFuel(fuel);
                }
                else
                {
                    logger.LogWarning("No SurtlingCoreOverclocking component on smelter " + __instance.transform.position);
                }
            }
コード例 #14
0
        private void UpdateSmelterValues()
        {
            if (!this.m_nview.IsValid())
            {
                return;
            }
            Smelter smelter = GetComponent <Smelter>();

            float speedMultiplier = (float)GetSpeedMultiplier(GetSpeedCoreCount(), GetEfficiencyCoreCount(), GetProductivityCoreCount());

            Debug.Log("SpeedMultiplier: " + speedMultiplier);
            smelter.m_secPerProduct = original_m_secPerProduct / speedMultiplier;
            Debug.Log("Updated Smelter.m_secPerProduct from " + original_m_secPerProduct + " to " + smelter.m_secPerProduct);
        }
コード例 #15
0
            static void Prefix(Smelter __instance, string ore, ref int stack)
            {
                SurtlingCoreOverclocking surtlingCoreOverclocking = __instance.GetComponentInParent <SurtlingCoreOverclocking>();

                if (surtlingCoreOverclocking)
                {
                    int aditional = surtlingCoreOverclocking.OnSpawn(ore);
                    stack += aditional;
                }
                else
                {
                    logger.LogWarning("No SurtlingCoreOverclocking component on smelter " + __instance.transform.position);
                }
            }
コード例 #16
0
        private static void CalculateSmelterBakeTime(Smelter smelter)
        {
            double deltaTime   = smelter.GetDeltaTime();
            float  accumulator = smelter.GetAccumulator();

            accumulator += (float)deltaTime;
            float power = smelter.m_windmill ? smelter.m_windmill.GetPowerOutput() : 1f;

            while (accumulator >= 1f)
            {
                accumulator -= 1f;
                float  fuel      = smelter.GetFuel();
                string queuedOre = smelter.GetQueuedOre();
                if ((smelter.m_maxFuel == 0 || fuel > 0f) && queuedOre != "" && smelter.m_secPerProduct > 0f && (!smelter.m_requiresRoof || smelter.m_haveRoof))
                {
                    float speed = 1f * power;
                    if (smelter.m_maxFuel > 0)
                    {
                        float usage = smelter.m_secPerProduct / (float)smelter.m_fuelPerProduct;
                        fuel -= speed / usage;
                        if (fuel < 0f)
                        {
                            fuel = 0f;
                        }
                        smelter.SetFuel(fuel);
                    }
                    float bakeTime = smelter.GetBakeTimer();
                    bakeTime += speed;
                    smelter.SetBakeTimer(bakeTime);
                    if (bakeTime > smelter.m_secPerProduct)
                    {
                        smelter.SetBakeTimer(0f);
                        smelter.RemoveOneOre();
                        smelter.QueueProcessed(queuedOre);
                    }
                }
            }

            if (smelter.GetQueuedOre() == "" || ((float)smelter.m_maxFuel > 0f && smelter.GetFuel() == 0f))
            {
                smelter.SpawnProcessed();
            }

            smelter.SetAccumulator(accumulator);
        }
コード例 #17
0
 public static void Postfix(Smelter __instance)
 {
     if (ItsJustWood.AllowAncientBarkForCoal.Value)
     {
         var ancientWood    = ObjectDB.instance.GetItemPrefab("ElderBark").GetComponent <ItemDrop>();
         var itemConversion = __instance.m_conversion.Find(x => x.m_from == ancientWood);
         if (itemConversion == null)
         {
             var coal = ObjectDB.instance.GetItemPrefab("Coal").GetComponent <ItemDrop>();
             itemConversion = new Smelter.ItemConversion()
             {
                 m_from = ancientWood,
                 m_to   = coal
             };
             __instance.m_conversion.Add(itemConversion);
         }
     }
 }
コード例 #18
0
            static void Postfix(Smelter __instance, ZNetView ___m_nview)
            {
                if (!Player.m_localPlayer || !isOn.Value || ___m_nview == null || !___m_nview.IsOwner())
                {
                    return;
                }

                if (Time.time - lastFuel < 0.1)
                {
                    fuelCount++;
                    RefuelSmelter(__instance, ___m_nview, fuelCount * 33);
                }
                else
                {
                    fuelCount = 0;
                    lastFuel  = Time.time;
                    RefuelSmelter(__instance, ___m_nview, 0);
                }
            }
コード例 #19
0
        static void BlastFurnacePatch(ref Smelter __instance)
        {
            if (__instance.m_name != "$piece_blastfurnace")
            {
                //UnityEngine.Debug.Log("Ignored non-blast furnace smelter.");
                return;
            }
            //UnityEngine.Debug.Log("Found a blast furnace! Applying fix.");

            ObjectDB        instance  = ObjectDB.instance;
            List <ItemDrop> materials = instance.GetAllItems(ItemDrop.ItemData.ItemType.Material, "");

            foreach (ItemDrop material in materials)
            {
                if (BFFix.metals.Keys.Contains(material.m_itemData.m_shared.m_name))
                {
                    //UnityEngine.Debug.Log("Adding " + material.m_itemData.m_shared.m_name + " to list of materials.");
                    BFFix.metals[material.m_itemData.m_shared.m_name] = material;
                }
            }

            List <Smelter.ItemConversion> conversions = new List <Smelter.ItemConversion>()
            {
                new Smelter.ItemConversion {
                    m_from = BFFix.metals["$item_copperore"], m_to = BFFix.metals["$item_copper"]
                },
                new Smelter.ItemConversion {
                    m_from = BFFix.metals["$item_tinore"], m_to = BFFix.metals["$item_tin"]
                },
                new Smelter.ItemConversion {
                    m_from = BFFix.metals["$item_ironscrap"], m_to = BFFix.metals["$item_iron"]
                },
                new Smelter.ItemConversion {
                    m_from = BFFix.metals["$item_silverore"], m_to = BFFix.metals["$item_silver"]
                }
            };

            foreach (Smelter.ItemConversion conversion in conversions)
            {
                __instance.m_conversion.Add(conversion);
            }
        }
コード例 #20
0
            static bool Prefix(Smelter __instance, ref bool __result, ZNetView ___m_nview, Humanoid user, ItemDrop.ItemData item)
            {
                if (!AllowByKey() || user.GetInventory().HaveItem(__instance.m_fuelItem.m_itemData.m_shared.m_name) || item != null)
                {
                    return(true);
                }

                if (((float)typeof(Smelter).GetMethod("GetFuel", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { })) > __instance.m_maxFuel - 1)
                {
                    user.Message(MessageHud.MessageType.Center, "$msg_itsfull", 0, null);
                    return(false);
                }

                Dbgl($"missing fuel in player inventory");

                List <Container> nearbyContainers = GetNearbyContainers(__instance.transform.position);

                foreach (Container c in nearbyContainers)
                {
                    ItemDrop.ItemData newItem = c.GetInventory().GetItem(__instance.m_fuelItem.m_itemData.m_shared.m_name);
                    if (newItem != null)
                    {
                        if (fuelDisallowTypes.Value.Split(',').Contains(newItem.m_dropPrefab.name))
                        {
                            Dbgl($"container at {c.transform.position} has {newItem.m_stack} {newItem.m_dropPrefab.name} but it's forbidden by config");
                            continue;
                        }

                        Dbgl($"container at {c.transform.position} has {newItem.m_stack} {newItem.m_dropPrefab.name}, taking one");

                        user.Message(MessageHud.MessageType.Center, "$msg_added " + __instance.m_fuelItem.m_itemData.m_shared.m_name, 0, null);
                        ___m_nview.InvokeRPC("AddFuel", new object[] { });
                        c.GetInventory().RemoveItem(__instance.m_fuelItem.m_itemData.m_shared.m_name, 1);
                        typeof(Container).GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c, new object[] { });
                        typeof(Inventory).GetMethod("Changed", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c.GetInventory(), new object[] { });

                        __result = true;
                        return(false);
                    }
                }
                return(true);
            }
コード例 #21
0
            private static void Prefix(ref Smelter __instance)
            {
                if (Conf.Furnace != null)
                {
                    if (!__instance.m_addWoodSwitch && Conf.Kiln != null)
                    {
                        float ProductionSpeed_k = Conf.Kiln.ProductionSpeed;//toFloat(Config["Kiln"]["productionSpeed"]);

                        __instance.m_secPerProduct = ProductionSpeed_k;
                    }
                    else
                    {
                        // is furnace
                        __instance.m_maxOre         = Conf.Furnace.MaximumOre;
                        __instance.m_maxFuel        = Conf.Furnace.MaximumCoal;
                        __instance.m_secPerProduct  = Conf.Furnace.ProductionSpeed;
                        __instance.m_fuelPerProduct = Conf.Furnace.CoalUsedPerProduct;
                    }
                }
            }
コード例 #22
0
        private static bool Prefix(Smelter __instance)
        {
            var cancel = false;

            BlockingPrefixEvent?.Invoke(__instance, ref cancel);

            if (!cancel)
            {
                try
                {
                    PrefixEvent?.Invoke(__instance);
                }
                catch (Exception ex)
                {
                    Logger.LogError(ex.Message + Environment.NewLine + ex.StackTrace);
                }
            }

            return(!cancel);
        }
コード例 #23
0
 private static void Prefix(ref Smelter __instance)
 {
     if (!__instance.m_addWoodSwitch && Settings.isEnabled("Kiln"))
     {
         // is kiln
         __instance.m_maxOre        = Settings.getInt("Kiln", "maximumWood");
         __instance.m_secPerProduct = Settings.getFloat("Kiln", "productionSpeed");
     }
     else
     {
         // is furnace
         if (Settings.isEnabled("Furnace"))
         {
             __instance.m_maxOre         = Settings.getInt("Furnace", "maximumOre");
             __instance.m_maxFuel        = Settings.getInt("Furnace", "maximumCoal");
             __instance.m_secPerProduct  = Settings.getFloat("Furnace", "productionSpeed");
             __instance.m_fuelPerProduct = Settings.getInt("Furnace", "coalUsedPerProduct");
         }
     }
 }
コード例 #24
0
 private static void Prefix(ref Smelter __instance)
 {
     if (!__instance.m_addWoodSwitch)
     {
         // is kiln
         if (Configuration.Current.Kiln.IsEnabled)
         {
             __instance.m_maxOre        = Configuration.Current.Kiln.maximumWood;
             __instance.m_secPerProduct = Configuration.Current.Kiln.productionSpeed;
         }
     }
     else
     {
         // is furnace
         if (Configuration.Current.Furnace.IsEnabled)
         {
             __instance.m_maxOre         = Configuration.Current.Furnace.maximumOre;
             __instance.m_maxFuel        = Configuration.Current.Furnace.maximumCoal;
             __instance.m_secPerProduct  = Configuration.Current.Furnace.productionSpeed;
             __instance.m_fuelPerProduct = Configuration.Current.Furnace.coalUsedPerProduct;
         }
     }
 }
コード例 #25
0
ファイル: Smelter.cs プロジェクト: valheimPlus/ValheimPlus
        private static void Prefix(ref Smelter __instance)
        {
            if (__instance.m_name.Equals(SmelterDefinitions.KilnName) && Configuration.Current.Kiln.IsEnabled)
            {
                __instance.m_maxOre        = Configuration.Current.Kiln.maximumWood;
                __instance.m_secPerProduct = Configuration.Current.Kiln.productionSpeed;
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.SmelterName) && Configuration.Current.Smelter.IsEnabled)
            {
                __instance.m_maxOre         = Configuration.Current.Smelter.maximumOre;
                __instance.m_maxFuel        = Configuration.Current.Smelter.maximumCoal;
                __instance.m_secPerProduct  = Configuration.Current.Smelter.productionSpeed;
                __instance.m_fuelPerProduct = Configuration.Current.Smelter.coalUsedPerProduct;
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.FurnaceName) && Configuration.Current.Furnace.IsEnabled)
            {
                __instance.m_maxOre         = Configuration.Current.Furnace.maximumOre;
                __instance.m_maxFuel        = Configuration.Current.Furnace.maximumCoal;
                __instance.m_secPerProduct  = Configuration.Current.Furnace.productionSpeed;
                __instance.m_fuelPerProduct = Configuration.Current.Furnace.coalUsedPerProduct;

                if (Configuration.Current.Furnace.allowAllOres)
                {
                    __instance.m_conversion.AddRange(FurnaceDefinitions.AdditionalConversions);
                }
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.WindmillName) && Configuration.Current.Windmill.IsEnabled)
            {
                __instance.m_maxOre        = Configuration.Current.Windmill.maximumBarley;
                __instance.m_secPerProduct = Configuration.Current.Windmill.productionSpeed;
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.SpinningWheelName) && Configuration.Current.SpinningWheel.IsEnabled)
            {
                __instance.m_maxOre        = Configuration.Current.SpinningWheel.maximumFlax;
                __instance.m_secPerProduct = Configuration.Current.SpinningWheel.productionSpeed;
            }
        }
コード例 #26
0
            static void Postfix(Smelter __instance, ref ItemDrop.ItemData __result)
            {
                if (!AllowByKey() || __result != null || ((int)typeof(Smelter).GetMethod("GetQueueSize", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(__instance, new object[] { })) >= __instance.m_maxOre)
                {
                    return;
                }

                Dbgl($"missing cookable in player inventory");


                List <Container> nearbyContainers = GetNearbyContainers(__instance.transform.position);

                foreach (Smelter.ItemConversion itemConversion in __instance.m_conversion)
                {
                    foreach (Container c in nearbyContainers)
                    {
                        ItemDrop.ItemData item = c.GetInventory().GetItem(itemConversion.m_from.m_itemData.m_shared.m_name);
                        if (item != null)
                        {
                            if (oreDisallowTypes.Value.Split(',').Contains(item.m_dropPrefab.name))
                            {
                                Dbgl($"container at {c.transform.position} has {item.m_stack} {item.m_dropPrefab.name} but it's forbidden by config");
                                continue;
                            }


                            Dbgl($"container at {c.transform.position} has {item.m_stack} {item.m_dropPrefab.name}, taking one");
                            __result = item;
                            c.GetInventory().RemoveItem(itemConversion.m_from.m_itemData.m_shared.m_name, 1);
                            typeof(Container).GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c, new object[] { });
                            typeof(Inventory).GetMethod("Changed", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c.GetInventory(), new object[] { });
                            return;
                        }
                    }
                }
            }
コード例 #27
0
        public static async void RefuelSmelter(Smelter __instance, ZNetView ___m_nview, int delay)
        {
            await Task.Delay(delay);

            int maxOre  = __instance.m_maxOre - Traverse.Create(__instance).Method("GetQueueSize").GetValue <int>();
            int maxFuel = __instance.m_maxFuel - Mathf.CeilToInt(___m_nview.GetZDO().GetFloat("fuel", 0f));


            List <Container> nearbyOreContainers  = GetNearbyContainers(__instance.transform.position, smelterOreRange.Value);
            List <Container> nearbyFuelContainers = GetNearbyContainers(__instance.transform.position, smelterFuelRange.Value);

            Vector3 position = __instance.transform.position + Vector3.up;

            foreach (Collider collider in Physics.OverlapSphere(position, dropRange.Value, LayerMask.GetMask(new string[] { "item" })))
            {
                if (collider?.attachedRigidbody)
                {
                    ItemDrop item = collider.attachedRigidbody.GetComponent <ItemDrop>();
                    //Dbgl($"nearby item name: {item.m_itemData.m_dropPrefab.name}");

                    if (item?.GetComponent <ZNetView>()?.IsValid() != true)
                    {
                        continue;
                    }

                    string name = GetPrefabName(item.gameObject.name);

                    foreach (Smelter.ItemConversion itemConversion in __instance.m_conversion)
                    {
                        if (item.m_itemData.m_shared.m_name == itemConversion.m_from.m_itemData.m_shared.m_name && maxOre > 0)
                        {
                            if (oreDisallowTypes.Value.Split(',').Contains(name))
                            {
                                //Dbgl($"container at {c.transform.position} has {item.m_itemData.m_stack} {item.m_dropPrefab.name} but it's forbidden by config");
                                continue;
                            }

                            Dbgl($"auto adding ore {name} from ground");

                            int amount = Mathf.Min(item.m_itemData.m_stack, maxOre);
                            maxOre -= amount;

                            for (int i = 0; i < amount; i++)
                            {
                                if (item.m_itemData.m_stack <= 1)
                                {
                                    if (___m_nview.GetZDO() == null)
                                    {
                                        Destroy(item.gameObject);
                                    }
                                    else
                                    {
                                        ZNetScene.instance.Destroy(item.gameObject);
                                    }
                                    ___m_nview.InvokeRPC("AddOre", new object[] { name });
                                    break;
                                }

                                item.m_itemData.m_stack--;
                                ___m_nview.InvokeRPC("AddOre", new object[] { name });
                                Traverse.Create(item).Method("Save").GetValue();
                            }
                        }
                    }

                    if (__instance.m_fuelItem && item.m_itemData.m_shared.m_name == __instance.m_fuelItem.m_itemData.m_shared.m_name && maxFuel > 0)
                    {
                        if (fuelDisallowTypes.Value.Split(',').Contains(name))
                        {
                            //Dbgl($"ground has {item.m_itemData.m_dropPrefab.name} but it's forbidden by config");
                            continue;
                        }

                        Dbgl($"auto adding fuel {name} from ground");

                        int amount = Mathf.Min(item.m_itemData.m_stack, maxFuel);
                        maxFuel -= amount;

                        for (int i = 0; i < amount; i++)
                        {
                            if (item.m_itemData.m_stack <= 1)
                            {
                                if (___m_nview.GetZDO() == null)
                                {
                                    Destroy(item.gameObject);
                                }
                                else
                                {
                                    ZNetScene.instance.Destroy(item.gameObject);
                                }
                                ___m_nview.InvokeRPC("AddFuel", new object[] { });
                                break;
                            }

                            item.m_itemData.m_stack--;
                            ___m_nview.InvokeRPC("AddFuel", new object[] { });
                            Traverse.Create(item).Method("Save").GetValue();
                        }
                    }
                }
            }

            foreach (Container c in nearbyOreContainers)
            {
                foreach (Smelter.ItemConversion itemConversion in __instance.m_conversion)
                {
                    ItemDrop.ItemData oreItem = c.GetInventory().GetItem(itemConversion.m_from.m_itemData.m_shared.m_name);

                    if (oreItem != null && maxOre > 0)
                    {
                        maxOre--;
                        if (oreDisallowTypes.Value.Split(',').Contains(oreItem.m_dropPrefab.name))
                        {
                            continue;
                        }

                        Dbgl($"container at {c.transform.position} has {oreItem.m_stack} {oreItem.m_dropPrefab.name}, taking one");

                        ___m_nview.InvokeRPC("AddOre", new object[] { oreItem.m_dropPrefab?.name });
                        c.GetInventory().RemoveItem(itemConversion.m_from.m_itemData.m_shared.m_name, 1);
                        typeof(Container).GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c, new object[] { });
                        typeof(Inventory).GetMethod("Changed", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c.GetInventory(), new object[] { });
                    }
                }
            }
            foreach (Container c in nearbyFuelContainers)
            {
                if (__instance.m_fuelItem && maxFuel > 0)
                {
                    ItemDrop.ItemData fuelItem = c.GetInventory().GetItem(__instance.m_fuelItem.m_itemData.m_shared.m_name);
                    if (fuelItem != null)
                    {
                        maxFuel--;
                        if (fuelDisallowTypes.Value.Split(',').Contains(fuelItem.m_dropPrefab.name))
                        {
                            //Dbgl($"container at {c.transform.position} has {item.m_stack} {item.m_dropPrefab.name} but it's forbidden by config");
                            continue;
                        }

                        Dbgl($"container at {c.transform.position} has {fuelItem.m_stack} {fuelItem.m_dropPrefab.name}, taking one");

                        ___m_nview.InvokeRPC("AddFuel", new object[] { });

                        c.GetInventory().RemoveItem(__instance.m_fuelItem.m_itemData.m_shared.m_name, 1);
                        typeof(Container).GetMethod("Save", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c, new object[] { });
                        typeof(Inventory).GetMethod("Changed", BindingFlags.NonPublic | BindingFlags.Instance).Invoke(c.GetInventory(), new object[] { });
                    }
                }
            }
        }
コード例 #28
0
 public static void Postfix(Smelter __instance)
 {
     //__instance. += $"\n[<color=yellow><b>{WorkshopImprovementsConfig.LoadMaxHotkey}</b></color>] Load maximum " + __instance.m_fuelItem
 }
コード例 #29
0
ファイル: Smelter.cs プロジェクト: valheimPlus/ValheimPlus
        private static bool Prefix(string ore, int stack, ref Smelter __instance)
        {
            Smelter smelter = __instance; // allowing access to local function

            if (!smelter.m_nview.IsOwner())
            {
                return(true);
            }

            if (__instance.m_name.Equals(SmelterDefinitions.KilnName) && Configuration.Current.Kiln.IsEnabled && Configuration.Current.Kiln.autoDeposit)
            {
                return(spawn(Helper.Clamp(Configuration.Current.Kiln.autoRange, 1, 50), Configuration.Current.Kiln.ignorePrivateAreaCheck));
            }
            if (__instance.m_name.Equals(SmelterDefinitions.SmelterName) && Configuration.Current.Smelter.IsEnabled && Configuration.Current.Smelter.autoDeposit)
            {
                return(spawn(Helper.Clamp(Configuration.Current.Smelter.autoRange, 1, 50), Configuration.Current.Smelter.ignorePrivateAreaCheck));
            }
            if (__instance.m_name.Equals(SmelterDefinitions.FurnaceName) && Configuration.Current.Furnace.IsEnabled && Configuration.Current.Furnace.autoDeposit)
            {
                return(spawn(Helper.Clamp(Configuration.Current.Furnace.autoRange, 1, 50), Configuration.Current.Furnace.ignorePrivateAreaCheck));
            }
            if (__instance.m_name.Equals(SmelterDefinitions.WindmillName) && Configuration.Current.Windmill.IsEnabled && Configuration.Current.Windmill.autoDeposit)
            {
                return(spawn(Helper.Clamp(Configuration.Current.Windmill.autoRange, 1, 50), Configuration.Current.Windmill.ignorePrivateAreaCheck));
            }
            if (__instance.m_name.Equals(SmelterDefinitions.SpinningWheelName) && Configuration.Current.SpinningWheel.IsEnabled && Configuration.Current.SpinningWheel.autoDeposit)
            {
                return(spawn(Helper.Clamp(Configuration.Current.SpinningWheel.autoRange, 1, 50), Configuration.Current.Windmill.ignorePrivateAreaCheck));
            }
            bool spawn(float autoDepositRange, bool ignorePrivateAreaCheck)
            {
                List <Container> nearbyChests = InventoryAssistant.GetNearbyChests(smelter.gameObject, autoDepositRange, !ignorePrivateAreaCheck);

                if (nearbyChests.Count == 0)
                {
                    return(true);
                }

                if (autoDepositRange > 50)
                {
                    autoDepositRange = 50;
                }
                else if (autoDepositRange < 1)
                {
                    autoDepositRange = 1;
                }

                // Replicating original code, just "spawning/adding" the item inside the chest makes it "not have a prefab"
                GameObject itemPrefab = ObjectDB.instance.GetItemPrefab(smelter.GetItemConversion(ore).m_to.gameObject.name);

                // Also replication of original code, really have no idead what it is for, didn't bother look
                ZNetView.m_forceDisableInit = true;
                GameObject spawnedOre = Object.Instantiate <GameObject>(itemPrefab);

                ZNetView.m_forceDisableInit = false;

                // assign stack size, nobody wants a 0/20 stack of metals (its not very usefull)
                ItemDrop comp = spawnedOre.GetComponent <ItemDrop>();

                comp.m_itemData.m_stack = stack;

                bool result = spawnNearbyChest(true);

                Object.Destroy(spawnedOre);

                bool spawnNearbyChest(bool mustHaveItem)
                {
                    foreach (Container chest in nearbyChests)
                    {
                        Inventory cInventory = chest.GetInventory();
                        if (mustHaveItem && !cInventory.HaveItem(comp.m_itemData.m_shared.m_name))
                        {
                            continue;
                        }

                        bool added = cInventory.AddItem(comp.m_itemData);
                        if (!added)
                        {
                            // Chest full, move to the next
                            continue;
                        }

                        smelter.m_produceEffects.Create(smelter.transform.position, smelter.transform.rotation, null, 1f);
                        InventoryAssistant.ConveyContainerToNetwork(chest);
                        return(false);
                    }

                    if (mustHaveItem)
                    {
                        return(spawnNearbyChest(false));
                    }

                    return(true);
                }

                return(result);
            }

            return(true);
        }
コード例 #30
0
ファイル: Smelter.cs プロジェクト: valheimPlus/ValheimPlus
        static void Prefix(Smelter __instance)
        {
            if (__instance == null || !Player.m_localPlayer || __instance.m_nview == null || !__instance.m_nview.IsOwner())
            {
                return;
            }

            Smelter smelter = __instance;

            Stopwatch delta = GameObjectAssistant.GetStopwatch(smelter.gameObject);

            if (delta.IsRunning && delta.ElapsedMilliseconds < 1000)
            {
                return;
            }
            delta.Restart();

            float autoFuelRange          = 0f;
            bool  ignorePrivateAreaCheck = false;
            bool  isKiln = false;

            if (smelter.m_name.Equals(SmelterDefinitions.KilnName))
            {
                if (!Configuration.Current.Kiln.IsEnabled || !Configuration.Current.Kiln.autoFuel)
                {
                    return;
                }
                isKiln                 = true;
                autoFuelRange          = Configuration.Current.Kiln.autoRange;
                ignorePrivateAreaCheck = Configuration.Current.Kiln.ignorePrivateAreaCheck;
            }
            else if (smelter.m_name.Equals(SmelterDefinitions.SmelterName))
            {
                if (!Configuration.Current.Smelter.IsEnabled || !Configuration.Current.Smelter.autoFuel)
                {
                    return;
                }
                autoFuelRange          = Configuration.Current.Smelter.autoRange;
                ignorePrivateAreaCheck = Configuration.Current.Smelter.ignorePrivateAreaCheck;
            }
            else if (smelter.m_name.Equals(SmelterDefinitions.FurnaceName))
            {
                if (!Configuration.Current.Furnace.IsEnabled || !Configuration.Current.Furnace.autoFuel)
                {
                    return;
                }
                autoFuelRange          = Configuration.Current.Furnace.autoRange;
                ignorePrivateAreaCheck = Configuration.Current.Furnace.ignorePrivateAreaCheck;
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.WindmillName))
            {
                if (!Configuration.Current.Windmill.IsEnabled || !Configuration.Current.Windmill.autoFuel)
                {
                    return;
                }
                autoFuelRange          = Configuration.Current.Windmill.autoRange;
                ignorePrivateAreaCheck = Configuration.Current.Windmill.ignorePrivateAreaCheck;
            }
            else if (__instance.m_name.Equals(SmelterDefinitions.SpinningWheelName))
            {
                if (!Configuration.Current.SpinningWheel.IsEnabled || !Configuration.Current.SpinningWheel.autoFuel)
                {
                    return;
                }
                autoFuelRange          = Configuration.Current.SpinningWheel.autoRange;
                ignorePrivateAreaCheck = Configuration.Current.SpinningWheel.ignorePrivateAreaCheck;
            }

            autoFuelRange = Helper.Clamp(autoFuelRange, 1, 50);

            int toMaxOre  = smelter.m_maxOre - smelter.GetQueueSize();
            int toMaxFuel = smelter.m_maxFuel - (int)System.Math.Ceiling(smelter.GetFuel());

            if (smelter.m_fuelItem && toMaxFuel > 0)
            {
                ItemDrop.ItemData fuelItemData = smelter.m_fuelItem.m_itemData;

                // Check for fuel in nearby containers
                int addedFuel = InventoryAssistant.RemoveItemInAmountFromAllNearbyChests(smelter.gameObject, autoFuelRange, fuelItemData, toMaxFuel, !ignorePrivateAreaCheck);
                for (int i = 0; i < addedFuel; i++)
                {
                    smelter.m_nview.InvokeRPC("AddFuel", new object[] { });
                }
                if (addedFuel > 0)
                {
                    ZLog.Log("Added " + addedFuel + " fuel(" + fuelItemData.m_shared.m_name + ") in " + smelter.m_name);
                }
            }
            if (toMaxOre > 0)
            {
                List <Container> nearbyChests = InventoryAssistant.GetNearbyChests(smelter.gameObject, autoFuelRange);
                foreach (Container c in nearbyChests)
                {
                    foreach (Smelter.ItemConversion itemConversion in smelter.m_conversion)
                    {
                        if (isKiln)
                        {
                            if (Configuration.Current.Kiln.dontProcessFineWood && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(WoodDefinitions.FineWoodName))
                            {
                                continue;
                            }
                            if (Configuration.Current.Kiln.dontProcessRoundLog && itemConversion.m_from.m_itemData.m_shared.m_name.Equals(WoodDefinitions.RoundLogName))
                            {
                                continue;
                            }

                            int threshold = Configuration.Current.Kiln.stopAutoFuelThreshold < 0 ? 0 : Configuration.Current.Kiln.stopAutoFuelThreshold;
                            if (threshold > 0 && InventoryAssistant.GetItemAmountInItemList(InventoryAssistant.GetNearbyChestItemsByContainerList(nearbyChests), itemConversion.m_to.m_itemData) >= threshold)
                            {
                                return;
                            }
                        }

                        ItemDrop.ItemData oreItem = itemConversion.m_from.m_itemData;
                        int addedOres             = InventoryAssistant.RemoveItemFromChest(c, oreItem, toMaxOre);
                        if (addedOres > 0)
                        {
                            GameObject orePrefab = ObjectDB.instance.GetItemPrefab(itemConversion.m_from.gameObject.name);

                            for (int i = 0; i < addedOres; i++)
                            {
                                smelter.m_nview.InvokeRPC("AddOre", new object[] { orePrefab.name });
                            }
                            toMaxOre -= addedOres;
                            if (addedOres > 0)
                            {
                                ZLog.Log("Added " + addedOres + " ores(" + oreItem.m_shared.m_name + ") in " + smelter.m_name);
                            }
                            if (toMaxOre == 0)
                            {
                                return;
                            }
                        }
                    }
                }
            }
        }