Иконка ресурса

FREE BankSystem : 1.0.1 1.0.1

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using Facepunch.Extend;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
using Random = Oxide.Core.Random;

namespace Oxide.Plugins
{
    [Info("BankSystem", "Kira", "1.0.1")]
    [Description("Economic system")]
    public class BankSystem : RustPlugin
    {
        #region [Vars]

        [PluginReference] private Plugin ImageLibrary;
        private static WaitForSeconds Wait = new WaitForSeconds(0.1f); 
        private const string UIParent = "UI.BankSystem.Hud"; 
        private Vector3 pos1 = new Vector3(-1922.1f, 5.1f, 1449.6f);
        private Quaternion rot1 = new Quaternion(0.0f, 0.7f, 0.0f, -0.7f);
        private Vector3 pos2 = new Vector3(1290.8f, 5.7f, -1396.0f);
        private Quaternion rot2 = new Quaternion(0.0f, 0.4f, 0.0f, 0.9f); 
        private VendingMachine _vendingMachine1;
        private VendingMachine _vendingMachine2;
        private BaseEntity Box1;
        private Vector3 BoxPos1 = new Vector3(-1929.1f, 5.3f, 1473.1f);
        private Quaternion BoxRot1 = Quaternion.Euler(0, 0, 0);
        private BaseEntity Box2;
        private Vector3 BoxPos2 = new Vector3(1307.3f, 6.0f, -1378.7f);
        private Quaternion BoxRot2 = new Quaternion(0.0f, 0.9f, 0.0f, 0.3f);
        private const string PREFAB_CODE_LOCK = "assets/prefabs/locks/keypad/lock.code.prefab";
        private const string PREFAB_BOX = "assets/prefabs/deployable/large wood storage/box.wooden.large.prefab";

        #endregion

        #region [Configuraton] / [Конфигурация]

        private ConfigData _config;

        public class ConfigData
        {
            [JsonProperty(PropertyName = "BankSystem - Config")]
            public BankSystemCFG BankSystem = new BankSystemCFG();

            public class BankSystemCFG
            {
                [JsonProperty(PropertyName = "[Налог при смерти] (%)")]
                public int DeathNALOG = 20;
            }
        }

        private ConfigData GetDefaultConfig()
        {
            return new ConfigData
            {
                BankSystem = new ConfigData.BankSystemCFG
                {
                    DeathNALOG = 20
                }
            };
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();

            try
            {
                _config = Config.ReadObject<ConfigData>();
            }
            catch
            {
                LoadDefaultConfig();
            }

            SaveConfig();
        }

        protected override void LoadDefaultConfig()
        {
            PrintError("Файл конфигурации поврежден (или не существует), создан новый!");
            _config = GetDefaultConfig();
        }

        protected override void SaveConfig()
        {
            Config.WriteObject(_config);
        }

        #endregion

        #region [Lang]

        protected override void LoadDefaultMessages()
        {
            var ru = new Dictionary<string, string>
            {
                ["ENTERCOINS"] = "Введите число шреков",
                ["ENTERNUMBER"] = "Введите корректное число",
                ["ADDBALANCE"] = "Баланс пополнен",
                ["NOMONEY"] = "Недостаточно шреков",
                ["BALANCE"] = "На вашем балансе {1} шреков",
                ["ENTER"] = "ВВЕДИТЕ"
            };

            var en = new Dictionary<string, string>
            {
                ["ENTERCOINS"] = "Enter the number of shreks",
                ["ENTERNUMBER"] = "Enter the correct number",
                ["ADDBALANCE"] = "The balance is replenished",
                ["NOMONEY"] = "Not enough shreks",
                ["BALANCE"] = "There are {1} shreks on your balance",
                ["ENTER"] = "ENTER"
            };
            lang.RegisterMessages(ru, this, "ru");
            lang.RegisterMessages(en, this);
        }

        #endregion

        #region [DrawUI]

