C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
namespace Oxide.Plugins
{
[Info("Optimal Burn", "Thisha", "0.9.6")]
[Description("Splitter according to ultimate furnace guide")]
public class OptimalBurn : RustPlugin
{
#region variables
private const string permUse = "optimalburn.use";
private const int sulfurOre = -1157596551; //sulfur.ore
private const int metalOre = -4031221; //metal.ore
private const int hqOre = -1982036270; //HQ
private const int wood = -151838493; //wood
private const string largefurnace = "furnace.large";
private const string smallfurnace = "furnace";
private enum furnaceType {invalid, large, small };
private const int sulfurLarge1K = 5106;
private const int sulfurLarge2K = 7985;
private const int sulfurLarge2HK = 8759;
private const int hqmLarge1K = 977;
private const int metalLarge1K = 2804;
private const int metalLarge2K = 4772;
private const int metalLarge3K = 6087;
private const int metalLarge4K = 6879;
private const int metalLarge5K = 7314;
private const int metalSmall = 600;
private const int sulfurSmall = 900;
private const int hqmSmallLow = 200;
private const int hqmSmallHigh = 216;
private List<Item> items = new List<Item>();
private readonly Dictionary<ulong, string> openUis = new Dictionary<ulong, string>();
private Dictionary<ulong, PlayerData> playerData = new Dictionary<ulong, PlayerData>();
private class PlayerData
{
public int sulfurQtyFurnace;
public int metalQtyFurnace;
public int hqQtyFurnace;
public int woodQtyFurnace;
public int oreQtyFurnace;
public int sulfurQtyPlayer;
public int metalQtyPlayer;
public int hqQtyPlayer;
public int oreQtyPlayer;
public int woodQQtyPlayer;
public int ore;
public int oreQty;
public int woodQty;
public int woodToAdd;
public int oreToAdd;
public bool divideit = false;
public bool autoSplit = false;
public furnaceType currFurnace = furnaceType.invalid;
}
#endregion variables
#region localization
private new void LoadDefaultMessages()
{
lang.RegisterMessages(new Dictionary<string, string>
{
["Invalid source"] = "Invalid furnace",
["Multiple ores"] = "You have multiple ores." + '\n' + "You must either add sulfur, metal or HQM to define what you want to burn",
["Nothing to burn"] = "There is nothing to burn",
["Invalid items"] = "Please remove invalid items first",
["No wood"] = "You don't have wood",
["Cannot optimize"] = "Cannot define an optimal burn",
["In use"] = "The furnace is in use"
}, this);
}
#endregion localization
#region hooks
private void Init()
{
permission.RegisterPermission(permUse, this);
}
private void Unload()
{
foreach (var kv in openUis.ToDictionary(kv => kv.Key, kv => kv.Value))
{
BasePlayer player = BasePlayer.FindByID(kv.Key);
DestroyUI(player);
}
}
private void OnPlayerDisconnected(BasePlayer player, string reason)
{
DestroyUI(player);
}
private void OnPlayerDeath(BasePlayer player, HitInfo info)
{
DestroyUI(player);
}
private void OnLootEntity(BasePlayer player, BaseEntity entity)
{
BaseOven oven = entity as BaseOven;
if (oven == null || !HasPermission(player))
return;
if (playerData.ContainsKey(player.userID))
playerData.Remove(player.userID);
PlayerData data = new PlayerData();
playerData[player.userID] = data;
playerData[player.userID].currFurnace = furnaceType.invalid;
if (entity.ShortPrefabName.Equals(largefurnace))
playerData[player.userID].currFurnace = furnaceType.large;
else
{
if (entity.ShortPrefabName.Equals(smallfurnace))
playerData[player.userID].currFurnace = furnaceType.small;
}
if (playerData[player.userID].currFurnace == furnaceType.invalid)
return;
CreateUi(player, oven);
}
private void OnLootEntityEnd(BasePlayer player, BaseCombatEntity entity)
{
BaseOven oven = entity as BaseOven;
if (oven == null || ((!(entity.ShortPrefabName.Equals(largefurnace))) && (!(entity.ShortPrefabName.Equals(smallfurnace)))))
return;
DestroyUI(player);
}
private void OnEntityKill(BaseNetworkable networkable)
{
BaseOven oven = networkable as BaseOven;
if (oven != null)
DestroyOvenUI(oven);
}
object CanPickupEntity(BasePlayer player, BaseEntity entity)
{
if (!(entity.ShortPrefabName.Equals(largefurnace)) && !(entity.ShortPrefabName.Equals(smallfurnace)))
return null;
if (openUis.ContainsKey(player.userID))
{
player.ChatMessage(Lang("In use", player.UserIDString));
return false;
}
return null;
}
#endregion hooks
#region commands
[ConsoleCommand("optimalburn.split")]
private void OptimizeLargefurnace(ConsoleSystem.Arg arg)
{
BasePlayer player = arg.Player();
if (arg.Connection == null || player == null)
return;
BaseOven furnace = player.inventory.loot?.entitySource as BaseOven;
if (!playerData.ContainsKey(player.userID))
{
return;
}
if (furnace == null || (playerData[player.userID].currFurnace == furnaceType.invalid))
{
player.ChatMessage(Lang("Invalid source", player.UserIDString));
return;
}
Optimizefurnace(player, furnace);
}
#endregion commands
#region methods
bool HasInvalidItems(BaseOven furnace)
{
for (int i = 0; i <= 17; i++)
{
Item item = furnace.inventory.GetSlot(i);
if (item != null)
{
if ((item.info.itemid != metalOre) && (item.info.itemid != sulfurOre) && (item.info.itemid != hqOre) && (item.info.itemid != wood))
{
return true;
}
}
}
return false;
}
bool BurnableDefined(BasePlayer player)
{
//no different ores allowed in furnace
int types = 0;
if (playerData[player.userID].sulfurQtyFurnace > 0)
types += 1;
if (playerData[player.userID].metalQtyFurnace > 0)
types += 1;
if (playerData[player.userID].hqQtyFurnace > 0)
types += 1;
if (types > 1)
{
player.ChatMessage(Lang("Multiple ores", player.UserIDString));
return false;
}
if ((playerData[player.userID].sulfurQtyFurnace == 0) && (playerData[player.userID].metalQtyFurnace == 0) && (playerData[player.userID].hqQtyFurnace == 0))
{
//if only containing one of both, auto define
if ((playerData[player.userID].sulfurQtyPlayer > 0) && (playerData[player.userID].metalQtyPlayer == 0) && (playerData[player.userID].hqQtyFurnace == 0))
{
playerData[player.userID].ore = sulfurOre;
}
else
{
if ((playerData[player.userID].sulfurQtyPlayer == 0) && (playerData[player.userID].metalQtyPlayer > 0) && (playerData[player.userID].hqQtyPlayer == 0))
{
playerData[player.userID].ore = metalOre;
}
else
{
if ((playerData[player.userID].sulfurQtyPlayer == 0) && (playerData[player.userID].metalQtyPlayer == 0) && (playerData[player.userID].hqQtyPlayer > 0))
{
playerData[player.userID].ore = hqOre;
}
else
{
if ((playerData[player.userID].sulfurQtyPlayer == 0) && (playerData[player.userID].metalQtyPlayer == 0) && (playerData[player.userID].hqQtyPlayer == 0))
{
player.ChatMessage(Lang("Nothing to burn", player.UserIDString));
return false;
}
else
{
player.ChatMessage(Lang("Multiple ores", player.UserIDString));
return false;
}
}
}
}
}
else
{
if (playerData[player.userID].sulfurQtyFurnace > 0)
playerData[player.userID].ore = sulfurOre;
else
{
if (playerData[player.userID].metalQtyFurnace > 0)
playerData[player.userID].ore = metalOre;
else
playerData[player.userID].ore = hqOre;
}
}
return true;
}
void DefineQuantitesToUseLarge(BasePlayer player)
{
playerData[player.userID].autoSplit = false;
playerData[player.userID].divideit = false;
playerData[player.userID].oreToAdd = 0;
playerData[player.userID].woodToAdd = 0;
if (playerData[player.userID].woodQtyFurnace > 0)
{
switch (playerData[player.userID].woodQtyFurnace)
{
case 1000:
{
switch (playerData[player.userID].ore)
{
case sulfurOre:
{
if (playerData[player.userID].oreQty >= sulfurLarge1K)
{
playerData[player.userID].oreToAdd = sulfurLarge1K;
playerData[player.userID].woodToAdd = 1000;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case metalOre:
{
if (playerData[player.userID].oreQty >= metalLarge1K)
{
playerData[player.userID].oreToAdd = metalLarge1K;
playerData[player.userID].woodToAdd = 1000;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case hqOre:
{
if (playerData[player.userID].oreQty >= hqmLarge1K)
{
playerData[player.userID].oreToAdd = hqmLarge1K;
playerData[player.userID].woodToAdd = 1000;
}
else
playerData[player.userID].autoSplit = true;
break;
}
default:
{
return;
}
}
break;
}
case 2000:
{
switch (playerData[player.userID].ore)
{
case (sulfurOre):
{
if (playerData[player.userID].oreQty >= sulfurLarge2K)
{
playerData[player.userID].oreToAdd = sulfurLarge2K;
playerData[player.userID].woodToAdd = 2000;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case metalOre:
{
if (playerData[player.userID].oreQty >= metalLarge2K)
{
playerData[player.userID].oreToAdd = metalLarge2K;
playerData[player.userID].woodToAdd = 2000;
}
break;
}
case hqOre:
{
playerData[player.userID].autoSplit = true;
break;
}
default:
{
return;
}
}
break;
}
case 2500:
{
if (playerData[player.userID].ore == sulfurOre)
{
if (playerData[player.userID].oreQty >= sulfurLarge2HK)
{
playerData[player.userID].oreToAdd = sulfurLarge2HK;
playerData[player.userID].woodToAdd = 2500;
}
else
playerData[player.userID].autoSplit = true;
}
else
{
playerData[player.userID].autoSplit = true;
}
break;
}
case 3000:
{
if (playerData[player.userID].ore == metalOre)
{
if (playerData[player.userID].oreQty >= metalLarge3K)
{
playerData[player.userID].oreToAdd = metalLarge3K;
playerData[player.userID].woodToAdd = 3000;
}
else
playerData[player.userID].autoSplit = true;
}
else
{
playerData[player.userID].autoSplit = true;
}
break;
}
case 4000:
{
if (playerData[player.userID].ore == metalOre)
{
if (playerData[player.userID].oreQty >= metalLarge4K)
{
playerData[player.userID].oreToAdd = metalLarge4K;
playerData[player.userID].woodToAdd = 4000;
}
else
playerData[player.userID].autoSplit = true;
}
else
{
playerData[player.userID].autoSplit = true;
}
break;
}
case 5000:
{
if (playerData[player.userID].ore == metalOre)
{
if (playerData[player.userID].oreQty >= metalLarge5K)
{
playerData[player.userID].oreToAdd = metalLarge5K;
playerData[player.userID].autoSplit = true;
}
else
playerData[player.userID].autoSplit = true;
}
else
{
playerData[player.userID].autoSplit = true;
}
break;
}
default:
{
playerData[player.userID].autoSplit = true;
break;
}
}
}
else
{
playerData[player.userID].autoSplit = true;
}
if (playerData[player.userID].autoSplit)
{
//if no wood was added or the ore amount is insufficient for it, define according to inventory
switch (playerData[player.userID].ore)
{
case (metalOre):
{
if ((playerData[player.userID].oreQty >= metalLarge5K) && (playerData[player.userID].woodQty >= 5000))
{
playerData[player.userID].woodToAdd = 5000;
playerData[player.userID].oreToAdd = metalLarge5K;
}
else
{
if ((playerData[player.userID].oreQty >= metalLarge4K) && (playerData[player.userID].woodQty >= 4000))
{
playerData[player.userID].woodToAdd = 4000;
playerData[player.userID].oreToAdd = metalLarge4K;
}
else
{
if ((playerData[player.userID].oreQty >= metalLarge3K) && (playerData[player.userID].woodQty >= 3000))
{
playerData[player.userID].woodToAdd = 3000;
playerData[player.userID].oreToAdd = metalLarge3K;
}
else
{
if ((playerData[player.userID].oreQty >= metalLarge2K) && (playerData[player.userID].woodQty >= 2000))
{
playerData[player.userID].woodToAdd = 2000;
playerData[player.userID].oreToAdd = metalLarge2K;
}
else
{
if ((playerData[player.userID].oreQty >= metalLarge1K) && (playerData[player.userID].woodQty >= 1000))
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = metalLarge1K;
}
else
{
if ((playerData[player.userID].oreQty >= 990) && (playerData[player.userID].woodQty >= 330))
{
playerData[player.userID].woodToAdd = 330;
playerData[player.userID].oreToAdd = 990;
playerData[player.userID].divideit = true;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 15)
{
int orePartToAdd = 66; //max
if (orePartToAdd * 15 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 15;
while (orePartToAdd * 5 > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].oreToAdd = orePartToAdd * 15;
playerData[player.userID].woodToAdd = orePartToAdd * 5;
}
else
playerData[player.userID].oreToAdd = 0;
}
}
}
}
}
}
break;
}
case (sulfurOre):
{
if ((playerData[player.userID].oreQty >= sulfurLarge2HK) && (playerData[player.userID].woodQty >= 2500))
{
playerData[player.userID].woodToAdd = 2500;
playerData[player.userID].oreToAdd = sulfurLarge2HK;
}
else
{
if ((playerData[player.userID].oreQty >= sulfurLarge2K) && (playerData[player.userID].woodQty >= 2000))
{
playerData[player.userID].woodToAdd = 2000;
playerData[player.userID].oreToAdd = sulfurLarge2K;
}
else
{
if ((playerData[player.userID].oreQty >= sulfurLarge1K) && (playerData[player.userID].woodQty >= 1000))
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = sulfurLarge1K;
}
else
{
if ((playerData[player.userID].oreQty >= 990) && (playerData[player.userID].woodQty >= 165))
{
playerData[player.userID].woodToAdd = 165;
playerData[player.userID].oreToAdd = 990;
playerData[player.userID].divideit = true;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 15)
{
int orePartToAdd = 66; //max
if (orePartToAdd * 15 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 15;
while ((int)Math.Ceiling(orePartToAdd * 2.5f) > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].oreToAdd = orePartToAdd * 15;
playerData[player.userID].woodToAdd = (int)Math.Ceiling(orePartToAdd * 2.5f);
}
else
{
playerData[player.userID].oreToAdd = 0;
}
}
}
}
}
break;
}
case (hqOre):
{
if ((playerData[player.userID].oreQty >= hqmLarge1K) && (playerData[player.userID].woodQty >= 1000))
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = hqmLarge1K;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 15)
{
int orePartToAdd = 66; //max
if (orePartToAdd * 15 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 15;
while (orePartToAdd * 10 > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].oreToAdd = orePartToAdd * 15;
playerData[player.userID].woodToAdd = orePartToAdd * 10;
}
else
playerData[player.userID].oreToAdd = 0;
}
break;
}
}
}
}
void DefineQuantitesToUseSmall(BasePlayer player)
{
playerData[player.userID].autoSplit = false;
playerData[player.userID].divideit = false;
playerData[player.userID].oreToAdd = 0;
playerData[player.userID].woodToAdd = 0;
if (playerData[player.userID].woodQtyFurnace > 0)
{
switch (playerData[player.userID].woodQtyFurnace)
{
case 1000:
{
switch (playerData[player.userID].ore)
{
case sulfurOre:
{
if (playerData[player.userID].oreQty >= 999)
{
playerData[player.userID].oreToAdd = 999;
playerData[player.userID].woodToAdd = 833;
}
else
{
if (playerData[player.userID].oreQty >= sulfurSmall)
{
playerData[player.userID].oreToAdd = sulfurSmall;
playerData[player.userID].woodToAdd = 750;
}
else
playerData[player.userID].autoSplit = true;
}
break;
}
case metalOre:
{
if (playerData[player.userID].oreQty >= metalSmall)
{
playerData[player.userID].oreToAdd = metalSmall;
playerData[player.userID].woodToAdd = 1000;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case (hqOre):
{
if (playerData[player.userID].oreQty >= hqmSmallHigh)
{
playerData[player.userID].oreToAdd = hqmSmallHigh;
playerData[player.userID].woodToAdd = 1000;
}
else
{
if (playerData[player.userID].oreQty >= hqmSmallLow)
{
playerData[player.userID].oreToAdd = hqmSmallLow;
playerData[player.userID].woodToAdd = 1000;
}
else
playerData[player.userID].autoSplit = true;
}
break;
}
default:
{
return;
}
}
break;
}
case 750:
{
switch (playerData[player.userID].ore)
{
case sulfurOre:
{
if (playerData[player.userID].oreQty >= 900)
{
playerData[player.userID].oreToAdd = 900;
playerData[player.userID].woodToAdd = 750;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case metalOre:
{
if (playerData[player.userID].oreQty >= 150)
{
playerData[player.userID].oreToAdd = 450;
playerData[player.userID].woodToAdd = 750;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case (hqOre):
{
playerData[player.userID].autoSplit = true;
break;
}
default:
{
return;
}
}
break;
}
case 500:
{
switch (playerData[player.userID].ore)
{
case sulfurOre:
{
if (playerData[player.userID].oreQty >= 600)
{
playerData[player.userID].oreToAdd = 600;
playerData[player.userID].woodToAdd = 500;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case metalOre:
{
if (playerData[player.userID].oreQty >= 100)
{
playerData[player.userID].oreToAdd = 300;
playerData[player.userID].woodToAdd = 500;
}
else
playerData[player.userID].autoSplit = true;
break;
}
case (hqOre):
{
playerData[player.userID].autoSplit = true;
break;
}
default:
{
return;
}
}
break;
}
default:
{
playerData[player.userID].autoSplit = true;
break;
}
}
}
else
{
playerData[player.userID].autoSplit = true;
}
if (playerData[player.userID].autoSplit)
{
//if no wood was added or the ore amount is insufficient for it, define according to inventory
switch (playerData[player.userID].ore)
{
case (metalOre):
{
if ((playerData[player.userID].oreQty >= metalSmall) && (playerData[player.userID].woodQty >= 1000)) //enough for the best
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = metalSmall;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 3)
{
int orePartToAdd = 200; //max
if (orePartToAdd * 3 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 3;
while (orePartToAdd * 5 > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].woodToAdd = orePartToAdd * 5;
playerData[player.userID].oreToAdd = orePartToAdd * 3;
}
else
playerData[player.userID].oreToAdd = 0;
}
break;
}
case (sulfurOre):
{
if ((playerData[player.userID].oreQty >= 999) && (playerData[player.userID].woodQty >= 833))
{
playerData[player.userID].oreToAdd = 999;
playerData[player.userID].woodToAdd = 833;
} else
{
if ((playerData[player.userID].oreQty >= sulfurSmall) && (playerData[player.userID].woodQty >= 750))
{
playerData[player.userID].woodToAdd = 750;
playerData[player.userID].oreToAdd = sulfurSmall;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 3)
{
int orePartToAdd = 333; //max
if (orePartToAdd * 3 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 3;
while ((int)Math.Ceiling(orePartToAdd * 2.5f) > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].woodToAdd = (int)Math.Ceiling(orePartToAdd * 2.5f);
playerData[player.userID].oreToAdd = orePartToAdd * 3;
}
else
playerData[player.userID].oreToAdd = 0;
}
}
break;
}
case (hqOre):
{
if ((playerData[player.userID].oreQty >= hqmSmallHigh) && (playerData[player.userID].woodQty >= 1000)) //enough for the best
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = hqmSmallHigh;
}
else
{
if ((playerData[player.userID].oreQty >= hqmSmallLow) && (playerData[player.userID].woodQty >= 1000)) //enough for the best
{
playerData[player.userID].woodToAdd = 1000;
playerData[player.userID].oreToAdd = hqmSmallLow;
}
else
{
playerData[player.userID].divideit = true;
if (playerData[player.userID].oreQty >= 3)
{
int orePartToAdd = 100; //max
if (orePartToAdd * 3 > playerData[player.userID].oreQty)
orePartToAdd = (int)playerData[player.userID].oreQty / 3;
while (orePartToAdd * 10 > playerData[player.userID].woodQty)
{
orePartToAdd -= 1;
}
playerData[player.userID].woodToAdd = orePartToAdd * 10;
playerData[player.userID].oreToAdd = orePartToAdd * 3;
}
else
playerData[player.userID].oreToAdd = 0;
}
}
break;
}
}
}
}
void Optimizefurnace(BasePlayer player, BaseOven furnace)
{
//check for items other than wood, sulfur or metal
if (HasInvalidItems(furnace))
{
player.ChatMessage(Lang("Invalid items", player.UserIDString));
return;
}
//get available amounts of resources
playerData[player.userID].sulfurQtyFurnace = furnace.inventory.GetAmount(sulfurOre, true);
playerData[player.userID].metalQtyFurnace = furnace.inventory.GetAmount(metalOre, true);
playerData[player.userID].hqQtyFurnace = furnace.inventory.GetAmount(hqOre, true);
playerData[player.userID].woodQtyFurnace = furnace.inventory.GetAmount(wood, true);
playerData[player.userID].sulfurQtyPlayer = player.inventory.GetAmount(sulfurOre);
playerData[player.userID].metalQtyPlayer = player.inventory.GetAmount(metalOre);
playerData[player.userID].hqQtyPlayer = player.inventory.GetAmount(hqOre);
playerData[player.userID].woodQQtyPlayer = player.inventory.GetAmount(wood);
playerData[player.userID].woodQty = playerData[player.userID].woodQtyFurnace + playerData[player.userID].woodQQtyPlayer;
//check wood to burn
if (playerData[player.userID].woodQty == 0)
{
player.ChatMessage(Lang("No wood", player.UserIDString));
return;
}
//define what must be burnt
if (!BurnableDefined(player))
return;
//get total amount of ore to burn
switch (playerData[player.userID].ore)
{
case (metalOre):
{
playerData[player.userID].oreQty = playerData[player.userID].metalQtyFurnace + playerData[player.userID].metalQtyPlayer;
playerData[player.userID].oreQtyPlayer = playerData[player.userID].metalQtyPlayer;
playerData[player.userID].oreQtyFurnace = playerData[player.userID].metalQtyFurnace;
break;
}
case (sulfurOre):
{
playerData[player.userID].oreQty = playerData[player.userID].sulfurQtyFurnace + playerData[player.userID].sulfurQtyPlayer;
playerData[player.userID].oreQtyPlayer = playerData[player.userID].sulfurQtyPlayer;
playerData[player.userID].oreQtyFurnace = playerData[player.userID].sulfurQtyFurnace;
break;
}
case (hqOre):
{
playerData[player.userID].oreQty = playerData[player.userID].hqQtyFurnace + playerData[player.userID].hqQtyPlayer;
playerData[player.userID].oreQtyPlayer = playerData[player.userID].hqQtyPlayer;
playerData[player.userID].oreQtyFurnace = playerData[player.userID].hqQtyFurnace;
break;
}
}
//something to burn at all?
if (playerData[player.userID].oreQty == 0)
{
player.ChatMessage(Lang("Nothing to burn", player.UserIDString));
return;
}
//get the best solution
if (playerData[player.userID].currFurnace == furnaceType.large)
DefineQuantitesToUseLarge(player);
else
DefineQuantitesToUseSmall(player);
//no success
if ((playerData[player.userID].oreToAdd <= 0) || (playerData[player.userID].woodToAdd <= 0))
{
player.ChatMessage(Lang("Cannot optimize", player.UserIDString));
return;
}
//split stuff
if (playerData[player.userID].currFurnace == furnaceType.large)
Filllargefurnace(furnace, player);
else
Fillsmallfurnace(furnace, player);
//take from or give to player according what was used and what was already in furnace
Handleremainings(player);
}
void Handleremainings(BasePlayer player)
{
//take from player what was used that wasn't in the furnace
if (playerData[player.userID].woodQtyFurnace < playerData[player.userID].woodToAdd)
player.inventory.Take(items, wood, playerData[player.userID].woodToAdd - playerData[player.userID].woodQtyFurnace);
if (playerData[player.userID].oreQtyFurnace < playerData[player.userID].oreToAdd)
{
switch(pl
// ... [Code preview truncated due to length. Full source in attached file] ...