예제 #1
0
        internal static void OnRoleChanged(ChangingRoleEventArgs ev)
        {
            if (ev.Player?.UserId == null || ev.Player.IsHost || !ev.Player.IsVerified || ev.Player.IPAddress == "127.0.0.WAN" || ev.Player.IPAddress == "127.0.0.1")
            {
                return;
            }

            if (ev.NewRole != RoleType.None && ev.NewRole != RoleType.Spectator)
            {
                Timing.CallDelayed(.5f, () => ev.Player.SpawnCurrentHat());
            }

            if (PauseRound || Round.ElapsedTime.Seconds < 5 || !RoundSummary.RoundInProgress() || !Helper.IsPlayerValid(ev.Player, true, false))
            {
                return;
            }

            if (ev.IsEscaped)
            {
                StatHandler.SendRequest(RequestType.Escape, "{\"playerid\": \"" + Helper.HandleId(ev.Player) + "\", \"role\": \"" + ((int)ev.Player.Role).ToString() + "\"}");
            }

            if (ev.NewRole == RoleType.None || ev.NewRole == RoleType.Spectator)
            {
                return;
            }

            StatHandler.SendRequest(RequestType.Spawn, "{\"playerid\": \"" + Helper.HandleId(ev.Player) + "\", \"spawnrole\": \"" + ((int)ev.NewRole).ToString() + "\"}");
        }
예제 #2
0
파일: Events.cs 프로젝트: iD4NG3R/PheggMod
        public void OnPlayerDie(PlayerDeathEvent ev)
        {
            if (!RoundSummary.RoundInProgress() || ev.Player.Teamclass().role == RoleType.Spectator)
            {
                return;
            }

            if (ev.Attacker == null)
            {
                DiscordLab.bot.NewMessage($"World killed {ev.Player.name} using {ev.DamageType.name}");
            }

            else if (ev.Attacker.userId == ev.Player.userId)
            {
                DiscordLab.bot.NewMessage($"{ev.Player.name} committed suicide with {ev.DamageType.name}");
            }

            else if (ev.Attacker.Teamclass().cleanTeam == ev.Player.Teamclass().cleanTeam)
            {
                DiscordLab.bot.NewMessage($"**Teamkill** \n```autohotkey\nPlayer: {ev.Attacker.Teamclass().role} {ev.Attacker.ToString()}"
                                          + $"\nKilled: {ev.Player.Teamclass().role} {ev.Player.ToString()}\nUsing: {ev.DamageType.name}```");
            }

            else if (ev.Player.Disarmed() > 0 && !ev.Attacker.gameObject.GetComponent <CharacterClassManager>().IsAnyScp())
            {
                DiscordLab.bot.NewMessage($"__Disarmed Kill__\n```autohotkey\nPlayer: {ev.Attacker.Teamclass().role} {ev.Attacker.ToString()}"
                                          + $"\nKilled: {ev.Player.Teamclass().role} {ev.Player.ToString()}\nUsing: {ev.DamageType.name}```");
            }

            else
            {
                DiscordLab.bot.NewMessage($"{ev.Attacker.Teamclass().role} {ev.Attacker.name} killed {ev.Player.Teamclass().role} {ev.Player.name} with {ev.DamageType.name}");
            }
        }
예제 #3
0
        public void OnPlayerDie(PlayerDeathEvent ev)
        {
            if (!RoundSummary.RoundInProgress() || ev.Player.roleType == RoleType.Spectator)
            {
                return;
            }

            if (ev.Attacker == null || ev.Attacker.isEmpty)
            {
                DiscordLab.bot.NewMessage($"WORLD killed {ev.Player.nameClean} using {ev.DamageType.name}");
            }
            else if (ev.Attacker.userId == ev.Player.userId)
            {
                DiscordLab.bot.NewMessage($"{ev.Player.nameClean} committed suicide with {ev.DamageType.name}");
            }
            else if (IsTeamDamage(ev.Player.team, ev.Attacker.team))
            {
                DiscordLab.bot.NewMessage($"**Teamkill** \n```autohotkey\nPlayer: {ev.Attacker.roleType} {ev.Attacker}"
                                          + $"\nKilled: {ev.Player.roleType} {ev.Player}\nUsing: {ev.DamageType.name}```");
            }
            else if (ev.Player.disarmed > -1 && !ev.Attacker.refHub.characterClassManager.IsAnyScp())
            {
                DiscordLab.bot.NewMessage($"__Disarmed Kill__\n```autohotkey\nPlayer: {ev.Attacker.roleType} {ev.Attacker}"
                                          + $"\nKilled: {ev.Player.roleType} {ev.Player}\nUsing: {ev.DamageType.name}```");
            }
            else if (ev.DamageType == DamageTypes.Flying)
            {
                DiscordLab.bot.NewMessage($"ANTICHEAT killed {ev.Attacker.nameClean} with code {ev.HitInfo.Attacker}");
            }

            else
            {
                DiscordLab.bot.NewMessage($"{ev.Attacker.roleType} {ev.Attacker.nameClean} killed {ev.Player.roleType} {ev.Player.nameClean} with {ev.DamageType.name}");
            }
        }
예제 #4
0
        public void OnPlayerHurt(PlayerHurtEvent ev)
        {
            if (!RoundSummary.RoundInProgress() || ev.Player.roleType == RoleType.Spectator)
            {
                return;
            }

            if (ev.Attacker == null || ev.Attacker.isEmpty)
            {
                return;
            }
            else if (ev.Attacker.userId == ev.Player.userId)
            {
                DiscordLab.bot.NewMessage($"{ev.Player.nameClean} self-harmed for {Math.Round(ev.Damage)} with {ev.DamageType.name}");
            }
            else if (IsTeamDamage(ev.Player.team, ev.Attacker.team))
            {
                DiscordLab.bot.NewMessage($"**{ev.Attacker.roleType} {ev.Attacker} attacked {ev.Player.roleType} {ev.Player} for {Math.Round(ev.Damage)} with {ev.DamageType.name}**");
            }
            else if (ev.Player.disarmed > -1 && !ev.Attacker.refHub.characterClassManager.IsAnyScp())
            {
                DiscordLab.bot.NewMessage($"__{ev.Attacker.roleType} {ev.Attacker} attacked {ev.Player.roleType} {ev.Player} for {Math.Round(ev.Damage)} with {ev.DamageType.name}__");
            }
            else
            {
                DiscordLab.bot.NewMessage($"{ev.Attacker.nameClean} -> {ev.Player.nameClean} -> {Math.Round(ev.Damage)} ({ev.DamageType.name})");
            }
        }
예제 #5
0
        public void OnDestroy()
        {
            orig_OnDestroy();

            ReferenceHub refHub = ReferenceHub.GetHub(gameObject);

            if (string.IsNullOrEmpty(refHub.characterClassManager.UserId) || !refHub.characterClassManager.UserId.Contains('@'))
            {
                return;
            }
            else
            {
                try
                {
                    Base.Debug("Triggering PlayerLeaveEvent");
                    PluginManager.TriggerEvent <IEventHandlerPlayerLeave>(new PlayerLeaveEvent(new PheggPlayer(this.gameObject)));
                }
                catch (Exception e)
                {
                    Base.Error($"Error triggering PlayerLeaveEvent: {e.InnerException}");
                }
            }

            //if (refHub.characterClassManager.IsAnyScp() && refHub.characterClassManager.CurClass != RoleType.Scp0492)
            //{
            //    bool HasBeenReplaced = false;

            //    foreach(var p in ReferenceHub.GetAllHubs())
            //    {
            //        if(p.Value.characterClassManager.CurClass == RoleType.Spectator && p.Value.serverRoles.over)
            //    }

            //    if (!HasBeenReplaced && SCP.ContainsKey(refHub.characterClassManager.CurClass))
            //    {
            //        SCPData data = new SCPData
            //        {
            //            roleType = refHub.characterClassManager.CurClass,
            //            health = refHub.playerStats.Health,
            //            artHealth = refHub.playerStats.syncArtificialHealth,
            //            position = refHub.playerMovementSync.RealModelPosition,

            //        };

            //        if(data.roleType == RoleType.Scp079)
            //        {
            //            data.exp = refHub.scp079PlayerScript.Exp;
            //            data.mana = refHub.scp079PlayerScript.Mana;
            //        }

            //        SCP.Add(data.roleType, data);
            //    }
            //}



            if (PlayerManager.players.Count - 1 < 1 && RoundSummary.RoundInProgress())
            {
                PMRoundSummary.RoundFix();
            }
        }
예제 #6
0
            public void OnDestroy()
            {
                orig_OnDestroy();

                CharacterClassManager player = this.GetComponent <CharacterClassManager>();
                NicknameSync          name   = this.GetComponent <NicknameSync>();

                if (string.IsNullOrEmpty(player.UserId) || !player.UserId.Contains('@'))
                {
                    return;
                }
                else
                {
                    try
                    {
                        Base.Debug("Triggering PlayerLeaveEvent");
                        PluginManager.TriggerEvent <IEventHandlerPlayerLeave>(new PlayerLeaveEvent(new PheggPlayer(this.gameObject)));
                    }
                    catch (Exception e)
                    {
                        Base.Error($"Error triggering PlayerLeaveEvent: {e.InnerException.ToString()}");
                    }
                }

                if (PlayerManager.players.Count - 1 < 1 && RoundSummary.RoundInProgress())
                {
                    PMRoundSummary.RoundFix();
                }
            }