        private void DrawUI_Trade(BasePlayer player)
        {
            var ui = new CuiElementContainer
            {
                {
                    new CuiPanel
                    {
                        CursorEnabled = true,
                        Image =
                        {
                            Color = "0 0 0 0"
                        },
                        RectTransform =
                        {
                            AnchorMin = "0 0",
                            AnchorMax = "1 1"
                        }
                    },
                    "Hud", "UI.BankSystem"
                }
            };

            ui.Add(new CuiButton
            {
                Button =
                {
                    Close = "UI.BankSystem",
                    Color = "0 0 0 0"
                },
                Text = {Text = " "},
                RectTransform =
                {
                    AnchorMin = "0 0",
                    AnchorMax = "1 1"
                }
            }, "UI.BankSystem");

            ui.Add(new CuiElement
            {
                Name = "UI.BankSystem.Trade",
                Parent = "UI.BankSystem",
                Components =
                {
                    new CuiRawImageComponent
                    {
                        Png = GetImage("UI.BankSystem.Trade")
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.309179 0.2230871",
                        AnchorMax = "0.6908209 0.7769129"
                    }
                }
            });

            ui.Add(new CuiLabel
            {
                Text =
                {
                    Align = TextAnchor.MiddleCenter,
                    Color = "1.00 0.84 0.00 0.55",
                    FontSize = 16,
                    Text = $"x{GetMoneyCount(player)}"
                },
                RectTransform =
                {
                    AnchorMin = "0.3601163 0.5969682",
                    AnchorMax = "0.5962129 0.672204"
                }
            }, "UI.BankSystem.Trade");

            ui.Add(new CuiLabel
            {
                Text =
                {
                    Align = TextAnchor.MiddleCenter,
                    Color = "1.00 0.84 0.00 0.55",
                    FontSize = 16,
                    Text = $"x{GetBalance(player.userID)}"
                },
                RectTransform =
                {
                    AnchorMin = "0.3601163 0.06531323",
                    AnchorMax = "0.5962129 0.1405491"
                }
            }, "UI.BankSystem.Trade");

            CuiHelper.AddUi(player, ui);
            DrawUI_Input1(player);
            DrawUI_Input2(player);
        }

        private void DrawUI_Input1(BasePlayer player)
        {
            var ui = new CuiElementContainer();

            ui.Add(new CuiElement
            {
                Name = $"{UIParent}.Input1",
                Parent = "UI.BankSystem.Trade",
                Components =
                {
                    new CuiInputFieldComponent
                    {
                        Command = "BankSystem.Trade +",
                        Align = TextAnchor.MiddleCenter,
                        Color = "0.39 0.40 0.43 1.00",
                        Text = lang.GetMessage("ENTER", this, player.UserIDString)
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.0742103 0.5969681",
                        AnchorMax = "0.3103082 0.6722033"
                    }
                }
            });

            CuiHelper.AddUi(player, ui);
        }

        private void DrawUI_Input2(BasePlayer player)
        {
            var ui = new CuiElementContainer();

            ui.Add(new CuiElement
            {
                Name = $"{UIParent}.Input2",
                Parent = "UI.BankSystem.Trade",
                Components =
                {
                    new CuiInputFieldComponent
                    {
                        Command = "BankSystem.Trade -",
                        Align = TextAnchor.MiddleCenter,
                        Color = "0.39 0.40 0.43 1.00",
                        Text = lang.GetMessage("ENTER", this, player.UserIDString)
                    },
                    new CuiRectTransformComponent
                    {
                        AnchorMin = "0.6337423 0.06531322",
                        AnchorMax = "0.8698384 0.1405475"
                    }
                }
            });

            CuiHelper.AddUi(player, ui);
        }

        private void DrawUI_CardMoney(BasePlayer player)
        {
            var ui = new CuiElementContainer
            {
                new CuiElement
                {
                    Name = UIParent,
                    Parent = "Hud",
                    Components =
                    {
                        new CuiImageComponent
                        {
                            Color = "0.57 0.55 0.55 0.37"
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.5 0",
                            AnchorMax = "0.5 0",
                            OffsetMin = "185 18",
                            OffsetMax = "250 78"
                        }
                    }
                },
                new CuiElement
                {
                    Name = $"{UIParent}.IC",
                    Parent = UIParent,
                    Components =
                    {
                        new CuiRawImageComponent
                        {
                            Png = GetImage("UI.BankSystem.IC64")
                        },
                        new CuiRectTransformComponent
                        {
                            AnchorMin = "0.2179487 0.1944444",
                            AnchorMax = "0.7820513 0.8055556"
                        }
                    }
                }
            };

            ui.Add(new CuiLabel
            {
                Text =
                {
                    Text = $"x{GetBalance(player.userID)}",
                    FontSize = 13,
                    Align = TextAnchor.MiddleCenter,
                    Color = "1 1 1 0.55"
                },
                RectTransform =
                {
                    AnchorMin = "0 0",
                    AnchorMax = "1 0.2777778"
                }
            }, UIParent);

            CuiHelper.DestroyUi(player, UIParent);
            CuiHelper.AddUi(player, ui);
        }

        #endregion

        #region [Hooks] / [Крюки]

