using System; using System.Collections.Generic; using System.Diagnostics; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using BepInEx.Logging; using Extensions; using HarmonyLib; using Mirror; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("ElevatorMod")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("ElevatorMod")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("eafa11bc-f60d-47c5-b45f-3cb9e5bb4fee")] [assembly: AssemblyFileVersion("1.0.0.0")] [assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")] [assembly: AssemblyVersion("1.0.0.0")] public struct ElevatorTravelMsg : NetworkMessage { public bool traveled; } public struct PlayerFloorMsg : NetworkMessage { public uint[] netIds; public int[] floors; } [BepInPlugin("com.yourname.elevatormod", "Elevator Mod", "1.5.0")] public class ElevatorMod : BaseUnityPlugin { internal static ManualLogSource Log; public static ConfigEntry ModEnabled; public static ConfigEntry ShowStatusDisplay; public static int LocalPlayerCurrentFloor = 0; public static bool LocalPlayerTravelledLastTrip = false; public static bool ElevatorTripOccurred = false; public static bool ClientTraveledThisTrip = false; public static bool ClientTravelMsgPending = false; public static bool ClientFloorInitialized = false; public static bool ClientFloorRpcPending = false; public static int ClientFloorRpcIndex = 0; public static int PendingDestinationFloor = 0; public static Dictionary ServerPlayerFloors = new Dictionary(); public static Dictionary ClientPlayerFloors = new Dictionary(); public static bool NeedHandlerRegistration = true; public static HashSet ActivatedFloors = new HashSet(); private void Awake() { //IL_0101: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Expected O, but got Unknown //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_0120: Expected O, but got Unknown Log = ((BaseUnityPlugin)this).Logger; ModEnabled = ((BaseUnityPlugin)this).Config.Bind("General", "Enabled", true, "Enable or disable the elevator mod."); ShowStatusDisplay = ((BaseUnityPlugin)this).Config.Bind("General", "ShowStatusDisplay", true, "Show the READY/BUSY status display on screen."); Writer.write = delegate(NetworkWriter w, ElevatorTravelMsg msg) { NetworkWriterExtensions.WriteBool(w, msg.traveled); }; Reader.read = delegate(NetworkReader r) { ElevatorTravelMsg result2 = default(ElevatorTravelMsg); result2.traveled = NetworkReaderExtensions.ReadBool(r); return result2; }; Writer.write = delegate(NetworkWriter w, PlayerFloorMsg msg) { uint[] netIds = msg.netIds; int num2 = ((netIds != null) ? netIds.Length : 0); NetworkWriterExtensions.WriteInt(w, num2); for (int j = 0; j < num2; j++) { NetworkWriterExtensions.WriteUInt(w, msg.netIds[j]); NetworkWriterExtensions.WriteInt(w, msg.floors[j]); } }; Reader.read = delegate(NetworkReader r) { int num = NetworkReaderExtensions.ReadInt(r); uint[] array = new uint[num]; int[] array2 = new int[num]; for (int i = 0; i < num; i++) { array[i] = NetworkReaderExtensions.ReadUInt(r); array2[i] = NetworkReaderExtensions.ReadInt(r); } PlayerFloorMsg result = default(PlayerFloorMsg); result.netIds = array; result.floors = array2; return result; }; NetworkClient.OnDisconnectedEvent = (Action)Delegate.Combine(NetworkClient.OnDisconnectedEvent, new Action(ResetState)); GameObject val = new GameObject("ElevatorStatusDisplay"); val.AddComponent(); Object.DontDestroyOnLoad((Object)(object)val); Harmony val2 = new Harmony("com.yourname.elevatormod"); val2.PatchAll(); Log.LogInfo((object)"ElevatorMod 1.6.2 loaded!"); } public static void OnElevatorTravelMsg(ElevatorTravelMsg msg) { ClientTraveledThisTrip = msg.traveled; ClientTravelMsgPending = true; Log.LogDebug((object)$"ElevatorMod: [client] Travel msg received — traveled: {msg.traveled}"); ElevatorFloorChangePatch.TryResolveClientFloor(); } public static void OnPlayerFloorMsg(PlayerFloorMsg msg) { for (int i = 0; i < msg.netIds.Length; i++) { ClientPlayerFloors[msg.netIds[i]] = msg.floors[i]; } Log.LogDebug((object)$"ElevatorMod: [client] Player floor map updated ({msg.netIds.Length} players)."); ElevatorFloorChangePatch.RefreshPlayerVisibility(); } private static void ResetState() { LocalPlayerCurrentFloor = 0; LocalPlayerTravelledLastTrip = false; ElevatorTripOccurred = false; ClientTraveledThisTrip = false; ClientTravelMsgPending = false; ClientFloorInitialized = false; ClientFloorRpcPending = false; ClientFloorRpcIndex = 0; PendingDestinationFloor = 0; ServerPlayerFloors.Clear(); ClientPlayerFloors.Clear(); ActivatedFloors.Clear(); NeedHandlerRegistration = true; Log.LogDebug((object)"ElevatorMod: State reset on disconnect."); } } public class ElevatorStatusDisplay : MonoBehaviour { private const float DISPLAY_DISTANCE = 15f; private GUIStyle _boxStyle; private GUIStyle _textStyle; private bool _stylesInitialized = false; private void Update() { if (ElevatorMod.NeedHandlerRegistration && NetworkClient.active) { NetworkClient.RegisterHandler((Action)ElevatorMod.OnElevatorTravelMsg, true); NetworkClient.RegisterHandler((Action)ElevatorMod.OnPlayerFloorMsg, true); ElevatorMod.NeedHandlerRegistration = false; ElevatorMod.Log.LogDebug((object)"ElevatorMod: Network handlers registered."); } } private void InitStyles() { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Expected O, but got Unknown //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_0062: Expected O, but got Unknown if (!_stylesInitialized) { _boxStyle = new GUIStyle(GUI.skin.box); _boxStyle.fontSize = 18; _boxStyle.fontStyle = (FontStyle)1; _boxStyle.alignment = (TextAnchor)4; _textStyle = new GUIStyle(GUI.skin.label); _textStyle.fontSize = 18; _textStyle.fontStyle = (FontStyle)1; _textStyle.alignment = (TextAnchor)4; _stylesInitialized = true; } } private void OnGUI() { //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0085: Unknown result type (might be due to invalid IL or missing references) //IL_00d7: Unknown result type (might be due to invalid IL or missing references) //IL_00dc: 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_00f5: Unknown result type (might be due to invalid IL or missing references) //IL_011b: Unknown result type (might be due to invalid IL or missing references) //IL_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0140: Unknown result type (might be due to invalid IL or missing references) //IL_014b: Unknown result type (might be due to invalid IL or missing references) if (!ElevatorMod.ModEnabled.Value || !ElevatorMod.ShowStatusDisplay.Value || !NetworkClient.active) { return; } ElevatorManager val = Object.FindFirstObjectByType(); if (!((Object)(object)val == (Object)null)) { NetworkIdentity localPlayer = NetworkClient.localPlayer; if (!((Object)(object)localPlayer == (Object)null) && !(Vector3.Distance(((Component)localPlayer).transform.position, ((Component)val).transform.position) > 15f)) { bool isTeleporting = val.isTeleporting; InitStyles(); Rect val2 = default(Rect); ((Rect)(ref val2))..ctor((float)Screen.width / 2f - 120f, 20f, 240f, 50f); Color backgroundColor = GUI.backgroundColor; GUI.backgroundColor = (isTeleporting ? new Color(0.8f, 0.1f, 0.1f, 0.85f) : new Color(0.1f, 0.7f, 0.1f, 0.85f)); GUI.Box(val2, "", _boxStyle); GUI.backgroundColor = backgroundColor; _textStyle.normal.textColor = Color.white; GUI.Label(val2, isTeleporting ? "ELEVATOR — BUSY" : "ELEVATOR — READY", _textStyle); } } } } [HarmonyPatch(typeof(ElevatorManager), "CheckPlayersInside")] public class ElevatorCheckPatch { private static bool Prefix(ElevatorManager __instance, ref bool __result) { //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) if (!ElevatorMod.ModEnabled.Value) { return true; } Collider value = Traverse.Create((object)__instance).Field("checkCollider").GetValue(); if ((Object)(object)value == (Object)null) { return true; } __result = false; foreach (PlayerReferences player in MonoSingleton.Instance.players) { Bounds bounds = value.bounds; if (((Bounds)(ref bounds)).Contains(player.transform.position)) { __result = true; break; } } ElevatorMod.Log.LogDebug((object)$"ElevatorMod: CheckPlayersInside -> {__result}"); return false; } } [HarmonyPatch(typeof(ElevatorManager), "ServerTryTeleportPlayers")] public class ElevatorServerTryPatch { private static void Prefix(int toIndex) { ElevatorMod.PendingDestinationFloor = toIndex; } } [HarmonyPatch(typeof(ElevatorManager), "ServerTeleportPlayersOutside")] public class ElevatorTeleportPatch { private static bool Prefix(ElevatorManager __instance) { //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) //IL_006c: Unknown result type (might be due to invalid IL or missing references) //IL_00b9: Unknown result type (might be due to invalid IL or missing references) //IL_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00c9: Unknown result type (might be due to invalid IL or missing references) //IL_0175: Unknown result type (might be due to invalid IL or missing references) //IL_017f: Unknown result type (might be due to invalid IL or missing references) //IL_0184: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0195: Unknown result type (might be due to invalid IL or missing references) //IL_019e: Unknown result type (might be due to invalid IL or missing references) //IL_01a0: Unknown result type (might be due to invalid IL or missing references) //IL_01ac: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_01b8: Unknown result type (might be due to invalid IL or missing references) //IL_01d4: Unknown result type (might be due to invalid IL or missing references) if (!ElevatorMod.ModEnabled.Value) { return true; } Collider value = Traverse.Create((object)__instance).Field("checkCollider").GetValue(); if ((Object)(object)value == (Object)null) { return true; } ElevatorMod.ElevatorTripOccurred = true; NetworkIdentity localPlayer = NetworkClient.localPlayer; Bounds bounds; int num; if ((Object)(object)localPlayer != (Object)null) { bounds = value.bounds; num = (((Bounds)(ref bounds)).Contains(((Component)localPlayer).transform.position) ? 1 : 0); } else { num = 0; } bool localPlayerTravelledLastTrip = (byte)num != 0; ElevatorMod.LocalPlayerTravelledLastTrip = localPlayerTravelledLastTrip; int num2 = 0; int num3 = 0; foreach (PlayerReferences player in MonoSingleton.Instance.players) { bool isBeingHeld = ((Item)player.carry).GetIsBeingHeld(); int num4; if (!isBeingHeld) { bounds = value.bounds; num4 = (((Bounds)(ref bounds)).Contains(player.transform.position) ? 1 : 0); } else { num4 = 0; } bool flag = (byte)num4 != 0; uint netId = player.identity.netId; if (flag) { ElevatorMod.ServerPlayerFloors[netId] = ElevatorMod.PendingDestinationFloor; } else if (!ElevatorMod.ServerPlayerFloors.ContainsKey(netId)) { ElevatorMod.ServerPlayerFloors[netId] = 0; } NetworkConnection connectionToClient = (NetworkConnection)(object)((NetworkBehaviour)player.controller).netIdentity.connectionToClient; if (connectionToClient != null) { connectionToClient.Send(new ElevatorTravelMsg { traveled = flag }, 0); } if (!isBeingHeld) { if (flag) { Vector2 val = Random.insideUnitCircle * 3f; Vector3 position = NetworkSingleton.Instance.playerSpawnPosition.position; player.controller.ServerTeleport(position + new Vector3(val.x, 0f, val.y)); player.controller.ServerRotate(new Vector2(180f, 0f)); num2++; } else { num3++; } } } uint[] array = new uint[ElevatorMod.ServerPlayerFloors.Count]; int[] array2 = new int[ElevatorMod.ServerPlayerFloors.Count]; int num5 = 0; foreach (KeyValuePair serverPlayerFloor in ElevatorMod.ServerPlayerFloors) { array[num5] = serverPlayerFloor.Key; array2[num5] = serverPlayerFloor.Value; num5++; } PlayerFloorMsg playerFloorMsg = default(PlayerFloorMsg); playerFloorMsg.netIds = array; playerFloorMsg.floors = array2; NetworkServer.SendToAll(playerFloorMsg, 0, false); ElevatorMod.Log.LogDebug((object)$"ElevatorMod: {num2} travelled, {num3} stayed."); return false; } } [HarmonyPatch(typeof(ElevatorManager), "UserCode_RpcSetActiveFloorOnly__Int32")] public class ElevatorFloorChangePatch { private static bool Prefix(ElevatorManager __instance, int index) { if (!ElevatorMod.ModEnabled.Value) { return true; } NetworkIdentity localPlayer = NetworkClient.localPlayer; if ((Object)(object)localPlayer == (Object)null) { return true; } if (NetworkServer.active) { if (!ElevatorMod.ElevatorTripOccurred) { ElevatorMod.Log.LogDebug((object)$"ElevatorMod: [host] Init/sync to floor {index}"); ElevatorMod.LocalPlayerCurrentFloor = index; ApplyFloorVisuals(__instance, index, index); return false; } ElevatorMod.ElevatorTripOccurred = false; bool localPlayerTravelledLastTrip = ElevatorMod.LocalPlayerTravelledLastTrip; ElevatorMod.Log.LogDebug((object)$"ElevatorMod: [host] traveled={localPlayerTravelledLastTrip} → floor {index}"); if (localPlayerTravelledLastTrip) { ElevatorMod.LocalPlayerCurrentFloor = index; } ApplyFloorVisuals(__instance, ElevatorMod.LocalPlayerCurrentFloor, index); return false; } if (!ElevatorMod.ClientFloorInitialized) { ElevatorMod.Log.LogDebug((object)$"ElevatorMod: [client] Init to floor {index}"); ElevatorMod.ClientFloorInitialized = true; ElevatorMod.LocalPlayerCurrentFloor = index; ApplyFloorVisuals(__instance, index, index); return false; } ElevatorMod.ClientFloorRpcPending = true; ElevatorMod.ClientFloorRpcIndex = index; ElevatorMod.Log.LogDebug((object)$"ElevatorMod: [client] Buffering RPC for floor {index}"); TryResolveClientFloor(__instance); return false; } public static void TryResolveClientFloor(ElevatorManager instance = null) { if (ElevatorMod.ClientTravelMsgPending && ElevatorMod.ClientFloorRpcPending) { ElevatorMod.ClientTravelMsgPending = false; ElevatorMod.ClientFloorRpcPending = false; if (ElevatorMod.ClientTraveledThisTrip) { ElevatorMod.LocalPlayerCurrentFloor = ElevatorMod.ClientFloorRpcIndex; } if ((Object)(object)instance == (Object)null) { instance = Object.FindFirstObjectByType(); } if ((Object)(object)instance != (Object)null) { ApplyFloorVisuals(instance, ElevatorMod.LocalPlayerCurrentFloor, ElevatorMod.ClientFloorRpcIndex); } ElevatorMod.Log.LogDebug((object)$"ElevatorMod: [client] Floor resolved — traveled={ElevatorMod.ClientTraveledThisTrip}, floor={ElevatorMod.LocalPlayerCurrentFloor}"); } } private static void ApplyFloorVisuals(ElevatorManager instance, int localFloor, int newFloor) { ElevatorMod.ActivatedFloors.Add(localFloor); ElevatorMod.ActivatedFloors.Add(newFloor); List value = Traverse.Create((object)instance).Field("allFloors").GetValue>(); if (value != null) { foreach (CasinoFloor item in value) { bool flag = ElevatorMod.ActivatedFloors.Contains(item.floorIndex); bool flag2 = item.floorIndex == localFloor; if (flag) { if (!((Component)item).gameObject.activeSelf) { ((Component)item).gameObject.SetActive(true); } SetFloorVisible(item, flag2); } else { ((Component)item).gameObject.SetActive(false); } item.SetSfxTrigger(flag2); } } GameBase[] array = Object.FindObjectsOfType(); foreach (GameBase val in array) { bool flag3 = val.casinoLevel == localFloor; Renderer[] componentsInChildren = ((Component)val).GetComponentsInChildren(true); foreach (Renderer val2 in componentsInChildren) { val2.enabled = flag3; } Light[] componentsInChildren2 = ((Component)val).GetComponentsInChildren(true); foreach (Light val3 in componentsInChildren2) { ((Behaviour)val3).enabled = flag3; } AudioSource[] componentsInChildren3 = ((Component)val).GetComponentsInChildren(true); foreach (AudioSource val4 in componentsInChildren3) { val4.mute = !flag3; } if (NetworkServer.active) { continue; } Collider[] componentsInChildren4 = ((Component)val).GetComponentsInChildren(true); foreach (Collider val5 in componentsInChildren4) { if (!val5.isTrigger) { val5.enabled = flag3; } } } Keypad[] array2 = Object.FindObjectsOfType(); foreach (Keypad val6 in array2) { GameBase value2 = Traverse.Create((object)val6).Field("casinoGame").GetValue(); if ((Object)(object)value2 == (Object)null) { continue; } bool flag4 = value2.casinoLevel == localFloor; Renderer[] componentsInChildren5 = ((Component)val6).GetComponentsInChildren(true); foreach (Renderer val7 in componentsInChildren5) { val7.enabled = flag4; } Light[] componentsInChildren6 = ((Component)val6).GetComponentsInChildren(true); foreach (Light val8 in componentsInChildren6) { ((Behaviour)val8).enabled = flag4; } AudioSource[] componentsInChildren7 = ((Component)val6).GetComponentsInChildren(true); foreach (AudioSource val9 in componentsInChildren7) { val9.mute = !flag4; } Camera value3 = Traverse.Create((object)val6).Field("keypadCamera").GetValue(); if ((Object)(object)value3 != (Object)null) { ((Behaviour)value3).enabled = flag4; } Canvas[] componentsInChildren8 = ((Component)val6).GetComponentsInChildren(true); foreach (Canvas val10 in componentsInChildren8) { ((Behaviour)val10).enabled = flag4; } if (NetworkServer.active) { continue; } Collider[] componentsInChildren9 = ((Component)val6).GetComponentsInChildren(true); foreach (Collider val11 in componentsInChildren9) { if (!val11.isTrigger) { val11.enabled = flag4; } } } if ((Object)(object)MonoSingleton.Instance != (Object)null) { MonoSingleton.Instance.SetLightVolume(localFloor); } RefreshPlayerVisibility(); ElevatorMod.Log.LogDebug((object)string.Format("ElevatorMod: Visuals set — local floor {0}, visited [{1}]", localFloor, string.Join(",", ElevatorMod.ActivatedFloors))); } public static void RefreshPlayerVisibility() { NetworkIdentity localPlayer = NetworkClient.localPlayer; foreach (PlayerReferences player in MonoSingleton.Instance.players) { if (!((Object)(object)player.identity == (Object)(object)localPlayer)) { if (!ElevatorMod.ClientPlayerFloors.TryGetValue(player.identity.netId, out var value)) { value = 0; } bool enabled = value == ElevatorMod.LocalPlayerCurrentFloor; Renderer[] componentsInChildren = ((Component)player.identity).GetComponentsInChildren(); foreach (Renderer val in componentsInChildren) { val.enabled = enabled; } Canvas[] componentsInChildren2 = ((Component)player.identity).GetComponentsInChildren(); foreach (Canvas val2 in componentsInChildren2) { ((Behaviour)val2).enabled = enabled; } } } } private static void SetFloorVisible(CasinoFloor floor, bool visible) { Renderer[] componentsInChildren = ((Component)floor).GetComponentsInChildren(); foreach (Renderer val in componentsInChildren) { val.enabled = visible; } Light[] componentsInChildren2 = ((Component)floor).GetComponentsInChildren(); foreach (Light val2 in componentsInChildren2) { ((Behaviour)val2).enabled = visible; } AudioSource[] componentsInChildren3 = ((Component)floor).GetComponentsInChildren(); foreach (AudioSource val3 in componentsInChildren3) { val3.mute = !visible; } Collider[] componentsInChildren4 = ((Component)floor).GetComponentsInChildren(); foreach (Collider val4 in componentsInChildren4) { if (!val4.isTrigger && !((Object)(object)((Component)val4).GetComponentInParent() != (Object)null)) { val4.enabled = visible; } } } }