예제 #7
0
        public void cmd_sinfo(CommandInfo info)
        {
            string playerCount    = $"{PlayerManager.players.Count} / {ConfigFile.ServerConfig.GetInt("max_players", 20)}";
            string roundCount     = Base.roundCount.ToString();
            string roundDuration  = RoundSummary.RoundInProgress() == true ? $"{new DateTime(TimeSpan.FromSeconds((DateTime.Now - (DateTime)Base.roundStartTime).TotalSeconds).Ticks):HH:mm:ss}" : "Round not started";
            string timeSinceStart = $"{new DateTime(TimeSpan.FromSeconds((double)(new decimal(Time.realtimeSinceStartup))).Ticks):HH:mm:ss}";
            string curPlayerID    = PlayerManager.localPlayer.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId.ToString();
            string memory         = $"{ ((GC.GetTotalMemory(false) / 1024) / 1024) } MB";


            //(double)(new decimal(Time.realtimeSinceStartup))

            string status = "Server status:"
                            + $"\nPlayer count: {playerCount}"
                            + $"\nRound count: {roundCount}"
                            + $"\nRound duration: {roundDuration}"
                            + $"\nTime since startup: {timeSinceStart}"
                            + $"\nCurrent PlayerID: {curPlayerID}"
                            + $"\nMemory usage: {memory}"
            ;


            if (info.gameObject != null)
            {
                info.commandSender.RaReply(info.commandName.ToUpper() + $"#{status}", true, true, "");
            }
            else
            {
                Base.Info(status);
            }

            //+ $"\nMemory usage: {GC.GetTotalMemory(false)}"
        }
예제 #8
0
파일: Events.cs 프로젝트: iD4NG3R/PheggMod
        public void OnPlayerHurt(PlayerHurtEvent ev)
        {
            if (!RoundSummary.RoundInProgress() || ev.Attacker == null || ev.Attacker.gameObject.GetComponent <CharacterClassManager>().SpawnProtected || ev.Player.Teamclass().role == RoleType.Spectator)
            {
                return;
            }

            if (ev.Attacker.userId == ev.Player.userId)
            {
                DiscordLab.bot.NewMessage($"{ev.Player.name} self-harmed for {Math.Round(ev.Damage)} with {ev.DamageType.name}");
            }

            else if (ev.Attacker.Teamclass().cleanTeam == ev.Player.Teamclass().cleanTeam)
            {
                DiscordLab.bot.NewMessage($"**{ev.Attacker.Teamclass().role} {ev.Attacker.ToString()} attacked {ev.Player.Teamclass().role} {ev.Player.ToString()} for {Math.Round(ev.Damage)} with {ev.DamageType.name}**");
            }

            else if (ev.Player.Disarmed() > 0 && !ev.Attacker.gameObject.GetComponent <CharacterClassManager>().IsAnyScp())
            {
                DiscordLab.bot.NewMessage($"__{ev.Attacker.Teamclass().role} {ev.Attacker.ToString()} attacked {ev.Player.Teamclass().role} {ev.Player.ToString()} for {Math.Round(ev.Damage)} with {ev.DamageType.name}__");
            }

            else
            {
                DiscordLab.bot.NewMessage($"{ev.Attacker.name} -> {ev.Player.name} -> {Math.Round(ev.Damage)} ({ev.DamageType.name})");
            }
        }
예제 #9
0
 public static void TriggerEvent(RoundSummary sum, RoundSummary.SumInfo_ClassList list_start, RoundSummary.SumInfo_ClassList list_finish, RoundSummary.LeadingTeam leadingTeam, int e_ds, int e_sc, int scp_kills, int round_cd)
 {
     //bool shouldstop = false;
     foreach (var type in types_update)
     {
         if (LabMod.GetObjectOfType(type) == null)
         {
             continue;
         }
         ((ILabModRoundEnd)LabMod.GetObjectOfType(type)).Event(sum, list_start, list_finish, leadingTeam, e_ds, e_sc, scp_kills, round_cd);
     }
     //stop = shouldstop;
 }
        private void UpdateRespawnCounter()
        {
            if (!RoundSummary.RoundInProgress() || player.Role != RoleType.Spectator)
            {
                return;
            }

            if (RespawnManager.CurrentSequence() == RespawnManager.RespawnSequencePhase.RespawnCooldown || RespawnManager.CurrentSequence() == RespawnManager.RespawnSequencePhase.PlayingEntryAnimations)
            {
                _respawnCounter = (int)Math.Truncate(RespawnManager.Singleton._timeForNextSequence - RespawnManager.Singleton._stopwatch.Elapsed.TotalSeconds);
            }
            else
            {
                _respawnCounter = 0;
            }
        }
예제 #11
0
        public static IEnumerator <float> CassieFacilityScanMessage()
        {
            yield return(Timing.WaitForSeconds(0.1f));

            if (CassieFacilityScan.Instance.Config.BroadcastAtStartOfRound)
            {
                Timing.RunCoroutine(Extension.DelayedCassieMessage(Extension.GenerateCassieMessage(), false, false, 0), "cassiefacilityscan_timer");
            }

            while (RoundSummary.RoundInProgress())
            {
                yield return(Timing.WaitForSeconds(480f));

                Timing.RunCoroutine(Extension.DelayedCassieMessage(Extension.GenerateCassieMessage(), false, false, 0),
                                    "cassiefacilityscan_timer");
            }
        }
예제 #12
0
    private void CmdRegisterEscape()
    {
        CharacterClassManager component = base.GetComponent <CharacterClassManager>();

        if (Vector3.Distance(base.transform.position, base.GetComponent <Escape>().worldPosition) < (float)(base.GetComponent <Escape>().radius * 2))
        {
            RoundSummary component2 = GameObject.Find("Host").GetComponent <RoundSummary>();
            if (this.klasy[component.curClass].team == Team.CDP)
            {
                component2.summary.classD_escaped++;
                this.SetPlayersClass(8, base.gameObject);
            }
            if (this.klasy[component.curClass].team == Team.RSC)
            {
                component2.summary.scientists_escaped++;
                this.SetPlayersClass(4, base.gameObject);
            }
        }
    }
예제 #13
0
        public void OnFinishingRecall(FinishingRecallEventArgs ev)
        {
            // Check if round is still in progress
            if (!RoundSummary.RoundInProgress())
            {
                return;
            }

            // Counter for every player the Doctor has cured.
            Scp049AbilityController.CureCounter++;

            if (Scp049AbilityController.CureCounter == Instance.Config.DoctorConfigs.MinCures)
            {
                // Notify the Doctor that the buff is now active.
                foreach (Player scp049 in Player.Get(RoleType.Scp049))
                {
                    scp049.HintDisplay.Show(new TextHint(Instance.Config.Translations.PassiveActivationMessage,
                                                         new HintParameter[] { new StringHintParameter("") }, null, 5f));
                }

                // Run the actual EngageBuff corouting every 5 seconds.
                Timing.RunCoroutine(Scp049AbilityController.EngageBuff(), "SCP049_Passive");
                Timing.RunCoroutine(Scp049AbilityController.StartCooldownTimer(), "SCP049_Active_Cooldown");
            }

            // Increase the percentage zombies get healed for by the HealthPercentageMultiplier if the config option is set to 1 (percentage of missing hp mode)
            if (Instance.Config.DoctorConfigs.HealType == 1 &&
                Scp049AbilityController.CureCounter > Instance.Config.DoctorConfigs.MinCures)
            {
                Scp049AbilityController.HealAmountPercentage *= Instance.Config.DoctorConfigs.HealPercentageMultiplier;
            }

            // Heal the doctor for the configured percentage if it's missing health if the config option for it is set to true
            if (Instance.Config.DoctorConfigs.AllowDocSelfHeal)
            {
                Scp049AbilityController.ApplySelfHeal(ev.Scp049,
                                                      Instance.Config.DoctorConfigs.DocMissingHealthPercentage);
            }
        }
