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

FREE IQEconomic : 0.2.1 0.2.1

Нет прав для скачивания
C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using ConVar;
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("IQEconomic", "Mercury", "0.2.1")]
    [Description("Экономика на ваш сервер")]
    class IQEconomic : RustPlugin {
        /// <summary>
        /// Обновление 0.1.7
        /// - Поправил метод с подключением игрока
        /// - Исправлена ошибочное зачисление баланса за бочку - hobobarrel
        /// - Скорректировал проверки на синтаксис в командах
        /// - Исправлена ошибка в команде /transfer Nick Balance , когда можно было передавать минусовой баланс
        /// - Добавлена консольная команда iq.eco give.store SteamID/Name Balance - для выдачи баланса на магазин
        /// - Изменен метод начисления баланса за время на сервере
        /// - Изменен интерфейс /transfer
        /// - Добавлена возможность вывода сразу всех средств в /transfer
        /// - Добавлена возможность установки лимитов N количества вывода в N количество времени на команду /transfer
        /// - Добавлена поддержка Clans IO (Если возникнут проблемы, сообщите пожалуйста!)
        /// Обновление 0.1.9
        /// - Корректировка метода для работы с lang
        /// - Добавлена возможность настроить автоматическую очистку дата-файл
        ///    0 - Не очищать совсем,
        ///    1 - Очищать всю дату при вайпе сервера,
        ///    2 - Очищать дата файл игроков с балансом <N(настраивается в этой категории) при вайпе сервера,
        ///    3 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней,
        ///    4 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней и их баланс <N(настраивается в этой категории
        /// - Конфигурация перенесла большие изменения
        /// - Изменил структуру всех пунктов конфигурации для получения моент
        /// - Добавлена возможность включить и отключить любую возможность добычи монет
        /// - Добавлена возможность установить права для доступа к возможности добычи монет
        /// - Добавлена чат-команда для игроков, с возможностью просмотреть баланс (Работает на всех типах валюты)
        /// - Добавлена возможность начислять валюту за поднятие ресурсов (ягод, камней, дерева, растений и т.д)
        /// - Добавлена возможность включать/отключать уведомление игрока после получения монет (Работает на всех типах валюты)
        /// - Исправил выпадение монет на пол, если забиты все слоты инвентаря, но там уже есть монеты (При типе монет "На руках")
        /// - Добавлена возможность указать стартовый баланс для игроков
        /// </summary>
#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(string userID, string targetID) {
            if (Clans) {
                if(Clans.Author.Contains("dcode")) {
                    String TagUserID = (String)Clans?.Call("GetClanOf", userID);
                    String TagTargetID = (String)Clans?.Call("GetClanOf", targetID);
                    return (bool)(TagUserID == TagTargetID);
                }
                else return (bool)Clans?.Call("IsClanMember", 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(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
                    Interface_Changer(player);
                    return;
                }
                Puts($"Пользователь {userID} не авторизован в магазине");
                if (player == null) return;
                SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
            }
            ));
        }
        public void MoscovOVHBalanceSet(ulong userID, int Balance) {
            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}");
                    if (player == null) return;
                    SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
                    return;
                }
                Puts($"Пользователь {userID} не авторизован в магазине");
                if (player == null) return;
                SendChat(GetLang("CHAT_NO_AUTH_STORE", 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(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
                    Interface_Changer(player);
                    return;
                }
                if (s.Contains("fail")) {
                    Puts($"Пользователь {userID} не авторизован в магазине");
                    if (player == null) return;
                    SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
                }
            }
            , this);
        }
        public void GameStoresBalanceSet(ulong userID, int Balance) {
            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}");
                    if (player == null) return;
                    SendChat(GetLang("CHAT_STORE_SUCCESS", player.UserIDString), player);
                    return;
                }
                if (s.Contains("fail")) {
                    Puts($"Пользователь {userID} не авторизован в магазине");
                    if (player == null) return;
                    SendChat(GetLang("CHAT_NO_AUTH_STORE", player.UserIDString), player);
                }
            }
            , this);
        }
