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

FREE IQEconomic : 0.1.1 0.1.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Globalization;
using ConVar;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;

namespace Oxide.Plugins
{
    [Info("IQEconomic", "Mercury", "0.1.1")]
    [Description("Экономика на ваш сервер")]
    class IQEconomic : RustPlugin
    {
        #region Reference
        [PluginReference] Plugin IQChat, Friends, Clans, Battles, Duel, RustStore, ImageLibrary;
        public void SendChat(string Message, BasePlayer player, Chat.ChatChannel channel = Chat.ChatChannel.Global)
        {
            var Chat = config.ReferenceSettings.ChatSettings;
            if (IQChat)
                if (Chat.UIAlertUse)
                    IQChat?.Call("API_ALERT_PLAYER_UI", player, Message);                    
                else IQChat?.Call("API_ALERT_PLAYER", player, Message, Chat.CustomPrefix, Chat.CustomAvatar);
            else player.SendConsoleCommand("chat.add", channel, 0, Message);
        }
        private string GetImage(string fileName, ulong skin = 0)
        {
            var imageId = (string)plugins.Find("ImageLibrary").CallHook("GetImage", fileName, skin);
            if (!string.IsNullOrEmpty(imageId))
                return imageId;
            return string.Empty;
        }
        public bool AddImage(string url, string shortname, ulong skin = 0) => (bool)ImageLibrary?.Call("AddImage", url, shortname, skin);

        public void AddAllImage()
        {
            var Images = config.TransferSettings;
            if (string.IsNullOrEmpty(Images.URLMoney) || string.IsNullOrEmpty(Images.URLStores)) return;
            if (!ImageLibrary)
            {
                PrintError("Не установлен плагин ImageLibrary!");
                return;
            }

            AddImage(Images.URLMoney, "URLMoney");
            AddImage(Images.URLStores, "URLStores");
        }

        public bool IsFriends(ulong userID, ulong targetID)
        {
            if (Friends)
                return (bool)Friends?.Call("HasFriend", userID, targetID);
            else return false;
        }
        public bool IsClans(ulong userID, ulong targetID)
        {
            if (Clans)
                return (bool)Clans?.Call("HasFriend", userID, targetID);
            else return false;
        }
        public bool IsDuel(ulong userID)
        {
            if (Battles)
                return (bool)Battles?.Call("IsPlayerOnBattle", userID);
            else if (Duel) return (bool)Duel?.Call("IsPlayerOnActiveDuel", BasePlayer.FindByID(userID));
            else return false;
        }
        public void MoscovOVHBalanceSet(ulong userID, int Balance, int MoneyTake)
        {
            if (!RustStore)
            {
                PrintWarning("У вас не установлен магазин MoscovOVH");
                return;
            }
            plugins.Find("RustStore").CallHook("APIChangeUserBalance", userID, Balance, new Action<string>((result) =>
            {
                BasePlayer player = BasePlayer.FindByID(userID);
                if (result == "SUCCESS")
                {
                    Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
                    RemoveBalance(userID, MoneyTake);
                    if (player == null) return;
                    SendChat(lang.GetMessage("CHAT_STORE_SUCCESS", this, player.UserIDString), player);
                    return;
                }
                Puts($"Пользователь {userID} не авторизован в магазине");
                if (player == null) return;
                SendChat(lang.GetMessage("CHAT_NO_AUTH_STORE", this, player.UserIDString), player);
            }));
        }
        public void GameStoresBalanceSet(ulong userID, int Balance,int MoneyTake)
        {
            var GameStores = config.ReferenceSettings.GameStoresSettings;
            if (String.IsNullOrEmpty(GameStores.GameStoresAPIStore) || String.IsNullOrEmpty(GameStores.GameStoresIDStore))
            {
                PrintWarning("Магазин GameStores не настроен! Невозможно выдать баланс пользователю");
                return;
            }
            webrequest.Enqueue($"https://gamestores.ru/api?shop_id={GameStores.GameStoresIDStore}&secret={GameStores.GameStoresAPIStore}&action=moneys&type=plus&steam_id={userID}&amount={Balance}&mess={GameStores.GameStoresMessage}", null, (i, s) =>
            {
                BasePlayer player = BasePlayer.FindByID(userID);
                if (i != 200) { }
                if (s.Contains("success"))
                {
                    Puts($"Пользователю {userID} успешно зачислен баланс - {Balance}");
                    RemoveBalance(userID, MoneyTake);
                    if (player == null) return;
                    SendChat(lang.GetMessage("CHAT_STORE_SUCCESS", this, player.UserIDString), player);
                    return;
                }
                if (s.Contains("fail"))
                {
                    Puts($"Пользователь {userID} не авторизован в магазине");
                    if (player == null) return;
                    SendChat(lang.GetMessage("CHAT_NO_AUTH_STORE", this, player.UserIDString),player);
                }
            }, this);
        }
        #endregion