        // ReSharper disable once UnusedMember.Local
        private object OnPlayerDeath(BasePlayer player, HitInfo info)
        {
            if (player == null || info == null) return null;
            if (!_database.Clients.ContainsKey(player.userID)) return null;
            var db = _database.Clients[player.userID];
            if (db.Balance > 0)
                SetBalance(player.userID,
                    Convert.ToInt32((double) db.Balance / 100 * (100 - _config.BankSystem.DeathNALOG)));
            return null;
        }

        // ReSharper disable once UnusedMember.Local
        private bool CanUseVending(BasePlayer player, VendingMachine machine)
        {
            switch (machine.skinID)
            {
                case 2556:
                    DrawUI_Trade(player);
                    return false;
                default:
                    return true;
            }
        }

        // ReSharper disable once UnusedMember.Local
        private void OnServerInitialized()
        {
            LoadData();
            ServerMgr.Instance.StartCoroutine(CheckAllInDataBase());
            ImageLibrary.Call("AddImage", "https://i.imgur.com/aL9Ii8o.png", "UI.BankSystem.Trade");
            ImageLibrary.Call("AddImage", "https://i.imgur.com/qPiXX09.png", "UI.BankSystem.IC64");
            ServerMgr.Instance.StartCoroutine(LoadHud());
            SpawnNpc(pos1, rot1, 1);
            SpawnNpc(pos2, rot2, 2);
            Box1 = GameManager.server.CreateEntity(PREFAB_BOX, BoxPos1, BoxRot1);
            Box1.skinID = 4001;
            Box1.Spawn();
            if (_database.BalanceOCG > 1)
                ItemManager.CreateByName("ducttape", _database.BalanceOCG, 2808484201).MoveToContainer(Box1.GetComponent<StorageContainer>().inventory);
            Box2 = GameManager.server.CreateEntity(PREFAB_BOX, BoxPos2, BoxRot2);
            Box2.skinID = 4002;
            Box2.Spawn();
            if (_database.BalanceWSARMY > 1)
                ItemManager.CreateByName("ducttape", _database.BalanceWSARMY, 2808484201).MoveToContainer(Box2.GetComponent<StorageContainer>().inventory);

            CodeLock(Box1);
            CodeLock(Box2);
        }

        // ReSharper disable once UnusedMember.Local
        private void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
        {
            switch (entity.skinID)
            {
                case 4001:
                {
                    _database.BalanceOCG = 0;
                    break;
                }
                case 4002:
                {
                    _database.BalanceWSARMY = 0;
                    break;
                }
            }
        }

        // ReSharper disable once UnusedMember.Local
        private void OnPlayerConnected(BasePlayer player)
        {
            CheckInDataBase(player.userID);
            DrawUI_CardMoney(player);
        }

        // ReSharper disable once UnusedMember.Local
        private void Unload()
        {
            SaveData();
            ServerMgr.Instance.StartCoroutine(UnloadHud());
            _vendingMachine1.Kill();
            _vendingMachine2.Kill();
            if (Box1 != null) Box1.Kill();
            if (Box2 != null) Box2.Kill();
        }

        private void CodeLock(BaseEntity box)
        {
            var codeLock = GameManager.server.CreateEntity(PREFAB_CODE_LOCK) as CodeLock;
            if (codeLock == null) return;
            codeLock.SetParent(box, box.GetSlotAnchorName(BaseEntity.Slot.Lock));
            codeLock.OwnerID = box.OwnerID;
            codeLock.Spawn();
            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
            codeLock.code = Random.Range(1000, 10000).ToString();
            codeLock.SetFlag(BaseEntity.Flags.Locked, true);
            box.SetSlot(BaseEntity.Slot.Lock, codeLock);
        }

        #endregion

        #region [ConsoleCommands]

        [ConsoleCommand("banksystem.givebalance")]
        // ReSharper disable once UnusedMember.Local
        private void BankSystem_GiveBalance(ConsoleSystem.Arg args)
        {
            if (args.Player() != null) return;
            if (args.Args.Length <= 1)
            {
                PrintWarning("Error, information entered incorrectly");
                return;
            }

            var player = Convert.ToUInt64(args.Args[0]);
            if (!_database.Clients.ContainsKey(player))
            {
                PrintWarning($"Player [{player}] not found, check ID");
                return;
            }

            var money = args.Args[1].ToInt();
            GiveBalance(player, money);
        }