예제 #14
0
        public static IEnumerator <float> ProcessServerSide(RoundSummary instance)
        {
            var roundSummary = instance;

            while (roundSummary != null)
            {
                while (RoundSummary.RoundLock || !RoundSummary.RoundInProgress() ||
                       roundSummary._keepRoundOnOne && PlayerManager.players.Count < 2)
                {
                    yield return(0.0f);
                }

                var newList = new RoundSummary.SumInfo_ClassList();

                foreach (var chrClassManager in PlayerManager.players.Where(gameObject => gameObject != null).Select(gameObject => gameObject.GetComponent <CharacterClassManager>()).Where(chrClassManager => chrClassManager.Classes.CheckBounds(chrClassManager.CurClass)))
                {
                    // ReSharper disable once SwitchStatementHandlesSomeKnownEnumValuesWithDefault
                    switch (chrClassManager.Classes.SafeGet(chrClassManager.CurClass).team)
                    {
                    case Team.SCP:
                        if (chrClassManager.CurClass == RoleType.Scp0492)
                        {
                            newList.zombies++;
                            continue;
                        }

                        newList.scps_except_zombies++;
                        continue;

                    case Team.MTF:
                        newList.mtf_and_guards++;
                        continue;

                    case Team.CHI:
                        newList.chaos_insurgents++;
                        continue;

                    case Team.RSC:
                        newList.scientists++;
                        continue;

                    case Team.CDP:
                        newList.class_ds++;
                        continue;

                    default:
                        continue;
                    }
                }

                newList.warhead_kills =
                    AlphaWarheadController.Host.detonated ? AlphaWarheadController.Host.warheadKills : -1;

                yield return(float.NegativeInfinity);

                newList.time = (int)Time.realtimeSinceStartup;
                yield return(float.NegativeInfinity);

                RoundSummary.roundTime = newList.time - roundSummary.classlistStart.time;

                var mtfSum   = newList.mtf_and_guards + newList.scientists;
                var chaosSum = newList.chaos_insurgents + newList.class_ds;
                var scpSum   = newList.scps_except_zombies + newList.zombies;

                var escapedDs         = (float)(roundSummary.classlistStart.class_ds == 0 ? 0 : (RoundSummary.escaped_ds + newList.class_ds) / roundSummary.classlistStart.class_ds);
                var escapedScientists = (float)(roundSummary.classlistStart.scientists == 0 ? 1 : (RoundSummary.escaped_scientists + newList.scientists) / roundSummary.classlistStart.scientists);

                var allow       = true;
                var forceEnd    = false;
                var teamChanged = false;
                var team        = RoundSummary.LeadingTeam.Draw;

                try
                {
                    Events.InvokeCheckRoundEnd(ref forceEnd, ref allow, ref team, ref teamChanged);
                }
                catch (Exception e)
                {
                    Log.Error($"CheckRoundEnd err: {e}");
                    continue;
                }

                if (forceEnd)
                {
                    roundSummary._roundEnded = true;
                }

                if (!allow)
                {
                    continue;
                }

                if (newList.class_ds == 0 && mtfSum == 0)
                {
                    roundSummary._roundEnded = true;
                }

                else if (mtfSum == 0 && Respawning.RespawnTickets.Singleton.GetAvailableTickets(Respawning.SpawnableTeamType.NineTailedFox) == 0)
                {
                    roundSummary._roundEnded = true;
                }

                else
                {
                    //Okay. SCP hat hier einfach wirklich nur Staub gefressen oder so.
                    var checkVar = 0;

                    if (mtfSum > 0)
                    {
                        checkVar++;
                    }
                    if (chaosSum > 0)
                    {
                        checkVar++;
                    }
                    if (scpSum > 0)
                    {
                        checkVar++;
                    }

                    if (checkVar <= 1)
                    {
                        roundSummary._roundEnded = true;
                    }
                }


                if (!roundSummary._roundEnded)
                {
                    continue;
                }
                var leadingTeam = RoundSummary.LeadingTeam.Draw;

                if (mtfSum > 0)
                {
                    if (RoundSummary.escaped_ds == 0 && RoundSummary.escaped_scientists != 0)
                    {
                        leadingTeam = RoundSummary.LeadingTeam.FacilityForces;
                    }
                }
                else
                {
                    leadingTeam = RoundSummary.escaped_ds != 0
                        ? RoundSummary.LeadingTeam.ChaosInsurgency
                        : RoundSummary.LeadingTeam.Anomalies;
                }

                if (teamChanged)
                {
                    leadingTeam = team;
                }

                var text = $"Round finished! Anomalies:{scpSum} | Chaos: {chaosSum} | Facility Forces: {mtfSum} | D escaped percentage: {escapedDs} | S escaped percentage: {escapedScientists}";

                GameCore.Console.AddLog(text, Color.gray);
                ServerLogs.AddLog(ServerLogs.Modules.Logger, text, ServerLogs.ServerLogType.GameEvent);

                for (byte i = 0; i < 75; i += 1)
                {
                    yield return(0f);
                }
                var timeToRoundRestart = Mathf.Clamp(ConfigFile.ServerConfig.GetInt("auto_round_restart_time", 10), 5, 1000);
                if (roundSummary != null)
                {
                    roundSummary.RpcShowRoundSummary(roundSummary.classlistStart, newList, leadingTeam, RoundSummary.escaped_ds, RoundSummary.escaped_scientists, RoundSummary.kills_by_scp, timeToRoundRestart);
                }
                int num7;
                for (var j = 0; j < 50 * (timeToRoundRestart - 1); j = num7 + 1)
                {
                    yield return(0f);

                    num7 = j;
                }
                roundSummary.RpcDimScreen();
                for (byte i = 0; i < 50; i += 1)
                {
                    yield return(0f);
                }
                PlayerManager.localPlayer.GetComponent <PlayerStats>().Roundrestart();
            }
        }
예제 #15
0
    public void SetRandomRoles()
    {
        MTFRespawn component = base.GetComponent <MTFRespawn>();

        if (base.isLocalPlayer && base.isServer)
        {
            List <GameObject> list    = new List <GameObject>();
            List <GameObject> list2   = new List <GameObject>();
            GameObject[]      players = PlayerManager.singleton.players;
            foreach (GameObject item in players)
            {
                list.Add(item);
            }
            while (list.Count > 0)
            {
                int index = UnityEngine.Random.Range(0, list.Count);
                list2.Add(list[index]);
                list.RemoveAt(index);
            }
            GameObject[] array2     = list2.ToArray();
            RoundSummary component2 = base.GetComponent <RoundSummary>();
            bool         flag       = false;
            if ((float)UnityEngine.Random.Range(0, 100) < this.ciPercentage)
            {
                flag = true;
            }
            for (int j = 0; j < array2.Length; j++)
            {
                int num = (this.forceClass != -1) ? this.forceClass : this.Find_Random_ID_Using_Defined_Team(this.classTeamQueue[j]);
                if (this.klasy[num].team == Team.CDP)
                {
                    component2.summary.classD_start++;
                }
                if (this.klasy[num].team == Team.RSC)
                {
                    component2.summary.scientists_start++;
                }
                if (this.klasy[num].team == Team.SCP)
                {
                    component2.summary.scp_start++;
                }
                if (num == 4)
                {
                    if (flag)
                    {
                        num = 8;
                    }
                    else
                    {
                        component.playersToNTF.Add(array2[j]);
                    }
                }
                if (TutorialManager.status)
                {
                    this.SetPlayersClass(14, base.gameObject);
                }
                else if (num != 4)
                {
                    this.SetPlayersClass(num, array2[j]);
                }
            }
            component.SummonNTF();
        }
    }
