private static bool Prefix(RespawnTickets __instance, ref SpawnableTeamType __result)
        {
            bool flag = false;

            foreach (KeyValuePair <GameObject, ReferenceHub> allHub in ReferenceHub.GetAllHubs())
            {
                if ((allHub.Value.characterClassManager.CurClass == RoleType.Spectator &&
                     !allHub.Value.serverRoles.OverwatchEnabled) || API.IsGhost(Player.Get(allHub.Value)))
                {
                    flag = true;
                    break;
                }
            }

            if (!flag)
            {
                __result = SpawnableTeamType.None;
            }
            List <SpawnableTeamType> list1 = ListPool <SpawnableTeamType> .Shared.Rent();

            List <SpawnableTeamType> list2 = ListPool <SpawnableTeamType> .Shared.Rent();

            foreach (KeyValuePair <SpawnableTeamType, int> ticket in __instance._tickets)
            {
                if (ticket.Value > 0)
                {
                    for (int index = 0; index < ticket.Value; ++index)
                    {
                        list1.Add(ticket.Key);
                    }
                }
                else
                {
                    if (ticket.Value == 0 &&
                        RespawnWaveGenerator.SpawnableTeams.TryGetValue(ticket.Key, out var spawnableTeam) &&
                        spawnableTeam.LockUponZero)
                    {
                        list2.Add(ticket.Key);
                    }
                }
            }

            while (list2.Count > 0)
            {
                __instance._tickets[list2[0]] = -1;
                list2.RemoveAt(0);
            }

            int num = list1.Count == 0 ? 1 : (int)list1[Random.Range(0, list1.Count)];

            ListPool <SpawnableTeamType> .Shared.Return(list1);

            ListPool <SpawnableTeamType> .Shared.Return(list2);

            __result = (SpawnableTeamType)num;
            return(false);
        }
Ejemplo n.º 2
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 = 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);
                        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);
                    }

                    __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);
            }
        }
Ejemplo n.º 3
0
        private static bool Prefix(CharacterClassManager __instance)
        {
            var ev = new ExtendedEscapingEventArgs(Player.Get(__instance._hub));

            EventHandlers.OnEscaping(ev); // i can do that now, neato
            Exiled.Events.Handlers.Player.OnEscaping(ev);

            if (!ev.IsAllowed)
            {
                return(false);
            }

            var cuffed = false;

            foreach (DisarmedPlayers.DisarmedEntry entry in DisarmedPlayers.Entries.Where(entry =>
                                                                                          entry.DisarmedPlayer == __instance._hub.networkIdentity.netId))
            {
                if (entry.Disarmer == 0U)
                {
                    cuffed = CharacterClassManager.ForceCuffedChangeTeam;
                    break;
                }

                if (ReferenceHub.TryGetHubNetID(entry.Disarmer, out ReferenceHub hub))
                {
                    CharacterClassManager characterClassManager = hub.characterClassManager;
                    if (__instance.Faction == Faction.FoundationStaff &&
                        characterClassManager.Faction == Faction.FoundationEnemy ||
                        __instance.Faction == Faction.FoundationEnemy &&
                        characterClassManager.Faction == Faction.FoundationStaff)
                    {
                        cuffed = true;
                    }
                }
                else
                {
                    break;
                }
            }

            RespawnTickets singleton = RespawnTickets.Singleton;

            switch (__instance.CurRole.team)
            {
            case Team.RSC:
                if (cuffed)
                {
                    ++RoundSummary.EscapedClassD;
                    singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency,
                                           ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_scientist_cuffed_count", 2));
                    __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: false, changeTeam: true);
                    break;
                }

                ++RoundSummary.EscapedScientists;
                singleton.GrantTickets(SpawnableTeamType.NineTailedFox,
                                       ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_scientist_count", 1));
                __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: false, changeTeam: false);
                break;

            case Team.CDP:
                if (cuffed)
                {
                    ++RoundSummary.EscapedScientists;
                    singleton.GrantTickets(SpawnableTeamType.NineTailedFox,
                                           ConfigFile.ServerConfig.GetInt("respawn_tickets_mtf_classd_cuffed_count", 1));
                    __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: true, changeTeam: true);

                    break;
                }

                ++RoundSummary.EscapedClassD;
                singleton.GrantTickets(SpawnableTeamType.ChaosInsurgency,
                                       ConfigFile.ServerConfig.GetInt("respawn_tickets_ci_classd_count", 1));
                __instance.GetComponent <Escape>().TargetShowEscapeMessage(__instance.connectionToClient, isClassD: true, changeTeam: false);
                break;
            }

            if (ev.ClearInventory)
            {
                ev.Player.ClearInventory();
            }
            ev.Player.SetRole(ev.NewRole, SpawnReason.Escaped);

            return(false);
        }