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

FREE Duel : 4.2.1 4.2.1

Нет прав для скачивания
C#:
using Newtonsoft.Json;
using Oxide.Core;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Reflection;
using System.Text;
using UnityEngine;
namespace Oxide.Plugins {
    [Info("Duel", "111", "4.2.1")]
    [Description("Automatic Duel (Bets) with GUI, weapons list, auto-created arenas, save players loot and position")]
    class Duel : RustPlugin {
#region Messages&Config
        string notAllowed = "Вызов на дуэль запрещен";
        string duelCommand = "<color=orange>/duel <ник></color> - вызвать игрока на дуэль\n<color=orange><color=#ADFF2F>/duels</color> <ник></color> - <color=#ADFF2F>вызвать игрока на дуэль со ставками</color>\n<color=orange>/duel a</color> - принять вызов\n<color=orange>/duel c</color> - отменить вызов\n<color=orange>/duel stat</color> - статистика\n<color=orange>/duel top</color> - топ\nКомандная дуэль:\n<color=orange>/duel create [2-6]</color> - создать командную дуэль\n<color=orange>/duel join red/blue</color> - подать заявку\n<color=orange>/duel accept</color> - принять в дуэль (для создателя)\n<color=orange>/duel c</color> - покинуть дуэль";
        string dontHaveRequest = "У вас нет заявок на дуэль";
        string notFoundPlayer = "Игрок с именем <color=#7b9ef6>{0}</color> не найден";
        string alreadyHaveDuel = "<color=#7b9ef6>{0}</color> уже имеет активную дуэль";
        string youOnDuel = "Вы уже имеете активную дуэль";
        string noArenas = "Извините, все арены сейчас заняты";
        string noBuildAcess = "Вы должны быть авторизованы в шкафу";
        string cooldownMessage = "Вы сможете вызвать на дуэль через {0} секунд";
        string createRequest = "Вы вызвали <color=#7b9ef6>{0}</color> на дуэль!\n<color=orange>/duel c</color> - отменить вызов";
        string receiveRequest = "<color=#7b9ef6>{0}</color> вызвал вас на дуэль!\n<color=orange>/duel a</color> - принять вызов\n15 секунд до отмены\n<color=orange>/duel c</color> - отменить вызов";
        string youDontHaveRequest = "У вас нет активных вызовов";
        string cantCancelDuel = "Невозможно отменить начавшуюся дуэль.\nПобеди своего противника!";
        static string duelHasBeenCancelled = "Дуэль c <color=#7b9ef6>{0}</color> отменена.";
        static string duelStart = "Дуэль началась!";
        static string playerNotFound = "Игрок с именем {0} не найден";
        static string foundMultiplePlayers = "Найдено несколько игроков: <color=#7b9ef6>{0}</color>";
        static string guiChooseWeapon = "Выберите оружие из списка";
        static string guiYourChoose = "Вы выбрали: {0}";
        static string guiWaitForOpponentChoose = "Противник выбирает оружие";
        static string guiOpponentsWeapon = "Противник выбрал: {0}";
        static string guiStartAboutToBegin = "Начало через несколько секунд";
        static string guiSurrenderButton = "Сдаться";
        static string guiAutoCloseSec = "До выбора случайного оружия: {0}";
        static string guiPlayerSleep = "Ожидаем пока соперник проснётся";
        string statLoss = "Тебе засчитано поражение в дуэли";
        string statWin = "Тебе засчитана победа в дуэли";
        string notificationAboutWin = "[Дуэль] <color=#6ecc68>{0}</color> vs <color=#cc6868>{1}</color>\nПобедитель: <color=#68a7cc>{2}</color>";
        string cantBuild = "Ты не можешь строить на дуэли";
        string cantUseRecycle = "Ты не можешь использовать переработчик на дуэли";
        string cantUseNexusKits = "Ты не можешь использовать киты на дуэли";
        string cantTrade = "Ты не можешь обмениваться на дуэли";
        string cantRemove = "Ты не можешь ремувать на дуэли";
        string cantTp = "Ты не можешь пользоваться телепортом на дуэли";
        string cantUseKit = "Ты не можешь получить кит на дуэли";
        string cantUseCommand = "Вы не можете использовать /{0} на Duel";
        string cantUseBackPack = "Ты не можешь использовать рюкзак на дуэли";
        string cantUseSkins = "Ты не можешь использовать скины на дуэли";
        string cantUseKill = "Ты не можешь использовать kill на дуэли";
        string yourStat = "Ваша статистика по дуэлям:\nПобед: {0}\nПоражений: {1}\nКомандные дуэли:\nПобед:{2}\nПоражений:{3}";
        string emptyTop = "Статистика пуста как твоя кровать по ночам";
        string topWin = "Топ побед в дуэлях:";
        string topTeamWin = "\n\nТоп побед в командных дуэлях:";
        string topLosses = "\n\nТоп поражений в дуэлях:";
        string topTeamLoss = "\n\nТоп поражений в командных дуэлях:";
        string playerInTop = "\n{0}.<color=#469cd0>{1}</color>: {2}";
        // номер.ник: значение
        static string returnPlayerReason = "Дуэль окончена.\nПричина: <color=orange>{0}</color>";
        static string returnReasonSleep = "Кто-то слишком долго спал";
        static string returnReasonGUIFail = "Кто-то слишком долго выбирает оружие";
        static string returnReasonLimitTime = "Время на дуэль вышло({0} секунд)";
        static string returnReasonDisconnect = "Соперник отключился";
        static string returnReasonSurrender = "Кто-то всё же решил сдаться";
        static string returnReasonUnload = "Плагин на время отключен.Попробуйте позже.";
        static string teamDuelCancelled = "Командная дуэль отменена\nПричина: не собрана за {0} сек";
        static string teamPlayerDisconnect = "[Дуэль] <color=#7b9ef6>{0}</color> вышел с сервера!";
        static string teamWinRed = "[Дуэль] Побеждает команда <color=red>RED</color>!";
        static string teamWinBlue = "[Дуэль] Побеждает команда <color=blue>BLUE</color>!";
        static string teamDuellerWounded = "[Дуэль] Один из дуэлянтов ранен.\nДуэль не начнётся, пока он ранен.";
        static string teamArensBusy = "[Дуэль] Пожалуйста, подождите.Все арены заняты.";
        static string teamCooldownToCreate = "Вы сможете создать командную дуэль через {0} сек";
        static string teamAlreadyCreated = "Извините, но командная дуэль уже создана.Присоединиться: /duel join red/blue";
        static string teamCreatedPermPref = "<color=yellow> Турнирную </color>";
        static string teamSucessCreated = "<color=#409ccd>{0}</color> создал{1}командную дуэль <color=#36978e>{2}</color> на <color=#36978e>{2}</color>!\nПодать заявку на участие в команде <color=red>RED</color>: /duel join red\nПодать заявку на участие в команде <color=blue>BLUE</color>: /duel join blue";
        static string teamCancelDuel = "Отменить дуэль: <color=orange>/duel c</color>";
        static string teamNotOwner = "Ты не создатель дуэли";
        static string teamNoSlotsBlue = "Свободных мест в команде blue нет";
        static string teamNoSlotsRed = "Свободных мест в команде red нет";
        static string teamJoinPermPref = "<color=yellow> Турнирная </color>";
        static string teamJoinRedPref = "<color=red>red</color>";
        static string teamJoinBluePref = "<color=blue>blue</color>";
        static string teamAboutToBegin = "[Дуэль] Начало через 5 секунд!";
        static string teamJoinAboutToBeginAnnounce = "[{0}Командная дуэль]\n<color=#7b9ef6>{1}</color> присоединился к команде {2}\nНабор окончен!\nДуэль скоро начнется";
        static string teamJoinAnnounce = "[{0}Командная дуэль]\n<color=#7b9ef6>{1}</color> присоединился к команде {2}\nСвободных мест:\n<color=red>red</color>: {3}\n<color=blue>blue</color>: {4}\nПодать заявку: <color=orange>/duel join red</color> или <color=orange>blue</color>";
        static string teamPlayerWont = "{0} не подавал заявку на дуэль";
        static string teamErrorNoCommand = "Ошибка.Выберите команду: /duel join red / blue";
        static string teamAlreadyRequest = "Вы уже подали заявку на командную дуэль.Ждите одобрения создателя";
        static string teamAlreadyStarted = "Ошибка.Дуэль уже началась!";
        static string teamNoPerm = "Извините, у вас нет доступа к турнирным дуэлям.\nПриобрести можно в магазине сервера.";
        static string teamSucessRequest = "Вы подали заявку.\nОжидайте, пока <color=#409ccd>{0}</color> одобрит её.\n<color=orange>/duel c</color> - отменить заявку.";
        static string teamNewRequest = "<color=#409ccd>{0}</color> подал заявку на вступление в дуэль[<color={1}>{1}</color>].\n<color=orange>/duel accept</color> <color=#409ccd>{0}</color> - принять\nСписок подавших заявку: <color=orange>/duel accept</color>";
        static string teamNoDuelsHowCreate = "Активных командных дуэлей нет./duel create - создать новую";
        static string teamGuiWeapons = "Оружие дуэлянтов: ";
        static string teamGuiNoWeapon = "не выбрал";
        static string teamGuiBluePlayerColor = "#76b9d6";
        static string teamGuiRedPlayerColor = "red";
        static string teamGuiWeaponColor = "#e0e1e3";
        static string teamGuiWaiting = "Ожидаем других игроков\n60 секунд максимум";
        static string teamDamageTeammate = "<color=#7b9ef6>{0}</color>: Эй! Я твой союзник!";
        static string teamDeath = "[Дуэль] <color=#7b9ef6>{0}</color> [<color={1}>{1}</color>] погиб!\n<color=blue>Team Blue</color>: {2} человек\n<color=red>Team Red</color>: {3} человек";
        static float teamDuelRequestSecToClose = 300;
        float cooldownTeamDuelCreate = 180f;
        float cooldownRequestSec = 60;
        static float requestSecToClose = 20;
        static float duelMaxSec = 300;
        static float chooseWeaponMaxSec = 25f;
        static float teamChooseWeaponMaxSec = 60f;
        int maxWinsTop = 5;
        int maxLoseTop = 5;
        static bool debug = true;
#endregion
#region Variables
        [PluginReference]
        Plugin Trade;
        static string duelJoinPermission = "duel.join";
        static string duelCreatePermission = "duel.create";
        private readonly int triggerLayer = LayerMask.GetMask("Trigger");
        bool isIni = false;
        static FieldInfo buildingPrivlidges;
        private MethodInfo newbuildingid = typeof(BuildingBlock).GetMethod("NewBuildingID", BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static);
        static List<ActiveDuel> createdDuels = new List<ActiveDuel>();
        static List<TeamDuel> createdTeamDuels = new List<TeamDuel>();
        static List<ulong?> toRemoveCorpse = new List<ulong?>();
        Dictionary<ulong, float> lastRequestTime = new Dictionary<ulong, float>();
        Dictionary<ulong, float> lastTeamDuelCreateTime = new Dictionary<ulong, float>();
        static Dictionary<string, ulong> Wears = new Dictionary<string, ulong>  //item shortname : skinid
        {
            {
                "metal.facemask", 0
            }
            ,  //shirt
            {
                "metal.plate.torso", 0
            }
            ,  // Hat
            {
                "shoes.boots", 0
            }
            ,  // Pants
            {
                "hoodie", 0
            }
            ,  // Boots
            {
                "pants", 0
            }
            ,  // tolsovka
            {
                "roadsign.kilt", 0
            }
            // dorognie znaki
        }
        ;
        static Dictionary<string, ulong> WearsBlue = new Dictionary<string, ulong>  //item id : skinid
        {
            {
                "metal.facemask", 0
            }
            ,  //hoodie
            {
                "metal.plate.torso", 0
            }
            ,  // Hat
            {
                "shoes.boots", 0
            }
            ,  // Pants
            {
                "hoodie", 0
            }
            ,  // Boots
            {
                "pants", 14178
            }
            ,  // tolsovka
            {
                "roadsign.kilt", 0
            }
            // dorognie znaki
        }
        ;
        static Dictionary<string, ulong> WearsRed = new Dictionary<string, ulong>  //item id : skinid
        {
            {
                "metal.facemask", 0
            }
            ,  //hoodie
            {
                "metal.plate.torso", 0
            }
            ,  // Hat
            {
                "shoes.boots", 0
            }
            ,  // Pants
            {
                "hoodie", 0
            }
            ,  // Boots
            {
                "pants", 0
            }
            ,  // tolsovka
            {
                "roadsign.kilt", 0
            }
            // dorognie znaki
        }
        ;
        private List<BaseEntity> ArenaEntities = new List<BaseEntity>();
#endregion
#region Helperss
        [PluginReference]
        Plugin NoEscape;
        bool IsRaidBlock(BasePlayer player) {
            if (plugins.Exists("NoEscape")) {
                var time = (double)NoEscape.Call("ApiGetTime", player.userID);
                if (time > 0) {
                    SendReply(player, "У Вас рейдблок, Duel запрещена");
                    return true;
                }
            }
            return false;
        }
#endregion
#region ChatCommand
        [ChatCommand("duel")]
        void chatduel(BasePlayer player, string command, string[] arg) {
            if (!isIni) {
                SendReply(player, "<color=#FE5256>Duel не инициирована.Ожидайте........</color>");
                return;
            }
            if (arg.Length == 0) {
                SendReply(player, duelCommand);
                return;
            }
            //if (IsRaidBlock(player)) return;
            if (player.metabolism.radiation_poison.value > 5) {
                SendReply(player, "У Вас облучение радиацией.Duel запрещена");
                return;
            }
            string aim = (string)arg[0];
            if (aim == "join") {
                if (!canAcceptRequest(player)) return;
                if (IsDuelPlayer(player)) {
                    player.ChatMessage("Вы уже дуэлянт");
                    return;
                }
                if (arg.Length == 2) {
                    string team = (string)arg[1];
                    if (team != null) JoinTeamDuel(player, team);
                    return;
                }
                else {
                    if (createdTeamDuels.Count > 0) {
                        var teamDuel = createdTeamDuels[0];
                        player.ChatMessage($"Ошибка.Укажите команду, к которой хотите присоединиться\nВ команде red: {teamDuel.playersAmount - teamDuel.teamred.Count} свобоных мест\nВ команде blue: {teamDuel.playersAmount - teamDuel.teamblue.Count} свобоных мест");
                        return;
                    }
                    else {
                        player.ChatMessage("Ошибка.Пишите:\n/duel join red - присоединиться к команде red\n/duel join blue - присоединиться к команде blue");
                        return;
                    }
                }
            }
            if (aim == "accept") {
                if (arg.Length == 2) {
                    string requester = (string)arg[1];
                    var target = FindPlayersSingle(requester, player);
                    if (target != null) AcceptRequestTeamDuel(player, target);
                    return;
                }
                else {
                    if (createdTeamDuels.Count > 0) {
                        string msg = "";
                        var teamDuel = createdTeamDuels[0];
                        if (teamDuel.owner != player) {
                            player.ChatMessage("Ты не создатель дуэли");
                            return;
                        }
                        if (teamDuel.requestPlayers.Count > 0) {
                            foreach (var pl in teamDuel.requestPlayers) {
                                msg += $"<color=#409ccd>{pl.Key.displayName}</color>, ";
                            }
                            player.ChatMessage($"Игроки, подавшие заявку: {msg}\nПринять: <color=orange>/duel accept</color> <color=#409ccd>name</color>");
                            return;
                        }
                        else {
                            player.ChatMessage("Список с заявками пуст.");
                            return;
                        }
                    }
                    else {
                        player.ChatMessage("Командная дуэль не создана");
                        return;
                    }
                }
            }
            if (aim == "create") {
                if (!CanCreateDuel(player, true)) return;
                if (arg.Length >= 2) {
                    string amount = (string)arg[1];
                    int intamount = 0;
                    if (Int32.TryParse(amount, out intamount)) {
                        if (intamount > 1 && intamount <= 6) {
                            if (arg.Length == 3) {
                                string perm = (string)arg[2];
                                if (perm == "perm") {
                                    if (!HavePerm(duelCreatePermission, player.userID)) return;
                                    createTeamDuel(player, intamount, true);
                                    return;
                                }
                            }
                            createTeamDuel(player, intamount);
                            return;
                        }
                        else {
                            player.ChatMessage("Ошибка.Количество игроков в команде должно быть от 2 до 6");
                            return;
                        }
                    }
                    return;
                }
                else {
                    player.ChatMessage("Ошибка.Укажите количество участников (от 2 до 6) в каждой команде\n/duel create [2-6]");
                    return;
                }
            }
            if (aim == "top") {
                showTop(player);
                return;
            }
            if (aim == "stat") {
                showStat(player);
                return;
            }
            if (aim == "c") {
                CancelRequest(player);
                return;
            }
            if (aim == "a") {
                if (createdTeamDuels.Count > 0) {
                    var teamDuel = createdTeamDuels[0];
                    if (teamDuel.requestPlayers.ContainsKey(player)) {
                        player.ChatMessage("Ты подал заявку на командную дуэль.\nНачать новую ты не можешь");
                        return;
                    }
                }
                if (!canAcceptRequest(player)) return;
                if (!IsDuelPlayer(player)) {
                    SendReply(player, dontHaveRequest);
                    return;
                }
                if (IsPlayerOnActiveDuel(player)) {
                    player.ChatMessage("Вы уже находитесь на дуэли.");
                    return;
                }
                AcceptRequest(player);
                return;
            }
            var victim = FindPlayersSingle(aim, player);
            if (victim != null) {
                if (createdTeamDuels.Count > 0) {
                    var teamDuel = createdTeamDuels[0];
                    if (teamDuel.requestPlayers.ContainsKey(player)) {
                        player.ChatMessage("Ты подал заявку на командную дуэль.\nНачать новую ты не можешь");
                        return;
                    }
                }
                if (createdTeamDuels.Count > 0) {
                    var teamDuel = createdTeamDuels[0];
                    if (teamDuel.requestPlayers.ContainsKey(victim)) {
                        player.ChatMessage("Невозможно вызвать этого игрока");
                        return;
                    }
                }
                if (createdTeamDuels.Count > 0) {
                    var teamDuel = createdTeamDuels[0];
                    if (teamDuel.owner == victim) {
                        player.ChatMessage("Невозможно вызвать этого игрока");
                        return;
                    }
                }
                if (victim == player) {
                    player.ChatMessage("Вы не можете вызвать самого себя на дуэль");
                    return;
                }
                if (!CanCreateDuel(player)) return;
                string reason = CanDuel(victim);
                if (reason != null) {
                    SendReply(player, reason);
                    return;
                }
                CreateRequest(player, victim);
                return;
            }
        }
#endregion
#region Checks
        bool IsArenaZone(Vector3 pos) {
            foreach (var arena in arenaList) {
                if (Vector3.Distance(pos, arena.pos) < 100) return true;
            }
            return false;
        }
        void RemoveGarbage(BaseEntity entity) {
            if (entity == null) return;
            if (entity?.net?.ID == null) return;
            if (!isIni) return;
            if (entity is CargoPlane || entity is SupplyDrop || entity is CH47Helicopter || entity is BaseHelicopter) return;
            if (entity.transform.position.y > 900f) {
                var cont = entity as DroppedItemContainer;
                if (cont != null) {
                    if (IsArenaZone(cont.transform.position)) {
                        cont.ResetRemovalTime(0.1f);
                    }
                }
                var corpse = entity as BaseCorpse;
                if (corpse != null) {
                    if (toRemoveCorpse.Count == 0) return;
                    if (corpse) {
                        if ((corpse is PlayerCorpse) && corpse?.parentEnt?.ToPlayer()) {
                            if (corpse?.parentEnt?.ToPlayer() != null) {
                                if (toRemoveCorpse.Contains(corpse?.parentEnt?.ToPlayer().userID)) {
                                    corpse.ResetRemovalTime(0.1f);
                                    toRemoveCorpse.Remove(corpse?.parentEnt?.ToPlayer().userID);
                                    return;
                                }
                            }
                        }
                    }
                }
                if (entity is PlayerCorpse || entity.name.Contains("item_drop_backpack")) {
                    if (entity.transform.position.y > 900f) {
                        NextTick(() => {
                            if (entity != null && !entity.IsDestroyed) {
                                entity.Kill();
                            }
                        }
                        );
                    }
                }
                if (entity is WorldItem) {
                    if ((entity as WorldItem).item.GetOwnerPlayer() == null) return;
                    var activeDuel = PlayersActiveDuel((entity as WorldItem).item.GetOwnerPlayer().userID);
                    if (activeDuel != null) {
                        activeDuel.dropedWeapons.Add((entity as WorldItem).item);
                        return;
                    }
                    if (NeedToRemoveFromTeamDuel((entity as WorldItem).item.GetOwnerPlayer().userID)) {
                        createdTeamDuels[0].droppedWeapons.Add((entity as WorldItem).item);
                    }
                }
            }
        }
        bool NeedToRemoveFromTeamDuel(ulong? userid) {
            if (createdTeamDuels.Count > 0) {
                if (createdTeamDuels[0].allPlayers.Find(x => x.player.userID == userid)) return true;
            }
            return false;
        }
        ActiveDuel PlayersActiveDuel(ulong? userid) {
            if (createdDuels.Count == 0) return null;
            foreach (var duel in createdDuels) {
                if (duel.player1.player.userID == userid && duel.player1.haveweapon) {
                    return duel;
                }
                if (duel.player2.player.userID == userid && duel.player2.haveweapon) {
                    return duel;
                }
            }
            return null;
        }
        bool NeedToRemoveGarbage(ulong? userid) {
            int createdDuelsN = createdDuels.Count;
            if (createdDuelsN == 0) return false;
            if (createdDuels.Find(x => x.player1.player.userID == userid || x.player2.player.userID == userid)) return true;
            return false;
        }
        bool IsDuelPlayer(BasePlayer player) {
            DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
            if (dueller == null) return false;
            return true;
        }
        bool IsPlayerOnActiveDuel(BasePlayer player) {
            DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
            if (dueller == null) return false;
            if (!dueller.canDoSomeThings) return true;
            return false;
        }
        string CanDuel(BasePlayer player) {
            if (IsDuelPlayer(player)) {
                return String.Format(alreadyHaveDuel, player.displayName);
            }
            if (busyArena.Count == arenaList.Count) {
                return noArenas;
            }
            return null;
        }
        bool canAcceptRequest(BasePlayer player) {
            if (player.IsDead()) {
                return false;
            }
            if (player.IsWounded()) {
                SendReply(player, notAllowed);
                return false;
            }
            if (busyArena.Count == arenaList.Count) {
                SendReply(player, noArenas);
                return false;
            }
            return true;
        }
        bool CanCreateDuel(BasePlayer player, bool isTeamDuel = false) {
            float value = 0;
            if (lastRequestTime.TryGetValue(player.userID, out value) && !isTeamDuel) {
                if (UnityEngine.Time.realtimeSinceStartup - value < cooldownRequestSec) {
                    float when = cooldownRequestSec - (UnityEngine.Time.realtimeSinceStartup - value);
                    player.ChatMessage(String.Format(cooldownMessage, (int)when));
                    return false;
                }
            }
            if (player.IsWounded()) {
                SendReply(player, notAllowed);
                return false;
            }
            if (IsDuelPlayer(player)) {
                SendReply(player, youOnDuel);
                return false;
            }
            if (busyArena.Count == arenaList.Count) {
                SendReply(player, noArenas);
                return false;
            }
            if (!isTeamDuel) lastRequestTime[player.userID] = UnityEngine.Time.realtimeSinceStartup;
            return true;
        }
#endregion
#region DuelFunctions
        void CreateRequest(BasePlayer starter, BasePlayer opponent) {
            SendReply(starter, String.Format(createRequest, opponent.displayName));
            SendReply(opponent, String.Format(receiveRequest, starter.displayName));
            DuelPlayer dueller1 = starter.GetComponent<DuelPlayer>() ?? starter.gameObject.AddComponent<DuelPlayer>();
            DuelPlayer dueller2 = opponent.GetComponent<DuelPlayer>() ?? opponent.gameObject.AddComponent<DuelPlayer>();
            ActiveDuel activeDuel = starter.gameObject.AddComponent<ActiveDuel>();
            activeDuel.player1 = dueller1;
            activeDuel.player2 = dueller2;
            createdDuels.Add(activeDuel);
        }
        void AcceptRequest(BasePlayer player) {
            Arena arena = null;
            foreach (var duel in createdDuels) {
                if (duel.player2.player == player) {
                    if (!canAcceptRequest(player) || !canAcceptRequest(duel.player1.player)) {
                        CancelRequest(player);
                        return;
                    }
                    duel.arena = FreeArena();
                    arena = duel.arena;
                    duel.isRequest = false;
                    duel.timeWhenTp = UnityEngine.Time.realtimeSinceStartup;
                    duel.player1.spawnPos = arena.player1pos;
                    duel.player2.spawnPos = arena.player2pos;
                    Debug($"Началась Дуэль {duel.player1.player.displayName} : {duel.player2.player.displayName} {arena.name} Активных: {busyArena.Count}");
                    toRemoveCorpse.Add(duel.player1.player.userID);
                    toRemoveCorpse.Add(duel.player2.player.userID);
                    duel.player1.PrepairToDuel();
                    duel.player2.PrepairToDuel();
                    Trade?.CallHook("RemovePending", duel.player1.player);
                    Trade?.CallHook("RemovePending", duel.player2.player);
                    break;
                }
            }
        }
        public void CancelRequest(BasePlayer player) {
            if (createdTeamDuels.Count > 0) {
                var duel = createdTeamDuels[0];
                if (duel.owner == player && !duel.isStarted && !duel.allHere) {
                    if (duel.teamblue.Count > 0) foreach (var dueller in duel.teamblue) {
                        dueller.Destroy();
                    }
                    if (duel.teamred.Count > 0) foreach (var dueller in duel.teamred) {
                        dueller.Destroy();
                    }
                    PrintToChat("Командная дуэль отменена создателем");
                    duel.Destroy();
                    return;
                }
                if (duel.requestPlayers.ContainsKey(player)) {
                    duel.requestPlayers.Remove(player);
                    player.ChatMessage("Вы покинули командную дуэль");
                    duel.owner.ChatMessage($"{player.displayName} отменил заявку на дуэль");
                    return;
                }
                var redplayer = duel.teamred.Find(x => x.player == player);
                if (redplayer != null) {
                    if (!redplayer.haveweapon && !duel.isStarted && !duel.allHere) {
                        duel.teamred.Remove(redplayer);
                        redplayer.Destroy();
                        duel.owner.ChatMessage($"{player.displayName} покинул командную дуэль");
                        player.ChatMessage("Вы покинули командную дуэль");
                        return;
                    }
                    else {
                        player.ChatMessage("Вы не можете покинуть начавшуюся дуэль");
                        return;
                    }
                }
                var blueplayer = duel.teamblue.Find(x => x.player == player);
                if (blueplayer != null) {
                    if (!blueplayer.haveweapon && !duel.isStarted && !duel.allHere) {
                        duel.teamblue.Remove(blueplayer);
                        blueplayer.Destroy();
                        duel.owner.ChatMessage($"{player.displayName} покинул командную дуэль");
                        player.ChatMessage("Вы покинули командную дуэль");
                        return;
                    }
                    else {
                        player.ChatMessage("Вы не можете покинуть начавшуюся дуэль");
                        return;
                    }
                }
            }
            if (FindOpponent(player) != null) {
                var duel = FindDuelByPlayer(player);
                if (duel != null) {
                    if (duel.isRequest) {
                        duel.RequestRemove();
                        return;
                    }
                    else {
                        player.ChatMessage(cantCancelDuel);
                        return;
                    }
                }
            }
            player.ChatMessage("Вы не участник дуэли");
        }
        static ActiveDuel FindDuelByPlayer(BasePlayer player) {
            foreach (var duel in createdDuels) {
                if (duel.player1.player == player) {
                    return duel;
                }
                if (duel.player2.player == player) {
                    return duel;
                }
            }
            return null;
        }
        public void EndDuel(BasePlayer player, int reason, string UserId, string UserIdLoss) {
            DuelPlayer dueller = player?.GetComponent<DuelPlayer>();
            if (dueller != null) {
                if (dueller.team != "") {
                    if (reason == 6) {
                        if (dueller.savedHome) {
                            dueller.ReturnPlayer(reason);
                        }
                        else {
                            dueller.Destroy();
                        }
                        return;
                    }
                    if (reason == 0 || reason == 4) {
                        dueller.ReturnPlayer(reason);
                    }
                    return;
                }
            }
            if (createdTeamDuels.Count > 0 && reason == 4) {
                if (createdTeamDuels[0].owner == player) {
                    createdTeamDuels[0].RequestRemove();
                    return;
                }
                if (createdTeamDuels[0].requestPlayers.ContainsKey(player)) {
                    createdTeamDuels[0].requestPlayers.Remove(player);
                    createdTeamDuels[0].owner.ChatMessage($"[Дуэль] {player.displayName} вышел с сервера!");
                    return;
                }
            }
            if (createdDuels.Count == 0) return;
            DuelPlayer player1 = null;
            DuelPlayer player2 = null;
            foreach (var duel in createdDuels) {
                if (duel.player1.player == player) {
                    player1 = duel.player1;
                    player2 = duel.player2;
                    break;
                }
                if (duel.player2.player == player) {
                    player1 = duel.player1;
                    player2 = duel.player2;
                    break;
                }
            }
            if (reason == 0) {
                if (player1 != null) if (player1.player == player) {
                    player1.guiEnabled = false;
                    player1.canMove = true;
                    player1.ReturnPlayer(0);
                    return;
                }
                if (player2 != null) if (player2.player == player) {
                    player2.guiEnabled = false;
                    player2.canMove = true;
                    player2.ReturnPlayer(0);
                    return;
                }
            }
            if (reason == 7) {
                if (player1 != null) if (player1.player == player) {
                    player2.guiEnabled = false;
                    player2.canMove = true;
                    if (player2.induel) player2.ReturnWithCooldown();
                    player2.induel = false;
                    return;
                }
                if (player2 != null) if (player2.player == player) {
                    player1.guiEnabled = false;
                    player1.canMove = true;
                    if (player1.induel) player1.ReturnWithCooldown();
                    player1.induel = false;
                    return;
                }
            }
            if (player1 != null) {
                player1.guiEnabled = false;
                player1.canMove = true;
                player1.ReturnPlayer(reason);
            }
            if (player2 != null) {
                player2.guiEnabled = false;
                player2.canMove = true;
                player2.ReturnPlayer(reason);
            }
        }
#endregion
#region TeamDuel
#region Class TeamDuel
        class TeamDuel : MonoBehaviour {
            public List<DuelPlayer> teamblue = new List<DuelPlayer>();
            public List<DuelPlayer> teamred = new List<DuelPlayer>();
            public List<DuelPlayer> allPlayers = new List<DuelPlayer>();
            public List<BasePlayer> statTeamBlue = new List<BasePlayer>();
            public List<BasePlayer> statTeamRed = new List<BasePlayer>();
            public Dictionary<BasePlayer, string> requestPlayers = new Dictionary<BasePlayer, string>();
            public BasePlayer owner;
            public Arena arena = null;
            public bool isRequest = true;
            public bool isStarted = false;
            public bool needCheckStart;
            public bool isActive = true;
            public bool allHere;
            public bool allReady;
            public bool isPermDuel = false;
            public bool randomWeaponsHasGiven = false;
            public float guiTime;
            public int playersAmount = -1;
            public float startTime;
            public float requestTime;
            public float lastTimeMessage = 0f;
            public List<Item> droppedWeapons = new List<Item>();
            void Awake() {
                requestTime = UnityEngine.Time.realtimeSinceStartup;
                allHere = false;
                allReady = false;
            }
            public void CheckOnline() {
                int redCount = teamred.Count;
                int blueCount = teamblue.Count;
                List<string> offPlayers = new List<string>();
                if (redCount > 0) {
                    for (int i = 0; i < redCount; i++) {
                        if (teamred[i] == null) {
                            offPlayers.Add(teamred[i].player.displayName);
                            allPlayers.Remove(teamred[i]);
                            teamred.Remove(teamred[i]);
                            break;
                        }
                    }
                }
                if (blueCount > 0) {
                    for (int i = 0; i < blueCount; i++) {
                        if (teamblue[i] == null) {
                            offPlayers.Add(teamblue[i].player.displayName);
                            allPlayers.Remove(teamblue[i]);
                            teamblue.Remove(teamblue[i]);
                            break;
                        }
                    }
                }
                redCount = teamred.Count;
                blueCount = teamblue.Count;
                int offPlayersCount = offPlayers.Count;
                if (offPlayersCount > 0) {
                    if (blueCount > 0) {
                        for (int i = 0; i < blueCount; i++) {
                            for (int j = 0; j < offPlayersCount; j++) teamblue[i].player.ChatMessage(String.Format(teamPlayerDisconnect, offPlayers[j]));
                        }
                    }
                    if (redCount > 0) {
                        for (int i = 0; i < redCount; i++) {
                            for (int j = 0; j < offPlayersCount; j++) teamred[i].player.ChatMessage(String.Format(teamPlayerDisconnect, offPlayers[j]));
                        }
                    }
                }
            }
            void Update() {
                if (isActive) {
                    CheckOnline();
                }
                if (!isStarted && !allHere && teamblue.Count > 0 && teamred.Count > 0) {
                    if ((teamblue.Count + teamred.Count) == (playersAmount * 2)) {
                        allHere = true;
                        int teamPlayersN = teamblue.Count;
                        for (int i = 0; i < teamPlayersN; i++) {
                            var tmb = teamblue[i];
                            var tmr = teamred[i];
                            statTeamBlue.Add(tmb.player);
                            statTeamRed.Add(tmr.player);
                            allPlayers.Add(tmb);
                            allPlayers.Add(tmr);
                        }
                        Invoke("CheckDuellers", 5f);
                        needCheckStart = true;
                    }
                }
                if (needCheckStart) {
                    if (isStarted && isActive) {
                        if (teamblue.Count == 0) {
                            isStarted = false;
                            isActive = false;
                            ConsoleNetwork.BroadcastToAllClients("chat.add", 0, teamWinRed);
                            int statPlayersN = statTeamRed.Count;
                            for (int i = 0; i < statPlayersN; i++) {
                                db.playerStat[statTeamRed[i].userID].teamwins++;
                                db.playerStat[statTeamBlue[i].userID].teamloss++;
                            }
                            Invoke("EndTeamDuelWithWinners", 5f);
                            return;
                        }
                        if (teamred.Count == 0) {
                            isStarted = false;
                            isActive = false;
                            ConsoleNetwork.BroadcastToAllClients("chat.add", 0, teamWinBlue);
                            int statPlayersN = statTeamRed.Count;
                            for (int i = 0; i < statPlayersN; i++) {
                                db.playerStat[statTeamBlue[i].userID].teamwins++;
                                db.playerStat[statTeamRed[i].userID].teamloss++;
                            }
                            Invoke("EndTeamDuelWithWinners", 5f);
                            return;
                        }
                        if (UnityEngine.Time.realtimeSinceStartup - startTime > duelMaxSec) {
                            EndTeamDuel(3);
                            isActive = false;
                        }
                    }
                    if (allReady && !isStarted) {
                        bool go = true;
                        int allPlayersCount = allPlayers.Count;
                        for (int i = 0; i < allPlayersCount; i++) {
                            if (!allPlayers[i].haveweapon) go = false;
                        }
                        if (UnityEngine.Time.realtimeSinceStartup - guiTime > teamChooseWeaponMaxSec && !randomWeaponsHasGiven) {
                            for (int i = 0; i < allPlayersCount; i++) {
                                if (!allPlayers[i].haveweapon) GiveRandomWeapon(allPlayers[i].player);
                            }
                            randomWeaponsHasGiven = true;
                            go = true;
                        }
                        if (go) {
                            startTime = UnityEngine.Time.realtimeSinceStartup;
                            isStarted = true;
                            allReady = false;
                            Invoke("StartTeamDuel", 5f);
                        }
                    }
                }
                if (isRequest && isActive) {
                    if (UnityEngine.Time.realtimeSinceStartup - requestTime > teamDuelRequestSecToClose) {
                        RequestRemove();
                        isActive = false;
                    }
                }
            }
            public void CheckDuellers() {
                if (allReady) return;
                bool isWound = false;
                int allPlayersCount = allPlayers.Count;
                for (int i = 0; i < allPlayersCount; i++) {
                    if (allPlayers[i].player.IsWounded()) {
                        isWound = true;
                    }
                }
                if (isWound) {
                    if (lastTimeMessage != 0f && UnityEngine.Time.realtimeSinceStartup - lastTimeMessage > 10f) {
                        for (int i = 0; i < allPlayersCount; i++) {
                            allPlayers[i].player.ChatMessage(teamDuellerWounded);
                        }
                        lastTimeMessage = UnityEngine.Time.realtimeSinceStartup;
                        Invoke("CheckDuellers", 0.5f);
                        return;
                    }
                }
                arena = FindFreeTeamDuelArena(playersAmount);
                if (arena == null) {
                    if (lastTimeMessage != 0f && UnityEngine.Time.realtimeSinceStartup - lastTimeMessage > 10f) {
                        for (int i = 0; i < allPlayersCount; i++) {
                            allPlayers[i].player.ChatMessage(teamArensBusy);
                        }
                    }
                    lastTimeMessage = UnityEngine.Time.realtimeSinceStartup;
                    Invoke("CheckDuellers", 0.5f);
                    return;
                }
                SetSpawns();
                guiTime = UnityEngine.Time.realtimeSinceStartup;
                allReady = true;
                PrepareDuellers();
            }
            public void PrepareDuellers() {
                isRequest = false;
                int allPlayersN = allPlayers.Count;
                for (int i = 0; i < allPlayersN; i++) {
                    allPlayers[i].PrepairToDuel();
                }
            }
            public void StartTeamDuel() {
                int allPlayersN = allPlayers.Count;
                for (int i = 0; i < allPlayersN; i++) {
                    var dueller = allPlayers[i];
                    toRemoveCorpse.Add(dueller.player.userID);
                    dueller.guiEnabled = false;
                    CuiHelper.DestroyUi(dueller.player, "weaponsgui");
                    CuiHelper.DestroyUi(dueller.player, "weaponsguiteamweapons");
                    CuiHelper.DestroyUi(dueller.player, "mouse");
                    dueller.readyForBattle = true;
                    dueller.canMove = true;
                }
            }
            public void RequestRemove() {
                if (teamblue.Count > 0) {
                    foreach (DuelPlayer teamblueplayer in teamblue) {
                        teamblueplayer.player.ChatMessage(String.Format(teamDuelCancelled, teamDuelRequestSecToClose));
                        teamblueplayer.Destroy();
                    }
                }
                if (teamred.Count > 0) {
                    foreach (DuelPlayer teamredplayer in teamred) {
                        teamredplayer.player.ChatMessage(String.Format(teamDuelCancelled, teamDuelRequestSecToClose));
                        teamredplayer.Destroy();
                    }
                }
                Destroy();
            }
            public void EndTeamDuelWithWinners() {
                Debug($"Team Дуэль {playersAmount} * {playersAmount} от {owner.displayName} Окончена {arena.name}");
                int allPlayersN = allPlayers.Count;
                if (allPlayersN > 0) {
                    for (int i = 0; i < allPlayersN; i++) {
                        allPlayers[i].ReturnPlayer(0);
                    }
                }
                Invoke("Destroy", 2f);
            }
            public void EndTeamDuel(int reason = 0) {
                Debug($"Team Дуэль {playersAmount} * {playersAmount} от {owner.displayName} Прервана {arena.name}");
                int allPlayersN = allPlayers.Count;
                if (allPlayersN > 0) {
                    for (int i = 0; i < allPlayersN; i++) {
                        var dueller = allPlayers[i];
                        dueller.guiEnabled = false;
                        CuiHelper.DestroyUi(dueller.player, "weaponsgui");
                        
// ... [Code preview truncated due to length. Full source in attached file] ...

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

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

Сверху