        #region Configuration
        private static Configuration config = new Configuration();
        private class Configuration
        {
            [JsonProperty("Монетки будут и гроков на руках - false / Иначе будет чат или интерфейсе - true")]
            public bool UseUI;
            [JsonProperty("Использовать UI интерфейс для отображения баланса(true - да(Если вы не поставили , чтобы монетки были на руках))/false - информация будет в чате по команде и при входе)")]
            public bool UseUIMoney;
            [JsonProperty("Включить обмен валюты на баланс в магазине(GameStores/MoscovOVH)")]
            public bool TransferStoreUse;
            [JsonProperty("Отображение интерфейса с балансом(true - отображает/false - скрывает)")]
            public bool ShowUI;
            [JsonProperty("Настройки обмена валют на баланс в магазине")]
            public TransferSetting TransferSettings = new TransferSetting();
            [JsonProperty("Основные настройки")]
            public GeneralSettings GeneralSetting = new GeneralSettings();
            [JsonProperty("Настройки валюты(Если вид экономикик - false)")]
            public CustomMoney CustomMoneySetting = new CustomMoney();
            [JsonProperty("Настройки совместной работы с другими плагинами")]
            public ReferenceSetting ReferenceSettings = new ReferenceSetting();
            internal class CustomMoney
            {
                [JsonProperty("Название валюты")]
                public string DisplayName;
                [JsonProperty("Shortname монетки")]
                public string Shortname;
                [JsonProperty("SkinID монетки")]
                public ulong SkinID;
            }
                
            internal class GeneralSettings
            {
                [JsonProperty("Получение валюты за убийство игроков")]
                public bool BPlayerKillUse;
                [JsonProperty("Получение валюты за убийство животных")]
                public bool BPlayerAnimalUse;
                [JsonProperty("Получение валюты за убийство NPC")]
                public bool BPlayerNPCUse;
                [JsonProperty("Получение валюты за добычу ресурсов")]
                public bool BPlayerGatherUse;
                [JsonProperty("Получение валюты за уничтожение танка")]
                public bool BPlayerBradleyUse;
                [JsonProperty("Получение валюты за уничтожение вертолета")]
                public bool BPlayerHelicopterUse;
                [JsonProperty("Получение валюты за уничтожение бочек")]
                public bool BPLayerBarrelUse;
                [JsonProperty("Получение валюты проведенное время на сервере")]
                public bool BPLayerOnlineUse;
                [JsonProperty("Сколько нужно провести времени,чтобы выдали награду")]
                public int BPlayerOnlineTime;
                [JsonProperty("Сколько начислять валюты за проведенное время на сервере")]
                public int BPlayerOnlineGive;
                [JsonProperty("Настройка зачисления баланса за убийство игроков")]
                public AdvancedSetting BPlayerKillGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за убийство животных")]
                public AdvancedSetting BPlayerAnimalGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за убийство NPC")]
                public AdvancedSetting BPlayerNPCGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за уничтожение танка")]
                public AdvancedSetting BPlayerBradleyGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за уничтожение вертолета")]
                public AdvancedSetting BPlayerHelicopterGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за уничтожение бочек")]
                public AdvancedSetting BPlayerBarrelGive = new AdvancedSetting();
                [JsonProperty("Сколько начислять валюты за добычу ресурсов ( [за какой ресурс давать] = { остальная настройка }")]
                public Dictionary<string,AdvancedSetting> BPlayerGatherGive = new Dictionary<string, AdvancedSetting>();

                internal class AdvancedSetting
                {
                    [JsonProperty("Шанс получить валюту")]
                    public int Rare;
                    [JsonProperty("Сколько выдавать валюты")]
                    public int BPlayerGive;
                }
            }
            internal class TransferSetting
            {
                [JsonProperty("URL вашей монеты")]
                public string URLMoney;
                [JsonProperty("URL валюты для магазина")]
                public string URLStores;
                [JsonProperty("Сколько монет требуется для обмена")]
                public int MoneyCount;
                [JsonProperty("Сколько баланса получит игрок после обмена")]
                public int StoresMoneyCount;
            }
            internal class ReferenceSetting
            {
                [JsonProperty("Friends : Запретить получение монет за убийство друзей")]
                public bool FriendsBlockUse;
                [JsonProperty("Clans : Запретить получение монет за убийство сокланов")]
                public bool ClansBlockUse;
                [JsonProperty("Duel/Battles : Запретить получение монет за убийство на дуэлях")]
                public bool DuelBlockUse;
                [JsonProperty("MoscovOVH : Включить использование магазина(Должен быть включен обмен валют)")]
                public bool MoscovOvhUse;
                [JsonProperty("GameStores : Включить использование магазина(Должен быть включен обмен валют)")]
                public bool GameStoreshUse;
                [JsonProperty("GameStores : Настройки магазина GameStores")]
                public GameStores GameStoresSettings = new GameStores();
                [JsonProperty("IQChat : Настройки чата")]
                public ChatSetting ChatSettings = new ChatSetting();
                internal class ChatSetting
                {
                    [JsonProperty("IQChat : Кастомный префикс в чате")]
                    public string CustomPrefix;
                    [JsonProperty("IQChat : Кастомный аватар в чате(Если требуется)")]
                    public string CustomAvatar;
                    [JsonProperty("IQChat : Использовать UI уведомления")]
                    public bool UIAlertUse;
                }
                internal class GameStores
                {
                    [JsonProperty("API Магазина(GameStores)")]
                    public string GameStoresAPIStore;
                    [JsonProperty("ID Магазина(GameStores)")]
                    public string GameStoresIDStore;
                    [JsonProperty("Сообщение в магазин при выдаче баланса(GameStores)")]
                    public string GameStoresMessage;
                }
            }

