Some mods may be broken due to the recent Alloyed Collective update.
Decompiled source of PlayerRespawnSystem v2.0.5
PlayerRespawnSystem.dll
Decompiled a year agousing System; using System.Collections.Generic; using System.Diagnostics; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using EntityStates; using EntityStates.Missions.BrotherEncounter; using On.EntityStates.Missions.BrotherEncounter; using On.RoR2; using On.RoR2.UI; using R2API; using R2API.Utils; using RoR2; using RoR2.UI; using TMPro; using UnityEngine; using UnityEngine.Networking; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: AssemblyCompany("PlayerRespawnSystem")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: AssemblyInformationalVersion("1.0.0+0ce7bfe1fd69d2a2f0adc383d27fb84a060e4177")] [assembly: AssemblyProduct("PlayerRespawnSystem")] [assembly: AssemblyTitle("PlayerRespawnSystem")] [assembly: AssemblyVersion("1.0.0.0")] namespace Mordrog; public static class ChatHelper { private const string GrayColor = "7e91af"; private const string RedColor = "ff0000"; private const string YellowColor = "ffff00"; private const string GreenColor = "32cd32"; private const string SilverColor = "c0c0c0"; public static void TimedRespawnBlockedOnStage() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown string baseToken = "<color=#7e91af>Timed respawns are blocked on this stage.</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } public static void RespawnBlockedOnTPEvent() { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Expected O, but got Unknown string baseToken = "<color=#7e91af>Respawns are blocked on teleporter event.</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } public static void UserWillRespawnAfterTPEvent(string userName) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown string baseToken = "<color=#32cd32>" + userName + "</color> <color=#7e91af>will respawn after teleporter event</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } public static void UserWillRespawnAfterMithrixFight(string userName) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown string baseToken = "<color=#32cd32>" + userName + "</color> <color=#7e91af>will respawn after mithrix fight</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } public static void UserWillRespawnAfterArtifactTrial(string userName) { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown string baseToken = "<color=#32cd32>" + userName + "</color> <color=#7e91af>will respawn after artifact trial</color>"; Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } public static void UserWillRespawnAfter(string userName, uint respawnTime) { //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown string baseToken = string.Format("<color=#{0}>{1}</color> <color=#{2}>will respawn in {3} seconds</color>", "32cd32", userName, "7e91af", respawnTime); Chat.SendBroadcastChat((ChatMessageBase)new SimpleChatMessage { baseToken = baseToken }); } } public static class UsersHelper { public static NetworkUser GetUser(NetworkUserId userId) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) return ((IEnumerable<NetworkUser>)NetworkUser.readOnlyInstancesList).FirstOrDefault((Func<NetworkUser, bool>)delegate(NetworkUser u) { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) NetworkUserId id = u.id; return ((NetworkUserId)(ref id)).Equals(userId); }); } public static NetworkUser GetUser(CharacterMaster master) { return ((IEnumerable<NetworkUser>)NetworkUser.readOnlyInstancesList).FirstOrDefault((Func<NetworkUser, bool>)((NetworkUser u) => (Object)(object)u.master == (Object)(object)master)); } } internal static class RespawnPosition { public static Vector3 GetSpawnPositionAroundTeleporter(CharacterBody body, float minSpawnRadius, float maxSpawnRadius) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004d: Unknown result type (might be due to invalid IL or missing references) //IL_005f: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; int num = 0; do { if (num++ > 1000) { return Vector3.zero; } zero = ((Component)TeleporterInteraction.instance).transform.position; zero += GetRandomPositionInCircle(minSpawnRadius, maxSpawnRadius); } while (!TryUpdateToProperPositionOnStage(ref zero, body.radius)); return new Vector3(zero.x, zero.y + Util.GetBodyPrefabFootOffset(((Component)body).gameObject), zero.z); } public static Vector3 GetSpawnPositionAroundMoonBoss(CharacterBody body, float minSpawnRadius, float maxSpawnRadius) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_002e: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0037: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) Vector3 zero = Vector3.zero; int num = 0; do { if (num++ > 1000) { return Vector3.zero; } zero = GameObject.Find("ArenaWalls").transform.position; zero += GetRandomPositionInCircle(minSpawnRadius, maxSpawnRadius); } while (!TryUpdateToProperPositionOnStage(ref zero, body.radius)); return new Vector3(zero.x, zero.y + Util.GetBodyPrefabFootOffset(((Component)body).gameObject), zero.z); } private static Vector3 GetRandomPositionInCircle(float minRadius, float maxRadius) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0038: Unknown result type (might be due to invalid IL or missing references) Vector2 insideUnitCircle = Random.insideUnitCircle; Vector3 val = Vector2.op_Implicit(((Vector2)(ref insideUnitCircle)).normalized * Random.Range(minRadius, maxRadius)); val.z = val.y; val.y = 0f; return val; } private static bool TryUpdateToProperPositionOnStage(ref Vector3 position, float maxRadiusAroundPosition) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0027: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) RaycastHit val = default(RaycastHit); Ray val2 = new Ray(position + Vector3.up * 2f, Vector3.down); float num = 4f; if (Physics.SphereCast(val2, maxRadiusAroundPosition, ref val, num, LayerMask.op_Implicit(((LayerIndex)(ref LayerIndex.world)).mask))) { position.y += 2f - ((RaycastHit)(ref val)).distance; return true; } return false; } } public enum RespawnTimeType { StageTimeBased, GameTimeBased } internal static class RespawnTimeCalculation { public static uint GetRespawnTime() { uint num = PluginConfig.StartingRespawnTime.Value; switch (PluginConfig.RespawnTimeType.Value) { case RespawnTimeType.StageTimeBased: num += RespawnTimeBasedOnPassedStageTime(); break; case RespawnTimeType.GameTimeBased: num += RespawnTimeBasedOnPassedGameTime(); break; } return (uint)Mathf.Min((float)num, (float)PluginConfig.MaxRespawnTime.Value); } private static uint RespawnTimeBasedOnPassedStageTime() { return (GameSecondsPassed() - StageEntrySeconds()) / PluginConfig.UpdateCurrentRespawnTimeEveryXSeconds.Value * PluginConfig.UpdateCurrentRepsawnTimeByXSeconds.Value; } private static uint RespawnTimeBasedOnPassedGameTime() { return GameSecondsPassed() / PluginConfig.UpdateCurrentRespawnTimeEveryXSeconds.Value * PluginConfig.UpdateCurrentRepsawnTimeByXSeconds.Value; } private static uint StageEntrySeconds() { return (uint)(Object.op_Implicit((Object)(object)Stage.instance) ? Stage.instance.Network_entryStopwatchValue : 0f); } private static uint GameSecondsPassed() { return (uint)(Object.op_Implicit((Object)(object)Run.instance) ? Run.instance.GetRunStopwatch() : 0f); } } internal class UsersRespawnTimers : NetworkBehaviour { public delegate void UserTimerRespawnTimerEnd(NetworkUser user); private Dictionary<NetworkUserId, UserTimer> usersRespawnTimers = new Dictionary<NetworkUserId, UserTimer>(); public IReadOnlyDictionary<NetworkUserId, UserTimer> readOnlyInstances => usersRespawnTimers; public event UserTimerRespawnTimerEnd OnUserTimerRespawnTimerEnd; public void OnDestroy() { ClearAllUsersRespawnTimers(); } public void StartRespawnTimer(NetworkUserId userId, uint respawnTime) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (usersRespawnTimers.TryGetValue(userId, out var value)) { value.StartTimer(respawnTime); } } public void ResetRespawnTimer(NetworkUserId userId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) if (usersRespawnTimers.TryGetValue(userId, out var value)) { value.Reset(); } } public void StopAllCurrentRespawnTimers() { foreach (UserTimer value in usersRespawnTimers.Values) { value.Stop(); } } public void ResumeAllCurrentRespawnTimers() { foreach (UserTimer value in usersRespawnTimers.Values) { value.Resume(); } } public void ResetAllCurrentRespawnTimers() { foreach (UserTimer value in usersRespawnTimers.Values) { value.Reset(); } } public void ClearAllUsersRespawnTimers() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) foreach (NetworkUserId item in new List<NetworkUserId>(usersRespawnTimers.Keys)) { RemoveUserRespawnTimer(item); } } public void AddUserRespawnTimer(NetworkUserId userId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_005a: Unknown result type (might be due to invalid IL or missing references) if (!usersRespawnTimers.ContainsKey(userId)) { usersRespawnTimers[userId] = ((Component)this).gameObject.AddComponent<UserTimer>(); usersRespawnTimers[userId].UserId = userId; usersRespawnTimers[userId].OnTimerEndInFiveSeconds += UsersRespawnTimers_OnRespawnInFiveSeconds; usersRespawnTimers[userId].OnTimerEnd += UsersRespawnTimers_OnTimerEnd; } } public void RemoveUserRespawnTimer(NetworkUserId userId) { //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) if (usersRespawnTimers.TryGetValue(userId, out var value)) { value.OnTimerEndInFiveSeconds -= UsersRespawnTimers_OnRespawnInFiveSeconds; value.OnTimerEnd -= UsersRespawnTimers_OnTimerEnd; Object.DestroyImmediate((Object)(object)usersRespawnTimers[userId]); usersRespawnTimers.Remove(userId); } } private void UsersRespawnTimers_OnRespawnInFiveSeconds(NetworkUserId userId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) NetworkUser user = UsersHelper.GetUser(userId); if (Object.op_Implicit((Object)(object)user)) { ChatHelper.UserWillRespawnAfter(user.userName, 5u); } } private void UsersRespawnTimers_OnTimerEnd(NetworkUserId userId) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) NetworkUser user = UsersHelper.GetUser(userId); if (Object.op_Implicit((Object)(object)user)) { this.OnUserTimerRespawnTimerEnd?.Invoke(user); } } } internal class UserTimer : NetworkBehaviour { public delegate void TimerEndInFiveSeconds(NetworkUserId userId); public delegate void TimerEnd(NetworkUserId userId); private bool spawnInFiveSecondsFired; public float TimeRemaining { get; private set; } public NetworkUserId UserId { get; set; } public bool IsRunning { get; private set; } public event TimerEndInFiveSeconds OnTimerEndInFiveSeconds; public event TimerEnd OnTimerEnd; public void StartTimer(float time) { TimeRemaining = time; spawnInFiveSecondsFired = false; IsRunning = true; } public void Reset() { IsRunning = false; TimeRemaining = 0f; } public void Stop() { if (TimeRemaining > 0f) { IsRunning = false; } } public void Resume() { if (TimeRemaining > 0f) { IsRunning = true; } } public void Update() { //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_004f: Unknown result type (might be due to invalid IL or missing references) if (!IsRunning) { return; } if (TimeRemaining > 0f) { TimeRemaining -= Time.deltaTime; if (TimeRemaining <= 5f && !spawnInFiveSecondsFired) { spawnInFiveSecondsFired = true; this.OnTimerEndInFiveSeconds?.Invoke(UserId); } } else { Reset(); this.OnTimerEnd?.Invoke(UserId); } } } internal class UsersArtifactTrialRespawn : NetworkBehaviour { public UsersRespawnController respawnController; public void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown CombatState.OnEnter += new hook_OnEnter(ArtifactTrialMissionController_CombatState_OnEnter); CombatState.OnExit += new hook_OnExit(CombatState_OnExit); } public void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown CombatState.OnEnter -= new hook_OnEnter(ArtifactTrialMissionController_CombatState_OnEnter); CombatState.OnExit -= new hook_OnExit(CombatState_OnExit); } private void ArtifactTrialMissionController_CombatState_OnEnter(orig_OnEnter orig, EntityState self) { orig.Invoke(self); respawnController.RespawnType = RespawnType.Artifact; if (PluginConfig.RespawnOnArtifactTrialStart.Value) { respawnController.RespawnAllUsers(); } if (PluginConfig.BlockTimedRespawnOnArtifactTrial.Value) { respawnController.BlockTimedRespawn(); } } private void CombatState_OnExit(orig_OnExit orig, EntityState self) { orig.Invoke(self); if (PluginConfig.BlockTimedRespawnOnArtifactTrial.Value) { respawnController.UnblockTimedRespawn(); } if (PluginConfig.RespawnOnArtifactTrialEnd.Value) { respawnController.RespawnAllUsers(); } } } internal class UsersMithrixRespawn : NetworkBehaviour { public UsersRespawnController respawnController; public void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown Phase1.OnEnter += new hook_OnEnter(BrotherEncounter_Phase1_OnEnter); EncounterFinished.OnEnter += new hook_OnEnter(BrotherEncounter_EncounterFinished_OnEnter); } public void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown Phase1.OnEnter -= new hook_OnEnter(BrotherEncounter_Phase1_OnEnter); EncounterFinished.OnEnter -= new hook_OnEnter(BrotherEncounter_EncounterFinished_OnEnter); } private void BrotherEncounter_Phase1_OnEnter(orig_OnEnter orig, Phase1 self) { orig.Invoke(self); respawnController.RespawnType = RespawnType.Mithrix; if (PluginConfig.RespawnOnMithrixStart.Value) { respawnController.RespawnAllUsers(); } if (PluginConfig.BlockTimedRespawnOnMithrixFight.Value) { respawnController.BlockTimedRespawn(); } } private void BrotherEncounter_EncounterFinished_OnEnter(orig_OnEnter orig, EncounterFinished self) { orig.Invoke(self); if (PluginConfig.BlockTimedRespawnOnMithrixFight.Value) { respawnController.UnblockTimedRespawn(); } if (PluginConfig.RespawnOnMithrixEnd.Value) { respawnController.RespawnAllUsers(); } } } internal class UsersTeleporterRespawn : NetworkBehaviour { public UsersRespawnController respawnController; public void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown ChargingState.OnEnter += new hook_OnEnter(TeleporterInteraction_ChargingState_OnEnter); ChargedState.OnEnter += new hook_OnEnter(TeleporterInteraction_ChargedState_OnEnter); } public void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown ChargingState.OnEnter -= new hook_OnEnter(TeleporterInteraction_ChargingState_OnEnter); ChargedState.OnEnter -= new hook_OnEnter(TeleporterInteraction_ChargedState_OnEnter); } private void TeleporterInteraction_ChargingState_OnEnter(orig_OnEnter orig, BaseState self) { orig.Invoke(self); respawnController.RespawnType = RespawnType.Teleporter; if (PluginConfig.RespawnOnTPStart.Value) { respawnController.RespawnAllUsers(); } if (PluginConfig.BlockTimedRespawnOnTPEvent.Value) { respawnController.BlockTimedRespawn(); ChatHelper.RespawnBlockedOnTPEvent(); } } private void TeleporterInteraction_ChargedState_OnEnter(orig_OnEnter orig, BaseState self) { orig.Invoke(self); if (PluginConfig.BlockTimedRespawnOnTPEvent.Value) { respawnController.UnblockTimedRespawn(); } if (PluginConfig.RespawnOnTPEnd.Value) { respawnController.RespawnAllUsers(); } } } internal class UsersTimedRespawn : NetworkBehaviour { public UsersRespawnController respawnController; private UsersRespawnTimers usersRespawnTimers; public IReadOnlyDictionary<NetworkUserId, UserTimer> readOnlyInstances => usersRespawnTimers.readOnlyInstances; private void Awake() { //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_006c: Expected O, but got Unknown usersRespawnTimers = ((Component)this).gameObject.AddComponent<UsersRespawnTimers>(); usersRespawnTimers.OnUserTimerRespawnTimerEnd += UsersRespawnTimers_OnUserTimerRespawnTimerEnd; Run.OnUserAdded += new hook_OnUserAdded(Run_OnUserAdded); Run.OnUserRemoved += new hook_OnUserRemoved(Run_OnUserRemoved); Run.BeginGameOver += new hook_BeginGameOver(Run_BeginGameOver); Run.OnDestroy += new hook_OnDestroy(Run_OnDestroy); } public void OnDestroy() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Expected O, but got Unknown //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Expected O, but got Unknown //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Expected O, but got Unknown //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Expected O, but got Unknown usersRespawnTimers.OnUserTimerRespawnTimerEnd -= UsersRespawnTimers_OnUserTimerRespawnTimerEnd; Run.OnUserAdded -= new hook_OnUserAdded(Run_OnUserAdded); Run.OnUserRemoved -= new hook_OnUserRemoved(Run_OnUserRemoved); Run.BeginGameOver -= new hook_BeginGameOver(Run_BeginGameOver); Run.OnDestroy -= new hook_OnDestroy(Run_OnDestroy); } private void UsersRespawnTimers_OnUserTimerRespawnTimerEnd(NetworkUser user) { respawnController.RespawnUser(user); } private void Run_OnUserAdded(orig_OnUserAdded orig, Run self, NetworkUser user) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, user); usersRespawnTimers.AddUserRespawnTimer(user.id); } private void Run_OnUserRemoved(orig_OnUserRemoved orig, Run self, NetworkUser user) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self, user); usersRespawnTimers.RemoveUserRespawnTimer(user.id); } private void Run_BeginGameOver(orig_BeginGameOver orig, Run self, GameEndingDef gameEndingDef) { orig.Invoke(self, gameEndingDef); usersRespawnTimers.ClearAllUsersRespawnTimers(); } private void Run_OnDestroy(orig_OnDestroy orig, Run self) { orig.Invoke(self); usersRespawnTimers.ClearAllUsersRespawnTimers(); } public void StartTimedRespawn(NetworkUser user) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)user)) { uint respawnTime = RespawnTimeCalculation.GetRespawnTime(); usersRespawnTimers.StartRespawnTimer(user.id, respawnTime); ChatHelper.UserWillRespawnAfter(user.userName, respawnTime); } } public void ResetTimedRespawn(NetworkUser user) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)user)) { usersRespawnTimers.ResetRespawnTimer(user.id); } } public void StopAllRespawnTimers() { usersRespawnTimers.StopAllCurrentRespawnTimers(); } public void ResumeAllRespawnTimers() { usersRespawnTimers.ResumeAllCurrentRespawnTimers(); } public void ResetAllRespawnTimers() { usersRespawnTimers.ResetAllCurrentRespawnTimers(); } } internal class DeathTimerController : NetworkBehaviour { private DeathTimerPanel deathTimerPanel; public readonly int UpdateTimersEveryXFrames = 5; private int frameCount; public void Awake() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown HUD.Awake += new hook_Awake(HUD_Awake); Run.OnDestroy += new hook_OnDestroy(Run_OnDestroy); } public void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown HUD.Awake -= new hook_Awake(HUD_Awake); Run.OnDestroy -= new hook_OnDestroy(Run_OnDestroy); } private void HUD_Awake(orig_Awake orig, HUD self) { //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0012: Expected O, but got Unknown orig.Invoke(self); GameObject val = new GameObject("death_timer_box"); val.transform.SetParent(self.mainContainer.transform); val.transform.SetAsFirstSibling(); deathTimerPanel = val.AddComponent<DeathTimerPanel>(); } private void Run_OnDestroy(orig_OnDestroy orig, Run self) { orig.Invoke(self); deathTimerPanel = null; } public void FixedUpdate() { if (NetworkServer.active && ((NetworkBehaviour)this).hasAuthority) { frameCount++; if (frameCount >= UpdateTimersEveryXFrames) { CmdUpdateAllDeathTimers(); frameCount = 0; } } } [Command] public void CmdUpdateAllDeathTimers() { //IL_0036: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)UsersRespawnController.instance)) { return; } foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList) { if (UsersRespawnController.instance.usersTimedRespawn.readOnlyInstances.TryGetValue(readOnlyInstances.id, out var value)) { float timeRemaining = value.TimeRemaining; bool canTimedRespawn = UsersRespawnController.instance.CheckIfCanTimedRespawn((readOnlyInstances != null) ? readOnlyInstances.master : null); bool canRespawnAfter = UsersRespawnController.instance.CheckIfCanRespawn((readOnlyInstances != null) ? readOnlyInstances.master : null) && UsersRespawnController.instance.IsTimedRespawnBlocked; RespawnType respawnType = UsersRespawnController.instance.RespawnType; TargetUpdateDeathTimer(((NetworkBehaviour)readOnlyInstances).connectionToClient, timeRemaining, canTimedRespawn, canRespawnAfter, respawnType); } } } [TargetRpc] public void TargetUpdateDeathTimer(NetworkConnection target, float respawnTime, bool canTimedRespawn, bool canRespawnAfter, RespawnType respawnType) { if (!Object.op_Implicit((Object)(object)deathTimerPanel) || !PluginConfig.UseDeathTimerUI.Value) { return; } if (canTimedRespawn) { deathTimerPanel.show = true; ((TMP_Text)deathTimerPanel.textContext2).text = $"in <color=red>{Mathf.CeilToInt(respawnTime)}</color> seconds"; } else if (canRespawnAfter) { switch (respawnType) { case RespawnType.Default: deathTimerPanel.show = false; break; case RespawnType.Teleporter: if (PluginConfig.RespawnOnTPEnd.Value) { ((TMP_Text)deathTimerPanel.textContext2).text = "after <color=red>teleporter</color> event"; deathTimerPanel.show = true; } break; case RespawnType.Mithrix: if (PluginConfig.RespawnOnMithrixEnd.Value) { ((TMP_Text)deathTimerPanel.textContext2).text = "after <color=red>Mithrix</color> fight"; deathTimerPanel.show = true; } break; case RespawnType.Artifact: if (PluginConfig.RespawnOnArtifactTrialEnd.Value) { ((TMP_Text)deathTimerPanel.textContext2).text = "after <color=red>artifact trial</color> ends"; deathTimerPanel.show = true; } break; } } else { deathTimerPanel.show = false; } } } internal class DeathTimerPanel : MonoBehaviour { public RectTransform rectTransform; public RectTransform colorRectTransform; public HGTextMeshProUGUI textContext1; public HGTextMeshProUGUI textContext2; public bool show; private float fontSize = 30f; private float showSpeed = 0.05f; private float hideSpeed = 0.1f; public void Awake() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Unknown result type (might be due to invalid IL or missing references) //IL_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Expected O, but got Unknown //IL_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0108: Unknown result type (might be due to invalid IL or missing references) //IL_0112: Unknown result type (might be due to invalid IL or missing references) //IL_0130: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Expected O, but got Unknown //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_01a7: Unknown result type (might be due to invalid IL or missing references) //IL_01b1: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_0208: Unknown result type (might be due to invalid IL or missing references) //IL_020e: Expected O, but got Unknown //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_024b: Unknown result type (might be due to invalid IL or missing references) //IL_0260: Unknown result type (might be due to invalid IL or missing references) //IL_0275: Unknown result type (might be due to invalid IL or missing references) //IL_027f: Unknown result type (might be due to invalid IL or missing references) //IL_02ac: Unknown result type (might be due to invalid IL or missing references) rectTransform = ((Component)this).gameObject.AddComponent<RectTransform>(); rectTransform.anchorMin = Vector2.one / 2f; rectTransform.anchorMax = Vector2.one / 2f; rectTransform.pivot = Vector2.one / 2f; ((Transform)rectTransform).localPosition = Vector3.zero; ((Transform)rectTransform).position = Vector3.zero; rectTransform.sizeDelta = new Vector2(300f, 60f); ((Transform)rectTransform).localScale = Vector3.one; GameObject val = new GameObject(); val.transform.SetParent(((Component)this).transform); colorRectTransform = val.AddComponent<RectTransform>(); Image obj = val.AddComponent<Image>(); ((Transform)((Graphic)obj).rectTransform).localPosition = Vector3.zero; ((Graphic)obj).rectTransform.anchorMin = Vector2.zero; ((Graphic)obj).rectTransform.anchorMax = Vector2.one; ((Graphic)obj).rectTransform.pivot = Vector2.one / 2f; ((Graphic)obj).color = new Color(0f, 0f, 0f, 0.5f); GameObject val2 = new GameObject(); val2.transform.SetParent(((Component)this).transform); textContext1 = val2.AddComponent<HGTextMeshProUGUI>(); ((Transform)((TMP_Text)textContext1).rectTransform).localPosition = Vector3.zero; ((TMP_Text)textContext1).rectTransform.anchorMin = Vector2.zero; ((TMP_Text)textContext1).rectTransform.anchorMax = Vector2.one; ((TMP_Text)textContext1).rectTransform.pivot = Vector2.one / 2f; ((TMP_Text)textContext1).enableAutoSizing = false; ((TMP_Text)textContext1).fontSizeMax = fontSize; ((Graphic)textContext1).color = Color.white; ((TMP_Text)textContext1).alignment = (TextAlignmentOptions)258; ((TMP_Text)textContext1).text = "You will respawn"; GameObject val3 = new GameObject(); val3.transform.SetParent(((Component)this).transform); textContext2 = val3.AddComponent<HGTextMeshProUGUI>(); ((Transform)((TMP_Text)textContext2).rectTransform).localPosition = Vector3.zero; ((TMP_Text)textContext2).rectTransform.anchorMin = Vector2.zero; ((TMP_Text)textContext2).rectTransform.anchorMax = Vector2.one; ((TMP_Text)textContext2).rectTransform.pivot = Vector2.one / 2f; ((TMP_Text)textContext2).enableAutoSizing = false; ((TMP_Text)textContext2).fontSizeMax = fontSize; ((Graphic)textContext2).color = Color.white; ((TMP_Text)textContext2).alignment = (TextAlignmentOptions)4098; ((TMP_Text)textContext2).text = "in x seconds"; } public void OnEnable() { //IL_0010: Unknown result type (might be due to invalid IL or missing references) rectTransform.anchoredPosition = new Vector2(0f, 100f); } public void FixedUpdate() { //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Unknown result type (might be due to invalid IL or missing references) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_00ab: Unknown result type (might be due to invalid IL or missing references) //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0186: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0196: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) if (show && ((TMP_Text)textContext1).fontSize != fontSize && ((TMP_Text)textContext2).fontSize != fontSize && ((Transform)colorRectTransform).localScale != Vector3.one) { ((TMP_Text)textContext1).fontSize = Mathf.Lerp(((TMP_Text)textContext1).fontSize, fontSize, showSpeed); ((TMP_Text)textContext2).fontSize = Mathf.Lerp(((TMP_Text)textContext2).fontSize, fontSize, showSpeed); ((Transform)colorRectTransform).localScale = Vector2.op_Implicit(Vector2.Lerp(Vector2.op_Implicit(((Transform)colorRectTransform).localScale), Vector2.op_Implicit(Vector3.one), showSpeed)); } else if (!show && ((TMP_Text)textContext1).fontSize != 0f && ((TMP_Text)textContext2).fontSize != 0f && ((Transform)colorRectTransform).localScale != Vector3.up) { ((TMP_Text)textContext1).fontSize = Mathf.Lerp(((TMP_Text)textContext1).fontSize, 0f, hideSpeed); ((TMP_Text)textContext2).fontSize = Mathf.Lerp(((TMP_Text)textContext2).fontSize, 0f, hideSpeed); ((Transform)colorRectTransform).localScale = Vector2.op_Implicit(Vector2.Lerp(Vector2.op_Implicit(((Transform)colorRectTransform).localScale), Vector2.op_Implicit(Vector3.up), hideSpeed)); } } } public enum RespawnType : byte { Default, Teleporter, Mithrix, Artifact } internal class UsersRespawnController : NetworkBehaviour { public UsersTimedRespawn usersTimedRespawn; private UsersTeleporterRespawn usersTeleporterRespawn; private UsersMithrixRespawn usersMithrixRespawn; private UsersArtifactTrialRespawn usersArtifactTrialRespawn; private Queue<CharacterBody> respawnCharacterMaster = new Queue<CharacterBody>(); public bool IsAdvancingStage { get; private set; } public bool IsTimedRespawnBlocked { get; private set; } public RespawnType RespawnType { get; set; } public static UsersRespawnController instance { get; private set; } public void Awake() { //IL_0081: Unknown result type (might be due to invalid IL or missing references) //IL_008b: Expected O, but got Unknown //IL_0092: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Expected O, but got Unknown //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Expected O, but got Unknown //IL_00b4: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Expected O, but got Unknown //IL_00c5: Unknown result type (might be due to invalid IL or missing references) //IL_00cf: Expected O, but got Unknown //IL_00d6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Expected O, but got Unknown //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Expected O, but got Unknown //IL_00f8: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Expected O, but got Unknown //IL_0109: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Expected O, but got Unknown usersTimedRespawn = ((Component)this).gameObject.AddComponent<UsersTimedRespawn>(); usersTeleporterRespawn = ((Component)this).gameObject.AddComponent<UsersTeleporterRespawn>(); usersMithrixRespawn = ((Component)this).gameObject.AddComponent<UsersMithrixRespawn>(); usersArtifactTrialRespawn = ((Component)this).gameObject.AddComponent<UsersArtifactTrialRespawn>(); usersTimedRespawn.respawnController = (usersTeleporterRespawn.respawnController = (usersMithrixRespawn.respawnController = (usersArtifactTrialRespawn.respawnController = this))); PlayerCharacterMasterController.OnBodyDeath += new hook_OnBodyDeath(PlayerCharacterMasterController_OnBodyDeath); SceneExitController.SetState += new hook_SetState(SceneExitController_SetState); Stage.OnEnable += new hook_OnEnable(Stage_OnEnable); Stage.BeginAdvanceStage += new hook_BeginAdvanceStage(Stage_BeginAdvanceStage); Stage.RespawnCharacter += new hook_RespawnCharacter(Stage_RespawnCharacter); Stage.GetPlayerSpawnTransform += new hook_GetPlayerSpawnTransform(Stage_GetPlayerSpawnTransform); CharacterMaster.Respawn += new hook_Respawn(CharacterMaster_Respawn); Run.OnServerSceneChanged += new hook_OnServerSceneChanged(Run_OnServerSceneChanged); Run.OnDestroy += new hook_OnDestroy(Run_OnDestroy); } protected void OnEnable() { instance = SingletonHelper.Assign<UsersRespawnController>(instance, this); } protected void OnDisable() { instance = SingletonHelper.Unassign<UsersRespawnController>(instance, this); } public void OnDestroy() { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Expected O, but got Unknown //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Expected O, but got Unknown //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0033: Expected O, but got Unknown //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0044: Expected O, but got Unknown //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0055: Expected O, but got Unknown //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Expected O, but got Unknown //IL_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0077: Expected O, but got Unknown //IL_007e: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) //IL_0099: Expected O, but got Unknown PlayerCharacterMasterController.OnBodyDeath -= new hook_OnBodyDeath(PlayerCharacterMasterController_OnBodyDeath); SceneExitController.SetState -= new hook_SetState(SceneExitController_SetState); Stage.OnEnable -= new hook_OnEnable(Stage_OnEnable); Stage.BeginAdvanceStage -= new hook_BeginAdvanceStage(Stage_BeginAdvanceStage); Stage.RespawnCharacter -= new hook_RespawnCharacter(Stage_RespawnCharacter); Stage.GetPlayerSpawnTransform -= new hook_GetPlayerSpawnTransform(Stage_GetPlayerSpawnTransform); CharacterMaster.Respawn -= new hook_Respawn(CharacterMaster_Respawn); Run.OnServerSceneChanged -= new hook_OnServerSceneChanged(Run_OnServerSceneChanged); Run.OnDestroy -= new hook_OnDestroy(Run_OnDestroy); Object.Destroy((Object)(object)usersTimedRespawn); Object.Destroy((Object)(object)usersTeleporterRespawn); Object.Destroy((Object)(object)usersMithrixRespawn); Object.Destroy((Object)(object)usersArtifactTrialRespawn); } private void PlayerCharacterMasterController_OnBodyDeath(orig_OnBodyDeath orig, PlayerCharacterMasterController self) { orig.Invoke(self); Stage.instance.usePod = false; NetworkUser user = UsersHelper.GetUser(self.master); if (!Object.op_Implicit((Object)(object)user)) { return; } if (CheckIfCanTimedRespawn(self.master)) { usersTimedRespawn.StartTimedRespawn(user); } else { if (!IsTimedRespawnBlocked) { return; } switch (RespawnType) { case RespawnType.Teleporter: if (PluginConfig.RespawnOnTPEnd.Value) { ChatHelper.UserWillRespawnAfterTPEvent(user.userName); } break; case RespawnType.Mithrix: if (PluginConfig.RespawnOnMithrixEnd.Value) { ChatHelper.UserWillRespawnAfterMithrixFight(user.userName); } break; case RespawnType.Artifact: if (PluginConfig.RespawnOnArtifactTrialEnd.Value) { ChatHelper.UserWillRespawnAfterArtifactTrial(user.userName); } break; } } } private void SceneExitController_SetState(orig_SetState orig, SceneExitController self, ExitState newState) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0008: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Invalid comparison between Unknown and I4 orig.Invoke(self, newState); if ((int)newState == 2) { IsAdvancingStage = true; } } private void Stage_OnEnable(orig_OnEnable orig, Stage self) { orig.Invoke(self); if (!PluginConfig.UsePodsOnStartOfMatch.Value) { Stage.instance.usePod = false; } } private void Stage_BeginAdvanceStage(orig_BeginAdvanceStage orig, Stage self, SceneDef destinationStage) { orig.Invoke(self, destinationStage); UnblockTimedRespawn(); RespawnType = RespawnType.Default; usersTimedRespawn.ResetAllRespawnTimers(); } private void Stage_RespawnCharacter(orig_RespawnCharacter orig, Stage self, CharacterMaster characterMaster) { if (Object.op_Implicit((Object)(object)characterMaster.bodyPrefab)) { CharacterBody component = characterMaster.bodyPrefab.GetComponent<CharacterBody>(); if (Object.op_Implicit((Object)(object)component)) { respawnCharacterMaster.Enqueue(component); } } orig.Invoke(self, characterMaster); } private Transform Stage_GetPlayerSpawnTransform(orig_GetPlayerSpawnTransform orig, Stage self) { //IL_0035: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) if (respawnCharacterMaster.Count == 0) { return orig.Invoke(self); } CharacterBody body = respawnCharacterMaster.Dequeue(); switch (RespawnType) { case RespawnType.Teleporter: { Transform transform = new GameObject().transform; transform.position = RespawnPosition.GetSpawnPositionAroundTeleporter(body, 0.5f, 3f); if (transform.position != Vector3.zero) { return transform; } Debug.Log((object)$"UsersRespawnController::Stage_GetPlayerSpawnTransform hook: Failed to find better respawn position for '{RespawnType}' respawn type"); break; } case RespawnType.Mithrix: { Transform transform = new GameObject().transform; transform.position = RespawnPosition.GetSpawnPositionAroundMoonBoss(body, 100f, 105f); if (transform.position != Vector3.zero) { return transform; } Debug.Log((object)$"UsersRespawnController::Stage_GetPlayerSpawnTransform hook: Failed to find better respawn position for '{RespawnType}' respawn type"); break; } } return orig.Invoke(self); } private CharacterBody CharacterMaster_Respawn(orig_Respawn orig, CharacterMaster self, Vector3 footPosition, Quaternion rotation, bool wasRevivedMidStage) { //IL_0013: Unknown result type (might be due to invalid IL or missing references) //IL_0014: Unknown result type (might be due to invalid IL or missing references) usersTimedRespawn.ResetTimedRespawn(UsersHelper.GetUser(self)); return orig.Invoke(self, footPosition, rotation, wasRevivedMidStage); } private void Run_OnServerSceneChanged(orig_OnServerSceneChanged orig, Run self, string sceneName) { orig.Invoke(self, sceneName); IsAdvancingStage = false; if (CheckIfCurrentStageIsIgnoredForTimedRespawn()) { ChatHelper.TimedRespawnBlockedOnStage(); } } private void Run_OnDestroy(orig_OnDestroy orig, Run self) { orig.Invoke(self); respawnCharacterMaster.Clear(); UnblockTimedRespawn(); RespawnType = RespawnType.Default; } public void BlockTimedRespawn() { IsTimedRespawnBlocked = true; usersTimedRespawn.StopAllRespawnTimers(); } public void UnblockTimedRespawn() { IsTimedRespawnBlocked = false; usersTimedRespawn.ResumeAllRespawnTimers(); } public void RespawnUser(NetworkUser user) { if (Object.op_Implicit((Object)(object)((user != null) ? user.master : null)) && CheckIfCanRespawn(user.master)) { Stage.instance.RespawnCharacter(user.master); } } public void RespawnAllUsers() { foreach (NetworkUser readOnlyInstances in NetworkUser.readOnlyInstancesList) { RespawnUser(readOnlyInstances); } } public bool CheckIfCanRespawn(CharacterMaster master) { if (Object.op_Implicit((Object)(object)master) && master.IsDeadAndOutOfLivesServer()) { return !IsAdvancingStage; } return false; } public bool CheckIfCanTimedRespawn(CharacterMaster master) { if (CheckIfCanRespawn(master) && !CheckIfCurrentStageIsIgnoredForTimedRespawn() && !IsTimedRespawnBlocked) { return PluginConfig.UseTimedRespawn.Value; } return false; } public bool CheckIfCurrentStageIsIgnoredForTimedRespawn() { return PluginConfig.IgnoredMapsForTimedRespawn.Value.Contains(SceneCatalog.GetSceneDefForCurrentScene().baseSceneName); } } [BepInDependency(/*Could not decode attribute arguments.*/)] [R2APISubmoduleDependency(new string[] { "PrefabAPI" })] [NetworkCompatibility(/*Could not decode attribute arguments.*/)] [BepInPlugin("com.Mordrog.PlayerRespawnSystem", "PlayerRespawnSystem", "2.0.4")] public class PlayerRespawnSystemPlugin : BaseUnityPlugin { public const string ModVer = "2.0.4"; public const string ModName = "PlayerRespawnSystem"; public const string ModGuid = "com.Mordrog.PlayerRespawnSystem"; private UsersRespawnController usersRespawnController; private static GameObject DeathTimerControllerPrefab; private GameObject deathTimerController; public PlayerRespawnSystemPlugin() { InitConfig(); } public void Awake() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Expected O, but got Unknown //IL_0026: Expected O, but got Unknown //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0042: Expected O, but got Unknown //IL_0049: Unknown result type (might be due to invalid IL or missing references) //IL_0053: Expected O, but got Unknown //IL_005a: Unknown result type (might be due to invalid IL or missing references) //IL_0064: Expected O, but got Unknown GameObject val = new GameObject("temp"); val.AddComponent<NetworkIdentity>(); DeathTimerControllerPrefab = PrefabAPI.InstantiateClone(val, "DeathTimerController"); Object.Destroy((Object)val); DeathTimerControllerPrefab.AddComponent<DeathTimerController>(); NetworkUser.OnEnable += new hook_OnEnable(NetworkUser_OnEnable); Run.Awake += new hook_Awake(Run_Awake); Run.OnDestroy += new hook_OnDestroy(Run_OnDestroy); } private void NetworkUser_OnEnable(orig_OnEnable orig, NetworkUser self) { orig.Invoke(self); if (!Object.op_Implicit((Object)(object)deathTimerController)) { deathTimerController = Object.Instantiate<GameObject>(DeathTimerControllerPrefab); deathTimerController.transform.SetParent(((Component)self).transform, false); } } private void Run_Awake(orig_Awake orig, Run self) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (!PluginConfig.IgnoredGameModes.Value.Contains(GameModeCatalog.GetGameModeName(self.gameModeIndex))) { deathTimerController.SetActive(true); usersRespawnController = ((Component)this).gameObject.AddComponent<UsersRespawnController>(); if (NetworkServer.active) { NetworkServer.Spawn(deathTimerController); } } } private void Run_OnDestroy(orig_OnDestroy orig, Run self) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) orig.Invoke(self); if (!PluginConfig.IgnoredGameModes.Value.Contains(GameModeCatalog.GetGameModeName(self.gameModeIndex))) { if (Object.op_Implicit((Object)(object)deathTimerController)) { deathTimerController.SetActive(false); } Object.Destroy((Object)(object)usersRespawnController); if (NetworkServer.active && Object.op_Implicit((Object)(object)deathTimerController)) { NetworkServer.UnSpawn(deathTimerController); } } } private void InitConfig() { PluginConfig.IgnoredMapsForTimedRespawn = ((BaseUnityPlugin)this).Config.Bind<string>("Settings", "IgnoredMapsForTimedRespawn", "bazaar,arena,goldshores,moon,moon2,artifactworld,mysteryspace,limbo,voidraid", "Maps on which respawning is ignored."); PluginConfig.IgnoredGameModes = ((BaseUnityPlugin)this).Config.Bind<string>("Settings", "IgnoredGameModes", "InfiniteTowerRun", "Gamemode in which respawning should not work."); PluginConfig.RespawnTimeType = ((BaseUnityPlugin)this).Config.Bind<RespawnTimeType>("Settings", "RespawnTimeType", RespawnTimeType.StageTimeBased, "Type of time to consider when calculating respawn time."); PluginConfig.StartingRespawnTime = ((BaseUnityPlugin)this).Config.Bind<uint>("Settings", "StartingRespawnTime", 30u, "Starting respawn time."); PluginConfig.MaxRespawnTime = ((BaseUnityPlugin)this).Config.Bind<uint>("Settings", "MaxRespawnTime", 180u, "Max respawn time."); PluginConfig.UpdateCurrentRepsawnTimeByXSeconds = ((BaseUnityPlugin)this).Config.Bind<uint>("Settings", "UpdateCurrentRepsawnTimeByXSeconds", 5u, "Value by which current respawn time is updated every UpdateCurrentRespawnTimeEveryXSeconds."); PluginConfig.UpdateCurrentRespawnTimeEveryXSeconds = ((BaseUnityPlugin)this).Config.Bind<uint>("Settings", "UpdateCurrentRespawnTimeEveryXSeconds", 10u, "Time interval between updates of the UpdateCurrentRepsawnTimeByXSeconds."); PluginConfig.UsePodsOnStartOfMatch = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "UsePodsOnStartOfMatch", false, "Should players spawn from pods on start of match."); PluginConfig.UseDeathTimerUI = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "UseDeathTimerUI", true, "Should UI death timer show up for you on death."); PluginConfig.UseTimedRespawn = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "UseTimedRespawn", true, "Should players be respawned on timed based system."); PluginConfig.BlockTimedRespawnOnTPEvent = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "BlockTimedRespawnOnTPEvent", true, "Should players be blocked from respawning after teleporter event is started."); PluginConfig.RespawnOnTPStart = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnTPStart", true, "Should players be respawned on start of teleporter event (regardless of BlockSpawningOnTPEvent)."); PluginConfig.RespawnOnTPEnd = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnTPEnd", true, "Should players be respawned on end of teleporter event (regardless of BlockSpawningOnTPEvent)."); PluginConfig.BlockTimedRespawnOnMithrixFight = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "BlockTimedRespawnOnMithrixFight", true, "Should players be blocked from respawning after Mithrix fight is started."); PluginConfig.RespawnOnMithrixStart = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnMithrixStart", true, "Should players be respawned on start of Mithrix fight (regardless of BlockRespawningOnMithrixFight or map being ignored)."); PluginConfig.RespawnOnMithrixEnd = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnMithrixEnd", false, "Should players be respawned on end of Mithrix fight (regardless of BlockRespawningOnMithrixFight or map being ignored)."); PluginConfig.BlockTimedRespawnOnArtifactTrial = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "BlockTimedRespawnOnArtifactTrial", true, "Should players be blocked from respawning after Artifact trial is started."); PluginConfig.RespawnOnArtifactTrialStart = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnArtifactTrialStart", true, "Should players be respawned on start of Artifact trial (regardless of BlockTimedRespawningOnArtifactTrial or map being ignored)."); PluginConfig.RespawnOnArtifactTrialEnd = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "RespawnOnArtifactTrialEnd", true, "Should players be respawned on end of Artifact trial (regardless of BlockTimedRespawningOnArtifactTrial or map being ignored)."); } } public static class PluginConfig { public static ConfigEntry<string> IgnoredMapsForTimedRespawn; public static ConfigEntry<string> IgnoredGameModes; public static ConfigEntry<RespawnTimeType> RespawnTimeType; public static ConfigEntry<uint> StartingRespawnTime; public static ConfigEntry<uint> MaxRespawnTime; public static ConfigEntry<uint> UpdateCurrentRespawnTimeEveryXSeconds; public static ConfigEntry<uint> UpdateCurrentRepsawnTimeByXSeconds; public static ConfigEntry<bool> UsePodsOnStartOfMatch; public static ConfigEntry<bool> UseDeathTimerUI; public static ConfigEntry<bool> UseTimedRespawn; public static ConfigEntry<bool> BlockTimedRespawnOnTPEvent; public static ConfigEntry<bool> RespawnOnTPStart; public static ConfigEntry<bool> RespawnOnTPEnd; public static ConfigEntry<bool> BlockTimedRespawnOnMithrixFight; public static ConfigEntry<bool> RespawnOnMithrixStart; public static ConfigEntry<bool> RespawnOnMithrixEnd; public static ConfigEntry<bool> BlockTimedRespawnOnArtifactTrial; public static ConfigEntry<bool> RespawnOnArtifactTrialStart; public static ConfigEntry<bool> RespawnOnArtifactTrialEnd; }