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

FREE PlayersClasses : 0.2.0 0.2.0

Нет прав для скачивания
C#:
using Oxide.Core;
using Oxide.Core.Configuration;
using System.Collections;
using System.Collections.Generic;
using System.Drawing;
using System.Drawing.Imaging;
using System.IO;
using System.Linq;
using UnityEngine;
using Oxide.Game.Rust.Cui;
using Oxide.Core.Plugins;
using System;
namespace Oxide.Plugins {
    [Info("PlayersClasses", "ServerRust", "0.2.0")]
    class PlayersClasses : RustPlugin {
#region Data
        static PlayersClasses instance;
        public Dictionary<ulong, PlayersData> Players = new Dictionary<ulong, PlayersData>();
        public List<ulong> Attacker = new List<ulong>();
        public List<ulong> Raider = new List<ulong>();
        public List<ulong> Building = new List<ulong>();
        bool init = false;
        public class PlayersData {
            public string Name;
            public int Killed;
            public int Death;
            public int Building;
            public int KilledStructure;
            public string GetClasses;
            public bool Chose;
        }
        void LoadData() {
            try {
                Players = players_File.ReadObject<Dictionary<ulong, PlayersData>>();
            }
            catch {
                Players = new Dictionary<ulong, PlayersData>();
            }
        }
        DynamicConfigFile players_File = Interface.Oxide.DataFileSystem.GetFile("PlayersClasses/Players");
        void SaveData() {
            players_File.WriteObject(Players);
        }
#endregion
#region Configuration
        private List<string> defaultPrefabs2 = new List<string>();
        private List<string> defaultPrefabs1 = new List<string>();
        private List<string> Weapons1 = new List<string>();
        private List<string> Weapons2 = new List<string>();
        private List<string> BlacklistWeapons = new List<string>();
        private List<string> PrivilageAttacker = new List<string>() {
            "o.grant user {user} privilage",
        }
        ;
        private List<string> PrivilageBuilding = new List<string>() {
            "o.grant user {user} privilage",
        }
        ;
        private List<string> PrivilageRaider = new List<string>() {
            "o.grant user {user} privilage",
        }
        ;
        private void LoadDefaultConfig() {
            var _defaultPrefabs2 = new List<object>() {
                "cupboard.tool.deployed", "furnace", "barricade.stone", "barricade.concrete", "floor.grill", "wall.external.high.wood", "furnace.large", "reactivetarget_deployed", "barricade.woodwire", "landmine", "ceilinglight.deployed", "sleepingbag", "spikes.floor", "water_catcher_large", "gates.external.high.wood", "wall.frame.garagedoor", "shutter.metal.embrasure.a", "shutter.metal.embrasure.b", "door.hinged.metal", "door.double.hinged.metal", "wall.frame.cell.gate", "wall.frame.cell", "door.closer", "workbench2.deployed", "dropbox", "jackolantern.angry", "sleepingbag_leather_deployed", "barricade.wood", "lantern.deployed", "beartrap", "barricade.sandbags", "woodbox_deployed", "door.double.hinged.wood", "door.hinged.wood", "wall.frame.shopfront", "wall.window.bars.wood", "lock.key", "door.closer", "workbench1.deployed", "wall.window.bars.metal", "wall.frame.netting", "wall.frame.fence.gate", "wall.frame.fence", "sign.large.wood"
            }
            ;
            GetConfig("Постройка", "Разрешенные предметы для первого уровня Строителя (Запрещенное для нулевого)", ref _defaultPrefabs2);
            defaultPrefabs2 = _defaultPrefabs2.Select(p => p.ToString()).ToList();
            var _defaultPrefabs1 = new List<object>() {
                "jackolantern.angry", "sleepingbag_leather_deployed", "barricade.wood", "lantern.deployed", "beartrap", "barricade.sandbags", "woodbox_deployed", "door.double.hinged.wood", "door.hinged.wood", "wall.frame.shopfront", "wall.window.bars.wood", "lock.key", "door.closer", "workbench1.deployed", "wall.frame.fence.gate", "wall.frame.fence", "sign.large.wood"
            }
            ;
            GetConfig("Постройка", "Разрешенные предметы для нулевого уровня Строителя", ref _defaultPrefabs1);
            defaultPrefabs1 = _defaultPrefabs1.Select(p => p.ToString()).ToList();
            var _defaultWeapons1 = new List<object>() {
                "shotgun.double", "grenade.f1", "shotgun.pump", "pistol.revolver", "grenade.beancan", "pistol.semiauto", "pistol.python", "rifle.semiauto", "smg.thompson", "smg.mp5", "smg.2"
            }
            ;
            GetConfig("Оружие", "Разрешенное оружие для первого уровня стрелка (Запрещенное для нулевого)", ref _defaultWeapons1);
            Weapons1 = _defaultWeapons1.Select(p => p.ToString()).ToList();
            var _defaultWeapons2 = new List<object>() {
                "pistol.m92", "rifle.lr300", "rifle.ak", "rifle.bolt", "explosive.timed", "rocket.launcher", "lmg.m249", "shotgun.spas12"
            }
            ;
            GetConfig("Оружие", "Запрещенное оружие для первого и нулевого уровня стрелка", ref _defaultWeapons2);
            Weapons2 = _defaultWeapons2.Select(p => p.ToString()).ToList();
            var _WriteListExp = new List<object>() {
                "explosive.timed", "rocket.launcher", "flamethrower", "grenade.beancan", "grenade.f1", "explosive.satchel"
            }
            ;
            GetConfig("Оружие", "Список запрещенных взрывных веществ для Стрелков и Строителей", ref _WriteListExp);
            BlacklistWeapons = _WriteListExp.Select(p => p.ToString()).ToList();
            var _PrivilageAttacker = new List<object>() {
                "ratescontroller.x3", "default"
            }
            ;
            GetConfig("Привилегии", "Список дополнительных привилегий/групп для Стрелка (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageAttacker);
            PrivilageAttacker = _PrivilageAttacker.Select(p => p.ToString()).ToList();
            var _PrivilageBuilding = new List<object>() {
                "ratescontroller.x3", "default"
            }
            ;
            GetConfig("Привилегии", "Список дополнительных привилегий/групп для Строителя (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageBuilding);
            PrivilageBuilding = _PrivilageBuilding.Select(p => p.ToString()).ToList();
            var _PrivilageRaider = new List<object>() {
                "ratescontroller.x3", "default"
            }
            ;
            GetConfig("Привилегии", "Список дополнительных привилегий/групп для Рейдера (Используйте привилегию либо название группы без доп.слов)", ref _PrivilageRaider);
            PrivilageRaider = _PrivilageRaider.Select(p => p.ToString()).ToList();
            GetConfig("Основное", "Частота обновлений боковой панели GUI", ref UpdateTime);
            GetConfig("Основное", "Включить автоматический вайп классов при вайпе карты", ref AutoWipe);
            SaveConfig();
        }
        private bool GetConfig<T>(string MainMenu, string Key, ref T var) {
            if (Config[MainMenu, Key] != null) {
                var = (T)Convert.ChangeType(Config[MainMenu, Key], typeof(T));
                return false;
            }
            Config[MainMenu, Key] = var;
            return true;
        }
        private float UpdateTime = 5.0f;
        private bool AutoWipe = true;
#endregion
#region Oxide
        private void OnWeaponFired(BaseProjectile projectile, BasePlayer player, ItemModProjectile mod) {
            if (player == null) return;
            if (IsNPC(player)) return;
            var item = player.GetActiveItem();
            var targetLocation = player.transform.position + (player.eyes.HeadForward());
            if (GetPlayersClasses(player.userID) == "Building") {
                if (UnityEngine.Random.Range(0f, 100f) < 60) {
                    if (Weapons1.Contains(item.info.shortname)) {
                        SendReply(player, Messages["DropWeapon"]);
                        item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
                    }
                    if (Weapons2.Contains(item.info.shortname)) {
                        SendReply(player, Messages["DropWeapon"]);
                        item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
                    }
                }
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                if (UnityEngine.Random.Range(0f, 100f) < 30) {
                    if (Weapons2.Contains(item.info.shortname)) {
                        SendReply(player, Messages["DropWeapon"]);
                        item.Drop(player.transform.position + new Vector3(0, 1.5f, 0), player.eyes.HeadForward());
                    }
                }
            }
        }
        object CanEquipItem(PlayerInventory inventory, Item item) {
            var player = inventory.GetComponent<BasePlayer>();
            if (IsNPC(player)) return null;
            if (!Players.ContainsKey(player.userID)) return null;
            if (GetPlayersClasses(player.userID) == "Building") {
                foreach (var weap in BlacklistWeapons) {
                    if (weap == item.info.shortname) {
                        SendReply(player, Messages["CanEquipItem"]);
                        return false;
                    }
                }
            }
            if (GetPlayersClasses(player.userID) == "Attacker") {
                foreach (var weap in BlacklistWeapons) {
                    if (weap == item.info.shortname) {
                        SendReply(player, Messages["CanEquipItem"]);
                        return false;
                    }
                }
                if (item.info.shortname == "lock.code") {
                    SendReply(player, Messages["NoLockCode"]);
                    return false;
                }
            }
            return null;
        }
        void OnNewSave() {
            LoadData();
            WipeData();
        }
        void OnEntityDeath(BaseCombatEntity victim, HitInfo info) {
            if (victim == null) return;
            if (info == null) return;
            if (IsNPC(victim.ToPlayer()) || IsNPC(info.InitiatorPlayer)) return;
            var block = victim as BuildingBlock;
            if (info.Initiator == null) return;
            if (block && block.grade <= 0) return;
            if (!info.Initiator.ToPlayer()) return;
            BasePlayer v = victim.ToPlayer();
            BasePlayer k = info.InitiatorPlayer;
            if (InEvent(v) || InDuel(v)) return;
            BaseEntity e = victim.GetEntity();
            if (e == null) return;
            if (victim is BuildingBlock || victim is BaseEntity && !(victim is BasePlayer) && k is BasePlayer) {
                if (!Players.ContainsKey(k.userID)) {
                    OnPlayerConnected(k);
                }
                Players[k.userID].KilledStructure++;
            }
            if (v == null) return;
            if (k != null && k != v) {
                if (InEvent(k) || InDuel(k)) return;
                if (!Players.ContainsKey(k.userID)) {
                    OnPlayerConnected(k);
                }
                Players[k.userID].Killed++;
            }
            if (!Players.ContainsKey(v.userID)) {
                OnPlayerConnected(v);
            }
            if (!InDuel(v) || !IsNPC(v)) Players[v.userID].Death += 1;
        }
        object OnEntityTakeDamage(BaseCombatEntity entity, HitInfo hitInfo) {
            BasePlayer attacker = hitInfo?.Initiator as BasePlayer;
            if (hitInfo == null || attacker == null || entity == null) return null;
            if (IsNPC(attacker)) return null;
            if (InDuel(attacker)) return null;
            PlayersData PlayersData;
            if (!Players.TryGetValue(attacker.userID, out PlayersData)) return null;
            if (entity is BuildingBlock && entity is BaseEntity) {
                if (entity == null) return null;
                var ClassAttacker = Players[attacker.userID].GetClasses;
                if (ClassAttacker == "Attacker") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.5f);
                }
                if (ClassAttacker == "Building") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.25f);
                }
                if (ClassAttacker == "Raider") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(1.5f);
                }
            }
            BasePlayer victimPlayer = (entity as BasePlayer);
            if (victimPlayer == null) return null;
            if (InDuel(victimPlayer)) return null;
            if (entity is BasePlayer && hitInfo.Initiator is BasePlayer) {
                if (entity == null) return null;
                if (Players[attacker.userID].GetClasses == "Attacker") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    var attackerinfo = hitInfo.HitEntity.ToPlayer();
                    hitInfo.damageTypes.ScaleAll(1.5f);
                }
                if (Players[attacker.userID].GetClasses == "Building") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.5f);
                }
                if (Players[attacker.userID].GetClasses == "Raider") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.75f);
                }
                if (IsNPC(victimPlayer)) return null;
                if (Players[victimPlayer.userID].GetClasses == "Attacker") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.75f);
                }
                if (Players[victimPlayer.userID].GetClasses == "Building") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.4f);
                }
                if (Players[victimPlayer.userID].GetClasses == "Raider") {
                    var dmgType = hitInfo.damageTypes.GetMajorityDamageType();
                    hitInfo.damageTypes.ScaleAll(0.6f);
                }
            }
            return null;
        }
        void OnDispenserBonus(ResourceDispenser disp, BasePlayer player, Item item) {
            double mod = 1f;
            if (GetPlayersClasses(player.userID) == "Attacker") {
                var rates = 0.50;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                var rates = 0.75;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
            if (GetPlayersClasses(player.userID) == "Building") {
                var rates = 1.5f;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
        }
        void OnDispenserGather(ResourceDispenser dispenser, BaseEntity entity, Item item) {
            if (!entity.ToPlayer()) return;
            double mod = 1f;
            if (Players[entity.ToPlayer().userID].GetClasses == "Attacker") {
                var rates = 0.50;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
            if (Players[entity.ToPlayer().userID].GetClasses == "Raider") {
                var rates = 0.75;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
            if (Players[entity.ToPlayer().userID].GetClasses == "Building") {
                var rates = 1.5f;
                var newAmount = (int)(item.amount * rates * mod);
                item.amount = newAmount > 1 ? newAmount : 1;
            }
        }
        private Timer mytimer;
        Dictionary<string, string> Images = new Dictionary<string, string>() {
            {
                "Attacker", "http://i.imgur.com/co1TmwL.png"
            }
            , {
                "Building", "http://i.imgur.com/qmbEgcx.png"
            }
            , {
                "Raider", "http://i.imgur.com/aUNQmNN.png"
            }
            ,
        }
        ;
        void OnServerInitialized() {
            instance = this;
            lang.RegisterMessages(Messages, this, "en");
            Messages = lang.GetMessages("en", this);
            LoadData();
            LoadDefaultConfig();
            InitFileManager();
            CommunityEntity.ServerInstance.StartCoroutine(LoadImages());
            timer.Once(1f, () => instance.init = true);
            foreach (var player in BasePlayer.activePlayerList) mytimer = timer.Every(UpdateTime, () => CheckOnline(player));
            foreach (var player in BasePlayer.activePlayerList) OnPlayerConnected(player);
        }
        void OnPlayerConnected(BasePlayer player) {
            PlayersData PlayersData;
            if (!Players.TryGetValue(player.userID, out PlayersData)) {
                PlayersData = new PlayersData();
                Players.Add(player.userID, new PlayersData() {
                    Chose = false, GetClasses = "null", KilledStructure = 0, Killed = 0, Death = 0, Building = 0, Name = player.displayName
                }
                );
            }
            if (GetPlayersClasses(player.userID) == "null") {
                UIDraw(player);
            }
            if (Players.ContainsKey(player.userID)) {
                CheckOnline(player);
            }
        }
        void CheckOnline(BasePlayer player) {
            if (!Players.ContainsKey(player.userID)) {
                OnPlayerConnected(player);
                return;
            }
            Attacker.Clear();
            Building.Clear();
            Raider.Clear();
            if (GetPlayersClasses(player.userID) == "Attacker") {
                if (!Attacker.Contains(player.userID)) {
                    Attacker.Add(player.userID);
                }
                DrawUI(player, Attacker.Count());
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                if (!Raider.Contains(player.userID)) {
                    Raider.Add(player.userID);
                }
                DrawUI(player, Raider.Count());
            }
            if (GetPlayersClasses(player.userID) == "Building") {
                if (!Building.Contains(player.userID)) {
                    Building.Add(player.userID);
                }
                DrawUI(player, Building.Count());
            }
        }
        void OnHammerHit(BasePlayer player, HitInfo info) {
            var buildingBlock = info.HitEntity as BuildingBlock;
            if (buildingBlock == null || player == null) return;
            if (GetPlayersClasses(player.userID) == "Attacker") {
                var grades = buildingBlock.grade.ToString();
                var buildingGrade = (int)buildingBlock.grade;
                if (buildingGrade > 1) {
                    return;
                }
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                var buildingGrade = (int)buildingBlock.grade;
                if (buildingGrade > 2) {
                    return;
                }
            }
        }
        void OnEntityBuilt(Planner plan, GameObject go) {
            if (plan == null || go == null) return;
            var player = plan.GetOwnerPlayer();
            if (!Players.ContainsKey(player.userID)) {
                OnPlayerConnected(player);
                return;
            }
            BaseEntity entity = go.ToBaseEntity();
            var buildingBlock = entity as BuildingBlock;
            Players[player.userID].Building++;
            if (entity as BuildingBlock) {
                if (GetPlayersClasses(player.userID) == "Attacker") {
                    var buildingGrade = (int)buildingBlock.grade;
                    if (buildingGrade > 1) {
                        SendReply(player, Messages["NoUpgrade"]);
                        buildingBlock.SetGrade(BuildingGrade.Enum.Twigs);
                    }
                    return;
                }
                if (GetPlayersClasses(player.userID) == "Raider") {
                    var buildingGrade = (int)buildingBlock.grade;
                    if (buildingGrade > 2) {
                        SendReply(player, Messages["NoUpgrade"]);
                        buildingBlock.SetGrade(BuildingGrade.Enum.Twigs);
                    }
                    return;
                }
            }
            if (GetPlayersClasses(player.userID) == "Attacker") {
                if (!defaultPrefabs1.Contains(entity.ShortPrefabName)) {
                    entity.Kill();
                    ReplaceItem(player, entity.ShortPrefabName);
                    SendReply(player, Messages["NoBuildEntity"]);
                    return;
                }
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                if (!defaultPrefabs2.Contains(entity.ShortPrefabName)) {
                    entity.Kill();
                    ReplaceItem(player, entity.ShortPrefabName);
                    SendReply(player, Messages["NoBuildEntity"]);
                    return;
                }
            }
        }
        object OnStructureUpgrade(BaseCombatEntity entity, BasePlayer player, BuildingGrade.Enum grade) {
            if (GetPlayersClasses(player.userID) == "Attacker") {
                if (grade == BuildingGrade.Enum.Twigs || grade == BuildingGrade.Enum.Wood) {
                    return null;
                }
                else {
                    SendReply(player, Messages["NoUpgrade"]);
                    return false;
                }
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                if (grade == BuildingGrade.Enum.Twigs || grade == BuildingGrade.Enum.Wood || grade == BuildingGrade.Enum.Stone) {
                    return null;
                }
                else {
                    SendReply(player, Messages["NoUpgrade"]);
                    return false;
                }
            }
            return null;
        }
        void OnPlayerDisconnected(BasePlayer player, string reason) {
            if (!Players.ContainsKey(player.userID)) return;
            if (GetPlayersClasses(player.userID) == "Attacker") {
                Attacker.Remove(player.userID);
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                Raider.Remove(player.userID);
            }
            if (GetPlayersClasses(player.userID) == "Building") {
                Building.Remove(player.userID);
            }
            DestroyUI(player);
        }
        void OnServerSave() {
            SaveData();
        }
        void Unload() {
            SaveData();
            foreach (var player in BasePlayer.activePlayerList) {
                DestroyUI(player);
            }
        }
#endregion
#region Core
        [PluginReference]
        Plugin EventManager;
        bool InEvent(BasePlayer player) {
            try {
                bool result = (bool)EventManager?.Call("isPlaying", new object[] {
                    player
                }
                );
                return result;
            }
            catch {
                return false;
            }
        }
        [PluginReference]
        Plugin Duel;
        bool InDuel(BasePlayer player) => Duel?.Call<bool>("IsPlayerOnActiveDuel", player) ?? false;
        private bool IsNPC(BasePlayer player) {
            if (player == null) return false;
            if (player is NPCPlayer) return true;
            if (!(player.userID >= 76560000000000000L || player.userID <= 0L)) return true;
            return false;
        }
        public string GetPlayersClasses(ulong uid) {
            return Players[uid].GetClasses;
        }
        private string GetPlayerClasses(BasePlayer player, bool stat, bool rank = false, bool after = false, string Classes = "") {
            var classes1 = GetPlayersClasses(player.userID);
            if (stat) {
                if (classes1 == "Attacker") return "Стрелок";
                if (classes1 == "Building") return "Строитель";
                if (classes1 == "Raider") return "Рейдер";
            }
            if (rank) {
                IOrderedEnumerable<KeyValuePair<ulong, PlayersData>> Top = from pair in Players where pair.Value.GetClasses == classes1 orderby (pair.Value.Killed + pair.Value.KilledStructure + pair.Value.Building - pair.Value.Death) descending select pair;
                int i = 1;
                foreach (KeyValuePair<ulong, PlayersData> pair in Top) {
                    if (pair.Key == player.userID) {
                        return i.ToString();
                    }
                    i++;
                }
            }
            if (after) {
                IOrderedEnumerable<KeyValuePair<ulong, PlayersData>> Top = from pair in Players where pair.Value.GetClasses == Classes orderby (pair.Value.Killed + pair.Value.KilledStructure + pair.Value.Building - pair.Value.Death) descending select pair;
                int i = 1;
                foreach (KeyValuePair<ulong, PlayersData> pair in Top) {
                    i++;
                }
                return i.ToString();
            }
            return null;
        }
        void WipeData() {
            foreach (var player in Players) {
                WipedPlayerClasses(player.Key);
            }
            Players = new Dictionary<ulong, PlayersData>();
            PrintWarning("Прошел вайп, очистили data/PlayersClasses/Players а так же удалили все привилегии у игроков (Какие были выданы плагином)");
            Interface.Oxide.ReloadPlugin("PlayersClasses");
        }
        void WipedPlayerClasses(ulong userId) {
            var player = BasePlayer.FindByID(userId);
            if (player == null) return;
            if (!Players.ContainsKey(player.userID)) return;
            if (Players[player.userID].GetClasses == "Attacker") {
                foreach (var priv in PrivilageAttacker) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
                    }
                }
            }
            if (Players[player.userID].GetClasses == "Building") {
                foreach (var priv in PrivilageBuilding) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
                    }
                }
            }
            if (Players[player.userID].GetClasses == "Raider") {
                foreach (var priv in PrivilageRaider) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.revoke user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup remove {player.userID} {priv}");
                    }
                }
            }
        }
        string GetPrivilage(BasePlayer player) {
            string chose = "";
            if (GetPlayersClasses(player.userID) == "Attacker") {
                chose = chose + "\t\tНаносимый урон по игрокам: +50%\n\t\tНаносимый урон по постройкам: -50%\n\t\tУровень строителя: 0\n\t\tЗащита: +25%\n\t\tУровень стрельбы: 2\n\t\tСбор ресурсов: -50%";
            }
            if (GetPlayersClasses(player.userID) == "Building") {
                chose = chose + "\t\tНаносимый урон по игрокам: -75%\n\t\tНаносимый урон по постройкам: -75%\n\t\tУровень строителя: 2\n\t\tЗащита: +75%\n\t\tУровень стрельбы: 0\n\t\tСбор ресурсов: +50%";
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                chose = chose + "\t\tНаносимый урон по игрокам: -50%\n\t\tНаносимый урон по постройкам: +50%\n\t\tУровень строителя: 1\n\t\tЗащита: +50%\n\t\tУровень стрельбы: 1\n\t\tСбор ресурсов: -25%";
            }
            return chose;
        }
        void ReplaceItem(BasePlayer player, string shortname) {
            if (player == null) return;
            if (shortname.Contains(".deployed")) shortname = shortname.Replace(".deployed", "");
            player.inventory.GiveItem(ItemManager.CreateByName(shortname, 1, 0));
        }
        public BasePlayer FindBasePlayer(string nameOrUserId) {
            nameOrUserId = nameOrUserId.ToLower();
            foreach (var player in BasePlayer.activePlayerList) {
                if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
            }
            foreach (var player in BasePlayer.sleepingPlayerList) {
                if (player.displayName.ToLower().Contains(nameOrUserId) || player.UserIDString == nameOrUserId) return player;
            }
            return default(BasePlayer);
        }