예제 #16
0
        public static IEnumerator <float> ProcessServerSide(RoundSummary instance)
        {
            while (instance != null)
            {
                while (Map.Get.Round.RoundLock || !RoundSummary.RoundInProgress() || (instance._keepRoundOnOne && Server.Get.Players.Count < 2) || Map.Get.Round.RoundLength.TotalSeconds <= 3)
                {
                    yield return(Timing.WaitForOneFrame);
                }

                var teams = new List <Team>();

                var customroles = new List <Synapse.Api.Roles.IRole>();

                var teamAmounts = 0;

                var leadingTeam = RoundSummary.LeadingTeam.Draw;

                var result = default(RoundSummary.SumInfo_ClassList);

                bool endround;

                foreach (var player in Server.Get.Players)
                {
                    if (player.CustomRole != null)
                    {
                        customroles.Add(player.CustomRole);
                    }

                    teams.Add(player.RealTeam);

                    switch (player.RealTeam)
                    {
                    case Team.SCP:
                        if (player.RoleID == (int)RoleType.Scp0492)
                        {
                            result.zombies++;
                        }
                        else
                        {
                            result.scps_except_zombies++;
                        }
                        break;

                    case Team.MTF:
                        result.mtf_and_guards++;
                        break;

                    case Team.CHI:
                        result.chaos_insurgents++;
                        break;

                    case Team.RSC:
                        result.scientists++;
                        break;

                    case Team.CDP:
                        result.class_ds++;
                        break;
                    }
                }

                if (teams.Contains(Team.MTF))
                {
                    teamAmounts++;
                }
                if (teams.Contains(Team.RSC))
                {
                    teamAmounts++;
                }
                if (teams.Contains(Team.CHI))
                {
                    teamAmounts++;
                }
                if (teams.Contains(Team.CDP))
                {
                    teamAmounts++;
                }
                if (teams.Contains(Team.SCP))
                {
                    teamAmounts++;
                }

                result.warhead_kills = Map.Get.Nuke.Detonated ? Map.Get.Nuke.NukeKills : -1;

                yield return(Timing.WaitForOneFrame);

                result.time = (int)Time.realtimeSinceStartup;

                yield return(Timing.WaitForOneFrame);

                RoundSummary.roundTime = result.time - instance.classlistStart.time;

                switch (teamAmounts)
                {
                case 0:
                case 1:
                    endround = true;
                    break;

                case 2:
                    if (teams.Contains(Team.CHI) && teams.Contains(Team.SCP))
                    {
                        endround = Server.Get.Configs.SynapseConfiguration.ChaosScpEnd;
                    }

                    else if (teams.Contains(Team.CHI) && teams.Contains(Team.CDP))
                    {
                        endround = true;
                    }

                    else if (teams.Contains(Team.MTF) && teams.Contains(Team.RSC))
                    {
                        endround = true;
                    }
                    else
                    {
                        endround = false;
                    }
                    break;

                default:
                    endround = false;
                    break;
                }

                foreach (var role in customroles)
                {
                    if (role.GetEnemys().Any(x => teams.Contains(x)))
                    {
                        endround = false;
                    }
                }

                if (RoundSummary.escaped_ds + teams.Count(x => x == Team.CDP) > 0)
                {
                    if (teams.Contains(Team.SCP) || teams.Contains(Team.CHI) || teams.Contains(Team.CHI))
                    {
                        leadingTeam = RoundSummary.LeadingTeam.ChaosInsurgency;
                    }
                }
                else
                {
                    if (teams.Contains(Team.MTF) || teams.Contains(Team.RSC))
                    {
                        if (RoundSummary.escaped_scientists + teams.Count(x => x == Team.RSC) > 0)
                        {
                            leadingTeam = RoundSummary.LeadingTeam.FacilityForces;
                        }
                    }
                    else
                    {
                        leadingTeam = RoundSummary.LeadingTeam.Anomalies;
                    }
                }

                try
                {
                    Server.Get.Events.Round.InvokeRoundCheckEvent(ref endround, ref leadingTeam);
                }
                catch (Exception e)
                {
                    Logger.Get.Error($"Synapse-Event: RoundCheckEvent failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                }


                if (endround || Map.Get.Round.Forceend)
                {
                    instance._roundEnded             = true;
                    Map.Get.Round.Forceend           = false;
                    FriendlyFireConfig.PauseDetector = true;

                    var dpercentage = (float)instance.classlistStart.class_ds == 0 ? 0 : RoundSummary.escaped_ds + result.class_ds / instance.classlistStart.class_ds;
                    var spercentage = (float)instance.classlistStart.scientists == 0 ? 0 : RoundSummary.escaped_scientists + result.scientists / instance.classlistStart.scientists;
                    var text        = $"Round finished! Anomalies: {teams.Where(x => x == Team.SCP).Count()} | Chaos: {teams.Where(x => x == Team.CHI || x == Team.CDP).Count()}" +
                                      $" | Facility Forces: {teams.Where(x => x == Team.MTF || x == Team.RSC).Count()} | D escaped percentage: {dpercentage} | S escaped percentage : {spercentage}";
                    GameCore.Console.AddLog(text, Color.gray, false);
                    ServerLogs.AddLog(ServerLogs.Modules.Logger, text, ServerLogs.ServerLogType.GameEvent, false);

                    for (byte i = 0; i < 75; i++)
                    {
                        yield return(0f);
                    }

                    var timeToRoundRestart = Mathf.Clamp(GameCore.ConfigFile.ServerConfig.GetInt("auto_round_restart_time", 10), 5, 1000);

                    Map.Get.Round.ShowRoundSummary(result, leadingTeam);

                    for (int j = 0; j < 50 * timeToRoundRestart; j++)
                    {
                        yield return(0f);
                    }

                    Map.Get.Round.DimScreens();

                    for (byte i = 0; i < 50; i++)
                    {
                        yield return(0f);
                    }

                    Map.Get.Round.RestartRound();
                }
            }
        }
예제 #17
0
        public async Task <IActionResult> NovaTentativaAutonomaAsync(Tentativa tentativa)
        {
            tentativa.IniciarTentativa();
            Repositorio.AddTentativa(tentativa);

            HttpClient         client         = MyHttpClient.Client;
            string             path           = "/api/NewGame";
            NewGameRequest     newGameRequest = new NewGameRequest(tentativa.Nickname, tentativa.Classe);
            string             json           = JsonConvert.SerializeObject(newGameRequest);
            HttpRequestMessage request        = new HttpRequestMessage(HttpMethod.Post, path);

            request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");
            HttpResponseMessage response = await client.SendAsync(request);

            if (!response.IsSuccessStatusCode)
            {
                return(Redirect("/"));
            }
            string json_r = await response.Content.ReadAsStringAsync();

            GameState gs = JsonConvert.DeserializeObject <GameState>(json_r);

            tentativa.AtualizarDados(gs);


            while (!tentativa.JogoFinalizado && gs.RoundNumber < 50)
            {
                tentativa.ExecutarAlgoritmo();
                if ((tentativa.Nickname == "auto3" && gs.RoundNumber >= 3) || (tentativa.Nickname == "auto7" && gs.RoundNumber >= 7))
                {
                    tentativa.Acao = Playeraction.Quit;

                    tentativa.FinalizarTentativa();
                }
                path = "/api/Play";
                PlayRequest playRequest = new PlayRequest(tentativa.Id, tentativa.Acao);
                json = JsonConvert.SerializeObject(playRequest);

                request         = new HttpRequestMessage(HttpMethod.Post, path);
                request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

                response = await client.SendAsync(request);

                if (!response.IsSuccessStatusCode)
                {
                    return(Redirect("/"));
                }
                json_r = await response.Content.ReadAsStringAsync();

                gs = JsonConvert.DeserializeObject <GameState>(json_r);

                if (tentativa.Acao != Playeraction.Quit)
                {
                    tentativa.AtualizarDados(gs);
                    tentativa.ExecutarAcao();
                }


                RoundSummary rs = new RoundSummary();
                rs.AtualizarDados(tentativa.Acao, tentativa.Posicao, tentativa.InimigosDerrotados, tentativa.InimigosFintados, tentativa.ContadorItensEncontrados, tentativa.ChaveNoBolso, tentativa.PontosDeVida, tentativa.PontosDeForca, tentativa.PontosDeSorte, tentativa.PocoesDeVida, tentativa.Resultado, tentativa.Ronda);
                tentativa.FinalizarRonda(rs);
            }

            return(View("JogoFinalizadoAutonomo", tentativa));
        }
예제 #18
0
 void ILabModRoundEnd.Event(RoundSummary sum, RoundSummary.SumInfo_ClassList list_start, RoundSummary.SumInfo_ClassList list_finish, RoundSummary.LeadingTeam leadingTeam, int e_ds, int e_sc, int scp_kills, int round_cd)
 {
 }
예제 #19
0
        public async Task <IActionResult> CriarJogo(NovoJogo j)
        {
            if (ModelState.IsValid)
            {
                Jogo JogoNovo = new Jogo(j.Nome, j.PerfilTipo, j.Autonomo);
                List <RoundSummary> rsList = new List <RoundSummary>();
                HttpClient          client = NewGameHttpClient.Client;
                string path = "/api/NewGame";

                NovoJogoApiRequest req  = new NovoJogoApiRequest(j.Nome, j.PerfilTipo);
                string             json = JsonConvert.SerializeObject(req);

                HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, path);
                request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

                HttpResponseMessage response = await client.SendAsync(request);

                if (!response.IsSuccessStatusCode)
                {
                    return(Redirect("/"));
                }

                string json_r = await response.Content.ReadAsStringAsync();

                GameStateApi gs = JsonConvert.DeserializeObject <GameStateApi>(json_r);

                JogoNovo.AtualizarJogo(gs);
                RepositorioJogos.AdicionarJogo(JogoNovo);
                if (JogoNovo.Autonomo == false)
                {
                    return(View("JogoIniciado", JogoNovo));
                }
                // SE FOR AUTONOMO fazer o ciclo while
                else
                {
                    while (gs.RoundNumber < JogoNovo.Rondas &&
                           (JogoNovo.Terminado == false))
                    {
                        HttpClient clientAuton = NewGameHttpClient.Client;
                        path = "/api/Play";

                        AtualizarJogoApiRequest ajAuton = new AtualizarJogoApiRequest(JogoNovo.GameID, JogoNovo.TomarAccao);
                        json = JsonConvert.SerializeObject(ajAuton);

                        request         = new HttpRequestMessage(HttpMethod.Post, path);
                        request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

                        response = await clientAuton.SendAsync(request);

                        if (!response.IsSuccessStatusCode)
                        {
                            return(Redirect("/"));
                        }

                        json_r = await response.Content.ReadAsStringAsync();

                        gs = JsonConvert.DeserializeObject <GameStateApi>(json_r);

                        JogoNovo.AtualizarJogo(gs);
                        RoundSummary rs = new RoundSummary(JogoNovo);
                        rsList.Add(rs);

                        //RoundSummary rs = new RoundSummary(JogoNovo, gs.RoundNumber);
                        //RepositorioRondas.AdicionarRonda(rs);
                    }
                    if (gs.RoundNumber == JogoNovo.Rondas)
                    {
                        client = NewGameHttpClient.Client;
                        path   = "/api/Play";

                        AtualizarJogoApiRequest aja = new AtualizarJogoApiRequest(JogoNovo.GameID, PlayerAction.Quit);
                        json = JsonConvert.SerializeObject(aja);

                        request         = new HttpRequestMessage(HttpMethod.Post, path);
                        request.Content = new StringContent(json, System.Text.Encoding.UTF8, "application/json");

                        response = await client.SendAsync(request);

                        if (!response.IsSuccessStatusCode)
                        {
                            return(Redirect("/"));
                        }

                        json_r = await response.Content.ReadAsStringAsync();

                        gs = JsonConvert.DeserializeObject <GameStateApi>(json_r);


                        JogoNovo.CalcularBonus();
                        JogoNovo.Desistiu      = true;
                        JogoNovo.ResultadoJogo = ResultadoJogo.Desistiu;
                        JogoNovo.Terminado     = true;
                    }
                    RondaFinal rf = new RondaFinal(JogoNovo);
                    rf.rsList = rsList;
                    return(View("DadosJogoAutonomo", rf));
                }
            }
            else
            {
                return(View());
            }
        }
예제 #20
0
파일: RoundEnd.cs 프로젝트: xRoier/EXILED
        private static IEnumerator<float> Process(RoundSummary roundSummary)
        {
            float time = Time.unscaledTime;
            while (roundSummary is not null)
            {
                yield return Timing.WaitForSeconds(2.5f);

                while (RoundSummary.RoundLock || !RoundSummary.RoundInProgress() || Time.unscaledTime - time < 15f || (roundSummary._keepRoundOnOne && PlayerManager.players.Count < 2))
                    yield return Timing.WaitForOneFrame;

                RoundSummary.SumInfo_ClassList newList = default;
                foreach (KeyValuePair<GameObject, ReferenceHub> keyValuePair in ReferenceHub.GetAllHubs())
                {
                    if (keyValuePair.Value is null)
                        continue;

                    CharacterClassManager component = keyValuePair.Value.characterClassManager;
                    if (component.Classes.CheckBounds(component.CurClass))
                    {
                        switch (component.CurRole.team)
                        {
                            case Team.SCP:
                                if (component.CurClass == RoleType.Scp0492)
                                    newList.zombies++;
                                else
                                    newList.scps_except_zombies++;
                                continue;
                            case Team.MTF:
                                newList.mtf_and_guards++;
                                continue;
                            case Team.CHI:
                                newList.chaos_insurgents++;
                                continue;
                            case Team.RSC:
                                newList.scientists++;
                                continue;
                            case Team.CDP:
                                newList.class_ds++;
                                continue;
                            default:
                                continue;
                        }
                    }
                }

                yield return Timing.WaitForOneFrame;
                newList.warhead_kills = AlphaWarheadController.Host.detonated ? AlphaWarheadController.Host.warheadKills : -1;
                yield return Timing.WaitForOneFrame;
                newList.time = (int)Time.realtimeSinceStartup;
                yield return Timing.WaitForOneFrame;
                RoundSummary.roundTime = newList.time - roundSummary.classlistStart.time;
                int num1 = newList.mtf_and_guards + newList.scientists;
                int num2 = newList.chaos_insurgents + newList.class_ds;
                int num3 = newList.scps_except_zombies + newList.zombies;
                int num4 = newList.class_ds + RoundSummary.EscapedClassD;
                int num5 = newList.scientists + RoundSummary.EscapedScientists;
                float num6 = (roundSummary.classlistStart.class_ds == 0) ? 0f : (num4 / roundSummary.classlistStart.class_ds);
                float num7 = (roundSummary.classlistStart.scientists == 0) ? 1f : (num5 / roundSummary.classlistStart.scientists);

                RoundSummary.SurvivingSCPs = newList.scps_except_zombies;

                if (newList.class_ds <= 0 && num1 <= 0)
                {
                    roundSummary.RoundEnded = true;
                }
                else
                {
                    int num8 = 0;
                    if (num1 > 0)
                        num8++;
                    if (num2 > 0)
                        num8++;
                    if (num3 > 0)
                        num8++;
                    if (num8 <= 1)
                        roundSummary.RoundEnded = true;
                }

                EndingRoundEventArgs endingRoundEventArgs = new(LeadingTeam.Draw, newList, roundSummary.RoundEnded);

                if (num1 > 0)
                    endingRoundEventArgs.LeadingTeam = RoundSummary.EscapedScientists >= RoundSummary.EscapedClassD ? LeadingTeam.FacilityForces : LeadingTeam.Draw;
                else if (num3 > 0)
                    endingRoundEventArgs.LeadingTeam = RoundSummary.EscapedClassD > RoundSummary.SurvivingSCPs ? LeadingTeam.ChaosInsurgency : (RoundSummary.SurvivingSCPs > RoundSummary.EscapedScientists ? LeadingTeam.Anomalies : LeadingTeam.Draw);
                else if (num2 > 0)
                    endingRoundEventArgs.LeadingTeam = RoundSummary.EscapedClassD >= RoundSummary.EscapedScientists ? LeadingTeam.ChaosInsurgency : LeadingTeam.Draw;

                Server.OnEndingRound(endingRoundEventArgs);

                roundSummary.RoundEnded = endingRoundEventArgs.IsRoundEnded && endingRoundEventArgs.IsAllowed;

                if (roundSummary.RoundEnded)
                {
                    FriendlyFireConfig.PauseDetector = true;
                    string str = "Round finished! Anomalies: " + num3 + " | Chaos: " + num2 + " | Facility Forces: " + num1 + " | D escaped percentage: " + num6 + " | S escaped percentage: : " + num7;
                    Console.AddLog(str, Color.gray, false);
                    ServerLogs.AddLog(ServerLogs.Modules.Logger, str, ServerLogs.ServerLogType.GameEvent);
                    yield return Timing.WaitForSeconds(1.5f);
                    int timeToRoundRestart = Mathf.Clamp(ConfigFile.ServerConfig.GetInt("auto_round_restart_time", 10), 5, 1000);

                    if (roundSummary is not null)
                    {
                        RoundEndedEventArgs roundEndedEventArgs = new(endingRoundEventArgs.LeadingTeam, newList, timeToRoundRestart);

                        Server.OnRoundEnded(roundEndedEventArgs);

                        roundSummary.RpcShowRoundSummary(roundSummary.classlistStart, roundEndedEventArgs.ClassList, (RoundSummary.LeadingTeam)roundEndedEventArgs.LeadingTeam, RoundSummary.EscapedClassD, RoundSummary.EscapedScientists, RoundSummary.KilledBySCPs, roundEndedEventArgs.TimeToRestart);
                    }

                    yield return Timing.WaitForSeconds(timeToRoundRestart - 1);
                    roundSummary.RpcDimScreen();
                    yield return Timing.WaitForSeconds(1f);
                    RoundRestart.InitiateRoundRestart();
                    yield break;
                }
            }
        }
        public IActionResult Index(NewGameApiRequest novoJogador)
        {
            if (ModelState.IsValid)
            {
                //Novo Jogo
                HttpClient          client   = MyHTTPClientNewGame.Client;
                string              path     = "/api/NewGame";
                HttpResponseMessage response = client.PostAsJsonAsync(path, novoJogador).Result;
                if (!response.IsSuccessStatusCode)
                {
                    return(View("Index"));
                }

                PlayApiResponse nr = response.Content.ReadAsAsync <PlayApiResponse>().Result;



                int rd = 0;
                if (nr.PlayerName == "auto1")
                {
                    rd = 1;
                }
                else if (nr.PlayerName == "auto3")
                {
                    rd = 3;
                }
                else if (nr.PlayerName == "auto10")
                {
                    rd = 10;
                }
                else if (nr.PlayerName == "auto0")
                {
                    rd = 100;
                }

                Repository.ClearRounds();



                // Ciclo de rondas
                while (nr.RoundCount < rd && nr.PlayerCredits >= 10)
                {
                    RoundSummary rs = new RoundSummary();
                    rs.Blackjack = false;

                    int initialBet = 0;
                    if (nr.PlayerCredits > 200)
                    {
                        initialBet = 50;
                    }
                    else if (nr.PlayerCredits > 100)
                    {
                        initialBet = 25;
                    }
                    else
                    {
                        initialBet = 10;
                    }

                    rs.InitialCredits = nr.PlayerCredits;

                    PlayApiRequest rq = new PlayApiRequest(nr.GameId, (int)PlayerAction.NewRound, initialBet);
                    response = client.PostAsJsonAsync("/api/Play", rq).Result;
                    if (!response.IsSuccessStatusCode)
                    {
                        return(View("Index"));
                    }

                    nr = response.Content.ReadAsAsync <PlayApiResponse>().Result;

                    rs.Rounds = nr.RoundCount + 1;

                    if (nr.RoundFinalResult == (int)RoundFinalResult.BlackJack)
                    {
                        rs.Blackjack = true;
                    }


                    //Jogadas
                    while (nr.PlayingRound == true && nr.PlayerCredits >= 10)
                    {
                        PlayerAction playerAction;

                        CardMethods card = new CardMethods();

                        int playerHand = card.ValueHands(nr.PlayerHand);
                        int dealerHand = card.ValueHands(nr.Dealerhand);

                        //if (card.ValueHands(nr.PlayerHand) >= 5 && card.ValueHands(nr.PlayerHand) <= 10)
                        //{
                        //    playerAction = PlayerAction.Double;
                        //    rs.Double = true;
                        //    rs.Bet = rs.Bet + rs.Bet;
                        //}
                        //else if (card.ValueHands(nr.PlayerHand) < 5 && card.ValueHands(nr.Dealerhand) == 11)
                        //    playerAction = PlayerAction.Surrender;
                        //else if (card.ValueHands(nr.PlayerHand) <= 16)
                        //    playerAction = PlayerAction.Hit;
                        //else if (card.ValueHands(nr.PlayerHand) >= 17)
                        //    playerAction = PlayerAction.Stand;
                        //else
                        //    playerAction = PlayerAction.Surrender;

                        if (dealerHand >= 9 && playerHand == 16)
                        {
                            playerAction = PlayerAction.Surrender;
                        }
                        else if (dealerHand == 10 && playerHand == 15)
                        {
                            playerAction = PlayerAction.Surrender;
                        }
                        else if (playerHand >= 17 && playerHand <= 21)
                        {
                            playerAction = PlayerAction.Stand;
                        }
                        else if (playerHand == 16 && dealerHand >= 7 && dealerHand <= 8)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 16 && dealerHand >= 2 && dealerHand <= 6)
                        {
                            playerAction = PlayerAction.Stand;
                        }
                        else if (playerHand == 15 && dealerHand == 11)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 15 && dealerHand >= 7 && dealerHand <= 9)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 15 && dealerHand >= 2 && dealerHand <= 6)
                        {
                            playerAction = PlayerAction.Stand;
                        }
                        else if (playerHand >= 12 && playerHand <= 14 && dealerHand >= 7)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand >= 13 && playerHand <= 14 && dealerHand >= 2 && dealerHand <= 6)
                        {
                            playerAction = PlayerAction.Stand;
                        }
                        else if (playerHand == 12 && dealerHand >= 4 && dealerHand <= 6)
                        {
                            playerAction = PlayerAction.Stand;
                        }
                        else if (playerHand == 12 && dealerHand >= 2 && dealerHand <= 3)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 11 && dealerHand == 11)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 11)
                        {
                            if (nr.PlayerCredits >= 10)
                            {
                                playerAction = PlayerAction.Double;
                                rs.Double    = true;
                                rs.Bet       = rs.Bet + rs.Bet;
                            }
                            else
                            {
                                playerAction = PlayerAction.Hit;
                            }
                        }
                        else if (playerHand == 10 && dealerHand >= 10)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 10)
                        {
                            if (nr.PlayerCredits >= 10)
                            {
                                playerAction = PlayerAction.Double;
                                rs.Double    = true;
                                rs.Bet       = rs.Bet + rs.Bet;
                            }
                            else
                            {
                                playerAction = PlayerAction.Hit;
                            }
                        }
                        else if (playerHand == 9 && dealerHand >= 7)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else if (playerHand == 9 && dealerHand >= 3)
                        {
                            if (nr.PlayerCredits >= 10)
                            {
                                playerAction = PlayerAction.Double;
                                rs.Double    = true;
                                rs.Bet       = rs.Bet + rs.Bet;
                            }
                            else
                            {
                                playerAction = PlayerAction.Hit;
                            }
                        }
                        else if (playerHand == 9)
                        {
                            playerAction = PlayerAction.Hit;
                        }
                        else
                        {
                            playerAction = PlayerAction.Hit;
                        }

                        PlayApiRequest req = new PlayApiRequest(nr.GameId, (int)playerAction, initialBet);
                        response = client.PostAsJsonAsync("/api/Play", req).Result;
                        if (!response.IsSuccessStatusCode)
                        {
                            return(View("Index"));
                        }

                        nr = response.Content.ReadAsAsync <PlayApiResponse>().Result;

                        if (playerAction == PlayerAction.Double)
                        {
                            rs.Bet = rs.Bet + rs.Bet;
                        }
                        else
                        {
                            rs.Bet = initialBet;
                        }

                        if (card.ValueHands(nr.Dealerhand) == 21 && nr.Dealerhand.Count == 2)
                        {
                            rs.DealerBlackjack = true;
                        }
                        else
                        {
                            rs.DealerBlackjack = false;
                        }
                    }

                    rs.RoundResult  = nr.RoundFinalResult;
                    rs.FinalCredits = nr.PlayerCredits;
                    Repository.AddRound(rs);
                }

                path = "/api/Play/rGAUUmCfk3vUgfSF/" + nr.GameId;
                HttpResponseMessage resp = client.GetAsync(path).Result;
                if (!resp.IsSuccessStatusCode)
                {
                    return(View("Index"));
                }
                nr = resp.Content.ReadAsAsync <PlayApiResponse>().Result;

                path = "/api/Quit";
                QuitApiRequest reqq = new QuitApiRequest(nr.GameId);
                response = client.PostAsJsonAsync(path, reqq).Result;
                if (!response.IsSuccessStatusCode)
                {
                    return(View("Index"));
                }

                List <RoundSummary> rounds = Repository.Rounds;

                GameSummary g = new GameSummary();
                g.Rounds  = nr.RoundCount;
                g.Credits = nr.PlayerCredits;
                foreach (RoundSummary r in rounds)
                {
                    g.AvgBet = r.Bet + g.AvgBet;
                    if (r.Bet > g.MaxBet)
                    {
                        g.MaxBet = r.Bet;
                    }
                    if (r.Bet < g.MinBet)
                    {
                        g.MinBet = r.Bet;
                    }
                    else
                    {
                        g.MinBet = 10;
                    }
                    if (r.RoundResult == (int)RoundResult.BlackJack)
                    {
                        g.PlayerBlackjack = g.PlayerBlackjack + 1;
                    }
                    if (r.DealerBlackjack == true)
                    {
                        g.DealerBlackjack = g.DealerBlackjack + 1;
                    }
                }
                g.AvgBet = g.AvgBet / rounds.Count();

                ViewBag.Game = g;

                return(View("Result", rounds));
            }
            else
            {
                return(View());
            }
        }
