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] ...