Пример #1
0
        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.
                }
            }
        }
Пример #2
0
        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);
        }
Пример #3
0
        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);
            }
        }
Пример #4
0
 /// <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);
     }
 }
Пример #5
0
        /// <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);
        }
Пример #6
0
        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));
                }
            }
        }
Пример #7
0
        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;
        }
Пример #8
0
 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);
 }
Пример #9
0
        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);
            }
        }
Пример #10
0
 /// <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));
 }
Пример #11
0
 /// <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);
Пример #12
0
        /*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;
            }
        }
Пример #13
0
        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);
            }
        }
Пример #14
0
        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);
            }
        }
Пример #15
0
        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);
        }
Пример #16
0
        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");
                }
            }
        }