#endregion
#region Vars
        static Double CurrentTime => Facepunch.Math.Epoch.Current;
        enum TypeData {
            None, AllWipe, AllWipeOnlyBalance, TimeClear, TimeClearOnlyBalance,
        }
#endregion
#region Configuration
        private static Configuration config = new Configuration();
        private class Configuration {
            [JsonProperty("Монетки будут и гроков на руках - false / Иначе будет чат или интерфейсе - true")]
            public Boolean UseUI;
            [JsonProperty("Использовать UI интерфейс для отображения баланса(true - да(Если вы не поставили , чтобы монетки были на руках))/false - информация будет в чате по команде и при входе)")]
            public Boolean UseUIMoney;
            [JsonProperty("Отображение интерфейса с балансом(true - отображает/false - скрывает)")]
            public Boolean ShowUI;
            [JsonProperty("Включить уведомления игроку о получении валюты за добычу (true - да/false - нет)")]
            public Boolean UseAlert = true;
            [JsonProperty("Стартовый баланс для всех игроков")]
            public Int32 StartedBalance = 0;
            [JsonProperty("Настройки интерфейса в плагине (Не трогайте, если не понимаете как с этим работать)")]
            public Interface InterfaceSetting = new Interface();
            [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 UInt64 SkinID;
            }
            internal class Interface {
                [JsonProperty("Цвет основной панели")]
                public String ColorBackground = "#FFFFFF05";
                [JsonProperty("Цвет дополнительной панели #1")]
                public String ColorMoreOne = "#b1b1b1";
                [JsonProperty("Цвет дополнительной панели #2")]
                public String ColorMoreTwo = "#CCD045FF";
                [JsonProperty("Цвет текста")]
                public String ColorLabel = "#FEFFDDFF";
                [JsonProperty("AnchorMin")]
                public String AnchorMin = "1 0";
                [JsonProperty("AnchorMax")]
                public String AnchorMax = "1 0";
                [JsonProperty("OffsetMin")]
                public String OffsetMin = "-390 15";
                [JsonProperty("OffsetMax")]
                public String OffsetMax = "-212 42";
            }
            internal class GeneralSettings {
                [JsonProperty("Настройка дата-файла")]
                public DataFileSettings DataFileSetting = new DataFileSettings();
                internal class DataFileSettings {
                    [JsonProperty("Интервал сохранения дата файла (Установите 0, если не требуется сохранять файл по таймеру)")]
                    public Int32 SaveTime = 360;
                    [JsonProperty("Настройка очистки дата-файла")]
                    public DetalisWipeData DetalisWipe = new DetalisWipeData();
                    internal class DetalisWipeData {
                        [JsonProperty("Тип очистки дата-файла : 0 - Не очищать совсем, 1 - Очищать всю дату при вайпе сервера, 2 - Очищать дата файл игроков с балансом <N(настраивается в этой категории) при вайпе сервера, 3 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней, 4 - Очищать игроков, которые не заходили >N(настраивается в этой категории) дней и их баланс <N(настраивается в этой категории)")]
                        public TypeData TypeClear;
                        [JsonProperty("<N-количество баланса для очистки даты.Для типов : 2 и 4")]
                        public Int32 AmountBalance = 0;
                        [JsonProperty(">N-дней оффлайн для очистки даты.Для типов : 3 и 4")]
                        public Int32 DayPlayer = 0;
                    }
                }
                [JsonProperty("Настройка получение валюты за убийство игроков")]
                public GeneralSettingReward KilledReward;
                [JsonProperty("Настройка получение валюты за убийство животных")]
                public GeneralSettingReward AnimalReward;
                [JsonProperty("Настройка получение валюты за убийство NPC")]
                public GeneralSettingReward NPCReward;
                [JsonProperty("Настройка получение валюты за уничтожение танка")]
                public GeneralSettingReward BradleyReward;
                [JsonProperty("Настройка получение валюты за уничтожение вертолета")]
                public GeneralSettingReward HelicopterReward;
                [JsonProperty("Настройка получение валюты за уничтожение бочек")]
                public GeneralSettingReward BarrelReward;
                [JsonProperty("Настройка получение валюты за добычу ресурсов")]
                public GatherSettingReward GatherReward;
                [JsonProperty("Настройка получение валюты за поднятие ресурсов с земли (грибы, ягоды, дерево и т.д)")]
                public GatherSettingReward CollectableReward;
                [JsonProperty("Настройка получение валюты за проведенное время на сервере")]
                public TimeSettingsReward TimeReward;
                internal class TimeSettingsReward {
                    [JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
                    public String PermissionReward = "";
                    [JsonProperty("Использовать эту возможность получения валюты")]
                    public Boolean UseReward = true;
                    [JsonProperty("Сколько нужно провести времени,чтобы выдали награду")]
                    public Int32 OnlineTime;
                    [JsonProperty("Сколько начислять валюты за проведенное время на сервере")]
                    public Int32 OnlineTimeReward;
                }
                internal class GatherSettingReward {
                    [JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
                    public String PermissionReward = "";
                    [JsonProperty("Использовать эту возможность получения валюты")]
                    public Boolean UseReward = true;
                    [JsonProperty("Сколько начислять валюты за ресурсы ( [за какой ресурс давать] = { остальная настройка }")]
                    public Dictionary<String, AdvancedSetting> GatherSetting = new Dictionary<String, AdvancedSetting>();
                }
                internal class GeneralSettingReward {
                    [JsonProperty("Права для использования данной возможности (Если вам требуется сделать ее доступной всем по стандарту - оставьте поле пустым)")]
                    public String PermissionReward = "";
                    [JsonProperty("Использовать эту возможность получения валюты")]
                    public Boolean UseReward = true;
                    [JsonProperty("Настройка получения валюты")]
                    public AdvancedSetting AdvancedReward = new AdvancedSetting();
                }
                internal class AdvancedSetting {
                    [JsonProperty("Шанс получить валюту")]
                    public Int32 Rare;
                    [JsonProperty("Сколько выдавать валюты")]
                    public Int32 Money;
                }
            }
            internal class TransferSetting {
                [JsonProperty("Включить обмен валюты на баланс в магазине(GameStores/MoscovOVH)")]
                public Boolean TransferStoreUse;
                [JsonProperty("URL вашей монеты")]
                public String URLMoney;
                [JsonProperty("URL валюты для магазина")]
                public String URLStores;
                [JsonProperty("Сколько монет требуется для обмена")]
                public Int32 MoneyCount;
                [JsonProperty("Сколько баланса получит игрок после обмена")]
                public Int32 StoresMoneyCount;
                [JsonProperty("Включить лимит обмена средств")]
                public Boolean UseLimits = false;
                [JsonProperty("Лимит средств(баланса на магазин)")]
                public Int32 LimitBalance = 100;
                [JsonProperty("Время лимита(в секундах) (Пример : Установлен лимит 100 баланса, раз в 3600 секунд)")]
                public Int32 LimitTime = 3600;
            }
            internal class ReferenceSetting {
                [JsonProperty("Friends : Запретить получение монет за убийство друзей")]
                public Boolean FriendsBlockUse;
                [JsonProperty("Clans : Запретить получение монет за убийство сокланов")]
                public Boolean ClansBlockUse;
                [JsonProperty("Duel/Battles : Запретить получение монет за убийство на дуэлях")]
                public Boolean DuelBlockUse;
                [JsonProperty("MoscovOVH : Включить использование магазина(Должен быть включен обмен валют)")]
                public Boolean MoscovOvhUse;
                [JsonProperty("GameStores : Включить использование магазина(Должен быть включен обмен валют)")]
                public Boolean 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 Boolean 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 {
                    StartedBalance = 0, UseUI = true, ShowUI = true, UseAlert = true, UseUIMoney = true, TransferSettings = new TransferSetting {
                        TransferStoreUse = true, MoneyCount = 3, StoresMoneyCount = 1, URLMoney = "https://i.imgur.com/iGwnOyG.png", URLStores = "https://i.imgur.com/fPPzFaE.png", UseLimits = false, LimitBalance = 100, LimitTime = 3600,
                    }
                    , GeneralSetting = new GeneralSettings {
                        DataFileSetting = new GeneralSettings.DataFileSettings {
                            SaveTime = 360, DetalisWipe = new GeneralSettings.DataFileSettings.DetalisWipeData {
                                AmountBalance = 0, DayPlayer = 0, TypeClear = TypeData.None,
                            }
                        }
                        , AnimalReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 53, Money = 2,
                            }
                            ,
                        }
                        , BarrelReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 23, Money = 5,
                            }
                            ,
                        }
                        , BradleyReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 44, Money = 100,
                            }
                            ,
                        }
                        , HelicopterReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 80, Money = 100,
                            }
                            ,
                        }
                        , KilledReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 35, Money = 10,
                            }
                            ,
                        }
                        , NPCReward = new GeneralSettings.GeneralSettingReward {
                            PermissionReward = "", UseReward = true, AdvancedReward = new GeneralSettings.AdvancedSetting {
                                Rare = 10, Money = 15,
                            }
                            ,
                        }
                        , TimeReward = new GeneralSettings.TimeSettingsReward {
                            UseReward = true, PermissionReward = "", OnlineTime = 100, OnlineTimeReward = 10,
                        }
                        , GatherReward = new GeneralSettings.GatherSettingReward {
                            UseReward = true, PermissionReward = "", GatherSetting = new Dictionary<String, GeneralSettings.AdvancedSetting> {
                                ["sulfur.ore"]
                                = new GeneralSettings.AdvancedSetting {
                                    Rare = 10, Money = 10,
                                }
                                , ["stones"] = new GeneralSettings.AdvancedSetting {
                                    Rare = 20, Money = 1,
                                }
                            }
                            ,
                        }
                        , CollectableReward = new GeneralSettings.GatherSettingReward {
                            UseReward = true, PermissionReward = "", GatherSetting = new Dictionary<String, GeneralSettings.AdvancedSetting> {
                                ["sulfur.ore"]
                                = new GeneralSettings.AdvancedSetting {
                                    Rare = 10, Money = 10,
                                }
                                , ["stones"] = new GeneralSettings.AdvancedSetting {
                                    Rare = 20, Money = 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<UInt64, InformationData> DataEconomics = new Dictionary<UInt64, InformationData>();
        [JsonProperty("Время действующего времени на лимит выводов")]
        public Int32 ActualityLimitTime;
        void ReadData() {
            DataEconomics = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Dictionary<UInt64, InformationData>>("IQEconomic/DataEconomics");
            ActualityLimitTime = Oxide.Core.Interface.Oxide.DataFileSystem.ReadObject<Int32>("IQEconomic/ActualityLimitTime");
        }
        void WriteData() {
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/DataEconomics", DataEconomics);
            Oxide.Core.Interface.Oxide.DataFileSystem.WriteObject("IQEconomic/ActualityLimitTime", ActualityLimitTime);
        }
        void RegisteredDataUser(UInt64 player) {
            if (!DataEconomics.ContainsKey(player)) DataEconomics.Add(player, new InformationData {
                Balance = config.StartedBalance, Time = 0, LimitBalance = config.TransferSettings.LimitBalance, DateTime = CurrentTime
            }
            );
            else DataEconomics[player].DateTime = CurrentTime;
        }
        public class InformationData {
            [JsonProperty("Баланс игрока")]
            public Int32 Balance;
            [JsonProperty("Лимит вывода баланса игрока")]
            public Int32 LimitBalance;
            [JsonProperty("Счетчик времени")]
            public Int32 Time;
            [JsonProperty("Последний вход игрока на сервер")]
            public Double DateTime;
        }
        private void ClearDataFile() {
            Configuration.GeneralSettings.DataFileSettings.DetalisWipeData DataFileSetting = new Configuration.GeneralSettings.DataFileSettings.DetalisWipeData();
            switch (DataFileSetting.TypeClear) {
                case TypeData.None : break;
                case TypeData.AllWipe : {
                    DataEconomics.Clear();
                    break;
                }
                case TypeData.AllWipeOnlyBalance : {
                    foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => x.Value.Balance < DataFileSetting.AmountBalance)) NextTick(() => {
                        DataEconomics.Remove(Data.Key);
                    }
                    );
                    break;
                }
                case TypeData.TimeClear : {
                    foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => (CurrentTime - x.Value.DateTime) > (DataFileSetting.DayPlayer * 86400))) NextTick(() => {
                        DataEconomics.Remove(Data.Key);
                    }
                    );
                    break;
                }
                case TypeData.TimeClearOnlyBalance : {
                    foreach (KeyValuePair<UInt64, InformationData> Data in DataEconomics.Where(x => (CurrentTime - x.Value.DateTime) > (DataFileSetting.DayPlayer * 86400) && x.Value.Balance < DataFileSetting.AmountBalance)) NextTick(() => {
                        DataEconomics.Remove(Data.Key);
                    }
                    );
                    break;
                }
                default : break;
            }
            WriteData();
        }