예제 #22
0
        private static bool Prefix(PlayerStats __instance, out bool __result, PlayerStats.HitInfo info, GameObject go, bool noTeamDamage = false, bool IsValidDamage = true)
        {
            try
            {
                __result = false;
                var player = go?.GetPlayer();
                var killer = __instance?.GetPlayer();
                if (player == null)
                {
                    return(false);
                }

                if (info.GetDamageType() == DamageTypes.Grenade)
                {
                    killer = SynapseController.Server.GetPlayer(info.PlayerId);
                }
                else if (info.GetDamageType() == DamageTypes.Pocket)
                {
                    killer = Server.Get.Players.FirstOrDefault(x => x.Scp106Controller.PocketPlayers.Contains(player));

                    if (SynapseExtensions.CanNotHurtByScp(player))
                    {
                        return(false);
                    }
                }

                bool         flag         = false;
                bool         flag2        = false;
                bool         flag3        = go == null;
                ReferenceHub referenceHub = flag3 ? null : ReferenceHub.GetHub(go);

                if (info.Amount < 0f)
                {
                    if (flag3)
                    {
                        info.Amount = Mathf.Abs(999999f);
                    }
                    else
                    {
                        info.Amount = ((referenceHub.playerStats != null) ? Mathf.Abs(referenceHub.playerStats.Health + referenceHub.playerStats.syncArtificialHealth + 10f) : Mathf.Abs(999999f));
                    }
                }

                if (__instance._burned.Enabled)
                {
                    info.Amount *= __instance._burned.DamageMult;
                }

                if (info.Amount > 2.14748365E+09f)
                {
                    info.Amount = 2.14748365E+09f;
                }

                if (info.GetDamageType().isWeapon&& referenceHub.characterClassManager.IsAnyScp() && info.GetDamageType() != DamageTypes.MicroHid)
                {
                    info.Amount *= __instance.weaponManager.weapons[(int)__instance.weaponManager.curWeapon].scpDamageMultiplier;
                }

                if (flag3)
                {
                    __result = false;
                    return(false);
                }

                PlayerStats           playerStats           = referenceHub.playerStats;
                CharacterClassManager characterClassManager = referenceHub.characterClassManager;

                if (playerStats == null || characterClassManager == null)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.GodMode)
                {
                    __result = false;
                    return(false);
                }

                if (__instance.ccm.CurRole.team == Team.SCP && __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team == Team.SCP && __instance.ccm != characterClassManager)
                {
                    __result = false;
                    return(false);
                }

                if (characterClassManager.SpawnProtected && !__instance._allowSPDmg)
                {
                    __result = false;
                    return(false);
                }

                bool flag4 = !noTeamDamage && info.IsPlayer && referenceHub != info.RHub && referenceHub.characterClassManager.Fraction == info.RHub.characterClassManager.Fraction;

                if (flag4)
                {
                    info.Amount *= PlayerStats.FriendlyFireFactor;
                }

                float health = playerStats.Health;

                if (__instance.lastHitInfo.Attacker == "ARTIFICIALDEGEN")
                {
                    playerStats.unsyncedArtificialHealth -= info.Amount;
                    if (playerStats.unsyncedArtificialHealth < 0f)
                    {
                        playerStats.unsyncedArtificialHealth = 0f;
                    }
                }
                else
                {
                    var allow = true;
                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDamageEvent(player, killer, ref info, out allow);
                    }
                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (!allow)
                    {
                        __result = false;
                        return(false);
                    }

                    if (playerStats.unsyncedArtificialHealth > 0f)
                    {
                        float num  = info.Amount * playerStats.artificialNormalRatio;
                        float num2 = info.Amount - num;
                        playerStats.unsyncedArtificialHealth -= num;
                        if (playerStats.unsyncedArtificialHealth < 0f)
                        {
                            num2 += Mathf.Abs(playerStats.unsyncedArtificialHealth);
                            playerStats.unsyncedArtificialHealth = 0f;
                        }
                        playerStats.Health -= num2;
                        if (playerStats.Health > 0f && playerStats.Health - num <= 0f && characterClassManager.CurRole.team != Team.SCP)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "didntevenfeelthat");
                        }
                    }
                    else
                    {
                        playerStats.Health -= info.Amount;
                    }

                    if (playerStats.Health < 0f)
                    {
                        playerStats.Health = 0f;
                    }

                    playerStats.lastHitInfo = info;
                }
                PlayableScpsController component = go.GetComponent <PlayableScpsController>();
                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable)
                {
                    damagable.OnDamage(info);
                }

                if (playerStats.Health < 1f && characterClassManager.CurClass != RoleType.Spectator)
                {
                    if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IImmortalScp immortalScp && !immortalScp.OnDeath(info, __instance.gameObject))
                    {
                        __result = false;
                        return(false);
                    }
                    foreach (Scp079PlayerScript scp079PlayerScript in Scp079PlayerScript.instances)
                    {
                        Scp079Interactable.ZoneAndRoom otherRoom = go.GetComponent <Scp079PlayerScript>().GetOtherRoom();
                        bool flag5 = false;
                        foreach (Scp079Interaction scp079Interaction in scp079PlayerScript.ReturnRecentHistory(12f, __instance._filters))
                        {
                            foreach (Scp079Interactable.ZoneAndRoom zoneAndRoom in scp079Interaction.interactable.currentZonesAndRooms)
                            {
                                if (zoneAndRoom.currentZone == otherRoom.currentZone && zoneAndRoom.currentRoom == otherRoom.currentRoom)
                                {
                                    flag5 = true;
                                }
                            }
                        }

                        if (flag5)
                        {
                            scp079PlayerScript.RpcGainExp(ExpGainType.KillAssist, characterClassManager.CurClass);
                        }
                    }

                    if (RoundSummary.RoundInProgress() && RoundSummary.roundTime < 60 && IsValidDamage)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "wowreally");
                    }

                    if (__instance.isLocalPlayer && info.PlayerId != referenceHub.queryProcessor.PlayerId)
                    {
                        RoundSummary.Kills++;
                    }

                    flag = true;

                    if (characterClassManager.CurClass == RoleType.Scp096)
                    {
                        ReferenceHub hub = ReferenceHub.GetHub(go);

                        if (hub != null && hub.scpsController.CurrentScp is PlayableScps.Scp096 && (hub.scpsController.CurrentScp as PlayableScps.Scp096).PlayerState == PlayableScps.Scp096PlayerState.Enraging)
                        {
                            __instance.TargetAchieve(characterClassManager.connectionToClient, "unvoluntaryragequit");
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "newb");
                    }
                    else if (info.GetDamageType() == DamageTypes.Scp173)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "firsttime");
                    }
                    else if (info.GetDamageType() == DamageTypes.Grenade && info.PlayerId == referenceHub.queryProcessor.PlayerId)
                    {
                        __instance.TargetAchieve(characterClassManager.connectionToClient, "iwanttobearocket");
                    }
                    else if (info.GetDamageType().isWeapon)
                    {
                        Inventory inventory = referenceHub.inventory;
                        if (characterClassManager.CurClass == RoleType.Scientist)
                        {
                            Item itemByID = inventory.GetItemByID(inventory.curItem);
                            if (itemByID != null && itemByID.itemCategory == ItemCategory.Keycard && __instance.GetComponent <CharacterClassManager>().CurClass == RoleType.ClassD)
                            {
                                __instance.TargetAchieve(__instance.connectionToClient, "betrayal");
                            }
                        }

                        if (Time.realtimeSinceStartup - __instance._killStreakTime > 30f || __instance._killStreak == 0)
                        {
                            __instance._killStreak     = 0;
                            __instance._killStreakTime = Time.realtimeSinceStartup;
                        }

                        if (__instance.GetComponent <WeaponManager>().GetShootPermission(characterClassManager, true))
                        {
                            __instance._killStreak++;
                        }

                        if (__instance._killStreak >= 5)
                        {
                            __instance.TargetAchieve(__instance.connectionToClient, "pewpew");
                        }

                        if ((__instance.ccm.CurRole.team == Team.MTF || __instance.ccm.Classes.SafeGet(__instance.ccm.CurClass).team == Team.RSC) && characterClassManager.CurClass == RoleType.ClassD)
                        {
                            __instance.TargetStats(__instance.connectionToClient, "dboys_killed", "justresources", 50);
                        }
                    }
                    else if (__instance.ccm.CurRole.team == Team.SCP && go.GetComponent <MicroHID>().CurrentHidState != MicroHID.MicroHidState.Idle)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "illpassthanks");
                    }

                    if (player.RealTeam == Team.RSC && player.RealTeam == Team.SCP)
                    {
                        __instance.TargetAchieve(__instance.connectionToClient, "timetodoitmyself");
                    }

                    bool flag6 = info.IsPlayer && referenceHub == info.RHub;
                    flag2 = flag4;

                    if (flag6)
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " committed a suicide using ",
                            info.GetDamageName(),
                            "."
                        }), ServerLogs.ServerLogType.Suicide, false);
                    }
                    else
                    {
                        ServerLogs.AddLog(ServerLogs.Modules.ClassChange, string.Concat(new string[]
                        {
                            referenceHub.LoggedNameFromRefHub(),
                            " playing as ",
                            referenceHub.characterClassManager.CurRole.fullName,
                            " has been killed by ",
                            info.Attacker,
                            " using ",
                            info.GetDamageName(),
                            info.IsPlayer ? (" playing as " + info.RHub.characterClassManager.CurRole.fullName + ".") : "."
                        }), flag2 ? ServerLogs.ServerLogType.Teamkill : ServerLogs.ServerLogType.KillLog, false);
                    }

                    if (info.GetDamageType().isScp || info.GetDamageType() == DamageTypes.Pocket)
                    {
                        RoundSummary.kills_by_scp++;
                    }

                    else if (info.GetDamageType() == DamageTypes.Grenade)
                    {
                        RoundSummary.kills_by_frag++;
                    }

                    try
                    {
                        Server.Get.Events.Player.InvokePlayerDeathEvent(player, killer, info);
                    }

                    catch (Exception e)
                    {
                        SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDeath Event failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                    }

                    if (!__instance._pocketCleanup || info.GetDamageType() != DamageTypes.Pocket)
                    {
                        referenceHub.inventory.ServerDropAll();
                        PlayerMovementSync playerMovementSync = referenceHub.playerMovementSync;
                        if (characterClassManager.Classes.CheckBounds(characterClassManager.CurClass) && info.GetDamageType() != DamageTypes.RagdollLess)
                        {
                            __instance.GetComponent <RagdollManager>().SpawnRagdoll(go.transform.position, go.transform.rotation, (playerMovementSync == null) ? Vector3.zero : playerMovementSync.PlayerVelocity, (int)characterClassManager.CurClass, info, characterClassManager.CurRole.team > Team.SCP, go.GetComponent <Dissonance.Integrations.MirrorIgnorance.MirrorIgnorancePlayer>().PlayerId, referenceHub.nicknameSync.DisplayName, referenceHub.queryProcessor.PlayerId);
                        }
                    }
                    else
                    {
                        referenceHub.inventory.Clear();
                    }

                    characterClassManager.NetworkDeathPosition = go.transform.position;

                    if (characterClassManager.CurRole.team == Team.SCP)
                    {
                        if (characterClassManager.CurClass == RoleType.Scp0492)
                        {
                            NineTailedFoxAnnouncer.CheckForZombies(go);
                        }
                        else
                        {
                            GameObject x = null;
                            foreach (GameObject gameObject in PlayerManager.players)
                            {
                                if (gameObject.GetComponent <RemoteAdmin.QueryProcessor>().PlayerId == info.PlayerId)
                                {
                                    x = gameObject;
                                }
                            }
                            if (x != null)
                            {
                                NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, string.Empty);
                            }
                            else
                            {
                                DamageTypes.DamageType damageType = info.GetDamageType();
                                if (damageType == DamageTypes.Tesla)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "TESLA");
                                }
                                else if (damageType == DamageTypes.Nuke)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "WARHEAD");
                                }
                                else if (damageType == DamageTypes.Decont)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "DECONTAMINATION");
                                }
                                else if (characterClassManager.CurClass != RoleType.Scp079)
                                {
                                    NineTailedFoxAnnouncer.AnnounceScpTermination(characterClassManager.CurRole, info, "UNKNOWN");
                                }
                            }
                        }
                    }

                    playerStats.SetHPAmount(100);
                    characterClassManager.SetClassID(RoleType.Spectator);

                    player.CustomRole = null;
                    foreach (var larry in Server.Get.Players.Where(x => x.Scp106Controller.PocketPlayers.Contains(player)))
                    {
                        larry.Scp106Controller.PocketPlayers.Remove(player);
                    }
                }
                else
                {
                    Vector3 pos  = Vector3.zero;
                    float   num3 = 40f;
                    if (info.GetDamageType().isWeapon)
                    {
                        GameObject playerOfID = __instance.GetPlayerOfID(info.PlayerId);
                        if (playerOfID != null)
                        {
                            pos  = go.transform.InverseTransformPoint(playerOfID.transform.position).normalized;
                            num3 = 100f;
                        }
                    }
                    else if (info.GetDamageType() == DamageTypes.Pocket)
                    {
                        PlayerMovementSync component2 = __instance.ccm.GetComponent <PlayerMovementSync>();
                        if (component2.RealModelPosition.y > -1900f)
                        {
                            component2.OverridePosition(Vector3.down * 1998.5f, 0f, true);
                        }
                    }
                    __instance.TargetBloodEffect(go.GetComponent <NetworkIdentity>().connectionToClient, pos, Mathf.Clamp01(info.Amount / num3));
                }
                Respawning.RespawnTickets singleton = Respawning.RespawnTickets.Singleton;
                Team team = characterClassManager.CurRole.team;
                byte b    = (byte)team;
                if (b != 0)
                {
                    if (b == 3)
                    {
                        if (flag)
                        {
                            Team team2 = __instance.ccm.Classes.SafeGet(characterClassManager.CurClass).team;
                            if (team2 == Team.CDP && team2 == Team.CHI)
                            {
                                singleton.GrantTickets(Respawning.SpawnableTeamType.ChaosInsurgency, __instance._respawn_tickets_ci_scientist_died_count, false);
                            }
                        }
                    }
                }
                else if (characterClassManager.CurClass != RoleType.Scp0492)
                {
                    for (float num4 = 1f; num4 > 0f; num4 -= __instance._respawn_tickets_mtf_scp_hurt_interval)
                    {
                        float num5 = (float)playerStats.maxHP * num4;
                        if (health > num5 && playerStats.Health < num5)
                        {
                            singleton.GrantTickets(Respawning.SpawnableTeamType.NineTailedFox, __instance._respawn_tickets_mtf_scp_hurt_count, false);
                        }
                    }
                }

                if (component != null && (object)component.CurrentScp is PlayableScps.Interfaces.IDamagable damagable2)
                {
                    damagable2.OnDamage(info);
                }

                if (!flag4 || FriendlyFireConfig.PauseDetector || PermissionsHandler.IsPermitted(info.RHub.serverRoles.Permissions, PlayerPermissions.FriendlyFireDetectorImmunity))
                {
                    __result = flag;
                    return(false);
                }

                if (FriendlyFireConfig.IgnoreClassDTeamkills && referenceHub.characterClassManager.CurRole.team == Team.CDP && info.RHub.characterClassManager.CurRole.team == Team.CDP)
                {
                    __result = flag;
                    return(false);
                }

                if (flag2)
                {
                    if (info.RHub.FriendlyFireHandler.Respawn.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Window.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Life.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                    if (info.RHub.FriendlyFireHandler.Round.RegisterKill())
                    {
                        __result = flag;
                        return(false);
                    }
                }

                if (info.RHub.FriendlyFireHandler.Respawn.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Window.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                if (info.RHub.FriendlyFireHandler.Life.RegisterDamage(info.Amount))
                {
                    __result = flag;
                    return(false);
                }

                info.RHub.FriendlyFireHandler.Round.RegisterDamage(info.Amount);
                __result = flag;
                return(false);
            }
            catch (Exception e)
            {
                SynapseController.Server.Logger.Error($"Synapse-Event: PlayerDamage Patch failed!!\n{e}\nStackTrace:\n{e.StackTrace}");
                __result = false;
                return(true);
            }
        }
