public IEnumerator <float> ChopperThread() { while (roundStarted) { var playerCount = PlayerManager.players.Count; if (playerCount >= minPlayers) { yield return(Timing.WaitForSeconds(time)); // Wait seconds (10 minutes by defualt) Log.Info("Spawning chopper!"); RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, SpawnableTeamType.NineTailedFox); Map.Broadcast(5, dropText); yield return(Timing.WaitForSeconds(15)); // Wait 15 seconds Vector3 spawn = GetRandomSpawnPoint(RoleType.NtfCadet); foreach (KeyValuePair <ItemType, int> drop in allowedItems) // Drop items { Log.Info("Spawning " + drop.Value + " " + drop.Key.ToString() + "'s"); for (int i = 0; i < drop.Value; i++) { SpawnItem(drop.Key, spawn); } } yield return(Timing.WaitForSeconds(15)); // Wait 15 seconds to let the chopper leave. } } }
public bool Execute(ArraySegment <string> arguments, ICommandSender sender, out string response) { if (!((CommandSender)sender).CheckPermission("fctrl.respawn")) { response = "Access denied."; return(false); } if (arguments.Count() < 1) { response = "Proper usage: \"forcerespawn (mtf/chaos)\""; return(false); } if (arguments.At(0).ToLower() != "mtf" && arguments.At(0).ToLower() != "chaos") { response = "Provided argument must be \"mtf\" or \"chaos\"."; return(false); } SpawnableTeamType spawningTeam = (arguments.At(0).ToLower() == "mtf" ? SpawnableTeamType.NineTailedFox : SpawnableTeamType.ChaosInsurgency); float length = (spawningTeam == SpawnableTeamType.NineTailedFox ? 18f : 13f); RespawnManager.Singleton.RestartSequence(); // Prevent the opposite team from spawning while the forced team's animation is playing. RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, spawningTeam); Timing.CallDelayed(length, () => { RespawnManager.Singleton.ForceSpawnTeam(spawningTeam); }); response = $"Forcing {spawningTeam} spawn..."; return(true); }
public new void Spawn() { if (RespawnManagerCrap.blockRespawns) { return; } RespawnManagerCrap.isCI = NextKnownTeam == SpawnableTeamType.ChaosInsurgency; orig_Spawn(); try { Base.Debug("Triggering RespawnEvent"); PluginManager.TriggerEvent <IEventHandlerRespawn>(new RespawnEvent(RespawnManagerCrap.isCI)); } catch (Exception e) { Base.Error($"Error triggering RespawnEvent: {e.InnerException}"); } if (Commands.LightsoutCommand.isLightsout) { RespawnManagerCrap.TorchSpawnerReplacementDueToShittyCode(); } if (RespawnManagerCrap.isCI && PMConfigFile.announceChaos) { RespawnEffectsController.PlayCassieAnnouncement(PMConfigFile.chaosAnnouncement, false, true); } }
/// <summary> /// Forces a spawn of the given <see cref="SpawnableTeamType"/>. /// </summary> /// <param name="team">The <see cref="SpawnableTeamType"/> to spawn.</param> /// <param name="playEffects">Whether or not effects will be played with the spawn.</param> public static void ForceWave(SpawnableTeamType team, bool playEffects = false) { RespawnManager.Singleton.ForceSpawnTeam(team); if (playEffects) { RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, team); } }
/// <summary> /// Reproduce a non-glitched C.A.S.S.I.E message with a possibility to custom the subtitles. /// </summary> /// <param name="message">The message to be reproduced.</param> /// <param name="translation">The translation should be show in the subtitles.</param> /// <param name="isHeld">Indicates whether C.A.S.S.I.E has to hold the message.</param> /// <param name="isNoisy">Indicates whether C.A.S.S.I.E has to make noises or not during the message.</param> /// <param name="isSubtitles">Indicates whether C.A.S.S.I.E has to make subtitles.</param> public static void MessageTranslated(string message, string translation, bool isHeld = false, bool isNoisy = true, bool isSubtitles = true) { StringBuilder annoucement = new(); string[] cassies = message.Split('\n'); string[] translations = translation.Split('\n'); for (int i = 0; i < cassies.Count(); i++) { annoucement.Append($"{translations[i].Replace(' ', ' ')}<alpha=#00> {cassies[i]} </alpha><split>"); } RespawnEffectsController.PlayCassieAnnouncement(annoucement.ToString(), isHeld, isNoisy, isSubtitles); }
public IEnumerator <float> RunBlackoutTimer() { yield return(Timing.WaitForSeconds(Config.InitialDelay)); for (;;) { RespawnEffectsController.PlayCassieAnnouncement(Config.CassieMessageStart, false, true); if (Config.DisableTeslas) { EventHandlers.TeslasDisabled = true; } TimerOn = true; yield return(Timing.WaitForSeconds(8.7f)); float blackoutDur = Config.DurationMax; if (Config.RandomEvents) { blackoutDur = (float)Gen.NextDouble() * (Config.DurationMax - Config.DurationMin) + Config.DurationMin; } if (Config.EnableKeter) { EventHandlers.Coroutines.Add(Timing.RunCoroutine(Keter(blackoutDur), "keter")); } Generator079.Generators[0].ServerOvercharge(blackoutDur, Config.OnlyHeavy); if (Config.Voice) { RespawnEffectsController.PlayCassieAnnouncement(Config.CassieKeter, false, false); } yield return(Timing.WaitForSeconds(blackoutDur - 8.7f)); RespawnEffectsController.PlayCassieAnnouncement(Config.CassieMessageEnd, false, true); yield return(Timing.WaitForSeconds(8.7f)); Timing.KillCoroutines("keter"); EventHandlers.TeslasDisabled = false; TimerOn = false; if (Config.RandomEvents) { yield return(Timing.WaitForSeconds(Gen.Next(Config.DelayMin, Config.DelayMax))); } else { yield return(Timing.WaitForSeconds(Config.InitialDelay)); } } }
public static IEnumerator <float> InitBlackout() { yield return(Timing.WaitForSeconds(10f)); Methods.SendSubtitle(SanyaPlugin.Instance.Translation.BlackoutInit, 20); RespawnEffectsController.PlayCassieAnnouncement("warning . facility power system has been attacked . all most containment zones light does not available until generator activated .", false, true); foreach (var x in FlickerableLightController.Instances) { x.ServerFlickerLights(5f); } yield return(Timing.WaitForSeconds(3f)); foreach (var i in FlickerableLightController.Instances.Where(x => x.transform.root?.name != "Outside")) { i.Network_warheadLightOverride = true; i.Network_warheadLightColor = new Color(0f, 0f, 0f); } yield break; }
public new void ServerOnlyAddGlitchyPhrase(string tts, float glitchChance, float jamChance) { if (PMConfigFile.cassieGlitch || (PMConfigFile.cassieGlitchDetonation && AlphaWarheadController.Host.detonated)) { string[] array = tts.Split(' '); List <string> newWords = new List <string>(); newWords.EnsureCapacity(array.Length); for (int i = 0; i < array.Length; i++) { newWords.Add(array[i]); if (i < array.Length - 1) { if (PMConfigFile.cassieGlitch || PMConfigFile.cassieGlitchDetonation && AlphaWarheadController.Host.detonated) { if (UnityEngine.Random.value < glitchChance * 2) { newWords.Add(".G" + UnityEngine.Random.Range(1, 7)); } if (UnityEngine.Random.value < jamChance * 2) { newWords.Add(string.Concat(new object[] { "JAM_", UnityEngine.Random.Range(0, 70).ToString("000"), "_", UnityEngine.Random.Range(2, 6) })); } } } } tts = ""; foreach (string str in newWords) { tts = tts + str + " "; } } RespawnEffectsController.PlayCassieAnnouncement(tts, false, true); }
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); } }
/// <summary> /// Reproduce a C.A.S.S.I.E message after a certain amount of seconds. /// </summary> /// <param name="message">The message to be reproduced.</param> /// <param name="delay">The seconds that have to pass, before reproducing the message.</param> /// <param name="isHeld">Indicates whether C.A.S.S.I.E has to hold the message.</param> /// <param name="isNoisy">Indicates whether C.A.S.S.I.E has to make noises or not during the message.</param> public static void DelayedMessage(string message, float delay, bool isHeld = false, bool isNoisy = true) { Timing.CallDelayed(delay, () => RespawnEffectsController.PlayCassieAnnouncement(message, isHeld, isNoisy)); }
/// <summary> /// Reproduce a C.A.S.S.I.E message. /// </summary> /// <param name="message">The message to be reproduced.</param> /// <param name="isHeld">Indicates whether C.A.S.S.I.E has to hold the message.</param> /// <param name="isNoisy">Indicates whether C.A.S.S.I.E has to make noises or not during the message.</param> public static void Message(string message, bool isHeld = false, bool isNoisy = true) => RespawnEffectsController.PlayCassieAnnouncement(message, isHeld, isNoisy);
/*internal void ConsoleCmd(ConsoleCommandEvent ev) * { * if (ev.Player.GetRole() == RoleType.Scp079) * { * string[] args = ev.Command.Split(' '); * if (args[0].Equals(plugin.CommandPrefix)) * { * if (args.Length == 2) * { * if (args[1].ToLower().Equals("help") || args[1].ToLower().Equals("commands") || args[1].ToLower().Equals("?")) * { * ev.ReturnMessage = plugin.HelpMsgTitle + "\n" + * "\"." + plugin.CommandPrefix + " a1\" - " + plugin.HelpMsgA1 + " - " + plugin.A1Power + "+ AP - Tier " + (plugin.A1Tier + 1) + "+\n" + * "\"." + plugin.CommandPrefix + " a2\" - " + plugin.HelpMsgA2 + " - " + plugin.A2Power + "+ AP - Tier " + (plugin.A2Tier + 1) + "+\n" + * "\"." + plugin.CommandPrefix + " a3\" - " + plugin.HelpMsgA3 + " - " + plugin.A3Power + "+ AP - Tier " + (plugin.A3Tier + 1) + "+\n" + * "\"." + plugin.CommandPrefix + " a4\" - " + plugin.HelpMsgA4 + " - " + plugin.A4Power + "+ AP - Tier " + (plugin.A4Tier + 1) + "+\n"; * return; * } * * if (args[1].ToLower().Equals("a1")) * { * if (ev.Player.scp079PlayerScript.NetworkcurLvl < plugin.A1Tier) * { * ev.ReturnMessage = plugin.TierRequiredMsg.Replace("$tier", "" + (plugin.A1Tier + 1)); * return; * } * if (ev.Player.scp079PlayerScript.NetworkcurMana >= plugin.A1Power) * { * ev.Player.scp079PlayerScript.NetworkcurMana -= plugin.A1Power; * } * else * { * ev.ReturnMessage = plugin.NoPowerMsg; * return; * } * var cams = GetSCPCameras(); * if (cams.Count > 0) * { * Camera079 cam = cams[UnityEngine.Random.Range(0, cams.Count)]; * ev.Player.scp079PlayerScript.CmdSwitchCamera(cam.cameraId, false); * ev.ReturnMessage = plugin.RunA1Msg; * return; * } * else * { * ev.ReturnMessage = plugin.FailA1Msg; * ev.Player.scp079PlayerScript.NetworkcurMana += plugin.A1Power; * return; * } * } * * if (args[1].ToLower().Equals("a2")) * { * if (ev.Player.scp079PlayerScript.NetworkcurLvl < plugin.A2Tier) * { * ev.ReturnMessage = plugin.TierRequiredMsg.Replace("$tier", "" + (plugin.A2Tier + 1)); * return; * } * if (ev.Player.scp079PlayerScript.NetworkcurMana >= plugin.A2Power) * { * ev.Player.scp079PlayerScript.NetworkcurMana -= plugin.A2Power; * } * else * { * ev.ReturnMessage = plugin.NoPowerMsg; * return; * } * if (Time.timeSinceLevelLoad - a2cooldown < plugin.A2Cooldown) * { * ev.Player.scp079PlayerScript.NetworkcurMana += plugin.A2Power; * ev.ReturnMessage = plugin.FailA2Msg; * return; * } * Room room = SCP079Room(ev.Player); * if (room == null) * { * ev.Player.scp079PlayerScript.NetworkcurMana += plugin.A2Power; * ev.ReturnMessage = plugin.FailA2Msg; * return; * } * if (room.Zone == ZoneType.Surface) * { * ev.Player.scp079PlayerScript.NetworkcurMana += plugin.A2Power; * ev.ReturnMessage = plugin.FailA2Msg; * return; * } * foreach (var item in plugin.A2BlacklistRooms) * { * if (room.Name.ToLower().Contains(item.ToLower())) * { * ev.Player.scp079PlayerScript.NetworkcurMana += plugin.A2Power; * ev.ReturnMessage = plugin.FailA2Msg; * return; * } * } * Timing.RunCoroutine(GasRoom(room, ev.Player)); * ev.ReturnMessage = plugin.RunA2Msg; * return; * } * * if (args[1].ToLower().Equals("a3")) * { * if (ev.Player.scp079PlayerScript.NetworkcurLvl < plugin.A3Tier) * { * ev.ReturnMessage = plugin.TierRequiredMsg.Replace("$tier", "" + (plugin.A3Tier + 1)); * return; * } * if (ev.Player.scp079PlayerScript.NetworkcurMana >= plugin.A3Power) * { * ev.Player.scp079PlayerScript.NetworkcurMana -= plugin.A3Power; * } * else * { * ev.ReturnMessage = plugin.NoPowerMsg; * return; * } * Generator079.Generators[0].RpcCustomOverchargeForOurBeautifulModCreators(plugin.A3Timer, false); * ev.ReturnMessage = plugin.RunA3Msg; * return; * } * * if (args[1].ToLower().Equals("a4")) * { * if (ev.Player.scp079PlayerScript.NetworkcurLvl < plugin.A4Tier) * { * ev.ReturnMessage = plugin.TierRequiredMsg.Replace("$tier", "" + (plugin.A4Tier + 1)); * return; * } * if (ev.Player.scp079PlayerScript.NetworkcurMana >= plugin.A4Power) * { * ev.Player.scp079PlayerScript.NetworkcurMana -= plugin.A4Power; * } * else * { * ev.ReturnMessage = plugin.NoPowerMsg; * return; * } * var pos = ev.Player.scp079PlayerScript.currentCamera.transform.position; * GrenadeManager gm = ev.Player.GetComponent<GrenadeManager>(); * GrenadeSettings settings = gm.availableGrenades.FirstOrDefault(g => g.inventoryID == ItemType.GrenadeFlash); * FlashGrenade flash = GameObject.Instantiate(settings.grenadeInstance).GetComponent<FlashGrenade>(); * flash.fuseDuration = 0.5f; * flash.InitData(gm, Vector3.zero, Vector3.zero, 1f); * flash.transform.position = pos; * NetworkServer.Spawn(flash.gameObject); * ev.ReturnMessage = plugin.RunA4Msg; * return; * } * ev.ReturnMessage = plugin.HelpMsg.Replace("$prefix", "" + plugin.CommandPrefix); * return; * } * ev.ReturnMessage = plugin.HelpMsg.Replace("$prefix", "" + plugin.CommandPrefix); * return; * } * } * }*/ public static IEnumerator <float> GasRoom(Room room, ReferenceHub scp) { a2cooldown = Time.timeSinceLevelLoad; if (!Better079Plugin.instance.Config.b079_a2_disable_cassie) { string str = ".g4 "; for (int i = Better079Plugin.instance.Config.b079_a2_timer; i > 0f; i--) { str += ". .g4 "; } RespawnEffectsController.PlayCassieAnnouncement(str, false, false); } List <Door> doors = Map.Doors.FindAll((d) => Vector3.Distance(d.transform.position, room.Position) <= 20f); foreach (var item in doors) { item.NetworkisOpen = true; item.Networklocked = true; } for (int i = Better079Plugin.instance.Config.b079_a2_timer; i > 0f; i--) { foreach (var ply in PlayerManager.players) { var player = new Player(ply); if (player.Team != Team.SCP && player.CurrentRoom != null && player.CurrentRoom.Transform == room.Transform) { player.ReferenceHub.hints.Show(new TextHint(Better079Plugin.instance.Config.b079_msg_a2_warn.Replace("$seconds", "" + i), new HintParameter[] { new StringHintParameter("") }, new HintEffect[] { HintEffectPresets.TrailingPulseAlpha(0.5f, 1f, 0.5f, 2f, 0f, 3) }, 1f)); //player.ClearBroadcasts(); //player.Broadcast(1, plugin.A2WarnMsg.Replace("$seconds", "" + i), true); //PlayerManager.localPlayer.GetComponent<MTFRespawn>().RpcPlayCustomAnnouncement(".g3", false, false); } } yield return(Timing.WaitForSeconds(1f)); } foreach (var item in doors) { item.NetworkisOpen = false; item.Networklocked = true; } foreach (var ply in PlayerManager.players) { var player = new Player(ply); if (player.Team != Team.SCP && player.CurrentRoom != null && player.CurrentRoom.Transform == room.Transform) { player.ReferenceHub.hints.Show(new TextHint(Better079Plugin.instance.Config.b079_msg_a2_active, new HintParameter[] { new StringHintParameter("") }, new HintEffect[] { HintEffectPresets.TrailingPulseAlpha(0.5f, 1f, 0.5f, 2f, 0f, 3) }, 5f)); } } for (int i = 0; i < Better079Plugin.instance.Config.b079_a2_gas_timer * 2; i++) { foreach (var ply in PlayerManager.players) { var player = new Player(ply); if (player.Team != Team.SCP && player.Role != RoleType.Spectator && player.CurrentRoom != null && player.CurrentRoom.Transform == room.Transform) { player.ReferenceHub.playerStats.HurtPlayer(new PlayerStats.HitInfo(10f, "WORLD", DamageTypes.Decont, 0), player.ReferenceHub.gameObject); if (player.Role == RoleType.Spectator) { scp.scp079PlayerScript.AddExperience(Better079Plugin.instance.Config.b079_a2_exp); } } } yield return(Timing.WaitForSeconds(0.5f)); } foreach (var item in doors) { item.Networklocked = false; } }
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 Spawn(RespawnManager __instance) { try { if (!RespawnWaveGenerator.SpawnableTeams.TryGetValue(__instance.NextKnownTeam, out var spawnableTeam) || __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 && !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>(); } var 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); } 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 players = list.Select(x => x.GetPlayer()).ToList(); var team = __instance.NextKnownTeam; SynapseController.Server.Events.Round.InvokeTeamRespawn(ref players, ref team, out var allow, out var id); if (!allow) { return(false); } if (team == SpawnableTeamType.None) { Server.Get.TeamManager.SpawnTeam(id, players); return(false); } list = players.Select(x => x.Hub).ToList(); __instance.NextKnownTeam = team; var que = new Queue <RoleType>(); spawnableTeam.GenerateQueue(que, list.Count); foreach (ReferenceHub referenceHub in list) { try { RoleType classid = que.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 * spawnableTeam.TicketRespawnCost, false); if (Respawning.NamingRules.UnitNamingRules.TryGetNamingRule(__instance.NextKnownTeam, out var unitNamingRule)) { unitNamingRule.GenerateNew(__instance.NextKnownTeam, out string 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); } catch (Exception e) { SynapseController.Server.Logger.Error($"Synapse-Event: TeamRespawn failed!!\n{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); }
public IEnumerator <float> doSupplyDrop() { while (true) { yield return(Timing.WaitForSeconds(Plugin.Config.SupplyIntervall)); if (Server.Get.Players.Count >= Plugin.Config.MinPlayersForSupply) { if (Plugin.Config.DoCassieAnnouncement) { Map.Get.GlitchedCassie(Plugin.Config.CassieAnnouncement); } if (Plugin.Config.IsOnlyCICar) { int i = r.Next(1, 101); if (i <= Plugin.Config.CiCarChance) { RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, SpawnableTeamType.ChaosInsurgency); if (Plugin.Config.DoBroadcast) { Map.Get.SendBroadcast(Plugin.Config.BroadcastDuration, Plugin.Config.BroadcastMessageCI); } yield return(Timing.WaitForSeconds(15f)); foreach (var items in Plugin.Config.Items) { items.Parse().Drop(ciSpawn); } } } if (!Plugin.Config.IsOnlyHelicopter) { int i = r.Next(1, 101); if (i <= Plugin.Config.CiCarChance) { RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, SpawnableTeamType.ChaosInsurgency); if (Plugin.Config.DoBroadcast) { Map.Get.SendBroadcast(Plugin.Config.BroadcastDuration, Plugin.Config.BroadcastMessageCI); } yield return(Timing.WaitForSeconds(15f)); foreach (var items in Plugin.Config.Items) { items.Parse().Drop(ciSpawn); } } else { RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, SpawnableTeamType.NineTailedFox); if (Plugin.Config.DoBroadcast) { Map.Get.SendBroadcast(Plugin.Config.BroadcastDuration, Plugin.Config.BroadcastMessageMTF); } yield return(Timing.WaitForSeconds(15f)); foreach (var items in Plugin.Config.Items) { items.Parse().Drop(ciSpawn); } } } else { RespawnEffectsController.ExecuteAllEffects(RespawnEffectsController.EffectType.Selection, SpawnableTeamType.NineTailedFox); if (Plugin.Config.DoBroadcast) { Map.Get.SendBroadcast(Plugin.Config.BroadcastDuration, Plugin.Config.BroadcastMessageMTF); } yield return(Timing.WaitForSeconds(15f)); foreach (var items in Plugin.Config.Items) { items.Parse().Drop(ciSpawn); } } yield return(Timing.WaitForOneFrame); } else { Server.Get.Logger.Info("Not enough players for a supplydrop, skipping"); } } }