#endregion
#region Command
        [ChatCommand("balance")]
        void ChatCommandBalance(BasePlayer player) {
            SendChat(GetLang("CHAT_MY_BALANCE", player.UserIDString, GetBalance(player.userID)), player);
        }
        [ChatCommand("transfer")]
        void ChatCommandTransfer(BasePlayer player, String cmd, String[] arg) {
            if (player == null) return;
            if (!config.TransferSettings.TransferStoreUse && arg.Length == 0 || arg == null) {
                SendChat(GetLang("TRANSFER_COMMAND_NO_ARGS", player.UserIDString), player);
                return;
            }
            else if(config.TransferSettings.TransferStoreUse && arg.Length == 0 || arg == null) {
                Interface_Changer(player);
                return;
            }
            BasePlayer transferPlayer = FindPlayer(arg[0]);
            if (transferPlayer == null) {
                SendChat(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER", player.UserIDString), player);
                return;
            }
            if(transferPlayer.IsDead()) {
                SendChat(GetLang("BALANCE_TRANSFER_TRANSFERPLAYER_DIE", player.UserIDString), player);
                return;
            }
            Regex regex = new Regex("^[0-9]+$");
            if (!regex.IsMatch(arg[1])) return;
            Int32 Amount;
            if (!Int32.TryParse(arg[1], out Amount)) return;
            TransferPlayer(player.userID, transferPlayer.userID, Amount);
        }
        [ConsoleCommand("transfer")]
        void ConsoleCommandTransfer(ConsoleSystem.Arg args) {
            BasePlayer player = args.Player();
            if (player == null) return;
            Int32 Balance = GetBalance(player.userID);
            var Reference = config.ReferenceSettings;
            if (IsLimited(player.userID, Balance)) {
                SendChat(GetLang("CHAT_LIMITED_PLAYER", player.UserIDString), player);
                return;
            }
            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);
            if (config.TransferSettings.UseLimits) LimitedUpdate(player.userID, Balance);
        }
        [ConsoleCommand("transfer.all")]
        void TransferAll(ConsoleSystem.Arg args) {
            BasePlayer player = args.Player();
            if (player == null) return;
            Int32 Balance = config.TransferSettings.UseLimits ? GetBalance(player.userID) > GetLimit(player.userID) ? GetLimit(player.userID) : GetBalance(player.userID) : GetBalance(player.userID);
            if (!IsTransfer(Balance)) return;
            var Reference = config.ReferenceSettings;
            var Transfer = config.TransferSettings;
            if (Reference.GameStoreshUse) GameStoresBalanceSet(player.userID, Convert.ToInt32((Balance / Transfer.MoneyCount) * Transfer.StoresMoneyCount), Balance);
            if (Reference.MoscovOvhUse) MoscovOVHBalanceSet(player.userID, Convert.ToInt32((Balance / Transfer.MoneyCount) * Transfer.StoresMoneyCount), Balance);
            if (config.TransferSettings.UseLimits) LimitedUpdate(player.userID, Balance);
        }
        [ConsoleCommand("iq.eco")]
        //iq.eco give.store 76561198807822175 300
        void IQEconomicCommandsAdmin(ConsoleSystem.Arg arg) {
            if (arg.Player() != null && !arg.Player().IsAdmin) return;
            switch(arg.Args[0]) {
                case "give" : {
                    if(arg.Args[1] == null || arg.Args[1].Length == 0) {
                        PrintWarning("Введите ник или ID.Синтаксис : iq.eco give SteamID/Name Amount");
                        return;
                    }
                    String NamaOrID = arg.Args[1];
                    if(String.IsNullOrWhiteSpace(NamaOrID)) {
                        PrintWarning("Введите ник или ID");
                        return;
                    }
                    IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
                    if(iPlayer == null) {
                        Puts($"Такого игрока не существует");
                        return;
                    }
                    UInt64 userID = UInt64.Parse(iPlayer.Id);
                    Int32 Balance;
                    if (!Int32.TryParse(arg.Args[2], out Balance)) {
                        PrintWarning("Второй аргумент не является числом!");
                        return;
                    }
                    SetBalance(userID, Balance);
                    Puts($"Игроку {userID} успешно зачислено {Balance} монет");
                    break;
                }
                case "remove" : {
                    String NamaOrID = arg.Args[1];
                    if (String.IsNullOrWhiteSpace(NamaOrID)) {
                        PrintWarning("Введите ник или ID");
                        return;
                    }
                    IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
                    if (iPlayer == null) {
                        Puts($"Такого игрока не существует");
                        return;
                    }
                    UInt64 userID = UInt64.Parse(iPlayer.Id);
                    Int32 Balance;
                    if (!Int32.TryParse(arg.Args[2], out Balance)) {
                        PrintWarning("Второй аргумент не является числом!");
                        return;
                    }
                    RemoveBalance(userID, Balance);
                    Puts($"Игроку {userID} успешно снято {Balance} монет");
                    break;
                }
                case "give.store" : {
                    Configuration.ReferenceSetting Reference = config.ReferenceSettings;
                    String NamaOrID = arg.Args[1];
                    if (String.IsNullOrWhiteSpace(NamaOrID)) {
                        PrintWarning("Введите ник или ID");
                        return;
                    }
                    IPlayer iPlayer = covalence.Players.FindPlayer(NamaOrID);
                    if (iPlayer == null) {
                        Puts($"Такого игрока не существует");
                        return;
                    }
                    UInt64 userID = UInt64.Parse(iPlayer.Id);
                    Int32 Balance;
                    if (!Int32.TryParse(arg.Args[2], out Balance)) {
                        PrintWarning("Второй аргумент не является числом!");
                        return;
                    }
                    if (Reference.GameStoreshUse) GameStoresBalanceSet(userID, Balance);
                    if (Reference.MoscovOvhUse) MoscovOVHBalanceSet(userID, Balance);
                    Puts($"Игроку {userID} успешно зачислено {Balance} на магазин сервера");
                    break;
                }
            }
        }
