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

FREE Scrim : 1.1.2 1.1.2

Нет прав для скачивания
C#:
// Все права принадлежат дискорд сообществу https://discord.gg/VgNHPpNrz6
 // Requires: GameModeManager
using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Oxide.Core;
using Oxide.Core.Configuration;
using Oxide.Core.Plugins;
using Oxide.Game.Rust.Cui;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Text;
using UnityEngine;
///Скачано с дискорд сервера Rust Edit [PRO+]
///discord.gg/9vyTXsJyKR
namespace Oxide.Plugins {
    [Info("Scrim", "discord.gg/9vyTXsJyKR", "1.1.2")]
    [Description("An event that organizes players into teams to eliminate each other and secures victory.")]
    public class Scrim : RustPlugin, GameModeManager.IAdvancedLobby {
        private static GameModeManager _arena;
        private static Scrim _instance;
        private Configuration _config;
        private DynamicConfigFile _dataManager;
        private PluginData _pluginData;
        private TeamDeathmatchArenaData _arenaToEdit;
        public Dictionary<ulong, TeamDeathmatchPlayer> Players {
            get;
            set;
        }
        = new Dictionary<ulong, TeamDeathmatchPlayer>();
        private Dictionary<int, TeamDeathmatchArena> _arenas = new Dictionary<int, TeamDeathmatchArena>();
#region Classes
#region Config
        public class Configuration {
            [JsonProperty(PropertyName = "Chat command for showing the pause menu")]
            public string ShowPauseMenuCommand {
                get;
                set;
            }
            = "menu";
            [JsonProperty(PropertyName = "Chat command to set player ready")]
            public string ToggleReadyCommand {
                get;
                set;
            }
            = "ready";
            [JsonProperty(PropertyName = "Countdown Sound Effect")]
            public string CountdownSoundEffect {
                get;
                set;
            }
            = "assets/prefabs/locks/keypad/effects/lock.code.unlock.prefab";
        }
#endregion Config
#region Data
        public class PluginData {
            [JsonProperty(PropertyName = "Scrim")]
            public List<TeamDeathmatchArenaData> Arenas {
                get;
                set;
            }
            = new List<TeamDeathmatchArenaData>();
        }
        public class TeamDeathmatchArenaData : GameModeManager.ArenaData {
            [JsonProperty(PropertyName = "Match - Start Countdown", Order = 8)]
            public int MatchStartCountDown {
                get;
                set;
            }
            = 3;
            [JsonProperty(PropertyName = "Text - Display Name - Blue Team", Order = 19)]
            public string BlueTeamDisplayName {
                get;
                set;
            }
            = "<color=#33689A>Blue</color>";
            [JsonProperty(PropertyName = "Text - Display name - Red Team", Order = 20)]
            public string RedTeamDisplayName {
                get;
                set;
            }
            = "<color=#DD4B39>Red</color>";
            [JsonProperty(PropertyName = "Entrance Point - Display Text - Active Match", Order = 16)]
            public string StartedMatchEntranceDisplayText {
                get;
                set;
            }
            = "$.Name";
            [JsonProperty(PropertyName = "Entrance Point - Display Text - Inactive Match", Order = 17)]
            public string NoMatchEntranceDisplayText {
                get;
                set;
            }
            = "$.Name";
            [JsonProperty(PropertyName = "Loadout - Spectator", Order = 21)]
            public string SpectatorLoadoutName {
                get;
                set;
            }
            = "Spectator";
            [JsonProperty(PropertyName = "Loadout - Default - Blue Team", Order = 22)]
            public string BlueTeamDefaultLoadoutName {
                get;
                set;
            }
            = "AK";
            [JsonProperty(PropertyName = "Loadout - Default - Red Team", Order = 23)]
            public string RedTeamDefaultLoadoutName {
                get;
                set;
            }
            = "AK";
            [JsonProperty(PropertyName = "Match - Wounded Timeout", Order = 9)]
            public float WoundedTimeout {
                get;
                set;
            }
            = 0;
            [JsonProperty(PropertyName = "Match - Rounds Count - Default", Order = 10)]
            public int DefaultRoundCount {
                get;
                set;
            }
            = 3;
            [JsonProperty(PropertyName = "Match - Rounds Count", Order = 11)]
            public int[] RoundsCounts {
                get;
                set;
            }
            = {
                3, 6, 9
            }
            ;
            //TODO: Get From Commands
            [JsonProperty(PropertyName = "Loadout List", Order = 24)]
            public List<string> LoadoutNames {
                get;
                set;
            }
            = new List<string>();
            [JsonProperty(PropertyName = "Attachments List", Order = 25)]
            public List<ItemName> ItemsNames {
                get;
                set;
            }
            = new List<ItemName>();
            [JsonProperty(PropertyName = "Spawn Points", Order = 26)]
            public HashSet<ArenaSpawnData> SpawnLocations {
                get;
                set;
            }
            = new HashSet<ArenaSpawnData>();
        }
        public class ArenaSpawnData : GameModeManager.BaseSpawnData {
            [JsonProperty(PropertyName = "Spawn - Type", Order = 1)]
            public Team SpawnType {
                get;
                set;
            }
            [JsonProperty(PropertyName = "Spawn - Safe Area Radius", Order = 2)]
            public float SafeAreaRadius {
                get;
                set;
            }
            public override bool Equals(object obj) {
                var match = obj as ArenaSpawnData;
                if (match == null) {
                    return false;
                }
                return match.Name.Equals(Name, StringComparison.OrdinalIgnoreCase);
            }
            public override int GetHashCode() {
                return Name.ToLower().GetHashCode();
            }
        }
        public class ItemName {
            [JsonProperty(PropertyName = "Item Short Name")]
            public string ItemShortName {
                get;
                set;
            }
            [JsonProperty(PropertyName = "Item Display Name")]
            public string ItemDisplayName {
                get;
                set;
            }
        }
#endregion Data
#region Behaviours
        public class SpawnZoneBehaviour : MonoBehaviour {
            private HashSet<BasePlayer> Players {
                get;
                set;
            }
            = new HashSet<BasePlayer>();
            public TeamDeathmatchMatch Match {
                get;
                set;
            }
            public ArenaSpawnData SpawnData {
                get;
                set;
            }
            public static SpawnZoneBehaviour CreateSafeZone(string name, Vector3 safeZoneLocation) {
                var sphereObject = new GameObject(name);
                sphereObject.transform.position = safeZoneLocation;
                return sphereObject.AddComponent<SpawnZoneBehaviour>();
            }
            void Update() {
                if (Match == null || SpawnData == null || SpawnData.SafeAreaRadius <= 0) {
                    return;
                }
                if (Match.IsStarted && SpawnData.SpawnType != Team.Spectator) {
                    return;
                }
                foreach (var basePlayer in Players) {
                    if (basePlayer == null || !_instance.Players.ContainsKey(basePlayer.userID)) {
                        continue;
                    }
                    if (_instance.permission.UserHasPermission(basePlayer.UserIDString, GameModeManager.PermissionIgnore)) continue;
                    if (_arena.TeleportingPlayers.Contains(basePlayer.userID)) continue;
                    var offset = basePlayer.ServerPosition - SpawnData.SpawnPoint;
                    var sqrLen = offset.sqrMagnitude;
                    // square the distance we compare with
                    if (sqrLen > SpawnData.SafeAreaRadius * SpawnData.SafeAreaRadius) {
                        _arena.Teleport(basePlayer, SpawnData.SpawnPoint, false, false);
                    }
                }
            }
            public void Initialize(ArenaSpawnData spawnData, TeamDeathmatchMatch match) {
                SpawnData = spawnData;
                Match = match;
            }
            public void AddPlayer(BasePlayer player) {
                Players.Add(player);
            }
            public void RemovePlayer(BasePlayer player) {
                Players.Remove(player);
            }
            public void ClearPlayers() {
                Players.Clear();
            }
            public void DoDestroy() {
                Destroy(this);
            }
        }
#endregion Behaviours
        public class TeamDeathmatchArena : GameModeManager.Arena {
            public TeamDeathmatchArena(GameModeManager.Lobby lobby, TeamDeathmatchArenaData arenaData) : base(lobby, arenaData) {
                Data = arenaData;
                Match = new TeamDeathmatchMatch(this);
            }
            public new TeamDeathmatchMatch Match {
                get;
                set;
            }
            public new TeamDeathmatchArenaData Data {
                get;
                set;
            }
            public override string GetEntranceText() {
                var text = Match.IsStarted ? Data.StartedMatchEntranceDisplayText : Data.NoMatchEntranceDisplayText;
                var formattedText = text.Replace("$.Name", base.Data.Name).Replace("$.Capacity", base.Data.Capacity.ToString()).Replace("$.MatchType", base.Data.MatchType.ToString()).Replace("$.BlueCount", Match.Players.Count(x => x.AllowPlaying && x.Team == Team.Blue).ToString()).Replace("$.RedCount", Match.Players.Count(x => x.AllowPlaying && x.Team == Team.Red).ToString()).Replace("$.Blue", Data.BlueTeamDisplayName).Replace("$.Red", Data.RedTeamDisplayName).Replace("$.SpectatorCount", Match.Players.Count(x => !x.AllowPlaying || x.Team == Team.Spectator).ToString()).Replace("$.TotalCount", Match.Players.Count.ToString());
                return formattedText;
            }
            public override void TimerTick() {
                Match.MatchTimer();
            }
            public List<SpawnZoneBehaviour> SpawnZones {
                get;
                set;
            }
            = new List<SpawnZoneBehaviour>();
            public Vector3 GetRandomSpawnLocationForPlayer(BasePlayer player, Team? team = null) {
                if (player == null) return Vector3.zero;
                var validSpawnBehaviours = SpawnZones.Where(x => x.SpawnData != null && x.SpawnData.IsEnabled && (!team.HasValue || x.SpawnData.SpawnType == team.Value)).ToList();
                if (!validSpawnBehaviours.Any()) {
                    if (Zone == null) {
                        _instance.PrintError("No Zone Found");
                        return Vector3.zero;
                    }
                    return Zone.Location;
                }
                var tryCount = 0;
                var randomChance = UnityEngine.Random.Range(0.1f, 100);
                var spawnBehaviour = validSpawnBehaviours.Where(x => x.SpawnData.SpawnChance >= randomChance).ToList().GetRandom();
                Vector2? randomPos = null;
                if (spawnBehaviour != null && spawnBehaviour.SpawnData.Radius > 0) {
                    while (tryCount < 20) {
                        randomPos = UnityEngine.Random.insideUnitCircle * spawnBehaviour.SpawnData.Radius;
                        var entities = Facepunch.Pool.GetList<BaseEntity>();
                        Vis.Entities(randomPos.Value, 10, entities, LayerMask.GetMask("Construction", "Deployable"));
                        var count = entities.Count;
                        Facepunch.Pool.FreeList(ref entities);
                        if (count == 0) {
                            break;
                        }
                        randomPos = null;
                        tryCount++;
                    }
                }
                else {
                    randomPos = Vector2.zero;
                }
                foreach (var spawnZone in SpawnZones) {
                    spawnZone.RemovePlayer(player);
                }
                if (spawnBehaviour != null) spawnBehaviour.AddPlayer(player);
                return randomPos.HasValue && spawnBehaviour != null ? new Vector3(spawnBehaviour.SpawnData.SpawnPoint.x + randomPos.Value.x, spawnBehaviour.SpawnData.SpawnPoint.y, spawnBehaviour.SpawnData.SpawnPoint.z + randomPos.Value.y) : Vector3.zero;
            }
        }
        public class TeamDeathmatchMatch : GameModeManager.Match {
            public TeamDeathmatchMatch(TeamDeathmatchArena arena) : base(arena) {
                Arena = arena;
                BlueTeam = RelationshipManager.ServerInstance.CreateTeam();
                RedTeam = RelationshipManager.ServerInstance.CreateTeam();
                BlueTeamSelectedLoadoutName = arena.Data.BlueTeamDefaultLoadoutName;
                RedTeamSelectedLoadoutName = arena.Data.RedTeamDefaultLoadoutName;
                RoundCount = arena.Data.DefaultRoundCount;
            }
            public new TeamDeathmatchArena Arena {
                get;
                set;
            }
            private int _remainingTime;
            private int _currentRound;
            private int _countDown;
            private int _roundsWonByBlue = 0;
            private int _roundsWonByRed = 0;
            public new HashSet<TeamDeathmatchPlayer> Players {
                get;
                set;
            }
            = new HashSet<TeamDeathmatchPlayer>();
            public RelationshipManager.PlayerTeam BlueTeam {
                get;
                set;
            }
            public RelationshipManager.PlayerTeam RedTeam {
                get;
                set;
            }
            public int RoundTime {
                get;
                set;
            }
            = 5;
            public int RoundCount {
                get;
                set;
            }
            public string BlueTeamSelectedLoadoutName {
                get;
                set;
            }
            public string RedTeamSelectedLoadoutName {
                get;
                set;
            }
            public HashSet<string> Items {
                get;
                set;
            }
            = new HashSet<string>();
            public void MatchTimer() {
                ManagePlayers();
                if (!IsCountDownActivated) return;
                if (_countDown > 0) {
                    var countdown = TimeSpan.FromSeconds((float)_countDown / 2);
                    //var countdownText = _countDown <= 1 ? "GO!" : $"{countdown.Seconds}";
                    if (countdown.Seconds > 0) {
                        foreach (var matchPlayer in Players) {
                            _instance.ShowTeamDeathmatchCountDownGui(matchPlayer.Player, $"{countdown.Seconds}", _countDown % 2 != 0);
                        }
                    }
                    else {
                        ClearTimerGui();
                    }
                    _countDown--;
                    return;
                }
                if (_remainingTime > 0) {
                    var timer = TimeSpan.FromSeconds((float)_remainingTime / 2);
                    var timerText = $"{Math.Floor(timer.TotalMinutes):00}:{timer.Seconds:00}";
                    //var roundCount = RoundCount > 0 ? RoundCount.ToString() : "∞";
                    var roundText = RoundCount > 0 ? $"{_currentRound}/{RoundCount}" : string.Empty;
                    foreach (var matchPlayer in Players) {
                        _instance.ShowTeamDeathmatchInGameGui(matchPlayer.Player, timerText, roundText);
                    }
                    _remainingTime--;
                    return;
                }
                //here, count down or round is finished
                if (!IsStarted && _countDown <= 0) {
                    StartRound();
                }
                else {
                    EndRound();
                }
            }
            private void ManagePlayers() {
                var toBeKicked = new List<ulong>();
                foreach (var matchPlayer in Players) {
                    if (matchPlayer.Player.IdleTime >= 3 * 60) {
                        toBeKicked.Add(matchPlayer.PlayerId);
                    }
                    else if (matchPlayer.Player.IsWounded() && matchPlayer.Player.woundedDuration > matchPlayer.Match.Arena.Data.WoundedTimeout) {
                        matchPlayer.Player.Die(new HitInfo(matchPlayer.Player.lastAttacker, null, matchPlayer.Player.lastDamage, 0));
                    }
                    _instance.ShowTeamDeathmatchPlayers(matchPlayer.Player, this);
                    if (matchPlayer.Player.IsSleeping()) {
                        matchPlayer.Player.EndSleeping();
                    }
                }
                foreach (var playerId in toBeKicked) {
                    Kick(playerId, false);
                }
            }
            public void TryStartMatch() {
                if (Players.Where(x => x.Team != Team.Spectator).All(x => x.IsReady)) {
                    if (_currentRound > 1) {
                        StartCountDown();
                    }
                    else StartMatch();
                }
            }
            public bool IsMatchBalanced() {
                var blueCount = Players.Count(x => x.Team == Team.Blue);
                var redCount = Players.Count(x => x.Team == Team.Red);
                if (redCount == 0 || blueCount == 0) {
                    var leader = Players.FirstOrDefault(x => x.IsMatchLeader);
                    if (leader?.Player != null) {
                        _arena.ShowMessage(leader.Player, Messages.NotEnoughPlayers, _instance);
                    }
                    return false;
                }
                return true;
            }
            public void AllowPlayersToEscape() {
                foreach (var spawnZone in Arena.SpawnZones) {
                    if (spawnZone.SpawnData.SpawnType != Team.Spectator) {
                        spawnZone.ClearPlayers();
                        //free players so they can leave spawn zones
                    }
                }
            }
            public void StartMatch() {
                if (IsStarted) return;
                if (!IsMatchBalanced()) return;
                SetMatchInitialData();
                StartCountDown();
                //count down will start in matchtimer method
            }
            private void StartCountDown() {
                if (!IsMatchBalanced()) return;
                _remainingTime = 0;
                _countDown = IsCountDownEnabled ? Arena.Data.MatchStartCountDown * 2 : -1;
                IsCountDownActivated = true;
            }
            public void StartRound() {
                if (!IsMatchBalanced()) {
                    IsCountDownActivated = false;
                    return;
                }
                IsStarted = true;
                //set new round time
                _remainingTime = RoundTime * 60 * 2;
                AllowPlayersToEscape();
            }
            public void EndMatch() {
                ClearTimerGui();
                if (Players.Count > 0) {
                    var winnerTeam = string.Empty;
                    if (_roundsWonByBlue > _roundsWonByRed) {
                        winnerTeam = Arena.Data.BlueTeamDisplayName;
                    }
                    else if (_roundsWonByRed > _roundsWonByBlue) {
                        winnerTeam = Arena.Data.RedTeamDisplayName;
                    }
                    if (!string.IsNullOrWhiteSpace(winnerTeam)) {
                        foreach (var inGamePlayer in Players) {
                            _arena.ShowMessage(inGamePlayer.Player, Messages.EndMatchMessage, _instance, winnerTeam);
                        }
                    }
                    else {
                        foreach (var inGamePlayer in Players) {
                            _arena.ShowMessage(inGamePlayer.Player, Messages.EndMatchDrawMessage, _instance, winnerTeam);
                        }
                    }
                }
                SetMatchInitialData();
                //Clear();
            }
            public void EndRound() {
                IsStarted = false;
                IsCountDownActivated = false;
                ClearTimerGui();
                SetAllPlayersNotReady();
                _arena.ClearEntities(Arena.Zone.Id);
                CheckForWinner();
                UpdateStatistics();
                if ((RoundCount <= 0 || _currentRound < RoundCount) && Players.Count > 0) {
                    _instance.timer.Once(1.5f, () => {
                        _currentRound++;
                        MakePlayersReadyToMatch();
                        if (WillAutoStart) {
                            _instance.timer.Once(1.5f, () => {
                                SetAllPlayersReady();
                                StartCountDown();
                            }
                            );
                        }
                    }
                    );
                }
                else {
                    EndMatch();
                    MakePlayersReadyToMatch();
                }
            }
            public void UpdateStatistics() {
                var playerStats = Players.Select(x => new GameModeManager.PlayerStatistics(x.Player) {
                    Kills = x.Statistics.Kills, Deaths = x.Statistics.Deaths, DamagesDone = x.Statistics.DamagesDone
                }
                ).ToList();
                _arena.UpdateScore(playerStats);
                ResetStats();
            }
            public void MakePlayersReadyToMatch() {
                foreach (var matchPlayer in Players) {
                    matchPlayer.Reset();
                    _instance.RespawnInArena(matchPlayer, matchPlayer.Match.Arena, matchPlayer.Team);
                    matchPlayer.ManageInventory(false);
                }
            }
            public void SetMatchInitialData() {
                IsCountDownActivated = false;
                _countDown = IsCountDownEnabled ? Arena.Data.MatchStartCountDown * 2 : -1;
                _remainingTime = 0;
                //will be filled with real value in StartRound
                _currentRound = 1;
                _roundsWonByBlue = 0;
                _roundsWonByRed = 0;
                IsStarted = false;
                ResetStats();
            }
            private void SetAllPlayersNotReady() {
                foreach (var player in Players) {
                    player.IsReady = false;
                    _instance.ShowTeamDeathmatchQuickMenu(player.Player, this);
                }
            }
            public void SetAllPlayersReady() {
                foreach (var player in Players) {
                    player.IsReady = true;
                    _instance.ShowTeamDeathmatchQuickMenu(player.Player, this);
                }
            }
            public void ClearTimerGui() {
                foreach (var matchPlayer in Players) {
                    CuiHelper.DestroyUi(matchPlayer.Player, GameModeManager.Ui.Panels.InGameInfo.ToString());
                }
            }
            public void CheckIfRoundShouldEnd() {
                if (!IsStarted) {
                    return;
                }
                if (Players.Count <= 0)  //no players in match!
                {
                    EndMatch();
                }
                var alivePlayers = Players.Where(x => x.AllowPlaying).ToList();
                var blueCount = alivePlayers.Count(x => x.Team == Team.Blue);
                var redCount = alivePlayers.Count(x => x.Team == Team.Red);
                if (blueCount <= 0 || redCount <= 0)  //round should end
                {
                    EndRound();
                }
            }
            public void CheckForWinner() {
                if (Players.Count <= 0) {
                    EndMatch();
                }
                var alivePlayers = Players.Where(x => x.AllowPlaying).ToList();
                var blueCount = alivePlayers.Count(x => x.Team == Team.Blue);
                var redCount = alivePlayers.Count(x => x.Team == Team.Red);
                var winnerTeam = string.Empty;
                if (blueCount > redCount) {
                    _roundsWonByBlue++;
                    winnerTeam = Arena.Data.BlueTeamDisplayName;
                }
                else if (redCount > blueCount) {
                    _roundsWonByRed++;
                    winnerTeam = Arena.Data.RedTeamDisplayName;
                }
                if (!string.IsNullOrEmpty(winnerTeam)) {
                    foreach (var inGamePlayer in Players) {
                        _arena.ShowMessage(inGamePlayer.Player, Messages.EndRoundMessage, _instance, winnerTeam);
                    }
                }
                else {
                    foreach (var inGamePlayer in Players) {
                        _arena.ShowMessage(inGamePlayer.Player, Messages.EndRoundDrawMessage, _instance);
                    }
                }
            }
            public void ResetStats() {
                foreach (var matchPlayer in Players) {
                    matchPlayer.ResetStats();
                }
            }
            public void ResetLoadout() {
                foreach (var matchPlayer in Players) {
                    matchPlayer.ManageInventory(true);
                }
            }
            public void SetBlueTeamLoadout(string loadoutName) {
                BlueTeamSelectedLoadoutName = loadoutName;
                foreach (var deathmatchPlayer in Players) {
                    deathmatchPlayer.SetBlueTeamLoadout(loadoutName);
                    _arena.ShowMessage(deathmatchPlayer.Player, Messages.TeamKitSet, _instance, Arena.Data.BlueTeamDisplayName, loadoutName);
                }
            }
            public void SetRedTeamLoadout(string loadoutName) {
                RedTeamSelectedLoadoutName = loadoutName;
                foreach (var deathmatchPlayer in Players) {
                    deathmatchPlayer.SetRedTeamLoadout(loadoutName);
                    _arena.ShowMessage(deathmatchPlayer.Player, Messages.TeamKitSet, _instance, Arena.Data.RedTeamDisplayName, loadoutName);
                }
            }
            public void ToggleItem(string itemName) {
                if (Items.Contains(itemName)) Items.Remove(itemName);
                else Items.Add(itemName);
                foreach (var deathmatchPlayer in Players) {
                    deathmatchPlayer.ToggleItem(itemName);
                }
            }
            public void AddPlayer(TeamDeathmatchPlayer player) {
                Players.Add(player);
                player.InitialLoadoutItem();
            }
            public void RemovePlayer(TeamDeathmatchPlayer player) {
                Players.Remove(player);
                player.ClearInventory();
                if (Players.Count == 0) {
                    Clear();
                }
            }
            public void KickAll(bool includeLeader = false, bool beSpectator = true) {
                foreach (var matchPlayer in Players) {
                    if (!includeLeader && matchPlayer.IsMatchLeader) continue;
                    Kick(matchPlayer, beSpectator);
                }
            }
            public void Kick(ulong playerId, bool beSpectator) {
                var matchPlayer = Players.FirstOrDefault(x => x.PlayerId == playerId);
                Kick(matchPlayer, beSpectator);
            }
            public void Kick(GameModeManager.MatchPlayer matchPlayer, bool beSpectator) {
                if (matchPlayer != null) {
                    if (beSpectator) {
                        _instance.SwitchTeam(matchPlayer.Player, Team.Spectator);
                    }
                    else {
                        _instance.HandleLeaveArena(matchPlayer.Player);
                    }
                }
            }
            public void Clear() {
                SetMatchInitialData();
                BlueTeamSelectedLoadoutName = Arena.Data.BlueTeamDefaultLoadoutName;
                RedTeamSelectedLoadoutName = Arena.Data.RedTeamDefaultLoadoutName;
                IsCountDownActivated = false;
                IsCountDownEnabled = true;
                IsStarted = false;
                WillAutoStart = true;
                AllowIndividualKit = false;
                RestrictAccess = false;
                AllowedPlayers.Clear();
                BannedPlayers.Clear();
                RoundTime = 5;
                RoundCount = Arena.Data.DefaultRoundCount;
            }
        }
        public class TeamDeathmatchPlayer : GameModeManager.MatchPlayer {
            public TeamDeathmatchPlayer(BasePlayer player, TeamDeathmatchMatch match) : base(player, match) {
                Match = match;
            }
            public Team Team {
                get;
                set;
            }
            public new TeamDeathmatchMatch Match {
                get;
                set;
            }
            public bool IsSelected {
                get;
                set;
            }
            public bool IsReady {
                get;
                set;
            }
            public void ToggleReady() {
                if (!IsReady) {
                    IsReady = true;
                    foreach (var otherPlayer in Match.Players) {
                        _arena.ShowMessage(otherPlayer.Player, Messages.PlayerIsReady, _instance, PlayerName);
                    }
                    Match.TryStartMatch();
                }
            }
            public void InitialLoadoutItem() {
                BlueTeamSelectedLoadoutName = Match.BlueTeamSelectedLoadoutName;
                RedTeamSelectedLoadoutName = Match.RedTeamSelectedLoadoutName;
                foreach (var matchItem in Match.Items) {
                    IndividualItems.Add(matchItem);
                }
                ManageInventory(false);
            }
            public void SetBlueTeamLoadout(string loadoutName) {
                BlueTeamSelectedLoadoutName = loadoutName;
                ManageInventory(false);
            }
            public void SetRedTeamLoadout(string loadoutName) {
                RedTeamSelectedLoadoutName = loadoutName;
                ManageInventory(false);
            }
            public void ToggleItem(string itemName) {
                if (IndividualItems.Contains(itemName)) IndividualItems.Remove(itemName);
                else IndividualItems.Add(itemName);
                ManageInventory(false);
            }
            public void ManageInventory(bool forceReset) {
                if (Team == Team.Spectator || !AllowPlaying) {
                    _arena.GiveLoadout(Player, Match.Arena.Data.SpectatorLoadoutName);
                    return;
                }
                if (!forceReset && Match.IsStarted) return;
                if (Team == Team.Red) _arena.GiveLoadout(Player, RedTeamSelectedLoadoutName);
                else if (Team == Team.Blue) _arena.GiveLoadout(Player, BlueTeamSelectedLoadoutName);
                foreach (var itemShortName in IndividualItems) {
                    var existItem = Player.inventory.FindItemID(itemShortName);
                    if (existItem == null) {
                        var newItem = ItemManager.CreateByName(itemShortName);
                        Player.inventory.GiveItem(newItem);
                    }
                }
            }
            public override bool Equals(object obj) {
                var matchPlayer = obj as TeamDeathmatchPlayer;
                if (matchPlayer == null) {
                    return false;
                }
                return matchPlayer.PlayerId == PlayerId;
            }
            public override int GetHashCode() {
                return PlayerId.GetHashCode();
            }
        }
        private static class Messages {
            public const string NoPermission = "No Permission";
            public const string WrongCommand = "Wrong Command";
            public const string ArenaCommandsList = "Arena Commands List";
            public const string ScrimCommandsList = "Scrim Commands Help";
            public const string InvalidPlayerId = "Invalid Player Id";
            public const string PlayerNotFound = "Player Not Found";
            public const string LobbyNotFound = "Lobby Not Found";
            public const string ArenaNotFound = "Arena Not Found";
            public const string ChangesSaved = "Changes Saved";
            public const string NoEditingLobby = "No Editing Lobby";
            public const string NoEditingArena = "No Editing Arena";
            public const string ArenaParameterChanged = "Arena Parameter Changed";
            public const string ArenaSpawnPointAdded = "Arena Spawn Point Added";
            public const string ArenaInvalidPosition = "Arena Invalid Position";
            public const string ArenaInvalidEntrancePosition = "Arena Invalid Entrance Position";
            public const string ArenaDeleted = "Arena Deleted";
            public const string ArenaEditingStarted = "Arena Editing Started";
            public const string ArenaEditingDone = "Arena Editing Done";
            public const string ArenaRestrictAccess = "Arena Restrict Access";
            public const string ArenaNoVipAccess = "Arena No VIP Access";
            public const string ArenaZoneNotFound = "Arena Zone Not Found";
            public const string LobbyZoneNotFound = "Lobby Zone Not Found";
            public const string InvalidKitName = "Invalid Kit Name";
            public const string KitAdded = "Kit Added";
            public const string KitRemoved = "Kit Removed";
            public const string KitNotFound = "Kit Not Found";
            public const string ArenaCreated = "Arena Created";
            public const string SpawnPointNotFound = "Spawn Point Not Found";
            public const string TeamNotFound = "Team Not Found";
            public const string NotEnoughPlayers = "Not Enough Players";
            public const string EndRoundMessage = "End Round Message";
            public const string EndMatchMessage = "End Match Message";
            public const string EndRoundDrawMessage = "End Round Draw Message";
            public const string EndMatchDrawMessage = "End Match Draw Message";
            public const string ArenaJoinMessage = "Arena Join Message";
            public const string ArenaSpectatorJoinMessage = "Arena Spectator Join Message";
            public const string ArenaLeaveMessage = "Arena Leave Message";
            public const string PlayerIsReady = "Player Is Ready";
            public const string InvalidItemShortName = "Invalid Item Short Name";
            public const string ItemAdded = "Item Added";
            public const string ItemRemoved = "Item Removed";
            public const string ItemNotFound = "Item Not Found";
            public const string ArenaSetValueHelp = "Arena Set Value Help";
            public const string ArenaSpawnPointTypesHelp = "Arena SpawnPoint Types Help";
            public const string InvalidSpawnType = "Invalid Spawn Type";
            public const string SingleSelectionNeeded = "Single Selection Needed";
            public const string MatchLeadershipChange = "Match Leadership Change";
            public const string KilledBy = "Killed By";
            public const string NoSwitchTeamOnRunningMatch = "No Switch Team On Running Match";
            public const string MatchIsFull = "Match Is Full";
            public const string TeamKitSet = "Team Kit Set";
        }
        public static class ConsoleCommands {
            public const string ArenaHelp = "s.help";
            public const string ArenaEdit = "s.edit";
            public const string ArenaDone = "s.done";
            public const string ArenaDelete = "s.delete";
            public const string ArenaCreate = "s.create";
            public const string ArenaSet = "s.set";
            public const string ArenaSetHelp = "s.set.help";
            public const string ArenaSetSpawn = "s.set.spawn";
            public const string ArenaSetSpawnHelp = "s.set.spawn.help";
            public const string ArenaDeleteSpawn = "s.delete.spawn";
            public const string ArenaAllow = "s.allow";
            public const string ArenaBan = "s.ban";
            public const string ArenaJoin = "s.join";
            public const string ArenaLeave = "s.leave";
            public const string MenuShow = "s.menu.show";
            public const string MenuClear = "s.menu.clear";
            public const string LoadoutShow = "s.loadout.show";
            public const string SwitchTeamShow = "s.switchteam.show";
            public const string SwitchTeam = "s.switchteam";
            public const string LeaderboardShow = "s.leaderboard.show";
            public const string ControlShow = "s.control.show";
            public const string PlayersSearch = "s.players.search";
            public const string PlayersSearchInput = "players.search.input";
            public const string PlayerSelectionToggle = "s.player.select.toggle";
            public const string NextPage = "s.page.next";
            public const string PreviousPage = "s.page.prev";
            public const string ClearInput = "s.input.clear";
            public const string ResetMatchStats = "s.match.reset.stats";
            public const string ResetLoadout = "s.match.reset.loadout";
            public const string ResetMatch = "s.match.reset";
            public const string RemoveWalls = "s.match.reset.walls";
            public const string ForceStart = "s.match.start";
            public const string KickFromMatch = "s.match.kick";
            public const string KickAll = "s.match.kick.all";
            public const string LockMatch = "s.match.lock";
            public const string MatchReadyToggle = "s.match.ready.toggle";
            public const string AllowIndividualKit = "s.match.individualkit";
            public const string ToggleAutoStartRound = "s.match.autostart.toggle";
            public const string ToggleCountdown = "s.match.countdown.toggle";
            public const string SetRoundCount = "s.match.round.count";
            public const string SetRoundTime = "s.match.round.time";
            public const string MatchBan = "s.match.ban";
            public const string MatchAllow = "s.match.allow";
            public const string MatchUnBan = "s.match.unban";
            public const string MatchDisallow = "s.match.disallow";
            public const string TransferLeadership = "s.match.leadership";
            public const string SetBlueTeamKit = "s.match.kit.set.blue";
            public const string SetRedTeamKit = "s.match.kit.set.red";
            public const string GiveItem = "s.match.item.set";
            public const string TakeKit = "s.match.kit.take";
            public const string TakeItem = "s.match.item.take";
        }
        public enum Team {
            //None = 0,
            Spectator = 10, Blue = 20, Red = 30
        }
#endregion Classes
#region Methods
#region Commands
        private void ShowPauseMenuChatCommand(BasePlayer player, string command, string[] args) {
            if (player == null) {
                return;
            }
            ShowPauseMenu(player);
        }
        private void ToggleReadyChatCommand(BasePlayer player, string command, string[] args) {
            if (player == null) {
                return;
            }
            TogglePlayerReady(player);
        }
        private void ShowPauseMenu(BasePlayer player) {
            TeamDeathmatchPlayer matchPlayer;
            if (Players.TryGetValue(player.userID, out matchPlayer) && matchPlayer != null) ShowTeamDeathmatchPauseMenu(player, matchPlayer.Match.Arena.Data.Id);
        }
#region ArenaDataCommands
        //s.help
        [ConsoleCommand(ConsoleCommands.ArenaHelp)]
        void ArenaHelp(ConsoleSystem.Arg conArgs) {
            var player = conArgs?.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, GameModeManager.PermissionAdmin)) {
                _arena.ShowMessage(player, Messages.NoPermission, this);
                return;
            }
            _arena.ShowMessage(player, Messages.ArenaCommandsList, this, GetArenaCommands());
        }
        //s.edit <id>
        [ConsoleCommand(ConsoleCommands.ArenaEdit)]
        void EditArena(ConsoleSystem.Arg conArgs) {
            if (conArgs == null) {
                _arena.ShowMessage(null, Messages.WrongCommand, this, GetArenaCommands());
                return;
            }
            var player = conArgs.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, GameModeManager.PermissionAdmin)) {
                _arena.ShowMessage(player, Messages.NoPermission, this);
                return;
            }
            //if (_lobbyToEdit == null)
            //{
            //    _arena.ShowMessage(player, Messages.NoEditingLobby, this, ConsoleCommands.LobbyEdit);
            //    return;
            //}
            var id = conArgs.GetInt(0, -1);
            if (id >= 0) {
                _arenaToEdit = _pluginData.Arenas.FirstOrDefault(x => x.Id == id);
                if (_arenaToEdit == null) {
                    _arena.ShowMessage(player, Messages.ArenaNotFound, this, GetArenaCommands());
                    return;
                }
                _arena.UnLockEntities(_arenaToEdit.ZoneId, player.userID);
                _arena.ShowMessage(player, Messages.ArenaEditingStarted, this, _arenaToEdit.Name, _arenaToEdit.Id);
            }
            else {
                _arena.ShowMessage(player, Messages.WrongCommand, this, GetArenaCommands());
            }
        }
        //s.done
        [ConsoleCommand(ConsoleCommands.ArenaDone)]
        void DoneArena(ConsoleSystem.Arg conArgs) {
            if (conArgs == null) {
                _arena.ShowMessage(null, Messages.WrongCommand, this, GetArenaCommands());
                return;
            }
            var player = conArgs.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, GameModeManager.PermissionAdmin)) {
                _arena.ShowMessage(player, Messages.NoPermission, this);
                return;
            }
            if (_arenaToEdit != null) {
                _arena.LockEntities(_arenaToEdit.ZoneId);
                var name = _arenaToEdit.Name;
                var id = _arenaToEdit.Id;
                _arenaToEdit = null;
                _arena.ShowMessage(player, Messages.ArenaEditingDone, this, name, id);
            }
        }
        //s.delete <id>
        [ConsoleCommand(ConsoleCommands.ArenaDelete)]
        void DeleteArena(ConsoleSystem.Arg conArgs) {
            if (conArgs == null) {
                _arena.ShowMessage(null, Messages.WrongCommand, this, GetArenaCommands());
                return;
            }
            var player = conArgs.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, GameModeManager.PermissionAdmin)) {
                _arena.ShowMessage(player, Messages.NoPermission, this);
                return;
            }
            //if (_lobbyToEdit == null)
            //{
            //    _arena.ShowMessage(player, Messages.NoEditingLobby, this, ConsoleCommands.LobbyEdit);
            //    return;
            //}
            var id = conArgs.GetInt(0, -1);
            if (id >= 0) {
                var arenaToRemove = _pluginData.Arenas.FirstOrDefault(x => x.Id == id);
                if (arenaToRemove != null) {
                    _pluginData.Arenas.Remove(arenaToRemove);
                    SaveData();
                    TeamDeathmatchArena teamDeathMatchArena;
                    _arenas.TryGetValue(arenaToRemove.Id, out teamDeathMatchArena);
                    RemoveArena(teamDeathMatchArena);
                    _arena.ShowMessage(player, Messages.ArenaDeleted, this);
                }
                else {
                    _arena.ShowMessage(player, Messages.ArenaNotFound, this);
                }
            }
            else {
                _arena.ShowMessage(player, Messages.WrongCommand, this, GetArenaCommands());
            }
        }
        //s.create <Name> <ZoneId> [<Capacity>] [<EntranceTriggerRadius>]
        [ConsoleCommand(ConsoleCommands.ArenaCreate)]
        void CreateArena(ConsoleSystem.Arg conArgs) {
            if (conArgs == null) {
                _arena.ShowMessage(null, Messages.WrongCommand, this, GetArenaCommands());
                return;
            }
            var player = conArgs.Player();
            if (player != null && !permission.UserHasPermission(player.UserIDString, GameModeManager.PermissionAdmin)) {
                _arena.ShowMessage(player, Messages.NoPermission, this);
                return;
            }
            if (conArgs.Args.Length < 2) {
                _arena.ShowMessage(player, Messages.WrongCommand, this, GetArenaCommands());
                return;
            }
            if (_arena.LobbyToEdit == null) {
                _arena.ShowMessage(player, Messages.NoEditingLobby, this, GameModeManager.ConsoleCommands.LobbyEdit);
                return;
            }
            GameModeManager.Lobby lobby;
            if (!_arena.Lobbies.TryGetValue(_arena.LobbyToEdit.Id, out lobby) || lobby == null) {
                _arena.ShowMessage(player, Messages.LobbyNotFound, this);
                return;
            }
            var name = conArgs.GetString(0);
            var zoneId = conArgs.GetString(1);
            var capacity = conArgs.GetInt(2, 4);
            var radius = conArgs.GetFloat(3, 2);
            var entrancePosition = Vector3.zero;
            if (player != null) {
                entrancePosition = player.ServerPosition;
            }
            var zone = _arena.GetZone(zoneId);
            if (zone == null) {
                _arena.ShowMessage(player, Messages.ArenaZoneNotFound, this);
                return;
            }
            var lobbyZone =
// ... [Code preview truncated due to length. Full source in attached file] ...

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