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() + "\"}"); }
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}"); } }
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}"); } }
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})"); } }
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(); } }
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(); } }
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)}" }
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})"); } }
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; } }
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"); } }
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); } } }
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); } }
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(); } }
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(); } }
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(); } } }
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)); }
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) { }
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()); } }
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()); } }
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); } }
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() + "\"}"); }
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() + "\"}"); }
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() + "\"}"); }
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; } } }
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() + "\"}"); }