예제 #23
0
        internal static void OnThrow(ThrowingGrenadeEventArgs ev)
        {
            if (ev.Player?.UserId == null || ev.Player.IsHost || !ev.Player.IsVerified || ev.Player.IPAddress == "127.0.0.WAN" || ev.Player.IPAddress == "127.0.0.1" || PauseRound || !Helper.IsPlayerValid(ev.Player) || !RoundSummary.RoundInProgress() || !ev.IsAllowed)
            {
                return;
            }

            StatHandler.SendRequest(RequestType.Use, "{\"playerid\": \"" + Helper.HandleId(ev.Player) + "\", \"itemid\": \"" + ((int)ev.GrenadeManager.availableGrenades[(int)ev.Type].inventoryID).ToString() + "\"}");
        }
예제 #24
0
        internal static void OnUse(UsedMedicalItemEventArgs ev)
        {
            if (ev.Player?.UserId == null || ev.Player.IsHost || !ev.Player.IsVerified || ev.Player.IPAddress == "127.0.0.WAN" || ev.Player.IPAddress == "127.0.0.1" || PauseRound || !Helper.IsPlayerValid(ev.Player) || !RoundSummary.RoundInProgress())
            {
                return;
            }

            StatHandler.SendRequest(RequestType.Use, "{\"playerid\": \"" + Helper.HandleId(ev.Player) + "\", \"itemid\": \"" + ((int)ev.Item).ToString() + "\"}");
        }