            public static Configuration GetNewConfiguration()
            {
                return new Configuration
                {
                    UseUI = true,
                    ShowUI = true,
                    UseUIMoney = true,
                    TransferStoreUse = true,
                    TransferSettings = new TransferSetting
                    {
                        MoneyCount = 3,
                        StoresMoneyCount = 1,
                        URLMoney = "https://i.imgur.com/1dXVda4.png",
                        URLStores = "https://i.imgur.com/vPjkizs.png",
                    },
                    GeneralSetting = new GeneralSettings
                    {
                        BPLayerOnlineUse = true,
                        BPLayerBarrelUse = true,
                        BPlayerKillUse = true,
                        BPlayerAnimalUse = true,
                        BPlayerNPCUse = true,
                        BPlayerGatherUse = true,
                        BPlayerBradleyUse = true,
                        BPlayerHelicopterUse = true,
                        BPlayerOnlineTime = 60,
                        BPlayerOnlineGive = 5,
                        BPlayerAnimalGive = new GeneralSettings.AdvancedSetting { Rare = 53, BPlayerGive = 3 },
                        BPlayerKillGive = new GeneralSettings.AdvancedSetting { Rare = 40, BPlayerGive = 5 },
                        BPlayerNPCGive = new GeneralSettings.AdvancedSetting { Rare = 20, BPlayerGive = 2 },
                        BPlayerBradleyGive = new GeneralSettings.AdvancedSetting { Rare = 100 , BPlayerGive = 15},
                        BPlayerHelicopterGive = new GeneralSettings.AdvancedSetting { Rare = 90, BPlayerGive = 10 },
                        BPlayerBarrelGive = new GeneralSettings.AdvancedSetting { Rare = 10, BPlayerGive = 3 },
                        BPlayerGatherGive = new Dictionary<string, GeneralSettings.AdvancedSetting>
                        {
                            ["sulfur.ore"] = new GeneralSettings.AdvancedSetting
                            {
                                BPlayerGive = 10,
                                Rare = 10,
                            },
                            ["stones"] = new GeneralSettings.AdvancedSetting
                            {
                                Rare = 20,
                                BPlayerGive = 1,
                            }
                        },
                    },
                    CustomMoneySetting = new CustomMoney
                    {
                        DisplayName = "Монета удачи",
                        Shortname = "bleach",
                        SkinID = 1337228,
                    },
                    ReferenceSettings = new ReferenceSetting
                    {
                        FriendsBlockUse = true,
                        ClansBlockUse = true,
                        DuelBlockUse = true,
                        MoscovOvhUse = true,
                        GameStoreshUse = false,
                        GameStoresSettings = new ReferenceSetting.GameStores
                        {
                            GameStoresAPIStore = "",
                            GameStoresIDStore = "",
                            GameStoresMessage = "Успешный обмен"
                        },
                        ChatSettings = new ReferenceSetting.ChatSetting
                        {
                            CustomAvatar = "",
                            CustomPrefix = "",
                            UIAlertUse = true,
                        }
                    }

                };
            }
        }

        protected override void LoadConfig()
        {
            base.LoadConfig();
            try
            {
                config = Config.ReadObject<Configuration>();
                if (config == null) LoadDefaultConfig();
            }
            catch
            {
                PrintWarning("Ошибка #49" + $"чтения конфигурации 'oxide/config/{Name}', создаём новую конфигурацию! #33");
                LoadDefaultConfig();
            }
            NextTick(SaveConfig);
        }

        protected override void LoadDefaultConfig() => config = Configuration.GetNewConfiguration();
        protected override void SaveConfig() => Config.WriteObject(config);
        #endregion

        #region Data
        [JsonProperty("Система экономики")] public Dictionary<ulong, InformationData> DataEconomics = new Dictionary<ulong, InformationData>();
        void ReadData() { 
            DataEconomics = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, InformationData>>("IQEconomic/DataEconomics");
        }
        void WriteData() {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/DataEconomics", DataEconomics);
        }
        void RegisteredDataUser(ulong player)
        {
            if (!DataEconomics.ContainsKey(player))
                DataEconomics.Add(player, new InformationData { Balance = 0, Time = 0 });
        }
        public class InformationData
        {
            [JsonProperty("Баланс игрока")]
            public int Balance;
            [JsonProperty("Счетчик времени")]
            public int Time;
        }
        #endregion

        #region Command

        [ChatCommand("transfer")]
        void ChatCommandTransfer(BasePlayer player, string cmd, string[] arg)
        {
            if (player == null) return;
            if (!config.TransferStoreUse && arg.Length == 0 || arg == null)
            {
                SendChat(lang.GetMessage("TRANSFER_COMMAND_NO_ARGS", this, player.UserIDString),player);
                return;
            }
            else if(config.TransferStoreUse && arg.Length == 0 || arg == null)
            {
                Interface_Changer(player);
                return;
            }
            BasePlayer transferPlayer = FindPlayer(arg[0]);
            if (transferPlayer == null)
            {
                SendChat(lang.GetMessage("BALANCE_CUSTOM_MONEY_NOT_PLAYER", this, player.UserIDString), player);
                return;
            }
            if(transferPlayer.IsDead())
            {
                SendChat(lang.GetMessage("BALANCE_TRANSFER_TRANSFERPLAYER_DIE", this, player.UserIDString), player);
                return;
            }

            int TransferBalance = Convert.ToInt32(arg[1]);
            TransferPlayer(player.userID, transferPlayer.userID, TransferBalance);
        }
        
