C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
//patched for entity ids
using System;
using System.Linq;
using Oxide.Core;
using UnityEngine;
using Newtonsoft.Json;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Configuration;
using Oxide.Core.Libraries.Covalence;
using System.Collections.Generic;
using Newtonsoft.Json.Converters;
namespace Oxide.Plugins {
[Info("FurnaceLevels", "David", "1.4.6")]
[Description("Furnace progression system")]
public class FurnaceLevels : RustPlugin {
//temp stacking issue
object CanStackItem(Item source, Item target) {
var storage = source.GetEntityOwner() as BaseOven;
if (storage == null) return null;
if (storage.ShortPrefabName == "furnace.large" || storage.ShortPrefabName == "refinery_small_deployed") {
return (target.amount + source.amount) >= target.info.stackable ? (object)false : null;
}
return null;
}
[PluginReference]
private Plugin PortableFurnaces;
private bool flatOutput = false;
private bool global = false;
private string chatcommand = "furnace";
private static FurnaceLevels _instance;
private readonly List<FurnaceUpgrades> FurnControl = new List<FurnaceUpgrades>();
#region Hooks
private void OnServerInitialized() {
_instance = this;
LoadFurData();
timer.Once(4f, () => {
if (PortableFurnaces != null) chatcommand = "furnaceinfo";
cmd.AddChatCommand(chatcommand, this, "furnace_chatcmd");
}
);
foreach (ulong furn in _furnaceData.Keys) {
if (_furnaceData[furn].Speed > _config.speedSet.mod.Count() - 1) _furnaceData[furn].Speed = _config.speedSet.mod.Count() - 1;
if (_furnaceData[furn].Fuel > _config.fuelSet.mod.Count() - 1) _furnaceData[furn].Fuel = _config.fuelSet.mod.Count() - 1;
if (_furnaceData[furn].Output > _config.outSet.mod.Count() - 1) _furnaceData[furn].Output = _config.outSet.mod.Count() - 1;
}
SaveFurData();
permission.RegisterPermission($"furnacelevels.use", this);
var ovens = UnityEngine.Object.FindObjectsOfType<BaseOven>();
for (var i = 0; i < ovens.Length; i++) {
var oven = ovens[i];
OnEntitySpawned(oven);
}
timer.Once(2f, () => {
for (var i = 0; i < ovens.Length; i++) {
var oven = ovens[i];
var component = oven.gameObject.GetComponent<FurnaceUpgrades>();
if (component == null) continue;
if (oven == null || oven.IsDestroyed || !oven.IsOn()) continue;
component.StartCooking();
}
}
);
}
private void OnServerSave() {
SaveFurData();
}
private void Unload() {
SaveFurData();
var ovens = UnityEngine.Object.FindObjectsOfType<BaseOven>();
if (ovens == null) return;
for (var i = 0; i < ovens.Length; i++) {
var oven = ovens[i];
if (oven == null) return;
var component = oven.GetComponent<FurnaceUpgrades>();
if (component == null) return;
if (oven.IsOn()) {
component.StopCooking();
oven.StartCooking();
}
UnityEngine.Object.Destroy(component);
}
}
void OnLootEntity(BasePlayer player, BaseOven entity) {
CreateOvenButton(player, entity.net.ID.Value, entity.PrefabName);
}
void OnLootEntityEnd(BasePlayer player, BaseOven entity) {
DestroyCui(player);
}
void OnEntityKill(BaseOven oven) {
_furnaceData.Remove(oven.net.ID.Value);
}
void OnNewSave(string filename) {
_furnaceData.Clear();
}
object CanPickupEntity(BasePlayer player, BaseEntity entity) {
if (_furnaceData.ContainsKey(entity.net.ID.Value) && entity.ShortPrefabName.Contains("furnace")) {
//Puts($"{_furnaceData[entity.net.ID.Value].Speed}/{_furnaceData[entity.net.ID.Value].Fuel}/{_furnaceData[entity.net.ID.Value].Output}");
var item = ItemManager.CreateByName("furnace", 1, entity.skinID);
if (item != null) {
item.text = $"{_furnaceData[entity.net.ID.Value].Speed}/{_furnaceData[entity.net.ID.Value].Fuel}/{_furnaceData[entity.net.ID.Value].Output}";
item.name += $"Furnace Lvl.({_furnaceData[entity.net.ID.Value].Speed + 1}/{_furnaceData[entity.net.ID.Value].Fuel + 1}/{_furnaceData[entity.net.ID.Value].Output + 1})";
player.GiveItem(item);
}
_furnaceData.Remove(entity.net.ID.Value);
entity.Kill();
return false;
}
return null;
}
void OnEntityBuilt(Planner plan, GameObject go) {
try {
var player = plan.GetOwnerPlayer();
Item item = player.GetActiveItem();
if (item.name == null) return;
if (item.name.Contains("Lvl.")) {
NextTick(() => {
BaseEntity entity = go.GetComponent<BaseEntity>();
CheckData(entity.net.ID.Value);
string[] levels = item.text.Split('/');
_furnaceData[entity.net.ID.Value].Speed = Convert.ToInt32(levels[0]);
_furnaceData[entity.net.ID.Value].Fuel = Convert.ToInt32(levels[1]);
_furnaceData[entity.net.ID.Value].Output = Convert.ToInt32(levels[2]);
SaveFurData();
}
);
}
}
catch {
// it's lit
}
}
private void OnEntitySpawned(BaseNetworkable entity) {
var oven = entity as BaseOven;
if (oven == null) return;
var ovenId = oven.net.ID.Value;
if (!global) {
if (oven.PrefabName == "assets/prefabs/deployable/furnace/furnace.prefab" || oven.PrefabName == "assets/prefabs/deployable/furnace.large/furnace.large.prefab" || oven.PrefabName == "assets/prefabs/deployable/oil refinery/refinery_small_deployed.prefab") {
oven.gameObject.AddComponent<FurnaceUpgrades>();
CheckData(ovenId);
}
return;
}
oven.gameObject.AddComponent<FurnaceUpgrades>();
CheckData(ovenId);
}
private object OnOvenToggle(StorageContainer oven, BasePlayer player) {
if (!global) {
if (oven.PrefabName != "assets/prefabs/deployable/furnace/furnace.prefab" && oven.PrefabName != "assets/prefabs/deployable/furnace.large/furnace.large.prefab" && oven.PrefabName != "assets/prefabs/deployable/oil refinery/refinery_small_deployed.prefab") return null;
}
var component = oven.gameObject.GetComponent<FurnaceUpgrades>();
if (oven.IsOn()) {
component.StopCooking();
}
else {
component.StartCooking();
}
return false;
}
#endregion
#region Methods / Functions
private int GetMaxLevel(List<int> priceList, List<float> modList) {
int value = priceList.Count();
int value2 = modList.Count();
int[] values = {
value, value2
}
;
return values.Min();
}
private int GetNextPrice(int index, string modType) {
int price = 1;
if (modType == "speed") {
int maxLevel = GetMaxLevel(_config.speedSet.price, _config.speedSet.mod);
if (index >= maxLevel) return 0;
price = _config.speedSet.price[index];
}
if (modType == "fuel") {
int maxLevel = GetMaxLevel(_config.fuelSet.price, _config.fuelSet.mod);
if (index >= maxLevel) return 0;
price = _config.fuelSet.price[index];
}
if (modType == "output") {
int maxLevel = GetMaxLevel(_config.outSet.price, _config.outSet.mod);
if (index >= maxLevel) return 0;
price = _config.outSet.price[index];
}
return price;
}
private int GetUpgradeLevel(BasePlayer player, ulong ovenId, string modType) {
int _mod = 0;
if (modType == "speed") _mod = _furnaceData[ovenId].Speed;
if (modType == "fuel") _mod = _furnaceData[ovenId].Fuel;
if (modType == "output") _mod = _furnaceData[ovenId].Output;
return _mod;
}
private void UpgradeLevel(BasePlayer player, ulong entityId, string mod, string prefab = "") {
if (mod == "speed") {
int index = _furnaceData[entityId].Speed + 1;
if (prefab == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
if (GetCurrency(player, Convert.ToInt32(Math.Round(_config.speedSet.price[index] * _config.mainSet.largecost, MidpointRounding.ToEven)))) {
_furnaceData[entityId].Speed++;
SaveFurData();
RestartFurnace(entityId);
return;
}
else {
return;
}
}
if (GetCurrency(player, _config.speedSet.price[index])) {
_furnaceData[entityId].Speed++;
SaveFurData();
RestartFurnace(entityId);
return;
}
return;
}
if (mod == "fuel") {
int index = _furnaceData[entityId].Fuel + 1;
if (prefab == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
if (GetCurrency(player, Convert.ToInt32(Math.Round(_config.fuelSet.price[index] * _config.mainSet.largecost, MidpointRounding.ToEven)))) {
_furnaceData[entityId].Fuel++;
SaveFurData();
RestartFurnace(entityId);
return;
}
else {
return;
}
}
if (GetCurrency(player, _config.fuelSet.price[index])) {
_furnaceData[entityId].Fuel++;
SaveFurData();
RestartFurnace(entityId);
return;
}
return;
}
if (mod == "output") {
int index = _furnaceData[entityId].Output + 1;
if (prefab == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
if (GetCurrency(player, Convert.ToInt32(Math.Round(_config.outSet.price[index] * _config.mainSet.largecost, MidpointRounding.ToEven)))) {
_furnaceData[entityId].Output++;
SaveFurData();
RestartFurnace(entityId);
return;
}
else {
return;
}
}
if (GetCurrency(player, _config.outSet.price[index])) {
_furnaceData[entityId].Output++;
SaveFurData();
RestartFurnace(entityId);
return;
}
return;
}
}
private void RestartFurnace(ulong ovenid) {
var oven = BaseNetworkable.serverEntities.Find(new NetworkableId(ovenid)) as BaseOven;
if (oven == null) return;
if (oven.IsOn()) {
oven.StopCooking();
var component = oven.gameObject.GetComponent<FurnaceUpgrades>();
component.StartCooking();
}
}
private void CheckData(ulong entityId) {
if (!_furnaceData.ContainsKey(entityId)) {
_furnaceData.Add(entityId, new FurData());
//SaveFurData();
}
return;
}
private void furnace_chatcmd(BasePlayer player, string command, string[] args) {
if (player == null) return;
if (args.Length > 2) return;
if (args.Length == 0) {
SendReply(player, GetLang("chatCommand"));
return;
}
string arg0 = args[0].ToLower();
if (arg0 == "speed") {
string allValues = GetLang("chatCommandSpeed");
int level = 1;
foreach (float value in _config.speedSet.mod) {
allValues = allValues + $"\n <color=#FFD6BA>Level {level}</color> ({value})";
level++;
}
SendReply(player, allValues);
return;
}
if (arg0 == "fuel") {
string allValues = GetLang("chatCommandFuel");
int level = 1;
foreach (float value in _config.fuelSet.mod) {
allValues = allValues + $"\n <color=#FFD6BA>Level {level}</color> ({value})";
level++;
}
SendReply(player, allValues);
return;
}
if (arg0 == "output") {
string allValues = GetLang("chatCommandOut");
int level = 1;
foreach (float value in _config.outSet.mod) {
allValues = allValues + $"\n <color=#FFD6BA>Level {level}</color> ({value}x)";
level++;
}
SendReply(player, allValues);
return;
}
}
[ConsoleCommand("furnace_ui")]
private void furnace_ui(ConsoleSystem.Arg arg) {
var player = arg?.Player();
var args = arg.Args;
if (arg.Player() == null) return;
if (args[0] == "openmenu") {
if (!permission.UserHasPermission(player.UserIDString, "furnacelevels.use")) {
SendReply(player, GetLang("noPerms"));
return;
}
ulong netId = 1;
if (args[1].Contains("oil")) {
netId = Convert.ToUInt64(args[3]);
}
else {
netId = Convert.ToUInt64(args[2]);
}
DestroyOvenButton(player);
CheckData(netId);
CreateCui(player, netId, args[1]);
return;
}
if (args[0] == "upgrade") {
ulong netId = Convert.ToUInt64(args[2]);
UpgradeLevel(player, netId, args[3], args[1]);
CreateCui(player, netId, args[1]);
return;
}
}
private void PlayEffect(BasePlayer player, string fx) {
Effect.server.Run(fx, (BaseEntity)player, 0U, Vector3.zero, Vector3.zero);
}
#endregion
#region Furnace Controller
public class FurnaceUpgrades : FacepunchBehaviour {
private int _ticks;
private BaseOven _oven;
private BaseOven Furnace {
get {
if (_oven == null) _oven = GetComponent<BaseOven>();
return _oven;
}
}
private float speedMulti;
private float fuelEffMulti;
private float outputMulti;
private Dictionary<string, float> _outputModifiers;
private float OutputMultiplier(string shortname) {
float modifier;
modifier = 1.0f;
return modifier;
}
private void Awake() {
float modifierF;
float modifierI;
modifierF = 1.0f;
speedMulti = 0.5f / modifierF;
modifierI = 2.0f;
fuelEffMulti = modifierI;
}
private Item FindBurnable() {
if (Furnace.inventory == null) return null;
foreach (var item in Furnace.inventory.itemList) {
var component = item.info.GetComponent<ItemModBurnable>();
if (component && (Furnace.fuelType == null || item.info == Furnace.fuelType)) {
return item;
}
}
return null;
}
public void Cook() {
var item = FindBurnable();
if (item == null) {
StopCooking();
return;
}
SmeltItems();
var slot = Furnace.GetSlot(BaseEntity.Slot.FireMod);
if (slot) {
slot.SendMessage("Cook", 0.5f, SendMessageOptions.DontRequireReceiver);
}
var ovenId = Furnace.net.ID.Value;
int fuelData = _furnaceData[ovenId].Fuel;
if (fuelData == null) {
fuelEffMulti = 2.0f;
}
else {
fuelEffMulti = _config.fuelSet.mod[fuelData];
}
var component = item.info.GetComponent<ItemModBurnable>();
item.fuel -= 0.5f * (Furnace.cookingTemperature / 200f) * fuelEffMulti;
if (!item.HasFlag(global : : Item.Flag.OnFire)) {
item.SetFlag(global : : Item.Flag.OnFire, true);
item.MarkDirty();
}
if (item.fuel <= 0f) {
ConsumeFuel(item, component);
}
_ticks++;
}
private void ConsumeFuel(Item fuel, ItemModBurnable burnable) {
if (Furnace.allowByproductCreation && burnable.byproductItem != null && UnityEngine.Random.Range(0f, 1f) > burnable.byproductChance) {
var def = burnable.byproductItem;
var item = ItemManager.Create(def, (int)(burnable.byproductAmount * OutputMultiplier(def.shortname)));
if (!item.MoveToContainer(Furnace.inventory)) {
StopCooking();
item.Drop(Furnace.inventory.dropPosition, Furnace.inventory.dropVelocity);
}
}
if (fuel.amount <= 1) {
fuel.Remove();
return;
}
fuel.amount -= 1;
fuel.fuel = burnable.fuelAmount;
fuel.MarkDirty();
}
private void SmeltItems() {
if (_ticks % 2 != 0) return;
for (var i = 0; i < Furnace.inventory.itemList.Count; i++) {
var item = Furnace.inventory.itemList[i];
if (item == null || !item.IsValid()) continue;
var cookable = item.info.GetComponent<ItemModCookable>();
if (cookable == null) continue;
var temperature = item.temperature;
if ((temperature < cookable.lowTemp || temperature > cookable.highTemp)) {
if (!cookable.setCookingFlag || !item.HasFlag(global : : Item.Flag.Cooking)) continue;
item.SetFlag(global : : Item.Flag.Cooking, false);
item.MarkDirty();
continue;
}
if (cookable.cookTime > 0 && _ticks * 1f / 1 % cookable.cookTime > 0) continue;
if (cookable.setCookingFlag && !item.HasFlag(global : : Item.Flag.Cooking)) {
item.SetFlag(global : : Item.Flag.Cooking, true);
item.MarkDirty();
}
var position = item.position;
if (item.amount > 1) {
item.amount--;
item.MarkDirty();
}
else {
item.Remove();
}
if (cookable.becomeOnCooked == null) continue;
var ovenId = Furnace.net.ID.Value;
int itemData = _furnaceData[ovenId].Output;
if (itemData == null) {
outputMulti = 1;
}
else {
outputMulti = _config.outSet.mod[itemData];
}
var item2 = ItemManager.Create(cookable.becomeOnCooked, (int)(cookable.amountOfBecome + RandomProc(outputMulti)));
if (_instance.flatOutput) {
item2 = ItemManager.Create(cookable.becomeOnCooked, (int)(cookable.amountOfBecome * outputMulti));
}
if (_oven.temperature == global : : BaseOven.TemperatureType.Cooking) {
item2 = ItemManager.CreateByName(cookable.becomeOnCooked.shortname.Replace("burned", "cooked"), (int)(cookable.amountOfBecome + RandomProc(outputMulti)));
}
if (item2 == null || item2.MoveToContainer(item.parent, position) || item2.MoveToContainer(item.parent)) continue;
item2.Drop(item.parent.dropPosition, item.parent.dropVelocity);
if (!item.parent.entityOwner) continue;
StopCooking();
}
}
private int RandomProc(float value) {
float random = UnityEngine.Random.Range(1, 1001);
if (random <= value * 10) return 1;
else return 0;
}
public void StartCooking() {
if (FindBurnable() == null) {
return;
}
StopCooking();
Furnace.inventory.temperature = Furnace.cookingTemperature;
Furnace.UpdateAttachmentTemperature();
var ovenId = Furnace.net.ID.Value;
int speedData = _furnaceData[ovenId].Speed;
if (speedData == null) {
speedMulti = 0.5f;
}
else {
speedMulti = _config.speedSet.mod[speedData];
}
Furnace.InvokeRepeating(Cook, speedMulti, speedMulti);
Furnace.SetFlag(BaseEntity.Flags.On, true);
}
public void StopCooking() {
Furnace.CancelInvoke(Cook);
Furnace.StopCooking();
}
}
#endregion
#region Furnace GUI
private void CreateOvenButton(BasePlayer player, ulong ovenId, string prefabName) {
if (prefabName != "assets/prefabs/deployable/furnace/furnace.prefab" && prefabName != "assets/prefabs/deployable/furnace.large/furnace.large.prefab" && prefabName != "assets/prefabs/deployable/oil refinery/refinery_small_deployed.prefab") return;
string[] mainOffsets = {
"313 494", "365 515"
}
;
if (prefabName == "assets/prefabs/deployable/oil refinery/refinery_small_deployed.prefab") {
mainOffsets[0] = "410 494";
mainOffsets[1] = "462 515";
}
if (prefabName == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
mainOffsets[0] = "400 566";
mainOffsets[1] = "451 588";
}
var _upgradeButton = CUIClass.CreateOverlay("ref1", "0 0 0 0", "0 0", "0 0", false, 0.0f, $"assets/icons/iconmaterial.mat");
CUIClass.CreatePanel(ref _upgradeButton, "f_upgrade_button_div", "Overlay", "0 0 0 0", "0.5 0", "0.5 0", false, 0f, "assets/content/ui/uibackgroundblur.mat", mainOffsets[0], mainOffsets[1]);
CUIClass.CreateButton(ref _upgradeButton, "f_upgrade_button", "f_upgrade_button_div", "0.40 0.48 0.25 0.75", GetLang("upgradeBtn"), 12, "0 0", "1 1", $"furnace_ui openmenu {prefabName} {ovenId}", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
DestroyOvenButton(player);
CuiHelper.AddUi(player, _upgradeButton);
}
private void DestroyOvenButton(BasePlayer player) {
CuiHelper.DestroyUi(player, "ref1");
CuiHelper.DestroyUi(player, "f_upgrade_button_div");
}
private void CreateCui(BasePlayer player, ulong ovenId, string prefabName) {
string[] titleOffsets = {
"0 0", "0 0"
}
;
string[] mainOffsets = {
"193 525", "570 665"
}
;
if (prefabName == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
titleOffsets[0] = "-205 560";
titleOffsets[1] = "180 600";
mainOffsets[0] = "-199 385";
mainOffsets[1] = "180 554";
}
int speedLevel = GetUpgradeLevel(player, ovenId, "speed") + 1;
int fuelLevel = GetUpgradeLevel(player, ovenId, "fuel") + 1;
int outputLevel = GetUpgradeLevel(player, ovenId, "output") + 1;
string currency = _config.mainSet.currencyDisplayName;
int speedCost = GetNextPrice(speedLevel, "speed");
int fuelCost = GetNextPrice(fuelLevel, "fuel");
int outputCost = GetNextPrice(outputLevel, "output");
if (prefabName == "assets/prefabs/deployable/furnace.large/furnace.large.prefab") {
speedCost = Convert.ToInt32(Math.Round(speedCost * _config.mainSet.largecost, MidpointRounding.ToEven));
fuelCost = Convert.ToInt32(Math.Round(fuelCost * _config.mainSet.largecost, MidpointRounding.ToEven));
outputCost = Convert.ToInt32(Math.Round(outputCost * _config.mainSet.largecost, MidpointRounding.ToEven));
}
string speedText = $"<size=15><b>{GetLang("speedTitle")} (Lvl.{speedLevel})</b></size> \n{GetLang("speedDesc")}";
string fuelText = $"<size=15><b>{GetLang("fuelTitle")} (Lvl.{fuelLevel})</b></size> \n{GetLang("fuelDesc")}";
string outText = $"<size=15><b>{GetLang("outTitle")} (Lvl.{outputLevel})</b></size> \n{GetLang("outDesc")}";
string infoText = GetLang("info");
var _furnaceCui = CUIClass.CreateOverlay("ref2", "0 0 0 0", "0 0", "0 0", false, 0.0f, $"assets/icons/iconmaterial.mat");
CUIClass.CreatePanel(ref _furnaceCui, "f_title_div", "Overlay", "0.70 0.67 0.65 0.0", "0.5 0", "0.5 0", false, 0f, "assets/icons/iconmaterial.mat", titleOffsets[0], titleOffsets[1]);
CUIClass.CreateText(ref _furnaceCui, "f_title_text", "f_title_div", "0.94 0.91 0.87 1", $"UPGRADES", 28, "0.023 0", "1 1", TextAnchor.LowerLeft, "robotocondensed-bold.ttf", "0 0 0 0", "0 0");
CUIClass.CreatePanel(ref _furnaceCui, "f_content_div", "Overlay", "0.70 0.67 0.65 0.07", "0.5 0", "0.5 0", false, 0f, "assets/content/ui/uibackgroundblur.mat", mainOffsets[0], mainOffsets[1]);
CUIClass.CreatePanel(ref _furnaceCui, "f_content_div_1", "f_content_div", "0 0 0 0", "0.01 0.68", "0.99 0.98", false, 0f, "assets/icons/iconmaterial.mat");
CUIClass.CreatePanel(ref _furnaceCui, "f_content_div_2", "f_content_div", "0 0 0 0", "0.01 0.36", "0.99 0.66", false, 0f, "assets/icons/iconmaterial.mat");
CUIClass.CreatePanel(ref _furnaceCui, "f_content_div_3", "f_content_div", "0 0 0 0", "0.01 0.04", "0.99 0.34", false, 0f, "assets/icons/iconmaterial.mat");
//CUIClass.CreatePanel(ref _furnaceCui, "f_content_div_4", "f_content_div", "0 0 0 0", "0.01 0.01", "0.99 0.16", false, 0f, "assets/icons/iconmaterial.mat");
CUIClass.CreateText(ref _furnaceCui, "speed_text", "f_content_div_1", "1 1 1 0.65", speedText, 10, "0.03 0.0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-regular.ttf", "0 0 0 0", "0 0");
CUIClass.CreateText(ref _furnaceCui, "fuel_text", "f_content_div_2", "1 1 1 0.65", fuelText, 10, "0.03 0.0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-regular.ttf", "0 0 0 0", "0 0");
CUIClass.CreateText(ref _furnaceCui, "out_text", "f_content_div_3", "1 1 1 0.65", outText, 10, "0.03 0.0", "1 1", TextAnchor.MiddleLeft, "robotocondensed-regular.ttf", "0 0 0 0", "0 0");
//CUIClass.CreateText(ref _furnaceCui, "info_text", "f_content_div_4", "1 1 1 0.45", infoText, 10, "0.05 0.0", "0.95 1", TextAnchor.MiddleCenter, "robotocondensed-regular.ttf", "0 0 0 0", "0 0");
if (speedCost != 0) {
CUIClass.CreateButton(ref _furnaceCui, "speed_btn", "f_content_div_1", "0.40 0.48 0.25 0.65", $"{GetLang("upFor")} {speedCost}{currency}", 12, "0.55 0.18", "0.98 0.82", $"furnace_ui upgrade {prefabName} {ovenId} speed", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
else {
CUIClass.CreateButton(ref _furnaceCui, "speed_btn", "f_content_div_1", "0.70 0.67 0.65 0.20", $"{GetLang("maxLevel")}", 12, "0.55 0.18", "0.98 0.82", $"", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
if (fuelCost != 0) {
CUIClass.CreateButton(ref _furnaceCui, "fuel_btn", "f_content_div_2", "0.40 0.48 0.25 0.65", $"{GetLang("upFor")} {fuelCost}{currency}", 12, "0.55 0.18", "0.98 0.82", $"furnace_ui upgrade {prefabName} {ovenId} fuel", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
else {
CUIClass.CreateButton(ref _furnaceCui, "fuel_btn", "f_content_div_2", "0.70 0.67 0.65 0.20", $"{GetLang("maxLevel")}", 12, "0.55 0.18", "0.98 0.82", $"", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
if (outputCost != 0) {
CUIClass.CreateButton(ref _furnaceCui, "out_btn", "f_content_div_3", "0.40 0.48 0.25 0.65", $"{GetLang("upFor")} {outputCost}{currency}", 12, "0.55 0.18", "0.98 0.82", $"furnace_ui upgrade {prefabName} {ovenId} output", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
else {
CUIClass.CreateButton(ref _furnaceCui, "out_btn", "f_content_div_3", "0.70 0.67 0.65 0.20", $"{GetLang("maxLevel")}", 12, "0.55 0.18", "0.98 0.82", $"", "", "1 1 1 0.7", 0f, TextAnchor.MiddleCenter, $"robotocondensed-bold.ttf");
}
DestroyCui(player);
CuiHelper.AddUi(player, _furnaceCui);
}
private void DestroyCui(BasePlayer player) {
CuiHelper.DestroyUi(player, "f_content_div");
CuiHelper.DestroyUi(player, "f_title_div");
CuiHelper.DestroyUi(player, "title_div2");
CuiHelper.DestroyUi(player, "f_upgrade_button_div");
CuiHelper.DestroyUi(player, "ref1");
CuiHelper.DestroyUi(player, "ref2");
}
#endregion
#region Get Payments
[PluginReference]
private Plugin Economics;
[PluginReference]
private Plugin ServerRewards;
private bool GetCurrency(BasePlayer player, int _currencyAmount) {
string currencyType = _config.mainSet.currencyType.ToLower();
if (currencyType == "serverrewards") {
if (GetRP(player, _currencyAmount)) {
SendReply(player, GetLang("upSucc"));
PlayEffect(player, _config.fx.succ);
return true;
}
SendReply(player, GetLang("noFunds"));
PlayEffect(player, _config.fx.dnd);
return false;
}
if (currencyType == "economics") {
if (GetEco(player, _currencyAmount)) {
SendReply(player, GetLang("upSucc"));
PlayEffect(player, _config.fx.succ);
return true;
}
SendReply(player, GetLang("noFunds"));
PlayEffect(player, _config.fx.dnd);
return false;
}
if (currencyType == "item") {
if (GetInventoryItem(player, _config.mainSet.currencyItem, _currencyAmount)) {
SendReply(player, GetLang("upSucc"));
PlayEffect(player, _config.fx.succ);
return true;
}
SendReply(player, GetLang("noFunds"));
PlayEffect(player, _config.fx.dnd);
return false;
}
SendReply(player, GetLang("noFunds"));
PlayEffect(player, _config.fx.dnd);
return false;
}
private bool GetRP(BasePlayer player, int _currencyAmount) {
var checkRP = ServerRewards?.Call<int>("CheckPoints", player.userID);
if (checkRP >= _currencyAmount) {
ServerRewards?.Call("TakePoints", player.userID, _currencyAmount);
return true;
}
return false;
}
private bool GetEco(BasePlayer player, int _currencyAmount) {
double checkEco = Economics.Call<double>("Balance", player.UserIDString);
double _ecoConvert = Convert.ToDouble(_currencyAmount);
int playerBalance = Convert.ToInt32(checkEco);
if (playerBalance >= _currencyAmount) {
Economics.CallHook("Withdraw", player.UserIDString, _ecoConvert);
return true;
}
return false;
}
private bool GetInventoryItem(BasePlayer player, int _itemID, int _itemCost) {
int pInventory = player.inventory.GetAmount(_itemID);
if (pInventory < _itemCost) {
return false;
}
player.inventory.Take(null, _itemID, _itemCost);
return true;
}
#endregion
#region CUI Classes
public class CUIClass {
public static CuiElementContainer CreateOverlay(string _name, string _color, string _anchorMin, string _anchorMax, bool _cursorOn = false, float _fade = 0f, string _mat = "") {
var _element = new CuiElementContainer() {
{
new CuiPanel {
Image = {
Color = _color, Material = _mat, FadeIn = _fade
}
, RectTransform = {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
, CursorEnabled = _cursorOn
}
, new CuiElement().Parent = "Overlay", _name
}
}
;
return _element;
}
public static void CreatePanel(ref CuiElementContainer _container, string _name, string _parent, string _color, string _anchorMin, string _anchorMax, bool _cursorOn = false, float _fade = 0f, string _mat2 = "", string _OffsetMin = "", string _OffsetMax = "") {
_container.Add(new CuiPanel {
Image = {
Color = _color, Material = _mat2, FadeIn = _fade
}
, RectTransform = {
AnchorMin = _anchorMin, AnchorMax = _anchorMax, OffsetMin = _OffsetMin, OffsetMax = _OffsetMax
}
, CursorEnabled = _cursorOn
}
, _parent, _name);
}
public static void CreateImage(ref CuiElementContainer _container, string _parent, string _image, string _anchorMin, string _anchorMax, float _fade = 1f) {
if (_image.StartsWith("http") || _image.StartsWith("www")) {
_container.Add(new CuiElement {
Parent = _parent, Components = {
new CuiRawImageComponent {
Url = _image, Sprite = "assets/content/textures/generic/fulltransparent.tga", FadeIn = _fade
}
, new CuiRectTransformComponent {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
}
}
);
}
else {
_container.Add(new CuiElement {
Parent = _parent, Components = {
new CuiRawImageComponent {
Png = _image, Sprite = "assets/content/textures/generic/fulltransparent.tga", FadeIn = _fade
}
, new CuiRectTransformComponent {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
}
}
);
}
}
public static void CreateInput(ref CuiElementContainer _container, string _name, string _parent, string _color, int _size, string _anchorMin, string _anchorMax, string _font = "permanentmarker.ttf", string _command = "command.processinput", TextAnchor _align = TextAnchor.MiddleCenter) {
_container.Add(new CuiElement {
Parent = _parent, Name = _name, Components = {
new CuiInputFieldComponent {
Text = "0", CharsLimit = 250, Color = _color, IsPassword = false, Command = _command, Font = _font, FontSize = _size, Align = _align
}
, new CuiRectTransformComponent {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
}
,
}
);
}
public static void CreateText(ref CuiElementContainer _container, string _name, string _parent, string _color, string _text, int _size, string _anchorMin, string _anchorMax, TextAnchor _align = TextAnchor.MiddleCenter, string _font = "robotocondensed-bold.ttf", string _outlineColor = "", string _outlineScale = "") {
_container.Add(new CuiElement {
Parent = _parent, Name = _name, Components = {
new CuiTextComponent {
Text = _text, FontSize = _size, Font = _font, Align = _align, Color = _color, FadeIn = 0f,
}
, new CuiOutlineComponent {
Color = _outlineColor, Distance = _outlineScale
}
, new CuiRectTransformComponent {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
}
,
}
);
}
public static void CreateButton(ref CuiElementContainer _container, string _name, string _parent, string _color, string _text, int _size, string _anchorMin, string _anchorMax, string _command = "", string _close = "", string _textColor = "0.843 0.816 0.78 1", float _fade = 1f, TextAnchor _align = TextAnchor.MiddleCenter, string _font = "") {
_container.Add(new CuiButton {
Button = {
Close = _close, Command = _command, Color = _color, Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat", FadeIn = _fade
}
, RectTransform = {
AnchorMin = _anchorMin, AnchorMax = _anchorMax
}
, Text = {
Text = _text, FontSize = _size, Align = _align, Color = _textColor, Font = _font, FadeIn = _fade
}
}
, _parent, _name);
}
}
#endregion
#region Furnace Data
private void SaveFurData() {
if (_furnaceData != null) Interface.Oxide.DataFileSystem.WriteObject($"{Name}/FurnaceData", _furnaceData);
}
private static Dictionary<ulong, FurData> _furnaceData = new Dictionary<ulong, FurData>();
private class FurData {
public int Speed;
public int Fuel;
public int Output;
}
private void LoadFurData() {
if (Interface.Oxide.DataFileSystem.ExistsDatafile($"{Name}/FurnaceData")) {
_furnaceData = Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, FurData>>($"{Name}/FurnaceData");
}
else {
SaveFurData();
}
}
#endregion
#region Localization
protected override void LoadDefaultMessages() {
lang.RegisterMessages(new Dictionary<string, string> {
["noFunds"]
= "Not enough funds to upgrade furnace.", ["upSucc"] = "Furnace was successfully upgraded.", ["noPerms"] = "You missing permissions to access upgrade menu.", ["info"] = $"Upgrades are tied to particular furnace, after picking up or destroying furnace, upgrades are lost.Type /{chatcommand} for more info.", ["speedTitle"] = "Smelting Speed", ["fuelTitle"] = "Fuel Efficiency", ["outTitle"] = "Resource Output", ["speedDesc"] = "Speeding up smelting process.", ["fuelDesc"] = "Decreasing fuel usage per tick.", ["outDesc"] = "Chance to receive extra smelted item.", ["maxLevel"] = "✓ Already Max Level", ["upFor"] = "Upgrade for", ["upgradeBtn"] = "Upgrade", ["chatCommand"] = $"<size=19><color=#FF6800>Furnace Levels</color></size> \n\n Upgrades are tied to particular furnace, after picking up or destroying furnace, upgrades are lost.\n\n To apply purchased upgrades just toggle furnace <color=#FFD6BA>'off'</color> and <color=#FFD6BA>'on'</color>.\n\n <size=16><color=#FFB888>Available Upgrades</color></size>\n• Smelting Speed <color=#FFD6BA><size=10>/{chatcommand} speed</size></color>\n• Fuel Usage <color=#FFD6BA><size=10>/{chatcommand} fuel</size></color> \n• Output Modifier <color=#FFD6BA><size=10>/{chatcommand} output</size></color>", ["chatCommandSpeed"] = "<size=14><color=#FF6800>Speed Upgrades</color></size>\n<size=11>Lower value equals higher smelting speed.</size>\n", ["chatCommandFuel"] = "<size=14><color=#FF6800>Fuel Upgrades</color></size>\n<size=11>Lower value means wood lower food consuption when smelting.</size>\n", ["chatCommandOut"] = "<size=14><color=#FF6800>Output Upgrades</color></size>\n<size=11>Resource output multiplier.</size>\n",
}
, this);
}
private string GetLang(string _message) => lang.GetMessage(_message, this);
#endregion
#region [Config]
private static Configuration _config;
protected override void LoadConfig() {
base.LoadConfig();
_config = Config.ReadObject<Configuration>();
SaveConfig();
}
protected override void LoadDefaultConfig() {
_config = Configuration.CreateConfig();
}
protected override void SaveConfig() => Config.WriteObject(_config);
class Configuration {
[JsonProperty(PropertyName = "Main Settings")]
public MainSet mainSet {
get;
set;
}
public class MainSet {
[JsonProperty("Currency Type")]
public string currencyType {
get;
set;
}
[JsonProperty("Currency Display Name")]
public string currencyDisplayName {
get;
set;
}
[JsonProperty("Currency Item ID (only if type is Item)")]
public int currencyItem {
get;
set;
}
[JsonProperty("Large Furnace Cost Multiplier - Default 1.0x")]
public float largecost {
get;
set;
}
}
[JsonProperty(PropertyName = "Speed (Default is 0.5 - Lowering value increases smelting speed)")]
public SpeedSet speedSet {
get;
set;
}
public class SpeedSet {
[JsonProperty("Modifier")]
public List<float> mod {
get;
set;
}
[JsonProperty("Upgrade Price")]
public List<int> price {
get;
set;
}
}
[JsonProperty(PropertyName = "Fuel (Default is 2.0 - Lower value means wood lasts longer when smelting)")]
public FuelSet fuelSet {
get;
set;
}
public class FuelSet {
[JsonProperty("Modifier")]
public List<float> mod {
get;
set;
}
[JsonProperty("Upgrade Price")]
public List<int> price {
get;
set;
}
}
[JsonProperty(PropertyName = "Chance to receive extra product when item is smelted.")]
public OutSet outSet {
get;
set;
}
public class OutSet {
[JsonProperty("Modifier")]
public List<float> mod {
get;
set;
}
[JsonProperty("Upgrade Price")]
public List<int> price {
get;
set;
}
}
[JsonProperty(PropertyName = "Sound Fx")]
public FxSet fx {
get;
set;
}
public class FxSet {
[JsonProperty("Effects Enabled")]
public bool enabled {
get;
set;
}
[JsonProperty("On Furnace Upgrade")]
public string succ {
get;
set;
}
[JsonProperty("Not Enough Currency")]
public string dnd {
get;
set;
}
}
public static Configuration CreateConfig() {
// ... [Code preview truncated due to length. Full source in attached file] ...