#endregion
#region Commands
        [ConsoleCommand("classes_chose")]
        void CmdChoseClass(ConsoleSystem.Arg args) {
            var player = args.Connection.player as BasePlayer;
            if (player == null) return;
            if (args.Args == null) return;
            var chose = args.Args[0];
            Players[player.userID].Chose = true;
            Players[player.userID].GetClasses = chose;
            SendReply(player, Messages["Chose"], GetPlayerClasses(player, true), GetPrivilage(player));
            if (GetPlayersClasses(player.userID) == "Attacker") {
                foreach (var priv in PrivilageAttacker) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.grant user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup add {player.userID} {priv}");
                    }
                }
            }
            if (GetPlayersClasses(player.userID) == "Building") {
                foreach (var priv in PrivilageBuilding) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.grant user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup add {player.userID} {priv}");
                    }
                }
            }
            if (GetPlayersClasses(player.userID) == "Raider") {
                foreach (var priv in PrivilageRaider) {
                    if (priv.ToLower().Contains(".")) {
                        rust.RunServerCommand($"o.grant user {player.userID} {priv}");
                    }
                    else {
                        rust.RunServerCommand($"o.usergroup add {player} {priv}");
                    }
                }
            }
            DestroyUI(player);
        }
        [ConsoleCommand("classes")]
        void CmdChoseClasses(ConsoleSystem.Arg args) {
            var player = args.Connection.player as BasePlayer;
            if (player == null) return;
            var clases = GetPlayerClasses(player, true);
            if (player.IsAdmin || !Players[player.userID].Chose) {
                UIDraw(player);
            }
            else {
                SendReply(player, Messages["NoChose"], clases);
            }
        }
        [ConsoleCommand("classeswipe")]
        void CmdWipedClasses(ConsoleSystem.Arg args) {
            var player = args.Player();
            if (player != null) return;
            PrintWarning("Запущен ручной вайп данных PlayersClasses");
            WipeData();
        }
        [ConsoleCommand("classes_nochose")]
        void CmdNoChoseClass(ConsoleSystem.Arg args) {
            var player = args.Connection.player as BasePlayer;
            if (player == null) return;
            player.Kick("Вы отказались от выбора");
        }
        [ChatCommand("mystats")]
        void ChatChatStats(BasePlayer player) {
            if (player == null) return;
            DrawStats(player);
        }
        [ChatCommand("getclasses")]
        void ChatGetClasses(BasePlayer player, string cmd, string[] args) {
            if (player == null) return;
            if (!player.IsAdmin) return;
            if (args == null || args.Length <= 0) {
                SendReply(player, Messages["cmdHelp"]);
                return;
            }
            switch (args[0].ToLower()) {
                case "replace" : if (args.Length <= 2) {
                    SendReply(player, Messages["cmdHelp"]);
                    return;
                }
                var targetAdd = (BasePlayer.Find(args[1]) ?? BasePlayer.FindSleeping(args[1]));
                if (targetAdd == null) {
                    SendReply(player, Messages["playerNotFound"], args[1]);
                    return;
                }
                if (!Players.ContainsKey(targetAdd.userID)) {
                    SendReply(player, Messages["playerNotFound"], targetAdd.displayName);
                    return;
                }
                if (args[2] != "Attacker" && args[2] != "Building" && args[2] != "Raider") {
                    SendReply(player, Messages["ClassNotFound"], args[2], "Attacker, Building, Raider");
                    return;
                }
                WipedPlayerClasses(targetAdd.userID);
                if (targetAdd.IsConnected) {
                    player.Command($"classes_chose {args[2]}");
                }
                else {
                    Players[targetAdd.userID].GetClasses = args[2];
                    if (GetPlayersClasses(targetAdd.userID) == "Attacker") {
                        foreach (var priv in PrivilageAttacker) {
                            if (priv.ToLower().Contains(".")) {
                                rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
                            }
                            else {
                                rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
                            }
                        }
                    }
                    if (GetPlayersClasses(targetAdd.userID) == "Building") {
                        foreach (var priv in PrivilageBuilding) {
                            if (priv.ToLower().Contains(".")) {
                                rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
                            }
                            else {
                                rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
                            }
                        }
                    }
                    if (GetPlayersClasses(targetAdd.userID) == "Raider") {
                        foreach (var priv in PrivilageRaider) {
                            if (priv.ToLower().Contains(".")) {
                                rust.RunServerCommand($"o.grant user {targetAdd.userID} {priv}");
                            }
                            else {
                                rust.RunServerCommand($"o.usergroup add {targetAdd.userID} {priv}");
                            }
                        }
                    }
                }
                return;
                case "remove" : if (args.Length <= 1) {
                    SendReply(player, Messages["cmdHelp"]);
                    return;
                }
                var targetRemove = (BasePlayer.Find(args[1]) ?? BasePlayer.FindSleeping(args[1]));
                if (targetRemove == null) {
                    SendReply(player, Messages["playerNotFound"], args[1]);
                    return;
                }
                if (!Players.ContainsKey(targetRemove.userID)) {
                    SendReply(player, Messages["playerNotFound"], targetRemove.displayName);
                    return;
                }
                WipedPlayerClasses(targetRemove.userID);
                Players.Remove(targetRemove.userID);
                if (targetRemove.IsConnected) {
                    OnPlayerConnected(targetRemove);
                }
                return;
                default : var target = BasePlayer.Find(args[0]);
                if (target == null) {
                    SendReply(player, Messages["playerNotFound"], args[0]);
                    return;
                }
                if (!Players.ContainsKey(target.userID)) {
                    SendReply(player, Messages["playerNotFound"], target.displayName);
                    return;
                }
                string info = $"\nКласс игрока: {GetPlayerClasses(target, true)}\nИгрок на: {GetPlayerClasses(player, false, true)} месте в своем классе\nСтатистика:\n\tУбийств: {Players[target.userID].Killed}\n\tСмертей: {Players[target.userID].Death}\n\tУничтоженых строений: {Players[target.userID].KilledStructure}\n\tПостроеных строений: {Players[target.userID].Building}";
                SendReply(player, Messages["PlayerInfo"], target.displayName, info);
                return;
            }
        }
        [ChatCommand("globaltop")]
        void ChatChatTop(BasePlayer player) {
            if (player == null) return;
            DrawTOP(player);
        }
        [ConsoleCommand("drawstats")]
        private void DrawTop(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DrawStats(player);
        }
        [ConsoleCommand("drawtopclasses")]
        private void DrawStats(ConsoleSystem.Arg arg) {
            var player = arg.Player();
            if (player == null) return;
            DrawTOP(player);
        }