예제 #25
0
        internal static void OnKill(DyingEventArgs ev)
        {
            if (ev.Target?.UserId == null || ev.Target.IsHost || !ev.Target.IsVerified || PauseRound || !ev.IsAllowed || !Helper.IsPlayerValid(ev.Target, false) || !RoundSummary.RoundInProgress())
            {
                return;
            }

            if (!ev.Target.DoNotTrack && ev.Target.IPAddress != "127.0.0.WAN" && ev.Target.IPAddress != "127.0.0.1")
            {
                StatHandler.SendRequest(RequestType.Death, "{\"playerid\": \"" + Helper.HandleId(ev.Target) + "\", \"killerrole\": \"" + (ev.Killer == null ? ((int)ev.Target.Role).ToString() : ((int)ev.Killer.Role).ToString()) + "\", \"playerrole\": \"" + ((int)ev.Target.Role).ToString() + "\", \"damagetype\": \"" + DamageTypes.ToIndex(ev.HitInformation.GetDamageType()).ToString() + "\"}");
            }

            if (ev.HitInformation.GetDamageType() == DamageTypes.Pocket && PocketPlayers.TryGetValue(Helper.HandleId(ev.Target), out var killer))
            {
                StatHandler.SendRequest(RequestType.Kill, "{\"playerid\": \"" + killer + "\", \"targetrole\": \"" + ((int)ev.Target.Role).ToString() + "\", \"playerrole\": \"" + ((int)RoleType.Scp106).ToString() + "\", \"damagetype\": \"" + DamageTypes.ToIndex(ev.HitInformation.GetDamageType()).ToString() + "\"}");
                return;
            }

            if (ev.Killer?.UserId == null || ev.Killer.IsHost || !ev.Killer.IsVerified || ev.Killer.IPAddress == "127.0.0.WAN" || ev.Killer.IPAddress == "127.0.0.1" || ev.Killer.RawUserId == ev.Target.RawUserId || ev.Killer.DoNotTrack || !Helper.IsPlayerValid(ev.Killer, false))
            {
                return;
            }

            StatHandler.SendRequest(RequestType.Kill, "{\"playerid\": \"" + Helper.HandleId(ev.Killer) + "\", \"targetrole\": \"" + ((int)ev.Target.Role).ToString() + "\", \"playerrole\": \"" + ((int)ev.Killer.Role).ToString() + "\", \"damagetype\": \"" + DamageTypes.ToIndex(ev.HitInformation.GetDamageType()).ToString() + "\"}");
        }