        [ConsoleCommand("banksystem.trade")]
        // ReSharper disable once UnusedMember.Local
        private void BankSystem_Trade(ConsoleSystem.Arg args)
        {
            if (args.Player() == null) return;
            var player = args.Player();
            if (args.Args[0] == "+")
            {
                if (player.inventory.FindItemID("ducttape") == null) return;
                var item = player.inventory.FindItemID("ducttape");
                if (args.Args.Length < 2)
                {
                    player.ChatMessage(lang.GetMessage("ENTERCOINS", this, player.UserIDString));
                    return;
                }

                if (!args.Args[1].IsNumeric())
                {
                    player.ChatMessage(lang.GetMessage("ENTERNUMBER", this, player.UserIDString));
                    return;
                }

                if ((player.inventory.FindItemID("ducttape").amount > 0 &
                     player.inventory.FindItemID("ducttape").skin == 2808484201))
                {
                    var count = args.Args[1].ToInt();

                    player.ChatMessage(count.ToString());
                    if (count <= item.amount & count != 0)
                    {
                        GiveBalance(player.userID, count);
                        var amount = item.amount - count;
                        item.DoRemove();
                        if (amount > 0)
                        {
                            var newitem = ItemManager.CreateByName("ducttape", amount, 2808484201);
                            newitem.name = "SHREK";
                            player.GiveItem(newitem);
                        }

                        player.ChatMessage(lang.GetMessage("ADDBALANCE", this, player.UserIDString));
                        CuiHelper.DestroyUi(player, "UI.BankSystem");
                    }
                    else
                    {
                        player.ChatMessage(lang.GetMessage("NOMONEY", this, player.UserIDString));
                    }
                }
            }
            else
            {
                if (!args.Args[1].IsNumeric())
                {
                    player.ChatMessage(lang.GetMessage("ENTERNUMBER", this, player.UserIDString));
                    return;
                }

                var balance = GetBalance(player.userID);
                if (balance > 0)
                {
                    var count = args.Args[1].ToInt();
                    var item = ItemManager.CreateByName("ducttape", count);
                    item.name = "Shrek";
                    item.skin = 2808484201;
                    player.GiveItem(item);
                    TakeBalance(player.userID, count);
                }
                else
                {
                    player.ChatMessage(
                        lang.GetMessage("BALANCE", this, player.UserIDString).Replace("{1}", $"{balance}"));
                }
            }

            CuiHelper.DestroyUi(player, "UI.BankSystem");
        }

        [ConsoleCommand("banksystem.setbalance")]
        // ReSharper disable once UnusedMember.Local
        private void BankSystem_SetBalance(ConsoleSystem.Arg args)
        {
            if (args.Player() != null) return;
            if (args.Args.Length <= 1)
            {
                PrintWarning($"Error, information entered incorrectly");
                return;
            }

            var player = Convert.ToUInt64(args.Args[0]);
            if (!_database.Clients.ContainsKey(player))
            {
                PrintWarning($"Player [{player}] not found, check ID");
                return;
            }

            var money = args.Args[1].ToInt();
            SetBalance(player, money);
        }

        [ConsoleCommand("banksystem.takebalance")]
        // ReSharper disable once UnusedMember.Local
        private void BankSystem_TakeBalance(ConsoleSystem.Arg args)
        {
            if (args.Player() != null) return;
            if (args.Args.Length <= 1)
            {
                PrintWarning($"Error, information entered incorrectly");
                return;
            }

            var player = Convert.ToUInt64(args.Args[0]);
            if (!_database.Clients.ContainsKey(player))
            {
                PrintWarning($"Player [{player}] not found, check ID");
                return;
            }

            var money = args.Args[1].ToInt();
            TakeBalance(player, money);
        }

        [ConsoleCommand("banksystem.givemoney")]
        // ReSharper disable once UnusedMember.Local
        private void BankSystem_GiveMoney(ConsoleSystem.Arg args)
        {
            if (args.Player() != null) return;
            if (args.Args.Length <= 1)
            {
                PrintWarning("Error, information entered incorrectly");
                return;
            }

            var player = Convert.ToUInt64(args.Args[0]);
            if (!_database.Clients.ContainsKey(player))
            {
                PrintWarning($"Player [{player}] not found, check ID");
                return;
            }

            var count = args.Args[1].ToInt();
            var item = ItemManager.CreateByName("ducttape", count);
            item.name = "SHREK";
            item.skin = 2808484201;
            BasePlayer.FindByID(player).GiveItem(item);
        }

        // ReSharper disable once UnusedMember.Local
        private void SpawnNpc(Vector3 pos, Quaternion rot, int num)
        {
            var npc = GameManager.server.CreateEntity(
                "assets/prefabs/deployable/vendingmachine/vendingmachine.deployed.prefab",
                pos) as VendingMachine;
            npc.shopName = "BankMachine";
            npc.skinID = 2556;
            npc.transform.rotation = rot;
            npc.Spawn();
            npc.SendNetworkUpdate();

            switch (num)
            {
                case 1:
                    _vendingMachine1 = npc;
                    break;
                case 2:
                    _vendingMachine2 = npc;
                    break;
            }
        }