#endregion
#region Metods
        public void TrackerTime() {
            Configuration.GeneralSettings.TimeSettingsReward TimeSetting = config.GeneralSetting.TimeReward;
            IEnumerable<BasePlayer> FiltredList = !String.IsNullOrWhiteSpace(TimeSetting.PermissionReward) ? BasePlayer.activePlayerList.Where(x => permission.UserHasPermission(x.UserIDString, TimeSetting.PermissionReward)) : BasePlayer.activePlayerList;
            foreach (BasePlayer player in FiltredList) if (DataEconomics[player.userID].Time <= CurrentTime) {
                Int32 SetTime = Convert.ToInt32(config.GeneralSetting.TimeReward.OnlineTime + CurrentTime);
                SetBalance(player.userID, config.GeneralSetting.TimeReward.OnlineTimeReward);
                DataEconomics[player.userID].Time = SetTime;
            }
        }
        private void ResetLimit() {
            if (!config.TransferSettings.UseLimits) return;
            timer.Once(300f, () => ResetLimit());
            if (ActualityLimitTime > CurrentTime) return;
            ActualityLimitTime = Convert.ToInt32(CurrentTime + config.TransferSettings.LimitTime);
            foreach (var Value in DataEconomics.Values) NextTick(() => {
                Value.LimitBalance = config.TransferSettings.LimitBalance;
            }
            );
            Puts("Лимит баланса был сброшен за пройденное время");
        }
        public void ConnectedPlayer(BasePlayer player) {
            RegisteredDataUser(player.userID);
            if (config.UseUI) if (config.UseUIMoney) {
                if (config.ShowUI) Interface_Balance(player);
            }
            else SendChat(GetLang("CHAT_MY_BALANCE", player.UserIDString, GetBalance(player.userID)), player);
            DataEconomics[player.userID].Time = Convert.ToInt32(config.GeneralSetting.TimeReward.OnlineTime + CurrentTime);
        }
        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(GetLang("BALANCE_TRANSFER_NO_BALANCE", player.UserIDString), player);
                return;
            }
            RemoveBalance(player.userID, Balance);
            SetBalance(transferPlayer.userID, Balance);
            SendChat(GetLang("BALANCE_TRANSFER_PLAYER", player.UserIDString, transferPlayer.displayName, Balance), player);
            SendChat(GetLang("BALANCE_TRANSFER_TRANSFERPLAYER", 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(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
                    return;
                }
                Item Money = CreateCustomMoney(SetBalance);
                ItemContainer itemContainer = cont == null ? player.inventory.containerMain : cont;
                if (player.inventory.containerMain.itemList.Count == 24) {
                    Item FindMoney = player.inventory.containerMain.FindItemsByItemName(Money.info.shortname);
                    if (FindMoney != null && FindMoney.skin == Money.skin) {
                        FindMoney.amount += SetBalance;
                        FindMoney.MarkDirty();
                        if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
                        return;
                    }
                    SendChat(GetLang("BALANCE_CUSTOM_MONEY_INVENTORY_FULL", player.UserIDString), player);
                    Money.Drop(player.transform.position, Vector3.zero);
                    return;
                }
                Money.MoveToContainer(itemContainer);
                if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
            }
            else {
                if (IsData(userID)) {
                    DataEconomics[userID].Balance += SetBalance;
                    BasePlayer player = BasePlayer.FindByID(userID);
                    if (player == null) return;
                    if (config.UseAlert) SendChat(GetLang("BALANCE_SET", player.UserIDString, SetBalance), player);
                    if (config.ShowUI) Interface_Balance(player);
                }
                else RegisteredDataUser(userID);
            }
            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(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
                    return;
                }
                if(!IsRemoveBalance(userID, RemoveBalance)) {
                    PrintWarning(GetLang("BALANCE_CUSTOM_MONEY_NO_COUNT_TAKE"));
                    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);
            }
        }
        public void LimitedUpdate(UInt64 userID, Int32 Amount) {
            if (IsLimited(userID, Amount)) return;
            DataEconomics[userID].LimitBalance -= Amount;
        }
        public Int32 GetLimit(UInt64 userID) => DataEconomics[userID].LimitBalance;