예제 #26
0
파일: RoundEnd.cs 프로젝트: o5zereth/EXILED
        private static IEnumerator <float> Process(RoundSummary roundSummary)
        {
            while (roundSummary != null)
            {
                while (RoundSummary.RoundLock || !RoundSummary.RoundInProgress() || (roundSummary._keepRoundOnOne && PlayerManager.players.Count < 2))
                {
                    yield return(0.0f);
                }
                yield return(0.0f);

                RoundSummary.SumInfo_ClassList newList = default;
                foreach (GameObject player in PlayerManager.players)
                {
                    if (!(player == null))
                    {
                        CharacterClassManager component = player.GetComponent <CharacterClassManager>();
                        if (component.Classes.CheckBounds(component.CurClass))
                        {
                            switch (component.Classes.SafeGet(component.CurClass).team)
                            {
                            case Team.SCP:
                                if (component.CurClass == RoleType.Scp0492)
                                {
                                    ++newList.zombies;
                                    continue;
                                }

                                ++newList.scps_except_zombies;
                                continue;

                            case Team.MTF:
                                ++newList.mtf_and_guards;
                                continue;

                            case Team.CHI:
                                ++newList.chaos_insurgents;
                                continue;

                            case Team.RSC:
                                ++newList.scientists;
                                continue;

                            case Team.CDP:
                                ++newList.class_ds;
                                continue;

                            default:
                                continue;
                            }
                        }
                    }
                }

                newList.warhead_kills = AlphaWarheadController.Host.detonated ? AlphaWarheadController.Host.warheadKills : -1;
                yield return(float.NegativeInfinity);

                newList.time = (int)Time.realtimeSinceStartup;
                yield return(float.NegativeInfinity);

                RoundSummary.roundTime = newList.time - roundSummary.classlistStart.time;
                int   num1 = newList.mtf_and_guards + newList.scientists;
                int   num2 = newList.chaos_insurgents + newList.class_ds;
                int   num3 = newList.scps_except_zombies + newList.zombies;
                float num4 = roundSummary.classlistStart.class_ds == 0 ? 0.0f : (RoundSummary.escaped_ds + newList.class_ds) / roundSummary.classlistStart.class_ds;
                float num5 = roundSummary.classlistStart.scientists == 0 ? 1f : (RoundSummary.escaped_scientists + newList.scientists) / roundSummary.classlistStart.scientists;

                if (newList.class_ds == 0 && num1 == 0)
                {
                    roundSummary._roundEnded = true;
                }
                else
                {
                    int num6 = 0;
                    if (num1 > 0)
                    {
                        ++num6;
                    }
                    if (num2 > 0)
                    {
                        ++num6;
                    }
                    if (num3 > 0)
                    {
                        ++num6;
                    }
                    if (num6 <= 1)
                    {
                        roundSummary._roundEnded = true;
                    }
                }

                var endingRoundEventArgs = new EndingRoundEventArgs(LeadingTeam.Draw, newList, roundSummary._roundEnded);

                if (num1 > 0)
                {
                    if (RoundSummary.escaped_ds == 0 && RoundSummary.escaped_scientists != 0)
                    {
                        endingRoundEventArgs.LeadingTeam = LeadingTeam.FacilityForces;
                    }
                }
                else
                {
                    endingRoundEventArgs.LeadingTeam = RoundSummary.escaped_ds != 0 ? LeadingTeam.ChaosInsurgency : LeadingTeam.Anomalies;
                }

                Server.OnEndingRound(endingRoundEventArgs);

                roundSummary._roundEnded = endingRoundEventArgs.IsRoundEnded && endingRoundEventArgs.IsAllowed;

                if (roundSummary._roundEnded)
                {
                    FriendlyFireConfig.PauseDetector = true;
                    string str = "Round finished! Anomalies: " + num3 + " | Chaos: " + num2 + " | Facility Forces: " + num1 + " | D escaped percentage: " + num4 + " | S escaped percentage: : " + num5;
                    Console.AddLog(str, Color.gray, false);
                    ServerLogs.AddLog(ServerLogs.Modules.Logger, str, ServerLogs.ServerLogType.GameEvent);
                    byte i1;
                    for (i1 = 0; i1 < 75; ++i1)
                    {
                        yield return(0.0f);
                    }
                    int timeToRoundRestart = Mathf.Clamp(ConfigFile.ServerConfig.GetInt("auto_round_restart_time", 10), 5, 1000);

                    if (roundSummary != null)
                    {
                        newList.scps_except_zombies -= newList.zombies;

                        var roundEndedEventArgs = new RoundEndedEventArgs(endingRoundEventArgs.LeadingTeam, newList, timeToRoundRestart);

                        Server.OnRoundEnded(roundEndedEventArgs);

                        roundSummary.RpcShowRoundSummary(roundSummary.classlistStart, roundEndedEventArgs.ClassList, (RoundSummary.LeadingTeam)roundEndedEventArgs.LeadingTeam, RoundSummary.escaped_ds, RoundSummary.escaped_scientists, RoundSummary.kills_by_scp, roundEndedEventArgs.TimeToRestart);
                    }

                    for (int i2 = 0; i2 < 50 * (timeToRoundRestart - 1); ++i2)
                    {
                        yield return(0.0f);
                    }
                    roundSummary.RpcDimScreen();
                    for (i1 = 0; i1 < 50; ++i1)
                    {
                        yield return(0.0f);
                    }
                    PlayerManager.localPlayer.GetComponent <PlayerStats>().Roundrestart();
                    yield break;
                }
            }
        }
예제 #27
0
        internal static void OnPickup(PickingUpItemEventArgs ev)
        {
            if (!ev.Pickup || !ev.Pickup.gameObject)
            {
                return;
            }

            if (ev.Pickup.gameObject.TryGetComponent <HatItemComponent>(out _))
            {
                ev.IsAllowed = false;
                return;
            }

            if (ev.Player?.UserId == null || ev.Player.IsHost || !ev.Player.IsVerified || ev.Player.IPAddress == "127.0.0.WAN" || ev.Player.IPAddress == "127.0.0.1" || PauseRound || !Helper.IsPlayerValid(ev.Player) || !RoundSummary.RoundInProgress() || !ev.IsAllowed)
            {
                return;
            }

            StatHandler.SendRequest(RequestType.Pickup, "{\"playerid\": \"" + Helper.HandleId(ev.Player) + "\", \"itemid\": \"" + ((int)ev.Pickup.itemId).ToString() + "\"}");
        }