/// <param name="characterClassManager">Can be null, if team is not MTF</param> public static string ToFriendlyString(this Team team, CharacterClassManager characterClassManager = null) { switch (team) { case Team.SCP: return("SCP " + characterClassManager.CurRole.fullName); case Team.MTF: UnitNamingRule rule; return(UnitNamingRules.TryGetNamingRule(SpawnableTeamType.NineTailedFox, out rule) ? rule.GetCassieUnitName(characterClassManager.CurUnitName) : "UNKNOWN"); case Team.RSC: return("SCIENCE PERSONNEL"); case Team.CHI: return("CHAOSINSURGENCY"); case Team.CDP: return("CLASSD PERSONNEL"); case Team.TUT: return("BAN TEAM"); default: return("CONTAINMENTUNIT UNKNOWN"); } }
private static bool Prefix(RespawnManager __instance) { try { if (!RespawnWaveGenerator.SpawnableTeams.TryGetValue(__instance.NextKnownTeam, out SpawnableTeam spawnableTeam) || __instance.NextKnownTeam == SpawnableTeamType.None) { ServerConsole.AddLog("Fatal error. Team '" + __instance.NextKnownTeam + "' is undefined.", ConsoleColor.Red); } else { List <API.Features.Player> list = ListPool <API.Features.Player> .Shared.Rent(API.Features.Player.List.Where(player => player.IsDead && !player.IsOverwatchEnabled)); if (__instance._prioritySpawn) { var tempList = ListPool <API.Features.Player> .Shared.Rent(); tempList.AddRange(list.OrderBy(item => item.ReferenceHub.characterClassManager.DeathTime)); ListPool <API.Features.Player> .Shared.Return(list); list = tempList; } else { list.ShuffleList(); } // Code that should be here is in RespawningTeamEventArgs::ReissueNextKnownTeam var ev = new RespawningTeamEventArgs(list, __instance.NextKnownTeam); Handlers.Server.OnRespawningTeam(ev); if (ev.IsAllowed && ev.SpawnableTeam != null) { while (list.Count > ev.MaximumRespawnAmount) { list.RemoveAt(list.Count - 1); } list.ShuffleList(); List <ReferenceHub> referenceHubList = ListPool <ReferenceHub> .Shared.Rent(); foreach (API.Features.Player me in list) { try { RoleType classid = ev.SpawnableTeam.Value.ClassQueue[Mathf.Min(referenceHubList.Count, spawnableTeam.ClassQueue.Length - 1)]; me.ReferenceHub.characterClassManager.SetPlayersClass(classid, me.ReferenceHub.gameObject); referenceHubList.Add(me.ReferenceHub); ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + me.ReferenceHub.LoggedNameFromRefHub() + " respawned as " + classid + ".", ServerLogs.ServerLogType.GameEvent); } catch (Exception ex) { if (me != null) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + me.ReferenceHub.LoggedNameFromRefHub() + " couldn't be spawned. Err msg: " + ex.Message, ServerLogs.ServerLogType.GameEvent); } else { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Couldn't spawn a player - target's ReferenceHub is null.", ServerLogs.ServerLogType.GameEvent); } } } if (referenceHubList.Count > 0) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, $"RespawnManager has successfully spawned {referenceHubList.Count} players as {__instance.NextKnownTeam}!", ServerLogs.ServerLogType.GameEvent); RespawnTickets.Singleton.GrantTickets(__instance.NextKnownTeam, -referenceHubList.Count * spawnableTeam.TicketRespawnCost); if (UnitNamingRules.TryGetNamingRule(__instance.NextKnownTeam, out UnitNamingRule rule)) { rule.GenerateNew(__instance.NextKnownTeam, out string regular); foreach (ReferenceHub referenceHub in referenceHubList) { referenceHub.characterClassManager.NetworkCurSpawnableTeamType = (byte)__instance.NextKnownTeam; referenceHub.characterClassManager.NetworkCurUnitName = regular; } rule.PlayEntranceAnnouncement(regular); } RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.UponRespawn, __instance.NextKnownTeam); } ListPool <ReferenceHub> .Shared.Return(referenceHubList); } ListPool <API.Features.Player> .Shared.Return(list); __instance.NextKnownTeam = SpawnableTeamType.None; } return(false); } catch (Exception e) { Exiled.API.Features.Log.Error($"Exiled.Events.Patches.Events.Server.RespawningTeam: {e}\n{e.StackTrace}"); return(true); } }
public static bool Prefix(RespawnManager __instance) { try { if (!RespawnWaveGenerator.SpawnableTeams.TryGetValue(__instance.NextKnownTeam, out var spawnableTeam) || __instance.NextKnownTeam == SpawnableTeamType.None) { ServerConsole.AddLog("Fatal error. Team '" + __instance.NextKnownTeam.ToString() + "' is undefined.", (ConsoleColor)12); return(false); } var list = ReferenceHub.GetAllHubs().Values.Where((item) => item.characterClassManager.CurClass == RoleType.Spectator && !item.serverRoles.OverwatchEnabled).ToList(); if (__instance._prioritySpawn) { list = list.OrderBy((item) => item.characterClassManager.DeathTime).ToList(); } else { list.ShuffleList(); } var singleton = RespawnTickets.Singleton; var num = singleton.GetAvailableTickets(__instance.NextKnownTeam); if (num == 0) { num = singleton.DefaultTeamAmount; RespawnTickets.Singleton.GrantTickets(singleton.DefaultTeam, singleton.DefaultTeamAmount, true); } var num2 = Mathf.Min(num, spawnableTeam.MaxWaveSize); while (list.Count > num2) { list.RemoveAt(list.Count - 1); } list.ShuffleList(); var list2 = ListPool <ReferenceHub> .Shared.Rent(); var playerList = list.Select(hub => hub.GetPlayer()).ToList(); Events.InvokeTeamRespawnEvent(ref playerList, ref __instance.NextKnownTeam); if (__instance.NextKnownTeam == SpawnableTeamType.None) { return(false); } foreach (var player in playerList) { try { var classId = spawnableTeam.ClassQueue[Mathf.Min(list2.Count, spawnableTeam.ClassQueue.Length - 1)]; player.ClassManager.SetPlayersClass(classId, player.gameObject); list2.Add(player.Hub); ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[] { "Player ", player.Hub.LoggedNameFromRefHub(), " respawned as ", classId.ToString(), "." }), ServerLogs.ServerLogType.GameEvent); } catch (Exception ex) { if (player != null) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + player.Hub.LoggedNameFromRefHub() + " couldn't be spawned. Err msg: " + ex.Message, ServerLogs.ServerLogType.GameEvent); } else { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Couldn't spawn a player - target's ReferenceHub is null.", ServerLogs.ServerLogType.GameEvent); } } } if (list2.Count > 0) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new object[] { "RespawnManager has successfully spawned ", list2.Count, " players as ", __instance.NextKnownTeam.ToString(), "!" }), ServerLogs.ServerLogType.GameEvent); RespawnTickets.Singleton.GrantTickets(__instance.NextKnownTeam, -list2.Count * spawnableTeam.TicketRespawnCost); if (UnitNamingRules.TryGetNamingRule(__instance.NextKnownTeam, out var unitNamingRule)) { unitNamingRule.GenerateNew(__instance.NextKnownTeam, out var text); foreach (ReferenceHub referenceHub2 in list2) { referenceHub2.characterClassManager.NetworkCurSpawnableTeamType = (byte)__instance.NextKnownTeam; referenceHub2.characterClassManager.NetworkCurUnitName = text; } unitNamingRule.PlayEntranceAnnouncement(text); } RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.UponRespawn, __instance.NextKnownTeam); } __instance.NextKnownTeam = SpawnableTeamType.None; return(false); } catch (Exception e) { Log.Error($"TeamRespawnEvent Error: {e}"); return(true); } }
private static bool Prefix(RespawnManager __instance) { SpawnableTeam spawnableTeam; if (!RespawnWaveGenerator.SpawnableTeams.TryGetValue(__instance.NextKnownTeam, out spawnableTeam) || __instance.NextKnownTeam == SpawnableTeamType.None) { ServerConsole.AddLog("Fatal error. Team '" + __instance.NextKnownTeam + "' is undefined.", ConsoleColor.Red); } else { List <API.Features.Player> list = API.Features.Player.List.Where(p => p.IsDead && !p.IsOverwatchEnabled).ToList(); if (__instance._prioritySpawn) { list = list.OrderBy(item => item.ReferenceHub.characterClassManager.DeathTime).ToList(); } else { list.ShuffleList(); } RespawnTickets singleton = RespawnTickets.Singleton; int a = singleton.GetAvailableTickets(__instance.NextKnownTeam); if (a == 0) { a = singleton.DefaultTeamAmount; RespawnTickets.Singleton.GrantTickets(singleton.DefaultTeam, singleton.DefaultTeamAmount, true); } int num = Mathf.Min(a, spawnableTeam.MaxWaveSize); List <ReferenceHub> referenceHubList = ListPool <ReferenceHub> .Rent(); var ev = new RespawningTeamEventArgs(list, num, __instance.NextKnownTeam); Handlers.Server.OnRespawningTeam(ev); while (list.Count > num) { list.RemoveAt(list.Count - 1); } list.ShuffleList(); foreach (API.Features.Player me in list) { try { RoleType classid = spawnableTeam.ClassQueue[Mathf.Min(referenceHubList.Count, spawnableTeam.ClassQueue.Length - 1)]; me.ReferenceHub.characterClassManager.SetPlayersClass(classid, me.ReferenceHub.gameObject); referenceHubList.Add(me.ReferenceHub); ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + me.ReferenceHub.LoggedNameFromRefHub() + " respawned as " + classid + ".", ServerLogs.ServerLogType.GameEvent); } catch (Exception ex) { if (me != null) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + me.ReferenceHub.LoggedNameFromRefHub() + " couldn't be spawned. Err msg: " + ex.Message, ServerLogs.ServerLogType.GameEvent); } else { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Couldn't spawn a player - target's ReferenceHub is null.", ServerLogs.ServerLogType.GameEvent); } } } if (referenceHubList.Count > 0) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, $"RespawnManager has successfully spawned {referenceHubList.Count} players as {__instance.NextKnownTeam}!", ServerLogs.ServerLogType.GameEvent); RespawnTickets.Singleton.GrantTickets(__instance.NextKnownTeam, -referenceHubList.Count * spawnableTeam.TicketRespawnCost); UnitNamingRule rule; if (UnitNamingRules.TryGetNamingRule(__instance.NextKnownTeam, out rule)) { string regular; rule.GenerateNew(__instance.NextKnownTeam, out regular); foreach (ReferenceHub referenceHub in referenceHubList) { referenceHub.characterClassManager.NetworkCurSpawnableTeamType = (byte)__instance.NextKnownTeam; referenceHub.characterClassManager.NetworkCurUnitName = regular; } rule.PlayEntranceAnnouncement(regular); } RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.UponRespawn, __instance.NextKnownTeam); } __instance.NextKnownTeam = SpawnableTeamType.None; } return(false); }
private static bool Prefix(RespawnManager __instance) { SpawnableTeamHandlerBase spawnableTeamHandlerBase; if (!RespawnWaveGenerator.SpawnableTeams.TryGetValue(__instance.NextKnownTeam, out spawnableTeamHandlerBase) || __instance.NextKnownTeam == SpawnableTeamType.None) { ServerConsole.AddLog("Fatal error. Team '" + __instance.NextKnownTeam + "' is undefined.", ConsoleColor.Red); return(false); } List <ReferenceHub> list = (from item in ReferenceHub.GetAllHubs().Values where (item.characterClassManager.CurClass == RoleType.Spectator || API.IsGhost(Player.Get(item))) && !item.serverRoles.OverwatchEnabled select item).ToList <ReferenceHub>(); if (__instance._prioritySpawn) { list = (from item in list orderby item.characterClassManager.DeathTime select item).ToList <ReferenceHub>(); } else { list.ShuffleList <ReferenceHub>(); } int num = RespawnTickets.Singleton.GetAvailableTickets(__instance.NextKnownTeam); if (RespawnTickets.Singleton.IsFirstWave) { RespawnTickets.Singleton.IsFirstWave = false; } if (num == 0) { num = 5; RespawnTickets.Singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency, 5, true); } int num2 = Mathf.Min(num, spawnableTeamHandlerBase.MaxWaveSize); while (list.Count > num2) { list.RemoveAt(list.Count - 1); } list.ShuffleList <ReferenceHub>(); List <ReferenceHub> list2 = ListPool <ReferenceHub> .Shared.Rent(); Queue <RoleType> queue = new Queue <RoleType>(); spawnableTeamHandlerBase.GenerateQueue(queue, list.Count); foreach (ReferenceHub referenceHub in list) { try { RoleType classid = queue.Dequeue(); referenceHub.characterClassManager.SetPlayersClass(classid, referenceHub.gameObject, CharacterClassManager.SpawnReason.Respawn, false); list2.Add(referenceHub); ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[] { "Player ", referenceHub.LoggedNameFromRefHub(), " respawned as ", classid.ToString(), "." }), ServerLogs.ServerLogType.GameEvent, false); } catch (Exception ex) { if (referenceHub != null) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Player " + referenceHub.LoggedNameFromRefHub() + " couldn't be spawned. Err msg: " + ex.Message, ServerLogs.ServerLogType.GameEvent, false); } else { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, "Couldn't spawn a player - target's ReferenceHub is null.", ServerLogs.ServerLogType.GameEvent, false); } } } if (list2.Count > 0) { ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new object[] { "RespawnManager has successfully spawned ", list2.Count, " players as ", __instance.NextKnownTeam.ToString(), "!" }), ServerLogs.ServerLogType.GameEvent, false); RespawnTickets.Singleton.GrantTickets(__instance.NextKnownTeam, -list2.Count * spawnableTeamHandlerBase.TicketRespawnCost, false); UnitNamingRule unitNamingRule; if (UnitNamingRules.TryGetNamingRule(__instance.NextKnownTeam, out unitNamingRule)) { string text; unitNamingRule.GenerateNew(__instance.NextKnownTeam, out text); foreach (ReferenceHub referenceHub2 in list2) { referenceHub2.characterClassManager.NetworkCurSpawnableTeamType = (byte)__instance.NextKnownTeam; referenceHub2.characterClassManager.NetworkCurUnitName = text; } unitNamingRule.PlayEntranceAnnouncement(text); } RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.UponRespawn, __instance.NextKnownTeam); } ListPool <ReferenceHub> .Shared.Return(list2); __instance.NextKnownTeam = SpawnableTeamType.None; return(false); }