#region ReturnMetods
        public bool IsRare(int Rare) {
            if (Rare >= UnityEngine.Random.Range(0, 100)) return true;
            else return false;
        }
        public Boolean IsLimited(UInt64 userID, Int32 Amount) {
            if (config.TransferSettings.UseLimits) return GetLimit(userID) < Amount;
            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(GetLang("BALANCE_CUSTOM_MONEY_NOT_PLAYER"));
                    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 <= 0) return false;
            if (Balance >= TransferCurse.MoneyCount) return true;
            else return false;
        }
#endregion
#endregion
#region Hooks
        void Unload() {
            foreach(BasePlayer player in BasePlayer.activePlayerList) {
                CuiHelper.DestroyUi(player, UI_BALANCE_PARENT);
                CuiHelper.DestroyUi(player, UI_CHANGER_PARENT);
            }
            WriteData();
        }
        void OnNewSave(string filename) => ClearDataFile();
        private void OnServerShutdown() => Unload();
        private void Init() => ReadData();
        private void OnServerInitialized() {
            foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
            AddAllImage();
            if (config.GeneralSetting.TimeReward.UseReward) timer.Every(120f, () => TrackerTime());
            if (config.GeneralSetting.DataFileSetting.SaveTime > 0) timer.Every(config.GeneralSetting.DataFileSetting.SaveTime, () => WriteData());
            ResetLimit();
        }
        void OnPlayerConnected(BasePlayer player) => ConnectedPlayer(player);
        void OnCollectiblePickup(Item item, BasePlayer player, CollectibleEntity entity) {
            if (item == null 
// ... [Code preview truncated due to length. Full source in attached file] ...

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