using System; using System.Collections; 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 BepInEx.Logging; using ExitGames.Client.Photon; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using Photon.Realtime; using UnityEngine; using UnityEngine.SceneManagement; [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("Empress")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("2.0.6.0")] [assembly: AssemblyInformationalVersion("2.0.6+5f1b735e473ca4ccf3b383128fbebd889cb564da")] [assembly: AssemblyProduct("EmpressLateJoin")] [assembly: AssemblyTitle("EmpressLateJoin")] [assembly: AssemblyVersion("2.0.6.0")] [module: RefSafetyRules(11)] namespace Microsoft.CodeAnalysis { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] internal sealed class EmbeddedAttribute : Attribute { } } namespace System.Runtime.CompilerServices { [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)] internal sealed class NullableAttribute : Attribute { public readonly byte[] NullableFlags; public NullableAttribute(byte P_0) { NullableFlags = new byte[1] { P_0 }; } public NullableAttribute(byte[] P_0) { NullableFlags = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)] internal sealed class NullableContextAttribute : Attribute { public readonly byte Flag; public NullableContextAttribute(byte P_0) { Flag = P_0; } } [CompilerGenerated] [Microsoft.CodeAnalysis.Embedded] [AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)] internal sealed class RefSafetyRulesAttribute : Attribute { public readonly int Version; public RefSafetyRulesAttribute(int P_0) { Version = P_0; } } } namespace EmpressLateJoin { [BepInPlugin("empress.repo.empresslatejoin", "EmpressLateJoin", "2.0.6")] public sealed class EmpressLateJoinPlugin : BaseUnityPlugin { internal const string PluginGuid = "empress.repo.empresslatejoin"; internal const string PluginName = "EmpressLateJoin"; internal const string PluginVersion = "2.0.6"; private Harmony? _empressHarmony; internal ConfigEntry EmpressEnabled; internal ConfigEntry EmpressKeepRoomJoinable; internal ConfigEntry EmpressLiveJoinActiveLevels; internal ConfigEntry EmpressQueueDuringActiveLevels; internal ConfigEntry EmpressWaitingLeashRadius; internal ConfigEntry EmpressWaitingSnapCooldown; internal ConfigEntry EmpressSceneSwitchSettleDelay; internal ConfigEntry EmpressSceneSwitchSettleTimeout; internal ConfigEntry EmpressTruckStartFallbackDelay; internal static EmpressLateJoinPlugin? Instance { get; private set; } internal static EmpressLateJoinRuntime? Runtime { get; private set; } internal ManualLogSource EmpressLog => ((BaseUnityPlugin)this).Logger; private void Awake() { //IL_018d: 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_019a: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Expected O, but got Unknown //IL_01f3: Unknown result type (might be due to invalid IL or missing references) //IL_01fd: Expected O, but got Unknown ((Component)this).gameObject.transform.parent = null; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); Instance = this; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; EmpressEnabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Master switch for EmpressLateJoin."); EmpressKeepRoomJoinable = ((BaseUnityPlugin)this).Config.Bind("General", "KeepRoomJoinable", true, "Keeps the active multiplayer room joinable after the host starts the run."); EmpressLiveJoinActiveLevels = ((BaseUnityPlugin)this).Config.Bind("General", "LiveJoinActiveLevels", true, "Lets mid-level joiners load straight into the active scene and replay the missing live state from the host."); EmpressQueueDuringActiveLevels = ((BaseUnityPlugin)this).Config.Bind("WaitingRoom", "QueueDuringActiveLevels", true, "Parks mid-level late joiners in the Empress holding cell and lets them enter normal play on the next scene."); EmpressWaitingLeashRadius = ((BaseUnityPlugin)this).Config.Bind("WaitingRoom", "WaitingLeashRadius", 7f, "How far a waiting player can stray from the holding cell anchor before EmpressLateJoin snaps them back."); EmpressWaitingSnapCooldown = ((BaseUnityPlugin)this).Config.Bind("WaitingRoom", "WaitingSnapCooldown", 0.75f, "Minimum delay between holding-cell snapbacks."); EmpressSceneSwitchSettleDelay = ((BaseUnityPlugin)this).Config.Bind("WaitingRoom", "SceneSwitchSettleDelay", 1.25f, "Minimum amount of time EmpressLateJoin waits for a late joiner to settle before allowing the next scene switch."); EmpressSceneSwitchSettleTimeout = ((BaseUnityPlugin)this).Config.Bind("WaitingRoom", "SceneSwitchSettleTimeout", 8f, "Maximum amount of time EmpressLateJoin will delay a scene switch while a late joiner settles."); EmpressTruckStartFallbackDelay = ((BaseUnityPlugin)this).Config.Bind("Truck", "TruckStartFallbackDelay", 8f, "How long EmpressLateJoin waits after the truck starts before forcing the same transition as the /level next debug command if vanilla did not switch scenes."); Runtime = Resources.FindObjectsOfTypeAll().FirstOrDefault(); if ((Object)(object)Runtime == (Object)null) { GameObject val = new GameObject("EmpressLateJoin.Runtime") { hideFlags = (HideFlags)61 }; val.transform.parent = null; Object.DontDestroyOnLoad((Object)val); Runtime = val.AddComponent(); } else { ((Component)Runtime).gameObject.transform.parent = null; Object.DontDestroyOnLoad((Object)(object)((Component)Runtime).gameObject); ((Object)((Component)Runtime).gameObject).hideFlags = (HideFlags)61; } _empressHarmony = new Harmony("empress.repo.empresslatejoin"); _empressHarmony.PatchAll(); } } internal sealed class EmpressLateJoinRuntime : MonoBehaviour { private sealed class EmpressDelayedSceneChangeRequest { internal RunManager RunManager; internal bool CompletedLevel; internal bool LevelFailed; internal ChangeLevelType ChangeLevelType; internal float RequestedAt; } private const float EmpressJoinabilityRefreshInterval = 1f; private const float EmpressSupportAuditInterval = 1f; private const float EmpressWaitingAnchorRadiusBase = 1.3f; private const float EmpressLateJoinReadyHoldTime = 0.2f; private const float EmpressLateJoinMinimumIdentityTime = 0.5f; private const float EmpressLiveJoinUpdateLevelDelay = 2f; private const float EmpressLiveJoinGenerateDoneDelay = 3.5f; private const float EmpressLiveJoinReplayDelay = 4.5f; private static readonly FieldInfo? EmpressGameManagerConnectRandomField = AccessTools.Field(typeof(GameManager), "connectRandom"); private static readonly FieldInfo? EmpressDebugCommandHandlerInstanceField = AccessTools.Field(typeof(DebugCommandHandler), "instance"); private static readonly FieldInfo? EmpressPlayerAvatarSpawnedField = AccessTools.Field(typeof(PlayerAvatar), "spawned"); private static readonly FieldInfo? EmpressPlayerAvatarDeathHeadField = AccessTools.Field(typeof(PlayerAvatar), "playerDeathHead"); private static readonly FieldInfo? EmpressPlayerAvatarTumbleField = AccessTools.Field(typeof(PlayerAvatar), "tumble"); private static readonly FieldInfo? EmpressPlayerAvatarPlayerHealthField = AccessTools.Field(typeof(PlayerAvatar), "playerHealth"); private static readonly FieldInfo? EmpressPlayerAvatarDeadSetField = AccessTools.Field(typeof(PlayerAvatar), "deadSet"); private static readonly FieldInfo? EmpressPlayerAvatarIsDisabledField = AccessTools.Field(typeof(PlayerAvatar), "isDisabled"); private static readonly FieldInfo? EmpressPlayerAvatarRoomVolumeCheckField = AccessTools.Field(typeof(PlayerAvatar), "RoomVolumeCheck"); private static readonly FieldInfo? EmpressPlayerAvatarSelfDestructPreventedField = AccessTools.Field(typeof(PlayerAvatar), "selfDestructPrevented"); private static readonly FieldInfo? EmpressPlayerHealthHealthField = AccessTools.Field(typeof(PlayerHealth), "health"); private static readonly FieldInfo? EmpressPlayerHealthMaxHealthField = AccessTools.Field(typeof(PlayerHealth), "maxHealth"); private static readonly FieldInfo? EmpressPlayerDeathHeadPhysGrabObjectField = AccessTools.Field(typeof(PlayerDeathHead), "physGrabObject"); private static readonly FieldInfo? EmpressPlayerDeathHeadSetupField = AccessTools.Field(typeof(PlayerDeathHead), "setup"); private static readonly FieldInfo? EmpressPlayerTumblePhysGrabObjectField = AccessTools.Field(typeof(PlayerTumble), "physGrabObject"); private static readonly FieldInfo? EmpressPlayerTumblePhotonViewField = AccessTools.Field(typeof(PlayerTumble), "photonView"); private static readonly FieldInfo? EmpressPlayerTumbleSetupField = AccessTools.Field(typeof(PlayerTumble), "setup"); private static readonly FieldInfo? EmpressPlayerTumbleIsTumblingField = AccessTools.Field(typeof(PlayerTumble), "isTumbling"); private static readonly FieldInfo? EmpressPlayerTumbleOverrideField = AccessTools.Field(typeof(PlayerTumble), "tumbleOverride"); private static readonly FieldInfo? EmpressPlayerAvatarSteamIdField = AccessTools.Field(typeof(PlayerAvatar), "steamID"); private static readonly FieldInfo? EmpressPlayerAvatarPlayerNameField = AccessTools.Field(typeof(PlayerAvatar), "playerName"); private static readonly FieldInfo? EmpressPlayerAvatarLevelAnimationCompletedField = AccessTools.Field(typeof(PlayerAvatar), "levelAnimationCompleted"); private static readonly FieldInfo? EmpressRoomVolumeCheckInTruckField = AccessTools.Field(typeof(RoomVolumeCheck), "inTruck"); private static readonly FieldInfo? EmpressTruckScreenTextSelfDestructingPlayersField = AccessTools.Field(typeof(TruckScreenText), "selfDestructingPlayers"); private static readonly FieldInfo? EmpressPunManagerPhotonViewField = AccessTools.Field(typeof(PunManager), "photonView"); private static readonly FieldInfo? EmpressRoundDirectorPhotonViewField = AccessTools.Field(typeof(RoundDirector), "photonView"); private static readonly FieldInfo? EmpressRoundDirectorTotalHaulField = AccessTools.Field(typeof(RoundDirector), "totalHaul"); private static readonly FieldInfo? EmpressRoundDirectorExtractionPointActiveField = AccessTools.Field(typeof(RoundDirector), "extractionPointActive"); private static readonly FieldInfo? EmpressRoundDirectorExtractionPointCurrentField = AccessTools.Field(typeof(RoundDirector), "extractionPointCurrent"); private static readonly FieldInfo? EmpressRoundDirectorAllExtractionPointsCompletedField = AccessTools.Field(typeof(RoundDirector), "allExtractionPointsCompleted"); private static readonly FieldInfo? EmpressExtractionPointPhotonViewField = AccessTools.Field(typeof(ExtractionPoint), "photonView"); private static readonly FieldInfo? EmpressShopManagerTotalCostField = AccessTools.Field(typeof(ShopManager), "totalCost"); private static readonly FieldInfo? EmpressStatsManagerDictionaryOfDictionariesField = AccessTools.Field(typeof(StatsManager), "dictionaryOfDictionaries"); private static readonly FieldInfo? EmpressRunManagerLevelCurrentField = AccessTools.Field(typeof(RunManager), "levelCurrent"); private static readonly FieldInfo? EmpressRunManagerLevelsCompletedField = AccessTools.Field(typeof(RunManager), "levelsCompleted"); private static readonly FieldInfo? EmpressRunManagerGameOverField = AccessTools.Field(typeof(RunManager), "gameOver"); private static readonly FieldInfo? EmpressRunManagerPunField = AccessTools.Field(typeof(RunManager), "runManagerPUN"); private static readonly FieldInfo? EmpressRunManagerPunPhotonViewField = AccessTools.Field(typeof(RunManagerPUN), "photonView"); private static readonly MethodInfo? EmpressDebugCommandHandlerExecuteMethod = AccessTools.Method(typeof(DebugCommandHandler), "Execute", new Type[2] { typeof(string), typeof(bool) }, (Type[])null); private static readonly MethodInfo? EmpressRunManagerChangeLevelMethod = AccessTools.Method(typeof(RunManager), "ChangeLevel", new Type[3] { typeof(bool), typeof(bool), typeof(ChangeLevelType) }, (Type[])null); private static readonly FieldInfo? EmpressLevelGeneratorPhotonViewField = AccessTools.Field(typeof(LevelGenerator), "PhotonView"); private static readonly FieldInfo? EmpressLevelGeneratorDeathHeadPrefabField = AccessTools.Field(typeof(LevelGenerator), "PlayerDeathHeadPrefab"); private static readonly FieldInfo? EmpressLevelGeneratorTumblePrefabField = AccessTools.Field(typeof(LevelGenerator), "PlayerTumblePrefab"); private static readonly FieldInfo? EmpressPhotonRemoveFilterField = AccessTools.Field(typeof(PhotonNetwork), "removeFilter"); private static readonly FieldInfo? EmpressPhotonKeyByteSevenField = AccessTools.Field(typeof(PhotonNetwork), "keyByteSeven"); private static readonly FieldInfo? EmpressPhotonServerCleanOptionsField = AccessTools.Field(typeof(PhotonNetwork), "ServerCleanOptions"); private static readonly MethodInfo? EmpressPhotonRaiseEventInternalMethod = AccessTools.Method(typeof(PhotonNetwork), "RaiseEventInternal", (Type[])null, (Type[])null); private static readonly MethodInfo? EmpressRoomVolumeCheckCheckSetMethod = AccessTools.Method(typeof(RoomVolumeCheck), "CheckSet", (Type[])null, (Type[])null); private static readonly MethodInfo? EmpressPlayerDeathHeadSetupDoneMethod = AccessTools.Method(typeof(PlayerDeathHead), "SetupDone", (Type[])null, (Type[])null); private static readonly MethodInfo? EmpressPlayerTumbleSetupDoneMethod = AccessTools.Method(typeof(PlayerTumble), "SetupDone", (Type[])null, (Type[])null); private static readonly MethodInfo? EmpressTruckScreenTextChatMessageResultSuccessMethod = AccessTools.Method(typeof(TruckScreenText), "ChatMessageResultSuccess", (Type[])null, (Type[])null); private static readonly MethodInfo? EmpressTruckScreenTextPlayerChatBoxStateUpdateMethod = AccessTools.Method(typeof(TruckScreenText), "PlayerChatBoxStateUpdate", new Type[1] { typeof(PlayerChatBoxState) }, (Type[])null); private static readonly MethodInfo? EmpressTruckScreenTextGotoPageMethod = AccessTools.Method(typeof(TruckScreenText), "GotoPage", new Type[1] { typeof(int) }, (Type[])null); private readonly HashSet _empressHostWaitingActors = new HashSet(); private readonly HashSet _empressDeferredWaitingRoomActors = new HashSet(); private readonly HashSet _empressEnemyRegisteredActors = new HashSet(); private readonly HashSet _empressLiveJoinLevelUpdateSentActors = new HashSet(); private readonly HashSet _empressLiveJoinBootstrapSentActors = new HashSet(); private readonly HashSet _empressLiveStateReplayedActors = new HashSet(); private readonly HashSet _empressTruckDepartureIgnoredActors = new HashSet(); private readonly Dictionary _empressLateJoinDetectedAt = new Dictionary(); private readonly Dictionary _empressLateJoinReadyAt = new Dictionary(); private readonly Dictionary _empressNextSnapByActor = new Dictionary(); private EmpressDelayedSceneChangeRequest? _empressDelayedSceneChange; private bool _empressRunningDelayedSceneChange; private bool _empressLiveJoinCachePrepared; private bool _empressSteamLobbyUnlockApplied; private bool _empressRunLevelCachePruned; private float _empressNextJoinabilityRefreshTime; private float _empressNextSupportAuditTime; private Coroutine? _empressTruckStartFallbackCoroutine; private int _empressTruckStartFallbackSceneToken; private string _empressSteamLobbyUnlockRoomName = string.Empty; private void Awake() { ((Component)this).gameObject.transform.parent = null; Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject); ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; } private void OnEnable() { SceneManager.sceneLoaded += EmpressOnSceneLoaded; } private void OnDisable() { SceneManager.sceneLoaded -= EmpressOnSceneLoaded; } private void Update() { if (!((Object)(object)EmpressLateJoinPlugin.Instance == (Object)null) && EmpressLateJoinPlugin.Instance.EmpressEnabled.Value) { if (Time.unscaledTime >= _empressNextJoinabilityRefreshTime) { EmpressRefreshJoinability(); _empressNextJoinabilityRefreshTime = Time.unscaledTime + 1f; } EmpressMaybePruneRunLevelCache(); EmpressMaintainSupportObjects(); EmpressMaintainLateJoinState(); EmpressMaintainWaitingPlayers(); EmpressRepairExtractionActivationState(); EmpressProcessDelayedSceneChange(); } } internal bool EmpressTryHandleLateJoinSpawn() { if (!EmpressCanHostLateJoinLogic()) { return false; } List list = (from avatar in SemiFunc.PlayerGetList() where (Object)(object)avatar != (Object)null && (Object)(object)avatar.photonView != (Object)null && !EmpressGetAvatarSpawned(avatar) select avatar).ToList(); if (list.Count == 0) { return false; } if (SemiFunc.RunIsShop()) { foreach (PlayerAvatar item in list) { _empressTruckDepartureIgnoredActors.Add(item.photonView.OwnerActorNr); } return false; } foreach (PlayerAvatar item2 in list) { int ownerActorNr = item2.photonView.OwnerActorNr; if (EmpressEnsureRunLevelWaitingRoomMode()) { EmpressBackfillLateJoinerIntoEnemySystems(item2); _empressDeferredWaitingRoomActors.Add(ownerActorNr); continue; } EmpressTrackLateJoin(ownerActorNr); EmpressEnsureSupportObjects(item2); if (EmpressShouldQueueLateJoiner()) { EmpressQueueLateJoiner(item2); } else { EmpressAdmitLateJoiner(item2); } } return true; } internal void EmpressHandlePlayerLeft(Player player) { _empressHostWaitingActors.Remove(player.ActorNumber); _empressDeferredWaitingRoomActors.Remove(player.ActorNumber); _empressEnemyRegisteredActors.Remove(player.ActorNumber); _empressLiveJoinLevelUpdateSentActors.Remove(player.ActorNumber); _empressLiveJoinBootstrapSentActors.Remove(player.ActorNumber); _empressLiveStateReplayedActors.Remove(player.ActorNumber); _empressTruckDepartureIgnoredActors.Remove(player.ActorNumber); _empressNextSnapByActor.Remove(player.ActorNumber); EmpressClearLateJoinTracking(player.ActorNumber); } internal void EmpressHandlePlayerEntered(Player player) { if (EmpressCanHostRoomControl()) { if (SemiFunc.RunIsShop()) { _empressTruckDepartureIgnoredActors.Add(player.ActorNumber); } else if (EmpressCanHostLateJoinLogic() && SemiFunc.RunIsLevel() && !EmpressEnsureRunLevelWaitingRoomMode()) { EmpressTrackLateJoin(player.ActorNumber); } } } internal bool EmpressTryDelaySceneChange(RunManager runManager, bool completedLevel, bool levelFailed, ChangeLevelType changeLevelType) { //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Invalid comparison between Unknown and I4 //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0041: Invalid comparison between Unknown and I4 //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) if (_empressRunningDelayedSceneChange || !EmpressCanHostRoomControl() || !SemiFunc.RunIsLevel()) { return false; } if (EmpressEnsureRunLevelWaitingRoomMode()) { return false; } if (completedLevel && !levelFailed) { return false; } if (_empressLateJoinDetectedAt.Count == 0) { return false; } if ((int)changeLevelType == 4 || (int)changeLevelType == 3) { return false; } if (_empressDelayedSceneChange == null) { _empressDelayedSceneChange = new EmpressDelayedSceneChangeRequest { RunManager = runManager, CompletedLevel = completedLevel, LevelFailed = levelFailed, ChangeLevelType = changeLevelType, RequestedAt = Time.unscaledTime }; } else { _empressDelayedSceneChange.RunManager = runManager; _empressDelayedSceneChange.CompletedLevel = completedLevel; _empressDelayedSceneChange.LevelFailed = levelFailed; _empressDelayedSceneChange.ChangeLevelType = changeLevelType; } return true; } internal void EmpressHandleChangeLevelCompleted(RunManager runManager, ChangeLevelType changeLevelType) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) EmpressPrepareLiveJoinLevelDescriptor(runManager, changeLevelType); EmpressEnsureRunLevelWaitingRoomMode(); } private void EmpressOnSceneLoaded(Scene scene, LoadSceneMode mode) { _empressHostWaitingActors.Clear(); _empressDeferredWaitingRoomActors.Clear(); _empressEnemyRegisteredActors.Clear(); _empressLiveJoinLevelUpdateSentActors.Clear(); _empressLiveJoinBootstrapSentActors.Clear(); _empressLiveStateReplayedActors.Clear(); _empressTruckDepartureIgnoredActors.Clear(); _empressLateJoinDetectedAt.Clear(); _empressLateJoinReadyAt.Clear(); _empressNextSnapByActor.Clear(); _empressDelayedSceneChange = null; _empressRunningDelayedSceneChange = false; _empressLiveJoinCachePrepared = false; _empressSteamLobbyUnlockApplied = false; _empressRunLevelCachePruned = false; _empressNextJoinabilityRefreshTime = 0f; _empressNextSupportAuditTime = 0f; _empressTruckStartFallbackSceneToken++; if (_empressTruckStartFallbackCoroutine != null) { ((MonoBehaviour)this).StopCoroutine(_empressTruckStartFallbackCoroutine); } _empressTruckStartFallbackCoroutine = null; _empressSteamLobbyUnlockRoomName = string.Empty; EmpressRefreshJoinability(); } private void EmpressRefreshJoinability() { if (EmpressIsFrontEndRoomState()) { _empressSteamLobbyUnlockApplied = false; } else if (!EmpressCanHostRoomControl()) { _empressSteamLobbyUnlockApplied = false; _empressSteamLobbyUnlockRoomName = string.Empty; } else { EmpressForceJoinabilityRefresh(); } } internal void EmpressForceJoinabilityRefresh(bool forceSteamLobbyUnlock = false) { if (EmpressIsFrontEndRoomState() && !forceSteamLobbyUnlock) { _empressSteamLobbyUnlockApplied = false; return; } if (!EmpressCanHostRoomControl() || !EmpressLateJoinPlugin.Instance.EmpressKeepRoomJoinable.Value) { _empressSteamLobbyUnlockApplied = false; _empressSteamLobbyUnlockRoomName = string.Empty; return; } Room currentRoom = PhotonNetwork.CurrentRoom; if (currentRoom == null) { _empressSteamLobbyUnlockApplied = false; _empressSteamLobbyUnlockRoomName = string.Empty; return; } if (!string.Equals(_empressSteamLobbyUnlockRoomName, currentRoom.Name, StringComparison.Ordinal)) { _empressSteamLobbyUnlockRoomName = currentRoom.Name; _empressSteamLobbyUnlockApplied = false; } currentRoom.IsOpen = true; if (EmpressGetConnectRandom()) { currentRoom.IsVisible = true; _empressSteamLobbyUnlockApplied = false; } if (EmpressGetConnectRandom() || !((Object)(object)SteamManager.instance != (Object)null) || (_empressSteamLobbyUnlockApplied && !forceSteamLobbyUnlock)) { return; } try { SteamManager.instance.UnlockLobby(false); _empressSteamLobbyUnlockApplied = true; } catch { _empressSteamLobbyUnlockApplied = false; } } private bool EmpressGetCurrentRunGameOver() { return EmpressGetFieldValue(EmpressRunManagerGameOverField, RunManager.instance); } private bool EmpressLiveJoinEnabled() { return EmpressLateJoinPlugin.Instance?.EmpressLiveJoinActiveLevels.Value ?? false; } private void EmpressPrepareLiveJoinLevelDescriptor(RunManager runManager, ChangeLevelType changeLevelType) { Level val = EmpressGetRunManagerLevelCurrent(runManager); if (EmpressLiveJoinEnabled() && EmpressCanHostRoomControl() && !((Object)(object)runManager == (Object)null) && !((Object)(object)val == (Object)null) && SemiFunc.RunIsLevel()) { PhotonView val2 = EmpressGetRunManagerPhotonView(); if (!((Object)(object)val2 == (Object)null) && val2.ViewID > 0) { PhotonNetwork.RemoveBufferedRPCs(val2.ViewID, "UpdateLevelRPC", (int[])null); } } } private void EmpressPrepareLiveJoinRoomState() { if (!_empressLiveJoinCachePrepared && EmpressLiveJoinEnabled() && EmpressCanHostRoomControl() && SemiFunc.RunIsLevel()) { PhotonView val = EmpressGetFieldValue(EmpressLevelGeneratorPhotonViewField, LevelGenerator.Instance); if (!((Object)(object)val == (Object)null) && val.ViewID > 0) { PhotonNetwork.RemoveBufferedRPCs(val.ViewID, "GenerateDone", (int[])null); _empressLiveJoinCachePrepared = true; } } } private void EmpressMaybePruneRunLevelCache() { EmpressPrepareLiveJoinRoomState(); EmpressEnsureRunLevelWaitingRoomMode(); } private void EmpressMaintainSupportObjects() { if (!EmpressLiveJoinEnabled() || !EmpressCanHostRoomControl() || (Object)(object)LevelGenerator.Instance == (Object)null || SemiFunc.MenuLevel() || Time.unscaledTime < _empressNextSupportAuditTime) { return; } _empressNextSupportAuditTime = Time.unscaledTime + 1f; foreach (PlayerAvatar item in SemiFunc.PlayerGetList()) { if (!((Object)(object)item == (Object)null)) { EmpressEnsureSupportObjects(item); } } } private void EmpressMaintainLateJoinState() { if (!EmpressCanHostRoomControl() || _empressLateJoinDetectedAt.Count == 0) { return; } float num = Mathf.Max(1f, EmpressLateJoinPlugin.Instance.EmpressSceneSwitchSettleTimeout.Value); foreach (int item in _empressLateJoinDetectedAt.Keys.ToList()) { if (!EmpressIsActorStillConnected(item)) { EmpressClearLateJoinTracking(item); continue; } float num2 = _empressLateJoinDetectedAt[item]; PlayerAvatar val = EmpressFindAvatar(item); if ((Object)(object)val == (Object)null || (Object)(object)val.photonView == (Object)null) { if (Time.unscaledTime - num2 >= num) { EmpressClearLateJoinTracking(item); } continue; } EmpressEnsureSupportObjects(val); EmpressBackfillLateJoinerIntoEnemySystems(val); EmpressAdvanceLiveJoinBootstrap(val, num2); if (EmpressIsLateJoinerSettled(val, num2)) { if (!_empressLateJoinReadyAt.ContainsKey(item)) { _empressLateJoinReadyAt[item] = Time.unscaledTime; } else if (Time.unscaledTime - _empressLateJoinReadyAt[item] >= 0.2f) { EmpressClearLateJoinTracking(item); } } else { _empressLateJoinReadyAt.Remove(item); if (Time.unscaledTime - num2 >= num) { EmpressClearLateJoinTracking(item); } } } } private void EmpressAdvanceLiveJoinBootstrap(PlayerAvatar avatar, float detectedAt) { if (!EmpressLiveJoinEnabled() || (Object)(object)avatar.photonView == (Object)null || !EmpressGetAvatarSpawned(avatar)) { return; } int ownerActorNr = avatar.photonView.OwnerActorNr; if (ownerActorNr <= 0 || PhotonNetwork.CurrentRoom == null || !PhotonNetwork.CurrentRoom.Players.TryGetValue(ownerActorNr, out var value)) { return; } float num = Time.unscaledTime - detectedAt; try { if (!_empressLiveJoinLevelUpdateSentActors.Contains(ownerActorNr) && num >= 2f) { if (!EmpressHasLateJoinIdentity(avatar, detectedAt)) { return; } PhotonView val = EmpressGetRunManagerPhotonView(); if ((Object)(object)val != (Object)null) { Player obj = value; object[] array = new object[3]; Level? obj2 = EmpressGetRunManagerLevelCurrent(RunManager.instance); array[0] = ((obj2 != null) ? ((Object)obj2).name : null) ?? string.Empty; array[1] = EmpressGetRunManagerLevelsCompleted(RunManager.instance); array[2] = EmpressGetCurrentRunGameOver(); val.RPC("UpdateLevelRPC", obj, array); _empressLiveJoinLevelUpdateSentActors.Add(ownerActorNr); } } if (_empressLiveJoinLevelUpdateSentActors.Contains(ownerActorNr) && !_empressLiveJoinBootstrapSentActors.Contains(ownerActorNr) && num >= 3.5f) { PhotonView val2 = EmpressGetFieldValue(EmpressLevelGeneratorPhotonViewField, LevelGenerator.Instance); if ((Object)(object)val2 != (Object)null) { val2.RPC("GenerateDone", value, Array.Empty()); _empressLiveJoinBootstrapSentActors.Add(ownerActorNr); } } if (_empressLiveJoinBootstrapSentActors.Contains(ownerActorNr) && !_empressLiveStateReplayedActors.Contains(ownerActorNr) && num >= 4.5f) { EmpressReplayStatsToJoiner(value); EmpressReplayItemsToJoiner(value); EmpressReplayPlayerStateToJoiner(value); EmpressReplayRoundStateToJoiner(value); _empressLiveStateReplayedActors.Add(ownerActorNr); } } catch { } } private bool EmpressHasLateJoinIdentity(PlayerAvatar avatar, float detectedAt) { if (!EmpressGetAvatarSpawned(avatar)) { return false; } if (string.IsNullOrWhiteSpace(EmpressGetAvatarSteamId(avatar)) || string.IsNullOrWhiteSpace(EmpressGetAvatarPlayerName(avatar))) { return false; } EmpressEnsureSupportObjects(avatar); if (!EmpressHasSupportObjectsReady(avatar)) { return false; } int num = (((Object)(object)avatar.photonView != (Object)null) ? avatar.photonView.OwnerActorNr : 0); if (num > 0 && !_empressEnemyRegisteredActors.Contains(num)) { return false; } return Time.unscaledTime - detectedAt >= 0.5f; } private void EmpressReplayStatsToJoiner(Player targetPlayer) { //IL_004e: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Expected O, but got Unknown //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Expected O, but got Unknown PhotonView val = EmpressGetPunManagerPhotonView(); if ((Object)(object)PunManager.instance == (Object)null || (Object)(object)val == (Object)null || (Object)(object)StatsManager.instance == (Object)null) { return; } SortedDictionary> sortedDictionary = EmpressGetFieldValue>>(EmpressStatsManagerDictionaryOfDictionariesField, StatsManager.instance); if (sortedDictionary == null) { return; } List>> list = sortedDictionary.ToList(); if (list.Count == 0) { return; } Hashtable val2 = new Hashtable(); int num = 0; for (int i = 0; i < list.Count; i++) { KeyValuePair> keyValuePair = list[i]; val2[(object)keyValuePair.Key] = EmpressConvertDictionaryToHashtable(keyValuePair.Value); num++; if (num >= 4 || i >= list.Count - 1) { bool flag = i >= list.Count - 1; val.RPC("ReceiveSyncData", targetPlayer, new object[2] { val2, flag }); val2 = new Hashtable(); num = 0; } } } private void EmpressReplayItemsToJoiner(Player targetPlayer) { //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_011f: Unknown result type (might be due to invalid IL or missing references) //IL_0129: Expected I4, but got Unknown PhotonView val = EmpressGetPunManagerPhotonView(); if ((Object)(object)PunManager.instance == (Object)null || (Object)(object)val == (Object)null) { return; } foreach (ItemAttributes item in from item in Object.FindObjectsOfType() where (Object)(object)item != (Object)null && (Object)(object)item.photonView != (Object)null && item.photonView.ViewID > 0 orderby item.photonView.ViewID select item) { string text = ((!string.IsNullOrWhiteSpace(item.instanceName)) ? item.instanceName : item.itemAssetName); if (!string.IsNullOrWhiteSpace(text)) { val.RPC("SetItemNameRPC", targetPlayer, new object[2] { text, item.photonView.ViewID }); } item.photonView.RPC("GetValueRPC", targetPlayer, new object[1] { item.value }); ItemEquippable itemEquippable = item.itemEquippable; if ((Object)(object)itemEquippable != (Object)null && (int)itemEquippable.currentState != 0) { item.photonView.RPC("RPC_UpdateItemState", targetPlayer, new object[3] { (int)itemEquippable.currentState, itemEquippable.inventorySpotIndex, itemEquippable.ownerPlayerId }); } } } private void EmpressReplayPlayerStateToJoiner(Player targetPlayer) { foreach (PlayerAvatar item in from player in SemiFunc.PlayerGetList() where (Object)(object)player != (Object)null && (Object)(object)player.photonView != (Object)null select player) { PlayerHealth val = EmpressGetAvatarPlayerHealth(item); if ((Object)(object)val != (Object)null) { item.photonView.RPC("UpdateHealthRPC", targetPlayer, new object[3] { EmpressGetPlayerHealthHealth(val), EmpressGetPlayerHealthMaxHealth(val), false }); } if (EmpressGetAvatarDeadSet(item) || EmpressGetAvatarIsDisabled(item) || !((Component)item).gameObject.activeSelf) { item.photonView.RPC("PlayerDeathRPC", targetPlayer, new object[1] { -1 }); } PlayerTumble val2 = EmpressGetAvatarTumble(item); PhotonView val3 = (((Object)(object)val2 != (Object)null) ? EmpressGetTumblePhotonView(val2) : null); if ((Object)(object)val2 != (Object)null && (Object)(object)val3 != (Object)null && EmpressGetTumbleIsTumbling(val2)) { val3.RPC("TumbleSetRPC", targetPlayer, new object[2] { true, false }); if (EmpressGetTumbleOverride(val2)) { val3.RPC("TumbleOverrideRPC", targetPlayer, new object[1] { true }); } } } } private void EmpressReplayRoundStateToJoiner(Player targetPlayer) { PhotonView val = EmpressGetPunManagerPhotonView(); if ((Object)(object)val != (Object)null) { if (!string.IsNullOrWhiteSpace(SessionManager.instance?.crownedPlayerSteamID)) { val.RPC("CrownPlayerRPC", targetPlayer, new object[1] { SessionManager.instance.crownedPlayerSteamID }); } if ((Object)(object)RoundDirector.instance != (Object)null) { val.RPC("SyncHaul", targetPlayer, new object[1] { EmpressGetRoundDirectorTotalHaul() }); } if (SemiFunc.RunIsShop() && (Object)(object)ShopManager.instance != (Object)null) { val.RPC("UpdateShoppingCostRPC", targetPlayer, new object[1] { EmpressGetShopManagerTotalCost() }); } } PhotonView val2 = EmpressGetRoundDirectorPhotonView(); if (!((Object)(object)val2 == (Object)null)) { ExtractionPoint val3 = EmpressGetRoundDirectorExtractionPointCurrent(); PhotonView val4 = (((Object)(object)val3 != (Object)null) ? EmpressGetExtractionPointPhotonView(val3) : null); if (EmpressGetRoundDirectorExtractionPointActive() && (Object)(object)val4 != (Object)null && (Object)(object)PhotonView.Find(val4.ViewID) != (Object)null) { val2.RPC("ExtractionPointActivateRPC", targetPlayer, new object[1] { val4.ViewID }); } else { val2.RPC("ExtractionPointsUnlockRPC", targetPlayer, Array.Empty()); } if (EmpressGetRoundDirectorAllExtractionPointsCompleted()) { val2.RPC("ExtractionCompletedAllRPC", targetPlayer, Array.Empty()); } } } private void EmpressMaintainWaitingPlayers() { //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0087: Unknown result type (might be due to invalid IL or missing references) //IL_0088: Unknown result type (might be due to invalid IL or missing references) //IL_008d: 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_00e4: Unknown result type (might be due to invalid IL or missing references) //IL_00e5: Unknown result type (might be due to invalid IL or missing references) if (!EmpressCanHostLateJoinLogic() || _empressHostWaitingActors.Count == 0) { return; } foreach (int item3 in _empressHostWaitingActors.ToList()) { PlayerAvatar val = EmpressFindAvatar(item3); if ((Object)(object)val == (Object)null || (Object)(object)val.photonView == (Object)null) { _empressHostWaitingActors.Remove(item3); _empressNextSnapByActor.Remove(item3); } else { if (!SemiFunc.RunIsLevel()) { continue; } (Vector3 position, Quaternion rotation) tuple = EmpressGetWaitingSpawn(item3); Vector3 item = tuple.position; Quaternion item2 = tuple.rotation; float num = Mathf.Max(1f, EmpressLateJoinPlugin.Instance.EmpressWaitingLeashRadius.Value); if (!(Vector3.Distance(((Component)val).transform.position, item) <= num)) { float value; float num2 = (_empressNextSnapByActor.TryGetValue(item3, out value) ? value : 0f); if (!(Time.unscaledTime < num2)) { val.Spawn(item, item2); _empressNextSnapByActor[item3] = Time.unscaledTime + Mathf.Max(0.1f, EmpressLateJoinPlugin.Instance.EmpressWaitingSnapCooldown.Value); } } } } } internal bool EmpressTryBlockInvalidExtractionActivation(int photonViewId) { if (!EmpressCanHostRoomControl() || !SemiFunc.RunIsLevel()) { return false; } if (photonViewId <= 0) { EmpressRepairMissingExtractionActivation(); return true; } PhotonView val = PhotonView.Find(photonViewId); if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).GetComponent() != (Object)null) { return false; } EmpressRepairMissingExtractionActivation(); return true; } private void EmpressRepairMissingExtractionActivation() { if (!((Object)(object)RoundDirector.instance == (Object)null) && EmpressGetRoundDirectorExtractionPointActive()) { ExtractionPoint val = EmpressGetRoundDirectorExtractionPointCurrent(); PhotonView val2 = (((Object)(object)val != (Object)null) ? EmpressGetExtractionPointPhotonView(val) : null); if (!((Object)(object)val != (Object)null) || !((Object)(object)val2 != (Object)null) || !((Object)(object)PhotonView.Find(val2.ViewID) != (Object)null)) { EmpressSetRoundDirectorExtractionPointActive(value: false); EmpressSetRoundDirectorExtractionPointCurrent(null); } } } private void EmpressRepairExtractionActivationState() { if (EmpressCanHostRoomControl() && SemiFunc.RunIsLevel() && !((Object)(object)RoundDirector.instance == (Object)null) && EmpressGetRoundDirectorExtractionPointActive()) { ExtractionPoint val = EmpressGetRoundDirectorExtractionPointCurrent(); PhotonView val2 = (((Object)(object)val != (Object)null) ? EmpressGetExtractionPointPhotonView(val) : null); if (!((Object)(object)val != (Object)null) || !((Object)(object)val2 != (Object)null) || !((Object)(object)PhotonView.Find(val2.ViewID) != (Object)null)) { EmpressSetRoundDirectorExtractionPointActive(value: false); EmpressSetRoundDirectorExtractionPointCurrent(null); } } } internal void EmpressScheduleTruckStartFallback(PlayerChatBoxState state) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0002: Invalid comparison between Unknown and I4 if ((int)state == 3 && !((Object)(object)EmpressLateJoinPlugin.Instance == (Object)null) && EmpressLateJoinPlugin.Instance.EmpressEnabled.Value && !((Object)(object)RunManager.instance == (Object)null) && SemiFunc.IsMasterClientOrSingleplayer() && !SemiFunc.RunIsLobbyMenu() && !SemiFunc.MenuLevel() && _empressTruckStartFallbackCoroutine == null) { float delay = Mathf.Max(1f, EmpressLateJoinPlugin.Instance.EmpressTruckStartFallbackDelay.Value); _empressTruckStartFallbackCoroutine = ((MonoBehaviour)this).StartCoroutine(EmpressTruckStartFallback(delay, _empressTruckStartFallbackSceneToken)); } } private IEnumerator EmpressTruckStartFallback(float delay, int sceneToken) { yield return (object)new WaitForSeconds(delay); _empressTruckStartFallbackCoroutine = null; if (sceneToken == _empressTruckStartFallbackSceneToken && !((Object)(object)RunManager.instance == (Object)null) && SemiFunc.IsMasterClientOrSingleplayer() && !SemiFunc.RunIsLobbyMenu() && !SemiFunc.MenuLevel() && !EmpressTryExecuteLevelNextCommand()) { EmpressInvokeRunManagerChangeLevel(RunManager.instance, completedLevel: true, SemiFunc.RunIsArena(), (ChangeLevelType)0); } } private bool EmpressTryExecuteLevelNextCommand() { DebugCommandHandler val = EmpressGetDebugCommandHandlerInstance(); if ((Object)(object)val == (Object)null) { return false; } object obj = EmpressInvokeMethod(EmpressDebugCommandHandlerExecuteMethod, val, "level next", true); bool flag = default(bool); int num; if (obj is bool) { flag = (bool)obj; num = 1; } else { num = 0; } return (byte)((uint)num & (flag ? 1u : 0u)) != 0; } private void EmpressProcessDelayedSceneChange() { //IL_0094: Unknown result type (might be due to invalid IL or missing references) if (_empressDelayedSceneChange == null) { return; } EmpressDelayedSceneChangeRequest empressDelayedSceneChange = _empressDelayedSceneChange; if ((Object)(object)empressDelayedSceneChange.RunManager == (Object)null || ((object)empressDelayedSceneChange.RunManager).Equals((object?)null)) { _empressDelayedSceneChange = null; return; } float num = Mathf.Max(1f, EmpressLateJoinPlugin.Instance.EmpressSceneSwitchSettleTimeout.Value); bool flag = Time.unscaledTime - empressDelayedSceneChange.RequestedAt >= num; if (_empressLateJoinDetectedAt.Count > 0 && !flag) { return; } _empressDelayedSceneChange = null; _empressRunningDelayedSceneChange = true; try { EmpressInvokeRunManagerChangeLevel(empressDelayedSceneChange.RunManager, empressDelayedSceneChange.CompletedLevel, empressDelayedSceneChange.LevelFailed, empressDelayedSceneChange.ChangeLevelType); } finally { _empressRunningDelayedSceneChange = false; } } internal bool EmpressTryEvaluatePlayersAllInTruck(out bool result) { result = false; if (!EmpressCanHostRoomControl() || (!SemiFunc.RunIsLevel() && !SemiFunc.RunIsShop())) { return false; } bool result2 = false; foreach (PlayerAvatar item in SemiFunc.PlayerGetList()) { if (!((Object)(object)item == (Object)null) && !EmpressGetAvatarIsDisabled(item) && !EmpressGetAvatarInTruck(item)) { if (!EmpressShouldIgnoreForTruckDeparture(item)) { return result2; } result2 = true; } } result = true; return result2; } internal bool EmpressTryHandlePlayerSelfDestruction(TruckScreenText truckScreenText) { if ((Object)(object)truckScreenText == (Object)null || !EmpressCanHostRoomControl() || !SemiFunc.RunIsLevel()) { return false; } if (!SemiFunc.PerSecond(5f, (Object)(object)truckScreenText) || !EmpressGetTruckScreenSelfDestructingPlayers(truckScreenText)) { return false; } bool flag = false; bool flag2 = true; foreach (PlayerAvatar item in SemiFunc.PlayerGetList()) { if (!((Object)(object)item == (Object)null) && !EmpressGetAvatarIsDisabled(item)) { if (EmpressGetAvatarInTruck(item) && !EmpressGetAvatarSelfDestructPrevented(item)) { EmpressSetAvatarSelfDestructPrevented(item, value: true); } else if (EmpressShouldIgnoreForTruckDeparture(item)) { flag = true; } else if (!EmpressGetAvatarSelfDestructPrevented(item)) { flag2 = false; } } } if (!flag) { return false; } if (flag2) { EmpressInvokeTruckScreenChatMessageResultSuccess(truckScreenText); EmpressInvokeTruckScreenPlayerChatBoxStateUpdate(truckScreenText, (PlayerChatBoxState)3); EmpressInvokeTruckScreenGotoPage(truckScreenText, 2); EmpressSetTruckScreenSelfDestructingPlayers(truckScreenText, value: false); } return true; } private bool EmpressShouldIgnoreForTruckDeparture(PlayerAvatar avatar) { if ((Object)(object)avatar.photonView == (Object)null) { return false; } int ownerActorNr = avatar.photonView.OwnerActorNr; if (ownerActorNr <= 0 || !EmpressIsActorStillConnected(ownerActorNr)) { return false; } if (!_empressHostWaitingActors.Contains(ownerActorNr) && !_empressDeferredWaitingRoomActors.Contains(ownerActorNr) && !_empressTruckDepartureIgnoredActors.Contains(ownerActorNr) && (!SemiFunc.RunIsShop() || EmpressGetAvatarSpawned(avatar))) { return _empressLateJoinDetectedAt.ContainsKey(ownerActorNr); } return true; } private void EmpressQueueLateJoiner(PlayerAvatar avatar) { //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: 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_002c: 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) int ownerActorNr = avatar.photonView.OwnerActorNr; _empressHostWaitingActors.Add(ownerActorNr); var (val, val2) = EmpressGetWaitingSpawn(ownerActorNr); avatar.Spawn(val, val2); EmpressRefreshAvatarRoomState(avatar); EmpressBackfillLateJoinerIntoEnemySystems(avatar); } private void EmpressAdmitLateJoiner(PlayerAvatar avatar) { //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: 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_0065: Unknown result type (might be due to invalid IL or missing references) //IL_0056: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) int ownerActorNr = avatar.photonView.OwnerActorNr; _empressHostWaitingActors.Remove(ownerActorNr); _empressNextSnapByActor.Remove(ownerActorNr); Vector3 val; Quaternion val2; if (EmpressLiveJoinEnabled() && SemiFunc.RunIsLevel()) { (val, val2) = EmpressGetWaitingSpawn(ownerActorNr); } else { (val, val2) = EmpressGetAdmissionSpawn(avatar); } avatar.Spawn(val, val2); EmpressRefreshAvatarRoomState(avatar); EmpressBackfillLateJoinerIntoEnemySystems(avatar); } private void EmpressEnsureSupportObjects(PlayerAvatar avatar) { //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_006b: Unknown result type (might be due to invalid IL or missing references) //IL_0070: Unknown result type (might be due to invalid IL or missing references) //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_0106: Unknown result type (might be due to invalid IL or missing references) //IL_010b: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)avatar == (Object)null || (Object)(object)LevelGenerator.Instance == (Object)null || SemiFunc.MenuLevel() || !EmpressHasAvatarSteamIdentity(avatar)) { return; } bool flag = false; GameObject val = EmpressGetLevelDeathHeadPrefab(); PlayerDeathHead val2 = EmpressGetAvatarDeathHead(avatar); if ((Object)(object)val2 != (Object)null) { flag |= EmpressRepairDeathHeadSupport(avatar, val2); } else if ((Object)(object)val != (Object)null) { val2 = (GameManager.Multiplayer() ? PhotonNetwork.Instantiate(((Object)val).name, new Vector3(0f, 3000f, 0f), Quaternion.identity, (byte)0, (object[])null) : Object.Instantiate(val, new Vector3(0f, 3000f, 0f), Quaternion.identity)).GetComponent(); if ((Object)(object)val2 != (Object)null) { val2.playerAvatar = avatar; EmpressSetAvatarDeathHead(avatar, val2); flag = true; } } GameObject val3 = EmpressGetLevelTumblePrefab(); PlayerTumble val4 = EmpressGetAvatarTumble(avatar); if ((Object)(object)val4 != (Object)null) { flag |= EmpressRepairTumbleSupport(avatar, val4); } else if ((Object)(object)val3 != (Object)null) { val4 = (GameManager.Multiplayer() ? PhotonNetwork.Instantiate(((Object)val3).name, new Vector3(0f, 3000f, 0f), Quaternion.identity, (byte)0, (object[])null) : Object.Instantiate(val3, new Vector3(0f, 3000f, 0f), Quaternion.identity)).GetComponent(); if ((Object)(object)val4 != (Object)null) { val4.playerAvatar = avatar; EmpressSetAvatarTumble(avatar, val4); flag = true; } } } private bool EmpressRepairDeathHeadSupport(PlayerAvatar avatar, PlayerDeathHead deathHead) { bool result = false; if ((Object)(object)deathHead.playerAvatar != (Object)(object)avatar) { deathHead.playerAvatar = avatar; EmpressSetAvatarDeathHead(avatar, deathHead); result = true; } if (!EmpressGetDeathHeadSetup(deathHead) && (Object)(object)EmpressGetDeathHeadPhysGrabObject(deathHead) != (Object)null) { try { EmpressInvokePlayerDeathHeadSetupDone(deathHead); EmpressSetDeathHeadSetup(deathHead, setup: true); result = true; } catch { } } return result; } private bool EmpressRepairTumbleSupport(PlayerAvatar avatar, PlayerTumble tumble) { bool result = false; if ((Object)(object)tumble.playerAvatar != (Object)(object)avatar) { tumble.playerAvatar = avatar; EmpressSetAvatarTumble(avatar, tumble); result = true; } if (!EmpressGetTumbleSetup(tumble) && (Object)(object)EmpressGetTumblePhysGrabObject(tumble) != (Object)null) { try { EmpressInvokePlayerTumbleSetupDone(tumble); EmpressSetTumbleSetup(tumble, setup: true); result = true; } catch { } } return result; } private (Vector3 position, Quaternion rotation) EmpressGetAdmissionSpawn(PlayerAvatar lateJoiner) { //IL_0127: Unknown result type (might be due to invalid IL or missing references) //IL_0132: 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_00bc: Unknown result type (might be due to invalid IL or missing references) List list = EmpressFindSceneObjects(); if (list.Count == 0) { return EmpressGetFallbackSpawn(); } SpawnPoint val = list[0]; float num = float.NegativeInfinity; foreach (SpawnPoint item in list) { if ((Object)(object)item == (Object)null) { continue; } float num2 = float.PositiveInfinity; foreach (PlayerAvatar item2 in SemiFunc.PlayerGetList()) { if (!((Object)(object)item2 == (Object)null) && !((Object)(object)item2 == (Object)(object)lateJoiner) && EmpressGetAvatarSpawned(item2) && !((Object)(object)item2.photonView == (Object)null) && !_empressHostWaitingActors.Contains(item2.photonView.OwnerActorNr)) { num2 = Mathf.Min(num2, Vector3.Distance(((Component)item).transform.position, ((Component)item2).transform.position)); } } float num3 = (float.IsPositiveInfinity(num2) ? 9999f : num2); if (num3 > num) { num = num3; val = item; } } return (((Component)val).transform.position, ((Component)val).transform.rotation); } private (Vector3 position, Quaternion rotation) EmpressGetWaitingSpawn(int actorNumber) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_000c: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0012: 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) //IL_0048: 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_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0054: 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_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) (Vector3 position, Quaternion rotation) tuple = EmpressGetWaitingAnchor(); Vector3 item = tuple.position; Quaternion item2 = tuple.rotation; float num = (float)actorNumber * 47f; float num2 = 1.3f + (float)(actorNumber % 3) * 0.45f; Vector3 val = Quaternion.Euler(0f, num, 0f) * new Vector3(0f, 0f, num2); return (item + val, item2); } private (Vector3 position, Quaternion rotation) EmpressGetWaitingAnchor() { //IL_001a: Unknown result type (might be due to invalid IL or missing references) //IL_0025: 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) //IL_006b: Unknown result type (might be due to invalid IL or missing references) TruckSafetySpawnPoint val = EmpressFindSceneObjects().FirstOrDefault(); if ((Object)(object)val != (Object)null) { return (((Component)val).transform.position, ((Component)val).transform.rotation); } List list = EmpressFindSceneObjects(); if (list.Count > 0 && (Object)(object)list[0] != (Object)null) { return (((Component)list[0]).transform.position, ((Component)list[0]).transform.rotation); } return EmpressGetFallbackSpawn(); } private static (Vector3 position, Quaternion rotation) EmpressGetFallbackSpawn() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Unknown result type (might be due to invalid IL or missing references) //IL_0067: Unknown result type (might be due to invalid IL or missing references) //IL_0048: 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) if ((Object)(object)PlayerController.instance != (Object)null) { return (((Component)PlayerController.instance).transform.position, ((Component)PlayerController.instance).transform.rotation); } if ((Object)(object)Camera.main != (Object)null) { return (((Component)Camera.main).transform.position, ((Component)Camera.main).transform.rotation); } return (Vector3.zero, Quaternion.identity); } private static PlayerAvatar? EmpressFindAvatar(int actorNumber) { return ((IEnumerable)SemiFunc.PlayerGetList()).FirstOrDefault((Func)((PlayerAvatar player) => (Object)(object)player != (Object)null && (Object)(object)player.photonView != (Object)null && player.photonView.OwnerActorNr == actorNumber)); } private bool EmpressShouldQueueLateJoiner() { if (!SemiFunc.RunIsLevel()) { return false; } if (EmpressLiveJoinEnabled()) { return false; } return EmpressLateJoinPlugin.Instance.EmpressQueueDuringActiveLevels.Value; } private void EmpressTrackLateJoin(int actorNumber) { if (!_empressLateJoinDetectedAt.ContainsKey(actorNumber)) { _empressLateJoinDetectedAt[actorNumber] = Time.unscaledTime; } _empressTruckDepartureIgnoredActors.Add(actorNumber); _empressDeferredWaitingRoomActors.Remove(actorNumber); _empressEnemyRegisteredActors.Remove(actorNumber); _empressLiveJoinLevelUpdateSentActors.Remove(actorNumber); _empressLiveJoinBootstrapSentActors.Remove(actorNumber); _empressLiveStateReplayedActors.Remove(actorNumber); _empressLateJoinReadyAt.Remove(actorNumber); } private void EmpressClearLateJoinTracking(int actorNumber) { _empressLateJoinDetectedAt.Remove(actorNumber); _empressLateJoinReadyAt.Remove(actorNumber); } private bool EmpressEnsureRunLevelWaitingRoomMode() { if (EmpressLiveJoinEnabled()) { return false; } if (_empressRunLevelCachePruned) { return true; } if (!EmpressCanHostRoomControl() || !SemiFunc.RunIsLevel()) { return false; } if ((Object)(object)EmpressGetRunManagerPhotonView() == (Object)null) { return false; } if (EmpressPruneBufferedRunLevelState() <= 0) { return false; } _empressRunLevelCachePruned = true; _empressHostWaitingActors.Clear(); _empressLateJoinDetectedAt.Clear(); _empressLateJoinReadyAt.Clear(); _empressDelayedSceneChange = null; return true; } private bool EmpressIsLateJoinerSettled(PlayerAvatar avatar, float detectedAt) { if (!EmpressGetAvatarSpawned(avatar)) { return false; } if (string.IsNullOrWhiteSpace(EmpressGetAvatarSteamId(avatar)) || string.IsNullOrWhiteSpace(EmpressGetAvatarPlayerName(avatar))) { return false; } if (!EmpressHasSupportObjectsReady(avatar)) { return false; } int num = (((Object)(object)avatar.photonView != (Object)null) ? avatar.photonView.OwnerActorNr : 0); if (num > 0 && !_empressEnemyRegisteredActors.Contains(num)) { return false; } float num2 = Time.unscaledTime - detectedAt; if (num2 < 0.5f) { return false; } if (EmpressGetAvatarLevelAnimationCompleted(avatar)) { return true; } return num2 >= Mathf.Max(0.75f, EmpressLateJoinPlugin.Instance.EmpressSceneSwitchSettleDelay.Value); } private void EmpressBackfillLateJoinerIntoEnemySystems(PlayerAvatar avatar) { if ((Object)(object)avatar.photonView == (Object)null) { return; } int ownerActorNr = avatar.photonView.OwnerActorNr; int viewID = avatar.photonView.ViewID; if (ownerActorNr <= 0 || viewID <= 0 || _empressEnemyRegisteredActors.Contains(ownerActorNr)) { return; } HashSet hashSet = new HashSet(from enemy in EmpressFindSceneObjects() where (Object)(object)enemy != (Object)null select enemy); if (hashSet.Count == 0) { return; } int num = 0; foreach (Enemy item in hashSet) { try { item.PlayerAdded(viewID); num++; } catch { } } _empressEnemyRegisteredActors.Add(ownerActorNr); } private static void EmpressRefreshAvatarRoomState(PlayerAvatar avatar) { RoomVolumeCheck instance = EmpressGetAvatarRoomVolumeCheck(avatar); EmpressInvokeMethod(EmpressRoomVolumeCheckCheckSetMethod, instance); } private int EmpressPruneBufferedRunLevelState() { int num = 0; PhotonView val = EmpressGetRunManagerPhotonView(); if ((Object)(object)val != (Object)null) { PhotonNetwork.RemoveBufferedRPCs(val.ViewID, "UpdateLevelRPC", (int[])null); num++; } PhotonView val2 = EmpressGetFieldValue(EmpressLevelGeneratorPhotonViewField, LevelGenerator.Instance); if ((Object)(object)val2 != (Object)null) { PhotonNetwork.RemoveBufferedRPCs(val2.ViewID, (string)null, (int[])null); num++; } return num; } private void EmpressRemoveInstantiationCache(PhotonView photonView) { //IL_0100: Unknown result type (might be due to invalid IL or missing references) //IL_0102: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003f: Expected O, but got Unknown //IL_0043: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_00a7: Unknown result type (might be due to invalid IL or missing references) //IL_00ac: Unknown result type (might be due to invalid IL or missing references) //IL_00bd: Unknown result type (might be due to invalid IL or missing references) //IL_00b3: Unknown result type (might be due to invalid IL or missing references) //IL_00e6: Unknown result type (might be due to invalid IL or missing references) if (photonView.InstantiationId == 0 || EmpressPhotonRaiseEventInternalMethod == null) { return; } object obj = EmpressPhotonKeyByteSevenField?.GetValue(null); if (obj == null) { return; } Hashtable val = EmpressGetFieldValue(EmpressPhotonRemoveFilterField, null); Hashtable val2 = new Hashtable(); if (val != null) { DictionaryEntryEnumerator enumerator = val.GetEnumerator(); try { while (((DictionaryEntryEnumerator)(ref enumerator)).MoveNext()) { DictionaryEntry current = ((DictionaryEntryEnumerator)(ref enumerator)).Current; val2[current.Key] = current.Value; } } finally { ((IDisposable)(DictionaryEntryEnumerator)(ref enumerator)).Dispose(); } } val2[obj] = photonView.InstantiationId; RaiseEventOptions val3 = EmpressGetFieldValue(EmpressPhotonServerCleanOptionsField, null); EventCaching cachingOption = (EventCaching)((val3 != null) ? ((int)val3.CachingOption) : 0); RaiseEventOptions val4 = (RaiseEventOptions)(((object)val3) ?? ((object)new RaiseEventOptions())); val4.CachingOption = (EventCaching)6; try { EmpressPhotonRaiseEventInternalMethod.Invoke(null, new object[4] { (byte)202, val2, val4, SendOptions.SendReliable }); } catch { } finally { if (val3 != null) { val3.CachingOption = cachingOption; } } } private static PhotonView? EmpressGetRunManagerPhotonView() { RunManagerPUN val = EmpressGetFieldValue(EmpressRunManagerPunField, RunManager.instance); if ((Object)(object)val == (Object)null) { return null; } return EmpressGetFieldValue(EmpressRunManagerPunPhotonViewField, val); } private static bool EmpressIsActorStillConnected(int actorNumber) { if (!PhotonNetwork.InRoom || PhotonNetwork.CurrentRoom == null) { return false; } return PhotonNetwork.CurrentRoom.Players.ContainsKey(actorNumber); } private string EmpressDescribeTrackedLateJoiners() { List list = new List(); foreach (int item in _empressLateJoinDetectedAt.Keys.OrderBy((int value) => value)) { PlayerAvatar val = EmpressFindAvatar(item); Player value2; if ((Object)(object)val != (Object)null) { list.Add($"{EmpressGetAvatarDisplayName(val)} ({item})"); } else if (PhotonNetwork.CurrentRoom != null && PhotonNetwork.CurrentRoom.Players.TryGetValue(item, out value2)) { list.Add($"{value2.NickName} ({item})"); } else { list.Add(item.ToString()); } } if (list.Count != 0) { return string.Join(", ", list); } return "unknown players"; } private static bool EmpressCanHostRoomControl() { if ((Object)(object)EmpressLateJoinPlugin.Instance == (Object)null || !EmpressLateJoinPlugin.Instance.EmpressEnabled.Value) { return false; } if ((Object)(object)GameManager.instance == (Object)null || !PhotonNetwork.InRoom || !GameManager.Multiplayer() || !PhotonNetwork.IsMasterClient) { return false; } return true; } private static bool EmpressIsFrontEndRoomState() { if ((Object)(object)RunManager.instance == (Object)null) { return true; } return SemiFunc.MenuLevel(); } private static bool EmpressCanHostLateJoinLogic() { if (!EmpressCanHostRoomControl()) { return false; } if ((Object)(object)GameDirector.instance == (Object)null || (Object)(object)LevelGenerator.Instance == (Object)null) { return false; } return SemiFunc.LevelGenDone(); } private static bool EmpressGetConnectRandom() { return EmpressGetFieldValue(EmpressGameManagerConnectRandomField, GameManager.instance); } private static DebugCommandHandler? EmpressGetDebugCommandHandlerInstance() { return EmpressGetFieldValue(EmpressDebugCommandHandlerInstanceField, null); } private static Level? EmpressGetRunManagerLevelCurrent(RunManager? runManager) { return EmpressGetFieldValue(EmpressRunManagerLevelCurrentField, runManager); } private static int EmpressGetRunManagerLevelsCompleted(RunManager? runManager) { return EmpressGetFieldValue(EmpressRunManagerLevelsCompletedField, runManager); } private static bool EmpressGetAvatarSpawned(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarSpawnedField, avatar); } private static string EmpressGetAvatarSteamId(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarSteamIdField, avatar) ?? string.Empty; } private static bool EmpressHasAvatarSteamIdentity(PlayerAvatar avatar) { if ((Object)(object)avatar != (Object)null) { return !string.IsNullOrWhiteSpace(EmpressGetAvatarSteamId(avatar)); } return false; } private static string EmpressGetAvatarPlayerName(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarPlayerNameField, avatar) ?? string.Empty; } private static PlayerHealth? EmpressGetAvatarPlayerHealth(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarPlayerHealthField, avatar); } private static bool EmpressGetAvatarDeadSet(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarDeadSetField, avatar); } private static bool EmpressGetAvatarLevelAnimationCompleted(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarLevelAnimationCompletedField, avatar); } private static bool EmpressGetAvatarIsDisabled(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarIsDisabledField, avatar); } private static RoomVolumeCheck? EmpressGetAvatarRoomVolumeCheck(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarRoomVolumeCheckField, avatar); } private static bool EmpressGetAvatarInTruck(PlayerAvatar avatar) { RoomVolumeCheck val = EmpressGetAvatarRoomVolumeCheck(avatar); if ((Object)(object)val != (Object)null) { return EmpressGetFieldValue(EmpressRoomVolumeCheckInTruckField, val); } return false; } private static bool EmpressGetAvatarSelfDestructPrevented(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarSelfDestructPreventedField, avatar); } private static void EmpressSetAvatarSelfDestructPrevented(PlayerAvatar avatar, bool value) { EmpressSetFieldValue(EmpressPlayerAvatarSelfDestructPreventedField, avatar, value); } private static int EmpressGetPlayerHealthHealth(PlayerHealth playerHealth) { return EmpressGetFieldValue(EmpressPlayerHealthHealthField, playerHealth); } private static int EmpressGetPlayerHealthMaxHealth(PlayerHealth playerHealth) { return EmpressGetFieldValue(EmpressPlayerHealthMaxHealthField, playerHealth); } private static bool EmpressGetTruckScreenSelfDestructingPlayers(TruckScreenText truckScreenText) { return EmpressGetFieldValue(EmpressTruckScreenTextSelfDestructingPlayersField, truckScreenText); } private static void EmpressSetTruckScreenSelfDestructingPlayers(TruckScreenText truckScreenText, bool value) { EmpressSetFieldValue(EmpressTruckScreenTextSelfDestructingPlayersField, truckScreenText, value); } private static void EmpressInvokeTruckScreenChatMessageResultSuccess(TruckScreenText truckScreenText) { EmpressInvokeMethod(EmpressTruckScreenTextChatMessageResultSuccessMethod, truckScreenText); } private static void EmpressInvokeTruckScreenPlayerChatBoxStateUpdate(TruckScreenText truckScreenText, PlayerChatBoxState state) { //IL_000e: Unknown result type (might be due to invalid IL or missing references) EmpressInvokeMethod(EmpressTruckScreenTextPlayerChatBoxStateUpdateMethod, truckScreenText, state); } private static void EmpressInvokeTruckScreenGotoPage(TruckScreenText truckScreenText, int pageIndex) { EmpressInvokeMethod(EmpressTruckScreenTextGotoPageMethod, truckScreenText, pageIndex); } private static void EmpressInvokePlayerDeathHeadSetupDone(PlayerDeathHead deathHead) { EmpressInvokeMethod(EmpressPlayerDeathHeadSetupDoneMethod, deathHead); } private static void EmpressInvokePlayerTumbleSetupDone(PlayerTumble tumble) { EmpressInvokeMethod(EmpressPlayerTumbleSetupDoneMethod, tumble); } private static void EmpressInvokeRunManagerChangeLevel(RunManager runManager, bool completedLevel, bool levelFailed, ChangeLevelType changeLevelType) { //IL_0020: Unknown result type (might be due to invalid IL or missing references) EmpressInvokeMethod(EmpressRunManagerChangeLevelMethod, runManager, completedLevel, levelFailed, changeLevelType); } private static PhotonView? EmpressGetPunManagerPhotonView() { return EmpressGetFieldValue(EmpressPunManagerPhotonViewField, PunManager.instance); } private static PhotonView? EmpressGetRoundDirectorPhotonView() { return EmpressGetFieldValue(EmpressRoundDirectorPhotonViewField, RoundDirector.instance); } private static int EmpressGetRoundDirectorTotalHaul() { return EmpressGetFieldValue(EmpressRoundDirectorTotalHaulField, RoundDirector.instance); } private static bool EmpressGetRoundDirectorExtractionPointActive() { return EmpressGetFieldValue(EmpressRoundDirectorExtractionPointActiveField, RoundDirector.instance); } private static void EmpressSetRoundDirectorExtractionPointActive(bool value) { EmpressSetFieldValue(EmpressRoundDirectorExtractionPointActiveField, RoundDirector.instance, value); } private static ExtractionPoint? EmpressGetRoundDirectorExtractionPointCurrent() { return EmpressGetFieldValue(EmpressRoundDirectorExtractionPointCurrentField, RoundDirector.instance); } private static void EmpressSetRoundDirectorExtractionPointCurrent(ExtractionPoint? value) { EmpressSetFieldValue(EmpressRoundDirectorExtractionPointCurrentField, RoundDirector.instance, value); } private static bool EmpressGetRoundDirectorAllExtractionPointsCompleted() { return EmpressGetFieldValue(EmpressRoundDirectorAllExtractionPointsCompletedField, RoundDirector.instance); } private static PhotonView? EmpressGetExtractionPointPhotonView(ExtractionPoint extractionPoint) { return EmpressGetFieldValue(EmpressExtractionPointPhotonViewField, extractionPoint); } private static int EmpressGetShopManagerTotalCost() { return EmpressGetFieldValue(EmpressShopManagerTotalCostField, ShopManager.instance); } private static bool EmpressHasSupportObjectsReady(PlayerAvatar avatar) { PlayerDeathHead val = EmpressGetAvatarDeathHead(avatar); if ((Object)(object)val == (Object)null || (Object)(object)val.playerAvatar != (Object)(object)avatar || !EmpressGetDeathHeadSetup(val)) { return false; } PlayerTumble val2 = EmpressGetAvatarTumble(avatar); if ((Object)(object)val2 != (Object)null && (Object)(object)val2.playerAvatar == (Object)(object)avatar) { return EmpressGetTumbleSetup(val2); } return false; } private static PlayerDeathHead? EmpressGetAvatarDeathHead(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarDeathHeadField, avatar); } private static void EmpressSetAvatarDeathHead(PlayerAvatar avatar, PlayerDeathHead deathHead) { EmpressSetFieldValue(EmpressPlayerAvatarDeathHeadField, avatar, deathHead); } private static PlayerTumble? EmpressGetAvatarTumble(PlayerAvatar avatar) { return EmpressGetFieldValue(EmpressPlayerAvatarTumbleField, avatar); } private static void EmpressSetAvatarTumble(PlayerAvatar avatar, PlayerTumble tumble) { EmpressSetFieldValue(EmpressPlayerAvatarTumbleField, avatar, tumble); } private static bool EmpressGetDeathHeadSetup(PlayerDeathHead deathHead) { return EmpressGetFieldValue(EmpressPlayerDeathHeadSetupField, deathHead); } private static PhysGrabObject? EmpressGetDeathHeadPhysGrabObject(PlayerDeathHead deathHead) { return EmpressGetFieldValue(EmpressPlayerDeathHeadPhysGrabObjectField, deathHead); } private static void EmpressSetDeathHeadSetup(PlayerDeathHead deathHead, bool setup) { EmpressSetFieldValue(EmpressPlayerDeathHeadSetupField, deathHead, setup); } private static PhysGrabObject? EmpressGetTumblePhysGrabObject(PlayerTumble tumble) { return EmpressGetFieldValue(EmpressPlayerTumblePhysGrabObjectField, tumble); } private static PhotonView? EmpressGetTumblePhotonView(PlayerTumble tumble) { return EmpressGetFieldValue(EmpressPlayerTumblePhotonViewField, tumble); } private static bool EmpressGetTumbleSetup(PlayerTumble tumble) { return EmpressGetFieldValue(EmpressPlayerTumbleSetupField, tumble); } private static void EmpressSetTumbleSetup(PlayerTumble tumble, bool setup) { EmpressSetFieldValue(EmpressPlayerTumbleSetupField, tumble, setup); } private static bool EmpressGetTumbleIsTumbling(PlayerTumble tumble) { return EmpressGetFieldValue(EmpressPlayerTumbleIsTumblingField, tumble); } private static bool EmpressGetTumbleOverride(PlayerTumble tumble) { return EmpressGetFieldValue(EmpressPlayerTumbleOverrideField, tumble); } private static GameObject? EmpressGetLevelDeathHeadPrefab() { return EmpressGetFieldValue(EmpressLevelGeneratorDeathHeadPrefabField, LevelGenerator.Instance); } private static GameObject? EmpressGetLevelTumblePrefab() { return EmpressGetFieldValue(EmpressLevelGeneratorTumblePrefabField, LevelGenerator.Instance); } private static List EmpressFindSceneObjects() where T : Object { //IL_0060: 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_0077: Unknown result type (might be due to invalid IL or missing references) //IL_007c: Unknown result type (might be due to invalid IL or missing references) //IL_009b: Unknown result type (might be due to invalid IL or missing references) //IL_00a0: 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) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) List list = new List(); T[] array = Resources.FindObjectsOfTypeAll(); foreach (T val in array) { if ((Object)(object)val == (Object)null) { continue; } T val2 = val; object obj = val2; Component val3 = (Component)((obj is Component) ? obj : null); Scene scene; if (val3 == null) { object obj2 = val2; GameObject val4 = (GameObject)((obj2 is GameObject) ? obj2 : null); if (val4 == null) { continue; } GameObject val5 = val4; scene = val5.scene; if (((Scene)(ref scene)).IsValid()) { scene = val5.scene; if (!string.IsNullOrWhiteSpace(((Scene)(ref scene)).name)) { list.Add(val); } } continue; } Component val6 = val3; scene = val6.gameObject.scene; if (((Scene)(ref scene)).IsValid()) { scene = val6.gameObject.scene; if (!string.IsNullOrWhiteSpace(((Scene)(ref scene)).name)) { list.Add(val); } } } return list; } private static string EmpressGetAvatarDisplayName(PlayerAvatar avatar) { PhotonView photonView = avatar.photonView; if (((photonView != null) ? photonView.Owner : null) != null && !string.IsNullOrWhiteSpace(avatar.photonView.Owner.NickName)) { return avatar.photonView.Owner.NickName; } string text = EmpressGetAvatarPlayerName(avatar); if (!string.IsNullOrWhiteSpace(text)) { return text; } return ((Object)avatar).name; } private static Hashtable EmpressConvertDictionaryToHashtable(Dictionary dictionary) { //IL_0000: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Expected O, but got Unknown Hashtable val = new Hashtable(); foreach (KeyValuePair item in dictionary) { val[(object)item.Key] = item.Value; } return val; } private static T EmpressGetFieldValue(FieldInfo? fieldInfo, object? instance) { if (fieldInfo == null || (!fieldInfo.IsStatic && instance == null)) { return default(T); } try { object value = fieldInfo.GetValue(fieldInfo.IsStatic ? null : instance); if (value is T) { return (T)value; } } catch { } return default(T); } private static void EmpressSetFieldValue(FieldInfo? fieldInfo, object? instance, object? value) { if (fieldInfo == null || (!fieldInfo.IsStatic && instance == null)) { return; } try { fieldInfo.SetValue(fieldInfo.IsStatic ? null : instance, value); } catch { } } private static object? EmpressInvokeMethod(MethodInfo? methodInfo, object? instance, params object?[] parameters) { if (methodInfo == null || (!methodInfo.IsStatic && instance == null)) { return null; } try { return methodInfo.Invoke(methodInfo.IsStatic ? null : instance, parameters); } catch { return null; } } } [HarmonyPatch(typeof(LevelGenerator), "PlayerSpawn")] internal static class EmpressLateJoinLevelGeneratorPatch { private static bool Prefix() { return !(EmpressLateJoinPlugin.Runtime?.EmpressTryHandleLateJoinSpawn() ?? false); } } [HarmonyPatch(typeof(NetworkManager), "OnPlayerEnteredRoom")] internal static class EmpressLateJoinPlayerEnteredPatch { private static void Postfix(Player newPlayer) { EmpressLateJoinPlugin.Runtime?.EmpressHandlePlayerEntered(newPlayer); } } [HarmonyPatch(typeof(NetworkManager), "OnPlayerLeftRoom")] internal static class EmpressLateJoinPlayerLeftPatch { private static void Postfix(Player otherPlayer) { EmpressLateJoinPlugin.Runtime?.EmpressHandlePlayerLeft(otherPlayer); } } [HarmonyPatch(typeof(MenuPageLobby), "ButtonStart")] internal static class EmpressLateJoinLobbyStartPatch { private static void Postfix() { EmpressLateJoinPlugin.Runtime?.EmpressForceJoinabilityRefresh(forceSteamLobbyUnlock: true); } } [HarmonyPatch(typeof(RunManager), "ChangeLevel")] internal static class EmpressLateJoinChangeLevelPatch { private static bool Prefix(RunManager __instance, bool _completedLevel, bool _levelFailed, ChangeLevelType _changeLevelType) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) return !(EmpressLateJoinPlugin.Runtime?.EmpressTryDelaySceneChange(__instance, _completedLevel, _levelFailed, _changeLevelType) ?? false); } private static void Postfix(RunManager __instance, ChangeLevelType _changeLevelType) { //IL_000b: Unknown result type (might be due to invalid IL or missing references) EmpressLateJoinPlugin.Runtime?.EmpressHandleChangeLevelCompleted(__instance, _changeLevelType); } } [HarmonyPatch(typeof(RoundDirector), "RequestExtractionPointActivationRPC")] internal static class EmpressLateJoinExtractionActivationPatch { private static bool Prefix(int photonViewID) { return !(EmpressLateJoinPlugin.Runtime?.EmpressTryBlockInvalidExtractionActivation(photonViewID) ?? false); } } [HarmonyPatch(typeof(SemiFunc), "PlayersAllInTruck")] internal static class EmpressLateJoinPlayersAllInTruckPatch { private static bool Prefix(ref bool __result) { EmpressLateJoinRuntime? runtime = EmpressLateJoinPlugin.Runtime; if (runtime != null && runtime.EmpressTryEvaluatePlayersAllInTruck(out var result)) { __result = result; return false; } return true; } } [HarmonyPatch(typeof(TruckScreenText), "PlayerSelfDestruction")] internal static class EmpressLateJoinPlayerSelfDestructionPatch { private static bool Prefix(TruckScreenText __instance) { return !(EmpressLateJoinPlugin.Runtime?.EmpressTryHandlePlayerSelfDestruction(__instance) ?? false); } } [HarmonyPatch(typeof(TruckScreenText), "PlayerChatBoxStateUpdate")] internal static class EmpressLateJoinTruckStartStatePatch { private static void Postfix(PlayerChatBoxState _state) { //IL_000a: Unknown result type (might be due to invalid IL or missing references) EmpressLateJoinPlugin.Runtime?.EmpressScheduleTruckStartFallback(_state); } } internal static class EmpressLateJoinGrabGuard { internal static bool TryResolveGrabber(int playerPhotonId, string rpcName) { if (playerPhotonId <= 0) { return false; } PhotonView val = PhotonView.Find(playerPhotonId); if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).GetComponent() != (Object)null) { return true; } return false; } } [HarmonyPatch(typeof(PhysGrabObject), "GrabLinkRPC", new Type[] { typeof(int), typeof(int), typeof(Vector3), typeof(Vector3), typeof(Vector3), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabLinkPatch { private static bool Prefix(PhysGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "PhysGrabObject.GrabLinkRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPointSyncRPC", new Type[] { typeof(int), typeof(Vector3), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabPointSyncPatch { private static bool Prefix(PhysGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "PhysGrabObject.GrabPointSyncRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(PhysGrabObject), "GrabStartedRPC", new Type[] { typeof(int), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabStartedPatch { private static bool Prefix(PhysGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "PhysGrabObject.GrabStartedRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPlayerAddRPC", new Type[] { typeof(int), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabPlayerAddPatch { private static bool Prefix(PhysGrabObject __instance, int photonViewID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(photonViewID, "PhysGrabObject.GrabPlayerAddRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(PhysGrabObject), "GrabPlayerRemoveRPC", new Type[] { typeof(int), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabPlayerRemovePatch { private static bool Prefix(PhysGrabObject __instance, int photonViewID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(photonViewID, "PhysGrabObject.GrabPlayerRemoveRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(PhysGrabObject), "GrabEndedRPC", new Type[] { typeof(int), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinPhysGrabObjectGrabEndedPatch { private static bool Prefix(PhysGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "PhysGrabObject.GrabEndedRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(StaticGrabObject), "GrabLinkRPC", new Type[] { typeof(int), typeof(Vector3), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinStaticGrabObjectGrabLinkPatch { private static bool Prefix(StaticGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "StaticGrabObject.GrabLinkRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(StaticGrabObject), "GrabPointSyncRPC", new Type[] { typeof(int), typeof(Vector3), typeof(PhotonMessageInfo) })] internal static class EmpressLateJoinStaticGrabObjectGrabPointSyncPatch { private static bool Prefix(StaticGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "StaticGrabObject.GrabPointSyncRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(StaticGrabObject), "GrabStartedRPC", new Type[] { typeof(int) })] internal static class EmpressLateJoinStaticGrabObjectGrabStartedPatch { private static bool Prefix(StaticGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "StaticGrabObject.GrabStartedRPC on " + ((Object)__instance).name); } } [HarmonyPatch(typeof(StaticGrabObject), "GrabEndedRPC", new Type[] { typeof(int) })] internal static class EmpressLateJoinStaticGrabObjectGrabEndedPatch { private static bool Prefix(StaticGrabObject __instance, int playerPhotonID) { return EmpressLateJoinGrabGuard.TryResolveGrabber(playerPhotonID, "StaticGrabObject.GrabEndedRPC on " + ((Object)__instance).name); } } }