        #endregion

        #region [DataBase]

        private StoredData _database = new StoredData();

        private class StoredData
        {
            public Dictionary<ulong, BankClient> Clients = new Dictionary<ulong, BankClient>();

            public class BankClient
            {
                public int Balance;
            }

            public int BalanceOCG;
            public int BalanceWSARMY;
        }

        private void SaveData() => Interface.Oxide.DataFileSystem.WriteObject(Name, _database);

        private void LoadData()
        {
            try
            {
                _database = Interface.GetMod().DataFileSystem.ReadObject<StoredData>(Name);
            }
            catch (Exception)
            {
                _database = new StoredData();
            }
        }

        #endregion

        #region [Helpers]

        private IEnumerator LoadHud()
        {
            foreach (var player in BasePlayer.activePlayerList) DrawUI_CardMoney(player);
            yield return 0;
        }

        private IEnumerator UnloadHud()
        {
            foreach (var player in BasePlayer.activePlayerList) CuiHelper.DestroyUi(player, "UI.BankSystem.Hud");
            yield return 0;
        }

        private int GetMoneyCount(BasePlayer player)
        {
            return player.inventory.AllItems().Where(item => item.info.shortname == "ducttape" & item.skin == 2808484201).Sum(item => item.amount);
        }

        private string GetImage(string name)
        {
            return (string) ImageLibrary?.Call("GetImage", name);
        }

        private void CheckInDataBase(ulong player)
        {
            if (_database.Clients.ContainsKey(player)) return;
            _database.Clients.Add(player, new StoredData.BankClient());
        }

        private IEnumerator CheckAllInDataBase()
        {
            foreach (var player in BasePlayer.activePlayerList)
            {
                CheckInDataBase(player.userID);
                yield return Wait;
            }

            yield return 0;
        }

        #endregion

        #region [API]

        private void GiveBalance(ulong player, int money)
        {
            CheckInDataBase(player);
            _database.Clients[player].Balance += money;
            if (BasePlayer.FindByID(player) != null)
            {
                var obj = BasePlayer.FindByID(player);
                DrawUI_CardMoney(obj);
                switch (obj.Team.teamName)
                {
                    case "OCGBirch":
                        _database.BalanceOCG += (money / 100) * 20;
                        ItemManager.CreateByName("ducttape", _database.BalanceOCG, 2808484201).MoveToContainer(Box1.GetComponent<StorageContainer>().inventory);
                        break;
                    case "WSARMY":
                        _database.BalanceOCG += (money / 100) * 20;
                        ItemManager.CreateByName("ducttape", _database.BalanceOCG, 2808484201).MoveToContainer(Box2.GetComponent<StorageContainer>().inventory);
                        break;
                }
            }
        }

        private void SetBalance(ulong player, int money)
        {
            CheckInDataBase(player);
            _database.Clients[player].Balance = money;
            if (_database.Clients[player].Balance <= 0) _database.Clients[player].Balance = 0;
            if (BasePlayer.FindByID(player) != null) DrawUI_CardMoney(BasePlayer.FindByID(player));
        }

        private void TakeBalance(ulong player, int money)
        {
            CheckInDataBase(player);
            _database.Clients[player].Balance -= money;
            if (_database.Clients[player].Balance <= 0) _database.Clients[player].Balance = 0;
            if (BasePlayer.FindByID(player) != null)
            {
                var obj = BasePlayer.FindByID(player);
                DrawUI_CardMoney(obj);
                switch (obj.Team.teamName)
                {
                    case "OCGBirch":
                        _database.BalanceOCG += (money / 100) * 20;
                        ItemManager.CreateByName("ducttape", _database.BalanceOCG, 2808484201).MoveToContainer(Box1.GetComponent<StorageContainer>().inventory);
                        break;
                    case "WSARMY":
                        _database.BalanceOCG += (money / 100) * 20;
                        ItemManager.CreateByName("ducttape", _database.BalanceOCG, 2808484201).MoveToContainer(Box2.GetComponent<StorageContainer>().inventory);
                        break;
                }
            }
        }

        private int GetBalance(ulong player)
        {
            var balance = 0;
            if (_database.Clients.ContainsKey(player)) balance = _database.Clients[player].Balance;
            return balance;
        }

        #endregion
    }
}

Автор
15FPS
Скачиваний
0
Просмотры
1
Первый выпуск
Обновление
Оценка
0.00 звёзд 0 оценок
Сверху