        [ConsoleCommand("transfer")]
        void ConsoleCommandTransfer(ConsoleSystem.Arg args)
        {
            BasePlayer player = args.Player();
            if (player == null) return;
            int Balance = GetBalance(player.userID);
            var Reference = config.ReferenceSettings;

            if (!IsTransfer(Balance)) return;
            var Transfer = config.TransferSettings;

            if (Reference.GameStoreshUse)
                GameStoresBalanceSet(player.userID, Transfer.StoresMoneyCount, Transfer.MoneyCount);

            if(Reference.MoscovOvhUse)
                MoscovOVHBalanceSet(player.userID, Transfer.StoresMoneyCount, Transfer.MoneyCount);

            CuiElementContainer container = new CuiElementContainer();
            CuiHelper.DestroyUi(player, "MY_INFO_TRANSFERS");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "1 1", AnchorMax = "1 1", OffsetMin = "-130 5", OffsetMax = "60 50" },
                Text = { Text = String.Format(lang.GetMessage("UI_CHANGER_MY_INFO", this, player.UserIDString), GetBalance(player.userID) - Transfer.MoneyCount), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter, FadeIn = 0.3f }
            }, UI_CHANGER_PARENT, "MY_INFO_TRANSFERS");

            CuiHelper.AddUi(player, container);

        }

        [ConsoleCommand("migration")]
        void MigrationDataFile(ConsoleSystem.Arg args)
        {
            PrintWarning("Начинаем миграцию..Ищем файл...");
            string path = $"IQEconomic/DataEconomicsOLD";
            var data = Interface.GetMod().DataFileSystem.GetDatafile(path);
            if(data == null)
            {
                PrintError("Старый файл не найден!");
                return;
            }
            Dictionary<ulong,int> OldStructure = new Dictionary<ulong, int>();
            OldStructure = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<ulong, int>>(path);
            PrintWarning("Считали старую структуру....");
            foreach(var Old in OldStructure)
            {
                if (!DataEconomics.ContainsKey(Old.Key))
                    DataEconomics.Add(Old.Key, new InformationData { Balance = Old.Value, Time = 0 });
                else DataEconomics[Old.Key].Balance += Old.Value;
            }
            WriteData();
            PrintWarning("Миграция прошла успешно, выгрузите плагин и удалите старый файл");
        }

        [ConsoleCommand("iq.eco")]
        void IQEconomicCommandsAdmin(ConsoleSystem.Arg arg)
        {
            switch(arg.Args[0])
            {
                case "give":
                    {
                        ulong userID = ulong.Parse(arg.Args[1]);
                        int Balance = Convert.ToInt32(arg.Args[2]);
                        SetBalance(userID, Balance);
                        Puts($"Игроку {userID} успешно зачислено {Balance} монет");
                        break;
                    }
                case "remove":
                    {
                        ulong userID = ulong.Parse(arg.Args[1]);
                        int Balance = Convert.ToInt32(arg.Args[2]);
                        RemoveBalance(userID, Balance);
                        Puts($"Игроку {userID} успешно снято {Balance} монет");
                        break;
                    }
            }
        }

        #endregion

        #region Metods
        public void TrackerTime()
        {
            foreach (var player in BasePlayer.activePlayerList)
                if (DataEconomics[player.userID].Time <= CurrentTime())
                {
                    int SetTime = Convert.ToInt32(config.GeneralSetting.BPlayerOnlineTime + CurrentTime());
                    SetBalance(player.userID, config.GeneralSetting.BPlayerOnlineGive);
                    DataEconomics[player.userID].Time = SetTime;
                }
        }

        public void ConnectedPlayer(BasePlayer player)
        {
            if (player.IsReceivingSnapshot)
            {
                NextTick(() => ConnectedPlayer(player));
                return;
            }

            RegisteredDataUser(player.userID);

            if (config.UseUI)
                if (config.UseUIMoney)
                {
                    if (config.ShowUI)
                        Interface_Balance(player);
                }
                else SendChat(String.Format(lang.GetMessage("CHAT_MY_BALANCE", this), GetBalance(player.userID)), player);
        }
        public void TransferPlayer(ulong userID, ulong transferUserID, int Balance )
        {
            BasePlayer player = BasePlayer.FindByID(userID);
            BasePlayer transferPlayer = BasePlayer.FindByID(transferUserID);
            if (player == null) return;
            if (transferPlayer == null) return;

            if (!IsRemoveBalance(player.userID, Balance))
            {
                SendChat(lang.GetMessage("BALANCE_TRANSFER_NO_BALANCE", this, player.UserIDString), player);
                return;
            }

            RemoveBalance(player.userID, Balance);
            SetBalance(transferPlayer.userID, Balance);
            SendChat(String.Format(lang.GetMessage("BALANCE_TRANSFER_PLAYER", this, player.UserIDString), transferPlayer.displayName, Balance),player);
            SendChat(String.Format(lang.GetMessage("BALANCE_TRANSFER_TRANSFERPLAYER", this, transferPlayer.UserIDString), Balance, player.displayName),transferPlayer);
        }
        public void SetBalance(ulong userID, int SetBalance, ItemContainer cont = null)
        {
            if(!config.UseUI)
            {
                BasePlayer player = BasePlayer.FindByID(userID);
                if (player == null)
                {
                    PrintWarning(lang.GetMessage("BALANCE_CUSTOM_MONEY_NOT_PLAYER",this));
                    return;
                }
                Item Money = CreateCustomMoney(SetBalance);
                ItemContainer itemContainer = cont == null ? player.inventory.containerMain : cont;

                if (player.inventory.containerMain.itemList.Count == 24)
                {
                    SendChat(lang.GetMessage("BALANCE_CUSTOM_MONEY_INVENTORY_FULL", this, player.UserIDString), player);
                    Money.Drop(player.transform.position, Vector3.zero);
                    return;
                }
                Money.MoveToContainer(itemContainer);
                SendChat(String.Format(lang.GetMessage("BALANCE_SET", this), SetBalance), player);
            }
            else
            {
                if (IsData(userID))
                {
                    DataEconomics[userID].Balance += SetBalance;
                    BasePlayer player = BasePlayer.FindByID(userID);
                    if (player == null) return;
                    SendChat(String.Format(lang.GetMessage("BALANCE_SET", this), SetBalance), player);
                    if (config.ShowUI)
                        Interface_Balance(player);
                }
                else RegisteredDataUser(userID);
                WriteData();
            }
            Interface.Oxide.CallHook("SET_BALANCE_USER", userID, SetBalance);
        }
        public void RemoveBalance(ulong userID, int RemoveBalance)
        {
            if (!config.UseUI)
            {
                BasePlayer player = BasePlayer.FindByID(userID);
                if (player == null)
                {
                    PrintWarning(lang.GetMessage("BALANCE_CUSTOM_MONEY_NOT_PLAYER", this));
                    return;
                }
                if(!IsRemoveBalance(userID,RemoveBalance))
                {
                    PrintWarning(lang.GetMessage("BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE", this));
                    return;
                }
                player.inventory.Take(null, ItemManager.FindItemDefinition(config.CustomMoneySetting.Shortname).itemid, RemoveBalance);
            }
            else
            {
                if (IsData(userID))
                {
                    DataEconomics[userID].Balance -= RemoveBalance;
                    BasePlayer player = BasePlayer.FindByID(userID);
                    if (player == null) return;
                    if (config.ShowUI)
                        Interface_Balance(player);
                }
                else RegisteredDataUser(userID);
                WriteData();
            }
        }

        #region ReturnMetods

        public bool IsRare(int Rare)
        {
            if (Rare >= UnityEngine.Random.Range(0, 100))
                return true;
            else return false;
        }
        public bool IsData(ulong userID)
        {
            if (DataEconomics.ContainsKey(userID))
                return true;
            else return false;
        }
        public int GetBalance(ulong userID)
        {
            if (config.UseUI)
            {
                if (IsData(userID))
                    return DataEconomics[userID].Balance;
                else return 0;
            }
            else
            {
                BasePlayer player = BasePlayer.FindByID(userID);
                if (player == null)
                {
                    PrintWarning(lang.GetMessage("BALANCE_CUSTOM_MONEY_NOT_PLAYER", this));
                    return 0;
                }
                var PMoney = player.inventory.GetAmount(ItemManager.FindItemDefinition(config.CustomMoneySetting.Shortname).itemid);
                return PMoney;
            }
        }
        Item CreateCustomMoney(int Amount)
        {
            var CustomMoney = config.CustomMoneySetting;
            Item Money = ItemManager.CreateByName(CustomMoney.Shortname, Amount, CustomMoney.SkinID);
            Money.name = CustomMoney.DisplayName;
            return Money;
        }

        public bool IsRemoveBalance(ulong userID,int Amount)
        {
            if (GetBalance(userID) >= Amount)
                return true;
            else return false;
        }

        private BasePlayer FindPlayer(string nameOrId)
        {
            foreach (var check in BasePlayer.activePlayerList)
            {
                if (check.displayName.ToLower().Contains(nameOrId.ToLower()) || check.userID.ToString() == nameOrId)
                    return check;
            }

            return null;
        }

        public bool IsTransfer(int Balance)
        {
            var TransferCurse = config.TransferSettings;
            if (Balance < TransferCurse.MoneyCount) return false;
            else return true;
        }
        #endregion

        #endregion

        #region Hooks
        void Unload()
        {
            WriteData();
            foreach(BasePlayer player in BasePlayer.activePlayerList)
            {
                CuiHelper.DestroyUi(player, UI_BALANCE_PARENT);
                CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
            }
        }
        private void OnServerInitialized()
        {
            ReadData();
            foreach (var player in BasePlayer.activePlayerList)
                OnPlayerConnected(player);
            WriteData();
            AddAllImage();
            if (config.GeneralSetting.BPLayerOnlineUse)
                timer.Every(120f, () => TrackerTime());
        }
        void OnPlayerConnected(BasePlayer player) => ConnectedPlayer(player);
        void OnDispenserBonus(ResourceDispenser dispenser, BasePlayer player, Item item)
        {
            if (dispenser == null) return;
            if (player == null) return;
            if (item == null) return;
            var General = config.GeneralSetting;
            if (!General.BPlayerGatherUse) return;
            var GatherGeneral = config.GeneralSetting.BPlayerGatherGive;
            if (!GatherGeneral.ContainsKey(item.info.shortname)) return;
            var Gather = GatherGeneral[item.info.shortname];
            if (!IsRare(Gather.Rare)) return;

            SetBalance(player.userID, Gather.BPlayerGive);
        }
        void OnEntityDeath(BaseCombatEntity entity, HitInfo info)
        {
            if (entity == null || info == null) return;
            BasePlayer player = info.InitiatorPlayer;
            if (info.InitiatorPlayer != null)
                player = info.InitiatorPlayer;
            else if (entity.GetComponent<BaseHelicopter>() != null)
                player = BasePlayer.FindByID(GetLastAttacker(entity.net.ID));
            if (player == null) return;

            var General = config.GeneralSetting;
            var ReferenceGeneral = config.ReferenceSettings;

            if ((bool)(entity as NPCPlayer) || (bool)(entity as NPCMurderer))
                if (General.BPlayerNPCUse)
                {
                    var Setting = General.BPlayerNPCGive;
                    if (!IsRare(Setting.Rare)) return;
                    SetBalance(player.userID, Setting.BPlayerGive);
                }
            if ((bool)(entity as BasePlayer))
            {
                if ((bool)(entity as NPCPlayer) || (bool)(entity as NPCMurderer)) return;

                BasePlayer targetPlayer = entity.ToPlayer();
                if (targetPlayer == null) return;
                if (targetPlayer.userID != player.userID)
                    if (General.BPlayerKillUse)
                    {
                        if (ReferenceGeneral.FriendsBlockUse)
                            if (IsFriends(player.userID, targetPlayer.userID)) return;
                        if (ReferenceGeneral.ClansBlockUse)
                            if (IsClans(player.userID, targetPlayer.userID)) return;
                        if (ReferenceGeneral.DuelBlockUse)
                            if (IsDuel(player.userID)) return;

                        var Setting = General.BPlayerKillGive;
                        if (!IsRare(Setting.Rare)) return;
                        SetBalance(player.userID, Setting.BPlayerGive);
                    }
            }
            if ((bool)(entity as BaseAnimalNPC))
                if (General.BPlayerAnimalUse)
                {
                    var Setting = General.BPlayerAnimalGive;
                    if (!IsRare(Setting.Rare)) return;
                    SetBalance(player.userID, Setting.BPlayerGive);
                }
            if ((bool)(entity as BaseHelicopter))
                if (General.BPlayerHelicopterUse)
                {
                    var Setting = General.BPlayerHelicopterGive;
                    if (!IsRare(Setting.Rare)) return;
                    SetBalance(player.userID, Setting.BPlayerGive);
                }
            if ((bool)(entity as BradleyAPC))
                if (General.BPlayerBradleyUse)
                {
                    var Setting = General.BPlayerBradleyGive;
                    if (!IsRare(Setting.Rare)) return;
                    SetBalance(player.userID, Setting.BPlayerGive);
                }
            if(entity.PrefabName.Contains("barrel"))
                if(General.BPLayerBarrelUse)
                {
                    var Setting = General.BPlayerBarrelGive;
                    if (!IsRare(Setting.Rare)) return;
                    SetBalance(player.userID, Setting.BPlayerGive);
                }
        }

        private Dictionary<uint, Dictionary<ulong, int>> HeliAttackers = new Dictionary<uint, Dictionary<ulong, int>>();
        void OnEntityTakeDamage(BaseCombatEntity victim, HitInfo info)
        {
            if (victim.GetComponent<BaseHelicopter>() != null && info?.Initiator?.ToPlayer() != null)
            {
                var heli = victim.GetComponent<BaseHelicopter>();
                var player = info.Initiator.ToPlayer();
                NextTick(() =>
                {
                    if (heli == null) return;
                    if (!HeliAttackers.ContainsKey(heli.net.ID))
                        HeliAttackers.Add(heli.net.ID, new Dictionary<ulong, int>());
                    if (!HeliAttackers[heli.net.ID].ContainsKey(player.userID))
                        HeliAttackers[heli.net.ID].Add(player.userID, 0);
                    HeliAttackers[heli.net.ID][player.userID]++;
                });
            }
        }

        private ulong GetLastAttacker(uint id)
        {
            int hits = 0;
            ulong majorityPlayer = 0U;
            if (HeliAttackers.ContainsKey(id))
            {
                foreach (var score in HeliAttackers[id])
                {
                    if (score.Value > hits)
                        majorityPlayer = score.Key;
                }
            }
            return majorityPlayer;
        }

        #region HelpHooks
        private Item OnItemSplit(Item item, int amount)
        {
            if (plugins.Find("Stacks") || plugins.Find("CustomSkinsStacksFix") || plugins.Find("SkinBox")) return null; 
            var CustomMoney = config.CustomMoneySetting;
            if (CustomMoney.SkinID == 0) return null;
            if (item.skin == CustomMoney.SkinID)
            {
                Item x = ItemManager.CreateByPartialName(CustomMoney.Shortname, amount);
                x.name = CustomMoney.DisplayName;
                x.skin = CustomMoney.SkinID;
                x.amount = amount;
                item.amount -= amount;
                return x;
            }
            return null;
        }
        object CanCombineDroppedItem(DroppedItem item, DroppedItem targetItem)
        {
            if (item.GetItem().skin != targetItem.GetItem().skin) return false;

            return null;
        }
        object CanStackItem(Item item, Item targetItem)
        {
            if (item.skin != targetItem.skin) return false;

            return null;
        }
        #endregion

        #endregion

        #region Interface

        public static string UI_BALANCE_PARENT = "BALANCE_PLAYER_PARENT";
        public static string UI_CHANGER_PARENT = "CHANGER_PLAYER_PARENT";
        public void Interface_Balance(BasePlayer player)
        {
            CuiElementContainer container = new CuiElementContainer();
            CuiHelper.DestroyUi(player, UI_BALANCE_PARENT);

            var Balance = GetBalance(player.userID);

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"1 0", AnchorMax = $"1 0", OffsetMin = "-396 70", OffsetMax = "-218 97" },
                Image = { FadeIn = 0.15f, Color = HexToRustFormat("#FFFFFF05"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" }
            }, "Hud", UI_BALANCE_PARENT);

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"0.01932367 0.04938272", AnchorMax = $"0.1541551 0.9382206" },
                Image = { FadeIn = 0.15f, Color = HexToRustFormat("#b1b1b1"), Sprite = "assets/icons/favourite_servers.png" }
            }, UI_BALANCE_PARENT);

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"0.1835208 0.1358024", AnchorMax = $"0.9625472 0.8518519" },
                Image = { FadeIn = 0.15f, Color = HexToRustFormat("#FF800080"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" }
            }, UI_BALANCE_PARENT);

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.22 0", AnchorMax = "1 1" },
                Text = { Text = String.Format(lang.GetMessage("UI_MY_BALANCE", this), Balance), Color = HexToRustFormat("#FEFFDDFF"), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleLeft, FadeIn = 0.3f }
            }, UI_BALANCE_PARENT); 

            CuiHelper.AddUi(player, container); 
        }

        public void Interface_Changer(BasePlayer player)
        {
            CuiElementContainer container = new CuiElementContainer();
            CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
            var Balance = GetBalance(player.userID);
            var Transfer = config.TransferSettings;

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"0.5 0.5", AnchorMax = $"0.5 0.5", OffsetMin = "-150 -280", OffsetMax = "20 -230" },
                Image = { FadeIn = 0.15f, Color = HexToRustFormat("#292A2140"), Material = "assets/content/ui/uibackgroundblur.mat" }
            }, "Overlay", UI_CHANGER_PARENT);

            container.Add(new CuiButton
            {
                FadeOut = 0.2f,
                RectTransform = { AnchorMin = $"1 1", AnchorMax = $"1 1", OffsetMin = "2 -50", OffsetMax = "161 0" },
                Button = { Command = $"transfer", Color = HexToRustFormat("#FF800080"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" },
                Text = { Text = lang.GetMessage("UI_CHANGER_TRANSFER", this, player.UserIDString), Color = HexToRustFormat("#0B5CF4"), Align = TextAnchor.MiddleCenter }
            },  UI_CHANGER_PARENT);

            container.Add(new CuiButton
            {
                FadeOut = 0.2f,
                RectTransform = { AnchorMin = $"0 0", AnchorMax = $"0 0", OffsetMin = "-50 0", OffsetMax = "-2 50" },
                Button = { Close = UI_CHANGER_PARENT, Color = HexToRustFormat("#b0382580"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" },
                Text = { Text = "<b>✖</b>", Color = HexToRustFormat("#c8a097"),FontSize = 30, Align = TextAnchor.MiddleCenter }
            }, UI_CHANGER_PARENT);

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "1 1", AnchorMax = "1 1", OffsetMin = "-130 5", OffsetMax = "60 50" },
                Text = { Text = String.Format(lang.GetMessage("UI_CHANGER_MY_INFO", this,player.UserIDString),Balance), Font = "robotocondensed-bold.ttf", Align = TextAnchor.MiddleCenter, FadeIn = 0.3f }
            }, UI_CHANGER_PARENT,"MY_INFO_TRANSFERS");

            #region TransferInterface

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"0.01866667 0.06666667", AnchorMax = $"0.2696471 0.92" },
                Image = { Color = HexToRustFormat("#8A847E3D"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" }
            }, UI_CHANGER_PARENT, "MY_MONEY");

            container.Add(new CuiPanel
            {
                RectTransform = { AnchorMin = $"0.7351995 0.06666667", AnchorMax = $"0.9861803 0.92" },
                Image = { Color = HexToRustFormat("#8A847E3D"), Material = "assets/content/ui/uibackgroundblur-ingamemenu.mat" }
            }, UI_CHANGER_PARENT, "TRANSFER_MONEY");

            container.Add(new CuiLabel
            {
                RectTransform = { AnchorMin = "0.2151515 0.1200001", AnchorMax = "0.7757577 0.8800001" },
                Text = { Text = $"<b>{Transfer.MoneyCount} > {Transfer.StoresMoneyCount} </b>", Font = "robotocondensed-bold.ttf", FontSize = 20, Align = TextAnchor.MiddleCenter, FadeIn = 0.3f }
            },  UI_CHANGER_PARENT);

            container.Add(new CuiElement
            {
                Parent = "MY_MONEY",
                Components =
                        {
                        new CuiRawImageComponent { Png = GetImage("URLMoney") },
                        new CuiRectTransformComponent{  AnchorMin = $"0.125 0.125", AnchorMax = $"0.875 0.875" },
                        }
            });

            container.Add(new CuiElement
            {
                Parent = "TRANSFER_MONEY",
                Components =
                        {
                        new CuiRawImageComponent { Png = GetImage("URLStores") },
                        new CuiRectTransformComponent{  AnchorMin = $"0.125 0.125", AnchorMax = $"0.875 0.875" },
                        }
            });

            #endregion

            CuiHelper.AddUi(player, container);
        }

        #endregion

        #region Lang
        private new void LoadDefaultMessages()
        {
            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["UI_MY_BALANCE"] = "<b><size=12>Balance : {0}</size></b>",

                ["CHAT_MY_BALANCE"] = "Your Balance : <color=yellow>{0}</color>",
                ["BALANCE_CUSTOM_MONEY_NOT_PLAYER"] = "Player not found",
                ["BALANCE_CUSTOM_MONEY_INVENTORY_FULL"] = "Your inventory is full, coins fell to the floor",

                ["BALANCE_SET"] = "You have successfully received : {0} money",
                ["BALANCE_TRANSFER_NO_BALANCE"] = "You do not have so many coins to transfer",
                ["BALANCE_TRANSFER_PLAYER"] = "You have successfully submitted {0} {1} money",
                ["BALANCE_TRANSFER_TRANSFERPLAYER"] = "You have successfully received {0} money from {1}",
                ["BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"] = "The player does not have as many coins available",
                ["BALANCE_TRANSFER_TRANSFERPLAYER_DIE"] = "The player is dead, you can’t give him coins",

                ["TRANSFER_COMMAND_NO_ARGS"] = "Invalid Command\nEnter the correct transfer command transfer [Nick] [Amount Money]",

                ["UI_CHANGER_TRANSFER"] = "<b><size=20>TRANSFER</size>  </b>",
                ["UI_CHANGER_MY_INFO"] = "<b><size=16>TRANSFERS\nYour Balance : {0}</size></b>",

                ["CHAT_NO_AUTH_STORE"] = "You no auth stores",
                ["CHAT_STORE_SUCCESS"] = "You succes transfers",
            }, this);

            lang.RegisterMessages(new Dictionary<string, string>
            {
                ["UI_MY_BALANCE"] = "<b><size=12>Ваш баланс : {0}</size></b>",

                ["CHAT_MY_BALANCE"] = "Ваш баланс на данный момент : <color=yellow>{0}</color>",

                ["BALANCE_SET"] = "Вы успешно получили : {0} монет",
                ["BALANCE_CUSTOM_MONEY_NOT_PLAYER"] = "Такого игрока нет",
                ["BALANCE_CUSTOM_MONEY_INVENTORY_FULL"] = "Ваш инвентарь полон, монеты выпали на пол",
                ["BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"] = "У игрока нет столько монет в наличии",

                ["BALANCE_TRANSFER_NO_BALANCE"] = "У вас нет столько монет для передачи",
                ["BALANCE_TRANSFER_PLAYER"] = "Вы успешно передали {0} {1} монет(ы)",
                ["BALANCE_TRANSFER_TRANSFERPLAYER"] = "Вы успешно получили {0} монет(ы) от {1}",
                ["BALANCE_TRANSFER_TRANSFERPLAYER_DIE"] = "Игрок мертв,вы не можете передать ему монеты",

                ["TRANSFER_COMMAND_NO_ARGS"] = "Неверная команда\nВведите корректную команду transfer [Ник] [Количество монет]",

                ["UI_CHANGER_TRANSFER"] = "<b><size=20>ОБМЕНЯТЬ</size></b>",
                ["UI_CHANGER_MY_INFO"] = "<b><size=16>ОБМЕННИК\nВАШ БАЛАНС : {0}</size></b>",

                ["CHAT_NO_AUTH_STORE"] = "Вы не аваторизованы в магазине",
                ["CHAT_STORE_SUCCESS"] = "Вы успешно обменяли валюту",
            }, this, "ru");
            PrintWarning("Языковой файл загружен успешно");
        }
        #endregion

        #region Helps
        private static string HexToRustFormat(string hex)
        {
            Color color;
            ColorUtility.TryParseHtmlString(hex, out color);
            return string.Format("{0:F2} {1:F2} {2:F2} {3:F2}", color.r, color.g, color.b, color.a);
        }
        static DateTime epoch = new DateTime(1970, 1, 1, 0, 0, 0);
        static double CurrentTime() => DateTime.UtcNow.Subtract(epoch).TotalSeconds;
        #endregion

        #region API
        bool API_IS_USER(ulong userID) => IsData(userID);
        bool API_IS_REMOVED_BALANCE(ulong userID, int Amount) => IsRemoveBalance(userID, Amount);
        int API_GET_BALANCE(ulong userID) => GetBalance(userID);
        Item API_GET_ITEM(int Amount) => CreateCustomMoney(Amount);
        string API_GET_MONEY_IL() { return "URLMoney"; }
        string API_GET_STORES_IL() { return "URLStores"; }
        void API_SET_BALANCE(ulong userID, int Balance, ItemContainer itemContainer = null)
        {
            SetBalance(userID, Balance, itemContainer);
            Puts("Успешно зачислен баланс");
        }
        void API_REMOVE_BALANCE(ulong userID, int Balance)
        {
            RemoveBalance(userID, Balance);
    
// ... [Code preview truncated due to length. Full source in attached file] ...

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

Другие ресурсы пользователя 15FPS

Сверху