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

FREE OneVSOne : 1.0.0 1.0.0

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Libraries.Covalence;
using Oxide.Core.Plugins;
using Rust;
using System;
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using Random = UnityEngine.Random;
using ru = Oxide.Game.Rust;
namespace Oxide.Plugins {
    [Info("OneVSOne", "https://topplugin.ru / https://discord.com/invite/5DPTsRmd3G", "1.0.0")]
    [Description("Турнир одиночек")]
    public class OneVSOne : RustPlugin {
#region Config
        private PluginConfig config;
        protected override void LoadDefaultConfig() {
            config = PluginConfig.DefaultConfig();
        }
        protected override void LoadConfig() {
            base.LoadConfig();
            config = Config.ReadObject<PluginConfig>();
        }
        protected override void SaveConfig() {
            Config.WriteObject(config);
        }
        private class PluginConfig {
            [JsonProperty("Чат-команда", Order = 1)]
            public string command;
            [JsonProperty("Кит выдаваемый для дуэлянтов", Order = 2)]
            public string kit;
            [JsonProperty("Кит-награда победителю(Оставить пустым, если нет)", Order = 3)]
            public string kitreward;
            [JsonProperty("Кит-награда проигравшему, утешительный приз (Оставить пустым, если нет)", Order = 4)]
            public string kitreward2="reward2";
            [JsonProperty("Название арены в копипасте", Order = 5)]
            public string arenaname;
            [JsonProperty("Выделенное время на одну дуэль", Order = 6)]
            public int timeonround;
            [JsonProperty("Дефолтное время на регистрацию", Order = 7)]
            public int timeforreg;
            [JsonProperty("Минимальное количество участников для начала турнира", Order = 8)]
            public int minplayers;
            [JsonProperty("Минимальное количество участников для запуска автособытия", Order = 9)]
            public int minplayersOnline;
            [JsonProperty("Максимальное количество участников", Order = 10)]
            public int maxplayers;
            [JsonProperty("Проверок на телепорт абузеров", Order = 11)]
            public int proverok;
            [JsonProperty("Автоивент (0 - если выключить)", Order = 12)]
            public float autoevent;
            [JsonProperty("ServerRewards-награда (Поставить 0, если нет)", Order = 13)]
            public int sRewards;
            [JsonProperty("Награда консольная команда, по местам (пусто, если нет)", Order = 14)]
            public List<string> rewardcommands;
            [JsonProperty("Замутить войс на ивенте", Order = 15)]
            public bool mutevoice;
            [JsonProperty("Оружия для автоивента (выбирается рандомно)", Order = 16)]
            public List<int> random;
            [JsonProperty("Моды", Order = 17)]
            public List<int> mods;
            [JsonProperty("Количество выдаваемых патронов", Order = 18)]
            public int ammo = 300;
            [JsonProperty("Множитель урона на дуэли (0.5 - 50%, 1 - 100% и т.д.)", Order = 19)]
            public float damageScale = 1.0f;
            [JsonProperty("Заблокированные команды, которые используют global.", Order = 20)]
            public string[] blocked;
            [JsonProperty("Выводить все сообщения", Order = 21)]
            public bool messagetrue;
            [JsonProperty("STEAMID от кого отправляются сообщения (для аватарки)", Order = 22)]
            public ulong broadcast2;
            [JsonProperty("UI-сообщения", Order = 23)]
            public List<string> messageUI;
            [JsonProperty("Префикс", Order = 24)]
            public string prefix;
            [JsonProperty("Сообщения", Order = 25)]
            public List<string> messages;
            [JsonProperty("GUI - кнопка", Order = 26)]
            public string button;
            [JsonProperty("GUI - фон", Order = 27)]
            public string fon;
            [JsonProperty("GUI - верхушка", Order = 28)]
            public string head;
            [JsonProperty("GUI - низушка", Order = 29)]
            public string foot;
            [JsonProperty("Позиция первого игрока", Order = 30)]
            public string posplayer1;
            [JsonProperty("Позиция второго игрока", Order = 31)]
            public string posplayer2;
            [JsonProperty("Позиции зрителей", Order = 32)]
            public List<string> posspectators;
            [JsonProperty("Координаты постройки арены", Order = 33)]
            public string positionforarena;
            [JsonProperty("Блокировать инвентарь игрока (не позволит навешивать модификаторы)", Order = 34)]
            public bool lockInventory = false;
            [JsonProperty("^^", Order = 35)]
            public string rofl;
            public static PluginConfig DefaultConfig() {
                return new PluginConfig() {
                    rofl = "^_^", broadcast2 = 76561198125444659, damageScale=1.0f, lockInventory = false, posplayer1 = "(-1015.9, 801.0, -994.4)", posplayer2 = "(-988.9, 801.0, -1001.1)", posspectators = new List<string>() {
                        "(-1003.5, 803.9, -1007.1)", "(-998.1, 803.9, -1011.4)", "(-994.5, 803.9, -1012.2)", "(-992.2, 803.9, -1012.8)", "(-988.4, 803.9, -1008.3)", "(-989.3, 803.9, -1001.3)", "(-985.4, 803.9, -995.7)", "(-986.7, 803.9, -989.7)", "(-995.2, 803.9, -987.9)", "(-1002.0, 804.0, -988.8)", "(-1007.4, 803.9, -984.5)", "(-1012.5, 803.9, -983.8)", "(-1016.6, 803.9, -987.2)", "(-1014.6, 803.9, -991.8)", "(-1015.9, 803.9, -997.3)", "(-1020.2, 803.9, -999.2)", "(-1018.6, 803.9, -1005.4)", "(-1010.5, 803.9, -1007.6)"
                    }
                    , messages = new List<string>() {
                        "<size=15><#CD5C5C>{prefix} Ошибка | Нет пар для дуэлей!</color></size>", "<size=15><#CD5C5C>{prefix} Ошибка | Каким-то странным образом победитель не определился!</color></size>", "<size=15>ИВЕНТ <color=#ccff33>ТУРНИР ОДИНОЧЕК</color> НАЧНЕТСЯ ЧЕРЕЗ <color=#ccff33>{time}</color>\n<color=#ccff33>/{command}</color> - попасть на ивент</size>", "<size=15><#CD5C5C>{prefix} Багоюз | Попытка проникнуть на ивент телепорт-багом! СМЭРТЬ!</color></size>", "<size=15>{prefix} <color=#ccff33>/{command}</color> - выйти с ивента</size>", "<size=15>{prefix} <color=#ff6666>ЗАПРЕЩЕНО ИСПОЛЬЗОВАТЬ КОМАНДЫ НА ИВЕНТЕ!</color>\n<color=#ccff33>/{command}</color> - выйти с ивента</size>", "<size=15>{prefix} <color=#ff6666>ИВЕНТ ОТМЕНЕН, НЕ СОБРАЛОСЬ МИНИМАЛЬНОЕ КОЛИЧЕСТВО УЧАСТНИКОВ!</color>", "<size=15>{prefix} ИГРОК <color=#ccff33>{name}</color> ПОБЕДИЛ В ИВЕНТЕ <color=#ccff33>ТУРНИР ОДИНОЧЕК</color>\nПРИЗ ДВЕ ПЛЯШКИ ПЕННОГО.</size>", "<size=15>{prefix} <color=#ccff33>{name}</color> ПРОХОДИТ В СЛЕДУЮЩИЙ РАУНД.</size>", "<size=12>{prefix} <color=#ccff33>{name}</color> ПОКИДАЕТ ИВЕНТ.</size> - выключено -", "<size=12>{prefix} <color=#ccff33>{name}</color> ЗАШЕЛ НА ИВЕНТ.</size>", "<size=15><#CD5C5C>{prefix} ИВЕНТ ОТМЕНЕН!</color></size>", "<i>- {prefix} Время вышло, действуйте быстрее -</i>", "<size=15>{prefix} <color=#ccff33>{name1}</color> против <color=#ccff33>{name2}</color></size>"
                    }
                    , prefix = "[EVENT]", proverok = 10, timeonround = 60, command = "oo", kitreward = "reward", kitreward2 = "reward2", kit = "onekit", arenaname = "arenaoo", positionforarena = "(-1000.0, 800.0, -1000.0)", minplayers = 2, minplayersOnline=3, maxplayers = 64, mutevoice = true, sRewards = 50, autoevent = 7200f, timeforreg = 120, messagetrue = true, random = new List<int>() {
                        1545779598, 1318558775, 1373971859, 1588298435, -852563019, -41440462, 28201841, 1443579727, 1965232394, -1812555177, 818877484, -904863145
                    }
                    , mods = new List<int>() {
                        952603248, 442289265
                    }
                    , messageUI = new List<string> {
                        "ВАС УБИЛИ! ДЛЯ ВАС ИВЕНТ ЗАКОНЧЕН.", "ПОЗДРАВЛЯЕМ С ВЕЛИКОЙ ПОБЕДОЙ, ЧЕМПИОН!"
                    }
                    , rewardcommands = new List<string> {
                        "addgroup {steamid} 1place 3h", "addgroup {steamid} 2place 2h", "addgroup {steamid} 3place 1h"
                    }
                    , blocked = new string [] {
                        "tp", "home", "kit"
                    }
                    , ammo = 300, button = "1 0.83 0.47 0.35", fon = "1 1 1 0.03", head = "<color=#ffd479>ТУРНИР ОДИНОЧЕК\nоружие {gun}</color>", foot = "УЧАСТНИКОВ: <color=#ffd479>{count}</color>\nСТАРТ ЧЕРЕЗ <color=#ffd479>{time}</color>"
                }
                ;
            }
        }
#endregion
#region Head
        List<string> logs = new List<string>();
        [PluginReference]
        Plugin CopyPaste, Kits, ServerRewards, Economics, XKits;
        Timer Timeronround;
        Vector3 positionforarena = Vector3.zero;
        int round = 1;
        static OneVSOne ins;
        List<ulong> cashplayers = new List<ulong>();
        List<BasePlayer> players = new List<BasePlayer>();
        List<Duel> duels = new List<Duel>();
        //
        Vector3 posplayer1 = Vector3.zero;
        Vector3 posplayer2 = Vector3.zero;
        List<Vector3> posspectators = new List<Vector3>();
        int start = 0;
        uint privilege;
        int gun = 1545779598;
        //
        class Duel {
            public BasePlayer pl1;
            public BasePlayer pl2;
        }
#endregion
#region BlockDamage
        void OnPlayerAttack(BasePlayer attacker, HitInfo info) {
            BaseEntity entity = info.HitEntity;
            if (entity == null) return;
            if (entity is DecayEntity) {
                var build = entity.GetBuildingPrivilege();
                if (build == null) return;
                if (build.net.ID.Equals(privilege)) {
                    if (info.Initiator is FireBall) info.Initiator.Kill();
                    clear(info);
                }
            }
            else if (entity is BasePlayer) {
                BasePlayer player = entity.ToPlayer();
                if (player == null || !cashplayers.Contains(player.userID)) return;
                if (player.GetComponent<OnePlayer>().duel) {
                    info.damageTypes.ScaleAll(config.damageScale);
                    float damageAmount = info.damageTypes.Total();
                    if (entity.Health() - damageAmount <= 1.5f) {
                        Duel duel = duels.Where(x => x.pl1.Equals(player) || x.pl2.Equals(player)).FirstOrDefault();
                        if (duel != null) endduel(player, true);
                        else player.GetComponent<OnePlayer>().ToDestroy();
                        timer.Once(1f, () => {
                            if (player == null) return;
                            if (player.IsWounded()) player.Hurt(1000f, DamageType.Suicide, player, false);
                        }
                        );
                    }
                }
                else clear(info);
            }
        }
        void OnPlayerDeath(BasePlayer player, HitInfo info) {
            if (!cashplayers.Contains(player.userID)) return;
            Duel duel = duels.Where(x => x.pl1.Equals(player) || x.pl2.Equals(player)).FirstOrDefault();
            if (duel != null) endduel(player, true);
            else player.GetComponent<OnePlayer>().ToDestroy();
        }
        void OnRunPlayerMetabolism(PlayerMetabolism metabolism, BaseCombatEntity entity) {
            if (!(entity is BasePlayer)) return;
            var player = entity as BasePlayer;
            if (!cashplayers.Contains(player.userID)) return;
            if (player.metabolism.temperature.value < 20) player.metabolism.temperature.value = 21;
        }
        void clear(HitInfo info) {
            info.damageTypes = new DamageTypeList();
            info.HitEntity = null;
            info.HitMaterial = 0;
            info.PointStart = Vector3.zero;
        }
#endregion
#region Main
        public void GiveKit(BasePlayer player) {
            //Получаем рандомом оружку
            Item item = ItemManager.CreateByItemID(gun);
            BaseProjectile projectile = item.GetHeldEntity()?.GetComponent<BaseProjectile>();
            if (projectile != null && projectile.primaryMagazine != null) {
                projectile.primaryMagazine.contents = projectile.primaryMagazine.capacity;
                Item ammoitem = ItemManager.Create(projectile.primaryMagazine.ammoType, config.ammo);
                player.inventory.GiveItem(ammoitem, player.inventory.containerMain);
            }
            if (config.mods.Count > 0 && item.contents != null) {
                foreach (var z in config.mods) {
                    Item mod = ItemManager.CreateByItemID(z);
                    mod.MoveToContainer(item.contents);
                }
            }
            player.inventory.GiveItem(item, player.inventory.containerBelt);
            Kits?.Call("GiveKit", player, config.kit);
            XKits?.Call("GiveKit", player, config.kit);
        }
        const string nameui = "fonTsadq2cqse3";
        const string textui = "Tsadq2cqse3";
        void destroyUI(List<Network.Connection> netcon) {
            if (netcon == null || netcon.Count < 0) return;
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = netcon
            }
            , null, "DestroyUI", nameui);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = netcon
            }
            , null, "DestroyUI", textui);
        }
        void createUItext(List<Network.Connection> netcon) {
            if (netcon == null || netcon.Count < 0) return;
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = netcon
            }
            , null, "DestroyUI", textui);
            string sendto = GUItext.Replace("{count}", players.Count.ToString()).Replace("{time}", TimeSpan.FromSeconds(start).ToString());
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = netcon
            }
            , null, "AddUI", sendto);
        }
        void createUItext(Network.Connection netcon) {
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = netcon
            }
            , null, "DestroyUI", textui);
            string sendto = GUItext.Replace("{count}", players.Count.ToString()).Replace("{time}", TimeSpan.FromSeconds(start).ToString());
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = netcon
            }
            , null, "AddUI", sendto);
        }
        void createUIEXIT(Network.Connection netcon) {
            if (netcon == null) return;
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = netcon
            }
            , null, "DestroyUI", nameui);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = netcon
            }
            , null, "DestroyUI", textui);
            string def = ItemManager.FindItemDefinition(gun).displayName.english;
            string sendto1 = GUImain.Replace("{gun}", def).Replace("{button}", "ПРИСОЕДИНИТЬСЯ");
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = netcon
            }
            , null, "AddUI", sendto1);
            createUItext(netcon);
        }
        void createUI(List<Network.Connection> netcon) {
            if (netcon == null || netcon.Count < 0) return;
            destroyUI(netcon);
            string def = ItemManager.FindItemDefinition(gun).displayName.english;
            string sendto1 = GUImain.Replace("{gun}", def).Replace("{button}", "ВЫЙТИ");
            string sendto2 = GUImain.Replace("{gun}", def).Replace("{button}", "ПРИСОЕДИНИТЬСЯ");
            List<Network.Connection> exit = netcon.Where(x => cashplayers.Contains(x.userid)).ToList();
            List<Network.Connection> enter = netcon.Where(x => !cashplayers.Contains(x.userid)).ToList();
            if (exit.Count > 0) CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = exit
            }
            , null, "AddUI", sendto1);
            if (enter.Count > 0) CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connections = enter
            }
            , null, "AddUI", sendto2);
            ;
            createUItext(netcon);
        }
        string GUItext = "";
        string GUImain = "";
        static Vector3 arenaposition;
        void Init() => Unsubscribe(nameof(OnPasteFinished));
        void OnServerInitialized() {
            if(config.rofl == null) {
                config.rofl = "^_^";
                config.broadcast2 = 76561198125444659;
                SaveConfig();
            }
            if(config.head == null) {
                config.head = "<color=#ffd479>ТУРНИР ОДИНОЧЕК\nоружие {gun}</color>";
                config.foot = "УЧАСТНИКОВ: <color=#ffd479>{count}</color>\nСТАРТ ЧЕРЕЗ <color=#ffd479>{time}</color>";
                SaveConfig();
            }
            if(config.fon == null) {
                config.button = "1 0.83 0.47 0.35";
                config.fon = "1 1 1 0.03";
                SaveConfig();
            }
            GUItext = "[{\"name\":\"Tsadq2cqse3\",\"parent\":\"Hud.Menu\",\"components\":[{\"type\":\"UnityEngine.UI.Image\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\"}]},{\"name\":\"4c277f7583f6463e9cad69f4b92aaf62\",\"parent\":\"Tsadq2cqse3\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{foot}\",\"align\":\"MiddleLeft\",\"color\":\"1 1 1 0.5\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\",\"offsetmin\":\"-430 38\",\"offsetmax\":\"-265 78\"}]}]".Replace("{foot}", config.foot);
            GUImain = "[{\"name\":\"fonTsadq2cqse3\",\"parent\":\"Hud.Menu\",\"components\":[{\"type\":\"UnityEngine.UI.Image\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\"}]},{\"name\":\"c274caa359cf479bad4448ef8c47b792\",\"parent\":\"fonTsadq2cqse3\",\"components\":[{\"type\":\"UnityEngine.UI.Image\",\"material\":\"assets/content/ui/uibackgroundblur-ingamemenu.mat\",\"color\":\"{fon}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\",\"offsetmin\":\"-440 18\",\"offsetmax\":\"-265 78\"}]},{\"name\":\"790d2667be324c2e929c046594ca9a4d\",\"parent\":\"fonTsadq2cqse3\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{head}\",\"align\":\"LowerCenter\",\"color\":\"1 1 1 0.5\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\",\"offsetmin\":\"-440 80\",\"offsetmax\":\"-265 120\"}]},{\"name\":\"003a131d6cab495d89698c7028ee2429\",\"parent\":\"fonTsadq2cqse3\",\"components\":[{\"type\":\"UnityEngine.UI.Button\",\"command\":\"chat.say /{command}\",\"material\":\"assets/content/ui/ui.background.transparent.radial.psd\",\"color\":\"{buttoncolor}\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0\",\"anchormax\":\"0.5 0\",\"offsetmin\":\"-440 18\",\"offsetmax\":\"-265 38\"}]},{\"parent\":\"003a131d6cab495d89698c7028ee2429\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{button}\",\"align\":\"MiddleCenter\",\"color\":\"1 1 1 0.5\"},{\"type\":\"RectTransform\"}]}]".Replace("{fon}", config.fon).Replace("{buttoncolor}", config.button).Replace("{head}", config.head);
            if (config.blocked == null) {
                config.blocked = new string[] {
                    "tp", "home", "kit"
                }
                ;
                SaveConfig();
            }
            if (config.rewardcommands == null) {
                config.rewardcommands = new List<string> {
                    "addgroup {steamid} 1place 3h", "addgroup {steamid} 2place 2h", "addgroup {steamid} 3place 1h", "addgroup {steamid} 4place 1h"
                }
                ;
                SaveConfig();
            }
            GUImain = GUImain.Replace("{command}", config.command);
            if (positionforarena.Equals(Vector3.zero)) positionforarena = config.positionforarena.ToVector3();
            ins = this;
            Interface.Oxide.GetLibrary<ru.Libraries.Command>(null).AddChatCommand(config.command, this, "cmdtoevent");
            Interface.Oxide.GetLibrary<Game.Rust.Libraries.Command>(null).AddConsoleCommand("event.oo", this, "cmdconsolecommand");
            unsubscribe();
            Debug.Log("Проверяем построена ли арена.");
            RaycastHit hitInfo;
            if (!Physics.Raycast(positionforarena + 10f * Vector3.down, Vector3.up * 100f, out hitInfo, LayerMask.GetMask("Construction"))) {
                Debug.Log("Арена не построена...строим арену...");
                timer.Once(30f, () => createarena());
            }
            else {
                initialize();
                arenaposition = hitInfo.point;
                privilege = hitInfo.GetEntity().GetBuildingPrivilege().net.ID;
            }
            permission.RegisterPermission(Name + ".admin", this);
            if (config.autoevent > 0) {
                eventtime = DateTime.UtcNow.AddSeconds(config.autoevent);
                timer.Once(config.autoevent, () => autoeventON());
            }
        }
        private DateTime GetNextEventTime() {
            return eventtime;
        }
        private DateTime eventtime;
        void autoeventON() {
            eventtime = DateTime.UtcNow.AddSeconds(config.autoevent);
            timer.Once(config.autoevent, () => autoeventON());
            if (config.random.Count > 0) gun = config.random[Random.Range(0, config.random.Count)];
            startreg(config.timeforreg);
        }
        void spammes(string time) => Broadcast(config.messages[2].Replace("{prefix}", config.prefix).Replace("{time}", time).Replace("{command}", config.command));
        void startevent() {
            logs.Clear();
            destroyUI(Network.Net.sv.connections);
            if (players.Count < config.minplayers) {
                Broadcast(config.messages[6].Replace("{prefix}", config.prefix));
                endevent();
                return;
            }
            logs.Add($"[{DateTime.Now.ToString("H : mm")}] Участников: {players.Count} | Оружие: {ItemManager.FindItemDefinition(gun).displayName.english}");
            generetepairs();
        }
        List<Timer> timersspam = new List<Timer>();
        private bool IsEventArena(uint priv) {
            if (!privilege.Equals(priv)) return false;
            else return true;
        }
        void OnItemDropped(Item item, BaseEntity entity) {
            if (Vector3.Distance(arenaposition, entity.transform.position) < 70f) entity?.Kill();
        }
        void OnEntitySpawned(BaseNetworkable entity) {
            if (entity is PlayerCorpse || entity.prefabID == 1519640547) {
                if (Vector3.Distance(arenaposition, entity.transform.position) < 70f) entity?.Kill();
            }
        }
        void startreg(int time = 120) {
            //Смотрим на онлайн ибо нечего стартовать арену с 1 человеком в сети
            if (BasePlayer.activePlayerList.Count<config.minplayersOnline) {
                PrintWarning($"Количество игроков < {config.minplayersOnline}.Ивент пропущен.");
                return;
            }
            if (privilege == 0) {
                Debug.LogError("Арена для ивента отсутствует!");
                return;
            }
            if (posplayer1.Equals(Vector3.zero) || posplayer2.Equals(Vector3.zero) || posspectators.Count.Equals(0)) {
                Debug.LogError("Не указаны все точки спавна!");
                return;
            }
            endevent();
            messageUI.Clear();
            subscribe();
            start = time;
            Subscribe(nameof(OnPlayerDeath));
            //Subscribe(nameof(OnEntitySpawned));
            //Subscribe(nameof(OnItemDropped));
            Subscribe(nameof(OnPlayerAttack));
            Subscribe(nameof(OnRunPlayerMetabolism));
            spammes(FormatTime(TimeSpan.FromSeconds(time)).ToUpper());
            NextTick(() => {
                createUI(Network.Net.sv.connections);
            }
            );
            timersspam.Add(timer.Repeat(1f, 0, () => ticktimer()));
        }
        void ticktimer() {
            start--;
            if (start <= 0) {
                foreach (var z in timersspam) destroytimer(z);
                startevent();
                return;
            }
            else if (config.messagetrue) {
                if (start.Equals(60)) spammes("60 СЕКУНД");
                else if (start.Equals(30)) spammes("30 СЕКУНД");
                else if (start.Equals(15)) spammes("15 СЕКУНД");
                else if (start.Equals(10)) spammes("10 СЕКУНД");
                else if (start.Equals(3)) spammes("3 СЕКУНДЫ");
                else if (start.Equals(2)) spammes("2 СЕКУНДЫ");
                else if (start.Equals(1)) spammes("1 СЕКУНДУ");
            }
            createUItext(Network.Net.sv.connections);
        }
        void createarena() {
            Subscribe(nameof(OnPasteFinished));
            if (CopyPaste == null) {
                Debug.LogError("Установите копипаст!");
                return;
            }
            var options = new List<string> {
                "Deployables", "true", "Inventories", "true", "height", positionforarena.y.ToString()
            }
            ;
            var successPaste = CopyPaste.Call("TryPasteFromVector3", positionforarena, 0f, config.arenaname, options.ToArray());
            if (successPaste is string) {
                PrintError(successPaste.ToString());
                Unsubscribe(nameof(OnPasteFinished));
            }
        }
        void initialize() {
            if (posplayer1.Equals(Vector3.zero)) {
                if (string.IsNullOrEmpty(config.posplayer1)) {
                    Debug.LogError("Не указаны координаты для первого игрока!");
                    return;
                }
                posplayer1 = config.posplayer1.ToVector3() + Vector3.up * 0.1f;
            }
            if (posplayer2.Equals(Vector3.zero)) {
                if (string.IsNullOrEmpty(config.posplayer2)) {
                    Debug.LogError("Не указаны координаты для второго игрока!");
                    return;
                }
                posplayer2 = config.posplayer2.ToVector3() + Vector3.up * 0.1f;
            }
            if (posspectators.Count.Equals(0)) {
                if (config.posspectators.Equals(0)) {
                    Debug.LogError("Не указаны координаты для зрителей!");
                    return;
                }
                foreach (var z in config.posspectators) {
                    Vector3 pos = z.ToVector3();
                    posspectators.Add(pos);
                }
            }
            Debug.Log("Координаты указаны.");
        }
        private void OnPasteFinished(List<BaseEntity> entitys) {
            posplayer1 = Vector3.zero;
            posplayer2 = Vector3.zero;
            posspectators.Clear();
            foreach (var entity in entitys) {
                if (entity is FlasherLight) {
                    Vector3 pos = entity.transform.position + Vector3.up;
                    if (posplayer1.Equals(Vector3.zero)) {
                        posplayer1 = pos + Vector3.up * 0.1f;
                        config.posplayer1 = pos.ToString();
                    }
                    else if (posplayer2.Equals(Vector3.zero)) {
                        posplayer2 = pos + Vector3.up * 0.1f;
                        config.posplayer2 = pos.ToString();
                    }
                    entity.KillMessage();
                }
                if (entity is SirenLight) {
                    Vector3 pos = entity.transform.position + Vector3.up;
                    posspectators.Add(pos);
                    config.posspectators.Add(pos.ToString());
                    entity.KillMessage();
                }
            }
            Debug.Log("Арена построена!");
            var first = entitys.FirstOrDefault();
            privilege = first.GetBuildingPrivilege().net.ID;
            arenaposition = first.transform.position;
            SaveConfig();
            Unsubscribe(nameof(OnPasteFinished));
        }
        void destroytimer(Timer ss) {
            if (!ss.Destroyed) timer.Destroy(ref ss);
        }
        void generetepairs() {
            duels.Clear();
            string roundname = $"РАУНД <color=#ccff33>{round}</color>";
            string pairs = $"{config.prefix} {roundname}:\n";
            List<BasePlayer> swess = new List<BasePlayer>(players);
            while (swess.Count > 1) {
                Duel duel = new Duel();
                BasePlayer r1 = swess[Random.Range(0, swess.Count)];
                duel.pl1 = r1;
                swess.Remove(r1);
                BasePlayer r2 = swess[Random.Range(0, swess.Count)];
                duel.pl2 = r2;
                swess.Remove(r2);
                duels.Add(duel);
                pairs += $"<color=#ccff33>{duel.pl1.displayName}</color> - <color=#ccff33>{duel.pl2.displayName}</color>\n";
            }
            if (swess.Count > 0) Broadcast(config.messages[8].Replace("{prefix}", config.prefix).Replace("{name}", swess.FirstOrDefault().displayName.ToUpper()));
            if (config.messagetrue) {
                if (swess.Count.Equals(2)) roundname = "ФИНАЛ";
                else if (swess.Count <= 4) roundname = "ПОЛУФИНАЛ";
                if (swess.Count > 0) pairs += $"<color=#ccff33>{swess.FirstOrDefault().displayName}</color> проходит в следующий раунд";
                round++;
                Broadcast(pairs);
            }
            startduel();
        }
        void startduel() {
            if (players.Count < 2) {
                endevent();
                return;
            }
            if (duels.Count.Equals(0)) {
                nextphase();
                return;
            }
            timersspam.Add(timer.Once(2f, () => {
                if (duels.Count.Equals(0)) return;
                Duel duel = duels.FirstOrDefault();
                fight(duel.pl1, duel.pl2);
            }
            ));
        }
        void fight(BasePlayer player1, BasePlayer player2) {
            OnePlayer pl1 = player1.GetComponent<OnePlayer>();
            OnePlayer pl2 = player2.GetComponent<OnePlayer>();
            if (pl1 == null || pl2 == null) {
                if (pl1 == null && players.Contains(player1)) players.Remove(player1);
                if (pl2 == null && players.Contains(player2)) players.Remove(player2);
                duels.RemoveAt(0);
                Debug.LogWarning("Ошибка | OnePlayer = null | ИСПРАВИЛИ");
                startduel();
                return;
            }
            pl1.duel = true;
            pl2.duel = true;
            if (player1.inventory.loot?.entitySource != null) player1.EndLooting();
            if (player2.inventory.loot?.entitySource != null) player2.EndLooting();
            pl1.Teleport(posplayer1);
            pl1.Maxatributes();
            pl1.Kit();
            pl2.Teleport(posplayer2);
            pl2.Maxatributes();
            pl2.Kit();
            Broadcast(config.messages[13].Replace("{prefix}", config.prefix).Replace("{name1}", player1.displayName).Replace("{name2}", player2.displayName));
            Timeronround = timer.Once(config.timeonround, () => {
                if (pl1.Health() > pl2.Health()) endduel(player2, true);
                else if (pl1.Health() < pl2.Health()) endduel(player1, true);
                else {
                    Broadcast(config.messages[12].Replace("{prefix}", config.prefix));
                    if (Random.Range(0, 2).Equals(0)) endduel(player1, true);
                    else endduel(player2, true);
                }
            }
            );
        }
        void restoreafter(BasePlayer player) {
            restore rs = restoreinventory[player.userID];
            if (player.IsWounded()) player.StopWounded();
            Teleport(player, rs.teleportfrom);
            player.metabolism.Reset();
            player.health = rs.health;
            player.metabolism.calories.value = rs.calories;
            player.metabolism.hydration.value = rs.hydration;
            player.metabolism.bleeding.value = 0;
            player.metabolism.SendChangesToClient();
            player.inventory.Strip();
            if (!RestoreItems(player, rs.inventory, InventoryType.Belt) || !RestoreItems(player, rs.inventory, InventoryType.Main) || !RestoreItems(player, rs.inventory, InventoryType.Wear)) {
                Debug.LogError($"OneVSOne | Игрок {player.displayName} не получил все предметы.");
            }
            LockInventory(player, false);
            restoreinventory.Remove(player.userID);
        }
        void OnPlayerSleepEnded(BasePlayer player) {
            timer.Once(1f, () => {
                if (!player.IsConnected || player.IsDead()) return;
                if (restoreinventory.ContainsKey(player.userID)) restoreafter(player);
                else if (player.GetComponent<OnePlayer>() == null && !player.IsAdmin && Vector3.Distance(arenaposition, player.transform.position) < 65f) {
                    BasePlayer.SpawnPoint spawnPoint = ServerMgr.FindSpawnPoint();
                    player.Teleport(spawnPoint.pos);
                }
                if (kitreward.Contains(player.userID)) {
                    Kits?.Call("GiveKit", player, config.kitreward);
                    XKits?.Call("GiveKit", player, config.kitreward);
                    kitreward.Remove(player.userID);
                }
                if (!messageUI.ContainsKey(player)) return;
                string message = messageUI[player];
                timer.Once(1f, () => drawui(player, message));
                messageUI.Remove(player);
                ins.Kits?.Call("GiveKitEvent", player, config.kitreward2);
                XKits?.Call("GiveKit", player, config.kitreward2);
            }
            );
        }
        const string drawuimes = "UIasdq2e12";
        string GUImes = "[{\"name\":\"UIasdq2e12\",\"parent\":\"Hud.Menu\",\"components\":[{\"type\":\"UnityEngine.UI.Image\"},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0.5\",\"anchormax\":\"0.5 0.5\"}]},{\"name\":\"UI_mesOnesOne\",\"parent\":\"UIasdq2e12\",\"components\":[{\"type\":\"UnityEngine.UI.Text\",\"text\":\"{message}\",\"fontSize\":30,\"align\":\"MiddleCenter\",\"color\":\"1 1 1 0.9\",\"fadeIn\":0.5},{\"type\":\"RectTransform\",\"anchormin\":\"0.5 0.5\",\"anchormax\":\"0.5 0.5\",\"offsetmin\":\"-450 -60\",\"offsetmax\":\"450 60\"}]}]";
        void destroydrawUI(BasePlayer player) {
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "DestroyUI", drawuimes);
        }
        Dictionary<BasePlayer, string> messageUI = new Dictionary<BasePlayer, string>();
        void drawui(BasePlayer player, string message) {
            destroydrawUI(player);
            CommunityEntity.ServerInstance.ClientRPCEx(new Network.SendInfo {
                connection = player.net.connection
            }
            , null, "AddUI", GUImes.Replace("{message}", message));
            timer.Once(4f, () => destroydrawUI(player));
        }
        void endduel(BasePlayer lose, bool withmessage = false) {
            Duel duel = duels.FirstOrDefault(x => x.pl1.Equals(lose) || x.pl2.Equals(lose));
            if (duel == null) {
                Debug.LogError("Ошибка | Такой пары для дуэли не существует!");
                return;
            }
            messageUI.Add(lose, config.messageUI[0]);
            OnePlayer pl1 = duel.pl1?.GetComponent<OnePlayer>();
            OnePlayer pl2 = duel.pl2?.GetComponent<OnePlayer>();
            if (pl1 == null || pl2 == null) {
                Debug.LogError("Ошибка | КРИТИЧЕСКАЯ!");
                endevent();
                return;
            }
            bool active = pl1.duel;
            pl1.duel = false;
            pl2.duel = false;
            if (duel.pl2.Equals(lose)) {
                logs.Add($"[{DateTime.Now.ToString("H : mm")}] победил: {duel.pl1.displayName} ({duel.pl1.UserIDString}) - {duel.pl2.displayName} ({duel.pl2.UserIDString}) :проиграл");
                pl1.Clear();
                pl1.Teleport(posspectators[Random.Range(0, ins.posspectators.Count)]);
                pl1.Maxatributes();
                int count = ins.cashplayers.Count - 1;
                if (count >= 0 && count < ins.config.rewardcommands.Count) {
                    ins.Server.Command(ins.config.rewardcommands[count].Replace("{steamid}", duel.pl2.UserIDString));
                }
                pl2.ToDestroy();
                if (withmessage) Broadcast(config.messages[8].Replace("{prefix}", config.prefix).Replace("{name}", duel.pl1.displayName.ToUpper()));
            }
            else {
                logs.Add($"[{DateTime.Now.ToString("H : mm")}] победил: {duel.pl2.displayName} ({duel.pl2.UserIDString}) - {duel.pl1.displayName} ({duel.pl1.UserIDString}) :проиграл");
                pl2.Clear();
                pl2.Teleport(posspectators[Random.Range(0, ins.posspectators.Count)]);
                pl2.Maxatributes();
                int count = ins.cashplayers.Count - 1;
                if (count >= 0 && count < ins.config.rewardcommands.Count) {
                    ins.Server.Command(ins.config.rewardcommands[count].Replace("{steamid}", duel.pl1.UserIDString));
                }
                pl1.ToDestroy();
                if (withmessage) Broadcast(config.messages[8].Replace("{prefix}", config.prefix).Replace("{name}", duel.pl2.displayName.ToUpper()));
            }
            duels?.Remove(duel);
            if (active) {
                destroytimer(Timeronround);
                if (duels.Count > 0) {
                    startduel();
                }
                else {
                    NextTick(() => nextphase());
                }
            }
        }
        void nextphase() {
            if (players.Count.Equals(0)) {
                Debug.LogError(config.messages[1].Replace("{prefix}", config.prefix));
                Broadcast(config.messages[1].Replace("{prefix}", config.prefix));
                endevent();
                return;
            }
            if (players.Count.Equals(1)) {
                BasePlayer player = players.FirstOrDefault();
                logs.Add($"[{DateTime.Now.ToString("H : mm")}] {player.displayName} ({player.UserIDString}) - ВЫИГРАЛ!");
                Interface.Oxide.DataFileSystem.WriteObject($"ONEVSONE/{DateTime.Now.ToString("HH_mm____dd_MM")}", logs);
                logs.Clear();
                messageUI.Add(player, config.messageUI[1]);
                Broadcast(config.messages[7].Replace("{prefix}", config.prefix).Replace("{name}", player.displayName.ToUpper()));
                endevent();
                timer.Once(1f, () => {
                    if (ServerRewards != null && config.sRewards > 0) ConsoleSystem.Run(ConsoleSystem.Option.Server, $"sr add {player.userID} {config.sRewards}");
                    if (Economics != null && config.sRewards > 0) Economics?.Call("Deposit", player.userID, Convert.ToDouble(config.sRewards));
                    if (Kits != null && !string.IsNullOrEmpty(config.kitreward)) kitreward.Add(player.userID);
                    if (XKits != null && !string.IsNullOrEmpty(config.kitreward)) kitreward.Add(player.userID);
                    if (config.rewardcommands.Count > 0) {
                        ins.Server.Command(ins.config.rewardcommands[0].Replace("{steamid}", player.UserIDString));
                    }
                }
                );
                return;
            }
            generetepairs();
        }
        List<ulong> kitreward = new List<ulong>();
        private void OnPlayerConnected(BasePlayer player) {
            if (player.inventory.containerMain.HasFlag(ItemContainer.Flag.IsLocked)) LockInventory(player, false);
            NextTick(() => {
                if (start <= 0 || player == null || player.net == null) return;
                if (player.GetComponent<OnePlayer>() != null) player.GetComponent<OnePlayer>().ToDestroy();
                createUI(new List<Network.Connection> {
                    player.net.connection
                }
                );
            }
            );
        }
        void unsubscribe() {
            //Unsubscribe(nameof(OnEntitySpawned));
            //Unsubscribe(nameof(OnItemDropped));
            Unsubscribe(nameof(OnPlayerVoice));
            Unsubscribe(nameof(OnPlayerAttack));
            Unsubscribe(nameof(OnUserCommand));
            Unsubscribe(nameof(OnServerCommand));
            Unsubscribe(nameof(OnPlayerDisconnected));
            Unsubscribe(nameof(OnPlayerDeath));
            Unsubscribe(nameof(OnRunPlayerMetabolism));
        }
        void subscribe() {
            if (config.mutevoice) Subscribe(nameof(OnPlayerVoice));
            Subscribe(nameof(OnUserCommand));
            Subscribe(nameof(OnServerCommand));
            Subscribe(nameof(OnPlayerDisconnected));
        }
        void endevent() {
            round = 1;
            start = 0;
            if (timersspam.Count > 0) {
                foreach (var z in timersspam) z?.Destroy();
            }
            unsubscribe();
            foreach (var player in BasePlayer.activePlayerList) {
                if (player != null && player.GetComponent<OnePlayer>() != null) player.GetComponent<OnePlayer>().ToDestroy();
            }
            // Если с ботами
            foreach (var player in players) player.GetComponent<OnePlayer>()?.ToDestroy();
            //
            destroyUI(Network.Net.sv.connections);
            players.Clear();
            cashplayers.Clear();
            duels.Clear();
        }
        private object OnUserCommand(IPlayer player, string com, string[] args) {
            com = com.TrimStart('/').Substring(com.IndexOf(".", StringComparison.Ordinal) + 1).ToLower();
            return blocker(BasePlayer.Find(player.Id), com);
        }
        private object OnServerCommand(ConsoleSystem.Arg arg) {
            string com = arg.cmd.FullName.ToLower();
            if (com.Equals("chat.teamsay")) return null;
            return blocker(arg.Player(), com);
        }
        private object OnPlayerVoice(BasePlayer player, Byte[] data) {
            if (player.GetComponent<OnePlayer>() != null && !player.IsAdmin && !permission.UserHasPermission(player.UserIDString, Name + ".admin")) return false;
            return null;
        }
        private static string[] whitelist = new string[] {
            "report", "mreport", "ban", "mute", "pm", "r", "f"
        }
        ;
        private object blocker(BasePlayer player, string com) {
            if (com=="inventory.lighttoggle") return null;
            if (player == null) return null;
            if (com.Equals(config.command) || com.Contains("global.") && !config.blocked.Contains(com) || whitelist.Contains(com)) return null;
            OnePlayer one = player.GetComponent<OnePlayer>();
            if (one != null) {
                if (DateTime.Now > one.lastmsg) {
                    Message(player, config.messages[5].Replace("{prefix}", config.prefix).Replace("{command}", config.command));
                    one.lastmsg = DateTime.Now.AddSeconds(3);
                }
                return true;
            }
            return null;
        }
        public class ItemClass {
            public int itemid;
            public ulong skin;
            public int amount;
            public float condition;
            public float maxCondition;
            public int ammo;
            public string ammotype;
            public ProtoBuf.Item.InstanceData instanceData;
            public ItemClass[] contents;
        }
        public enum InventoryType {
            Main, Wear, Belt
        }
        ;
        static IEnumerable<ItemClass> GetItems(ItemContainer container) {
            return container.itemList.Where(x => x.amount > 0).Select(item => new ItemClass {
                itemid = item.info.itemid, amount = item.amount, ammo = (item.GetHeldEntity() as BaseProjectile)?.primaryMagazine.contents ?? 0, ammotype = (item.GetHeldEntity() as BaseProjectile)?.primaryMagazine.ammoType.shortname ?? null, skin = item.skin, maxCondition = item.maxCondition, condition = item.condition, instanceData = item.instanceData ?? null, contents = item.contents?.itemList.Select(item1 => new ItemClass {
                    itemid = item1.info.itemid, amount = item1.amount, condition = item1.condition, maxCondition = item1.maxCondition
                }
                ).ToArray()
            }
            );
        }
        static bool RestoreItems(BasePlayer player, Dictionary<InventoryType, List<ItemClass>> items, InventoryType type) {
            ItemContainer container = type == InventoryType.Belt ? player.inventory.containerBelt : type == InventoryType.Wear ? player.inventory.containerWear : player.inventory.containerMain;
            for (int i = 0; i < container.capacity; i++) {
                var existingItem = container.GetSlot(i);
                if (existingItem != null) {
                    existingItem.RemoveFromContainer();
                    existingItem.Remove(0f);
                }
                if (items[type].Count > i) {
                    var itemData = items[type][i];
                    var item = ItemManager.CreateByItemID(itemData.itemid, itemData.amount, itemData.skin);
                    item.condition = itemData.condition;
                    item.maxCondition = itemData.maxCondition;
                    if (itemData.instanceData != null) item.instanceData = itemData.instanceData;
                    var weapon = item.GetHeldEntity() as BaseProjectile;
                    if (weapon != null) {
                        if (!string.IsNullOrEmpty(itemData.ammotype)) weapon.primaryMagazine.ammoType = ItemManager.FindItemDefinition(itemData.ammotype);
                        weapon.primaryMagazine.contents = itemData.ammo;
                    }
                    if (itemData.contents != null) {
                        foreach (var contentData in itemData.contents) {
                            var newContent = ItemManager.CreateByItemID(contentData.itemid, contentData.amount);
                            if (newContent != null) {
                                newContent.condition = contentData.condition;
                                newContent.maxCondition = contentData.maxCondition;
                                newContent.MoveToContainer(item.contents);
                            }
                        }
                    }
                    item.position = i;
                   
// ... [Code preview truncated due to length. Full source in attached file] ...

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