#endregion
#region UI
        string UI = "[{\"name\":\"PlayersClasses_2\",\"parent\":\"Overlay\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0 0 0 0.788231\"},{\"type\":\"NeedsCursor\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_3\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1294118 0.1294118 0.1529412 0.4431373\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.8320313\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_4\",\"parent\":\"PlayersClasses_3\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{welcome}\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_5\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"1 1 1 0\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.26\",\"anchormax\":\"1 0.7500001\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_6\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.427451 0.1843137 0.1254902 0.4474251\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.09516837 0\",\"anchormax\":\"0.3016105 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Attacker\",\"color\":\"0.427451 0.1843137 0.1254902 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button2\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"СТРЕЛОК\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Attacker}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_6\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: +50%\nНаносимый урон по постройкам: -50%\nУровень строителя: 0\nЗащита: +25%\nУровень стрельбы: 2\nСбор ресурсов: -50%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_7\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.3882353 0.3803922 0.2901961 0.4363736\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.3967789 0\",\"anchormax\":\"0.6032211 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"СТРОИТЕЛЬ\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: -75%\nНаносимый урон по постройкам: -75%\nУровень строителя: 2\nЗащита: +75%\nУровень стрельбы: 0\nСбор ресурсов: +50%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Building}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_7\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Building\",\"color\":\"0.3882353 0.3803922 0.2901961 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button3\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"PlayersClasses_8\",\"parent\":\"PlayersClasses_5\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"sprite\":\"Assets/Content/UI/UI.Background.Tile.psd\",\"color\":\"0.1294118 0.1333333 0.1529412 0.4470588\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.6983895 0\",\"anchormax\":\"0.9048316 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_chose Raider\",\"color\":\"0.1333333 0.1372549 0.1529412 1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01 0.01\",\"anchormax\":\"0.99 0.1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button1\",\"parent\":\"button\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Выбрать\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3037587\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0.05 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"РЕЙДЕР\",\"fontSize\":20,\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.5247875\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0.9202804\",\"anchormax\":\"1 0.9946854\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"images\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.RawImage\",\"png\":\"{Raider}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.15 0.4021048\",\"anchormax\":\"0.85 0.9123087\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"textinfo\",\"parent\":\"PlayersClasses_8\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Наносимый урон по игрокам: -50%\nНаносимый урон по постройкам: +50%\nУровень строителя: 1\nЗащита: +50%\nУровень стрельбы: 1\nСбор ресурсов: -25%\",\"align\":\"MiddleCenter\"},{\"type\":\"UnityEngine.UI.Outline\",\"color\":\"0 0 0 0.3921701\",\"distance\":\"1 -1\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.01063825 0.1124575\",\"anchormax\":\"0.9858159 0.3967899\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"button_Exit\",\"parent\":\"PlayersClasses_2\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"classes_nochose\",\"color\":\"0.2705882 0 0 0.7857328\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.39 0.1523438\",\"anchormax\":\"0.61 0.2122396\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]},{\"name\":\"text\",\"parent\":\"button_Exit\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"Отказаться и выйти\",\"fontSize\":18,\"align\":\"MiddleCenter\"},{\"type\":\"RectTransform\",\"anchormin\":\"0 0\",\"anchormax\":\"1 1\",\"offsetmin\":\"0 0\",\"offsetmax\":\"1 1\"}]}]";
        string Online = "
// ... [Code preview truncated due to length. Full source in attached file] ...

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