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 System.Security; using System.Security.Permissions; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using Microsoft.CodeAnalysis; using Photon.Pun; using UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("EMPRESS")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.3.0.0")] [assembly: AssemblyInformationalVersion("1.3.0+749705fb7dd252339a4fb28ec075f9ea2e513f47")] [assembly: AssemblyProduct("Pocket Dimension Cart")] [assembly: AssemblyTitle("PocketDimensionCart")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.3.0.0")] [module: UnverifiableCode] [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 Empress.PocketDimensionCart { [HarmonyPatch(typeof(LevelGenerator), "Awake")] internal static class LevelGeneratorAwakePatch { private static void Prefix() { PocketDimensionCartRuntime.ResetLevelState(); } } [HarmonyPatch(typeof(PhysGrabCart), "ObjectsInCart")] internal static class PhysGrabCartObjectsInCartPatch { private static void Prefix(PhysGrabCart __instance, out bool __state) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) __state = false; if (Object.op_Implicit((Object)(object)__instance) && PocketDimensionCartRuntime.IsRealLevel && !(SemiFunc.PlayerNearestDistance(((Component)__instance).transform.position) > 12f) && !(__instance.objectInCartCheckTimer > 0f)) { __state = true; } } private static void Postfix(PhysGrabCart __instance, bool __state) { if (__state && Object.op_Implicit((Object)(object)__instance)) { PocketDimensionCartController component = ((Component)__instance).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { component.AddStoredContentsToCartReadout(); } } } } [HarmonyPatch(typeof(PhysGrabCart), "Start")] internal static class PhysGrabCartStartPatch { private static void Postfix(PhysGrabCart __instance) { if (Object.op_Implicit((Object)(object)__instance) && PocketDimensionCartRuntime.CanAttachToCart && !Object.op_Implicit((Object)(object)((Component)__instance).GetComponent())) { ((Component)__instance).gameObject.AddComponent(); } } } [HarmonyPatch(typeof(PhysGrabObjectImpactDetector), "OnTriggerStay")] internal static class PhysGrabObjectImpactDetectorOnTriggerStayPatch { private static void Postfix(PhysGrabObjectImpactDetector __instance, Collider other) { if (Object.op_Implicit((Object)(object)__instance) && Object.op_Implicit((Object)(object)other) && PocketDimensionCartRuntime.IsRealLevel && SemiFunc.IsMasterClientOrSingleplayer() && ((Component)other).CompareTag("Cart") && __instance.isValuable && Object.op_Implicit((Object)(object)__instance.physGrabObject) && Object.op_Implicit((Object)(object)__instance.currentCart)) { PocketDimensionCartController component = ((Component)__instance.currentCart).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { component.StoreValuable(__instance.physGrabObject); } } } } [HarmonyPatch(typeof(PhysGrabCart), "StateSwitchRPC")] internal static class PocketDimensionCartStateSwitchGuardPatch { private static bool Prefix(PhysGrabCart __instance, State _state) { //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_004b: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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) if (!Object.op_Implicit((Object)(object)__instance)) { return false; } if (Object.op_Implicit((Object)(object)__instance.cartMesh) && __instance.grabMaterial != null && __instance.capsuleColliders != null && __instance.cartInside != null && __instance.soundLocked != null && __instance.soundDragged != null && __instance.soundHandled != null) { return true; } __instance.currentState = _state; __instance.previousState = _state; return false; } } [HarmonyPatch(typeof(PlayerController), "FixedUpdate")] internal static class PocketDimensionPlayerControllerFixedUpdatePatch { private static void Postfix(PlayerController __instance) { PlayerAvatar controllerPlayer = PocketDimensionCartAccess.GetControllerPlayer(__instance); if (PocketDimensionCartRuntime.PlayerInsideAnyPocketRoom(controllerPlayer)) { PocketDimensionCartAccess.SuppressPocketRoomMovement(__instance, controllerPlayer); } } } [HarmonyPatch(typeof(PlayerTumble), "TumbleRequest")] internal static class PocketDimensionTumbleRequestPatch { private static bool Prefix(PlayerTumble __instance, bool _isTumbling) { if (_isTumbling) { return !BlockPocketRoomTumble(__instance); } return true; } internal static bool BlockPocketRoomTumble(PlayerTumble tumble) { PlayerAvatar tumbleOwner = PocketDimensionCartAccess.GetTumbleOwner(tumble); if (!PocketDimensionCartRuntime.PlayerInsideAnyPocketRoom(tumbleOwner)) { return false; } PocketDimensionCartAccess.SuppressPocketRoomMovement(PlayerController.instance, tumbleOwner); return true; } } [HarmonyPatch(typeof(PlayerTumble), "TumbleRequestRPC")] internal static class PocketDimensionTumbleRequestRpcPatch { private static bool Prefix(PlayerTumble __instance, bool _isTumbling) { if (_isTumbling) { return !PocketDimensionTumbleRequestPatch.BlockPocketRoomTumble(__instance); } return true; } } [HarmonyPatch(typeof(ValueScreen), "UpdateValue")] internal static class ValueScreenUpdateValuePatch { private static void Prefix(ValueScreen __instance, ref int newValue) { if (Object.op_Implicit((Object)(object)__instance) && PocketDimensionCartRuntime.IsRealLevel) { PocketDimensionCartController controllerForValueScreen = PocketDimensionCartRuntime.GetControllerForValueScreen(__instance); if ((Object)(object)controllerForValueScreen != (Object)null) { newValue = controllerForValueScreen.AddStoredValueToDisplay(newValue); } } } } internal sealed class PocketDimensionCartController : MonoBehaviourPun { private const string RequestEjectOneRpc = "PocketDimensionRequestEjectOne"; private const string RequestEjectAllRpc = "PocketDimensionRequestEjectAll"; private const string RequestEnterRpc = "PocketDimensionRequestEnter"; private const string RequestLeaveRpc = "PocketDimensionRequestLeave"; private const string StabilizeExitRpc = "PocketDimensionStabilizeExit"; private const string SyncStoredTotalsRpc = "PocketDimensionSyncStoredTotals"; private readonly List _storedViewIds = new List(); private PhysGrabCart _cart; private PhotonView _cartPhotonView; private GameObject _roomRoot; private Vector3 _roomOrigin; private Vector3 _playerSpawnPosition; private Vector3 _playerExitPosition; private Vector3 _valuableExitPosition; private Collider _exitCollider; private float _keyDownTime; private float _nextLocalEnterTime; private float _nextLocalExitTime; private float _exitTouchTimer; private float _insideCartTimer; private float _nextSafePoseRefreshTime; private Vector3 _lastSafeCartExitPosition; private Quaternion _lastSafeCartExitRotation = Quaternion.identity; private bool _lastSafeCartExitValid; private bool _holdRequestSent; private bool _ejectAllRunning; private int _roomIndex; private int _syncedStoredCount; private int _syncedStoredValue; public int StoredCount => _storedViewIds.Count; private void Awake() { _cart = ((Component)this).GetComponent(); _cartPhotonView = ((Component)this).GetComponent(); _roomIndex = PocketDimensionCartRuntime.ReserveRoomIndex(); BuildRoom(); PocketDimensionCartRuntime.Register(this); } private void OnDisable() { PocketDimensionCartRuntime.Unregister(this); } private void Update() { if (PocketDimensionCartRuntime.IsRealLevel && Object.op_Implicit((Object)(object)_cart)) { RefreshSafeCartExitPose(); UpdateLocalInput(); } } private Vector3 GetCartExitPosition() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_003b: Unknown result type (might be due to invalid IL or missing references) //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: 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_0063: Unknown result type (might be due to invalid IL or missing references) Vector3 flatCartForward = GetFlatCartForward(); Vector3 val = (Object.op_Implicit((Object)(object)_cart.inCart) ? _cart.inCart.position : ((Component)_cart).transform.position); Vector3 position = val + Vector3.up * 1.45f + flatCartForward * 1.25f; return SnapExitAboveFloor(position); } private Quaternion GetCartExitRotation() { //IL_0001: Unknown result type (might be due to invalid IL or missing references) //IL_0006: Unknown result type (might be due to invalid IL or missing references) //IL_000b: Unknown result type (might be due to invalid IL or missing references) return Quaternion.LookRotation(GetFlatCartForward(), Vector3.up); } private Vector3 GetFlatCartForward() { //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0023: Unknown result type (might be due to invalid IL or missing references) //IL_0028: Unknown result type (might be due to invalid IL or missing references) //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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_006d: 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) if (!Object.op_Implicit((Object)(object)_cart)) { return Vector3.forward; } Vector3 val = Vector3.ProjectOnPlane(((Component)_cart).transform.forward, Vector3.up); if (((Vector3)(ref val)).sqrMagnitude < 0.001f) { val = Vector3.ProjectOnPlane(((Component)_cart).transform.right, Vector3.up); } if (!(((Vector3)(ref val)).sqrMagnitude < 0.001f)) { return ((Vector3)(ref val)).normalized; } return Vector3.forward; } private static Vector3 SnapExitAboveFloor(Vector3 position) { //IL_003c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: 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_0053: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //IL_006a: Unknown result type (might be due to invalid IL or missing references) //IL_0072: Unknown result type (might be due to invalid IL or missing references) int num = LayerMask.GetMask(new string[3] { "Default", "PhysGrabObjectCart", "StaticGrabObject" }); if (num == 0) { num = ~LayerMask.GetMask(new string[1] { "Ignore Raycast" }); } Vector3 val = position + Vector3.up * 1.5f; RaycastHit val2 = default(RaycastHit); if (Physics.Raycast(val, Vector3.down, ref val2, 4.5f, num, (QueryTriggerInteraction)1)) { position.y = Mathf.Max(position.y, ((RaycastHit)(ref val2)).point.y + 1.15f); } return position; } private void GetCartExitPose(out Vector3 position, out Quaternion rotation) { //IL_0019: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_007a: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0061: Unknown result type (might be due to invalid IL or missing references) if (CartCanOpenPocket()) { RefreshSafeCartExitPose(force: true); } if (_lastSafeCartExitValid) { position = _lastSafeCartExitPosition; rotation = _lastSafeCartExitRotation; } else if (Object.op_Implicit((Object)(object)TruckSafetySpawnPoint.instance)) { position = ((Component)TruckSafetySpawnPoint.instance).transform.position; rotation = ((Component)TruckSafetySpawnPoint.instance).transform.rotation; } else { position = GetCartExitPosition(); rotation = GetCartExitRotation(); } } private void RefreshSafeCartExitPose(bool force = false) { //IL_002d: Unknown result type (might be due to invalid IL or missing references) //IL_0032: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) if (force || !(Time.time < _nextSafePoseRefreshTime)) { _nextSafePoseRefreshTime = Time.time + 0.25f; if (CartCanOpenPocket()) { _lastSafeCartExitPosition = GetCartExitPosition(); _lastSafeCartExitRotation = GetCartExitRotation(); _lastSafeCartExitValid = true; } } } public void RequestLeave(PlayerAvatar player) { if (!Object.op_Implicit((Object)(object)player) || Time.time < _nextLocalExitTime) { return; } _nextLocalExitTime = Time.time + 1f; if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { int playerViewId = GetPlayerViewId(player); if (playerViewId != 0) { _cartPhotonView.RPC("PocketDimensionRequestLeave", (RpcTarget)2, new object[1] { playerViewId }); } } else { LeaveRoom(player); } } private void UpdateLocalInput() { PlayerAvatar val = SemiFunc.PlayerGetLocal(); if (!Object.op_Implicit((Object)(object)val) || val.isDisabled || !SemiFunc.NoTextInputsActive()) { return; } if (LocalPlayerCanUseCart(val, out var insideCart)) { ShowCartText(); HandleActionKey(val); HandleInteractEnter(val); } if (PocketDimensionCartPlugin.EnterByHoppingInCart.Value && insideCart && Time.time >= _nextLocalEnterTime && !SemiFunc.InputHold((InputKey)10)) { _insideCartTimer += Time.deltaTime; if (_insideCartTimer >= 0.45f) { _nextLocalEnterTime = Time.time + 2f; _insideCartTimer = 0f; RequestEnter(val); } } else { _insideCartTimer = 0f; } if (LocalPlayerInsideRoom(val)) { PocketDimensionCartAccess.SuppressPocketRoomMovement(PlayerController.instance, val); HandleRoomExit(val); } } private void HandleActionKey(PlayerAvatar player) { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_000b: 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_005b: Unknown result type (might be due to invalid IL or missing references) KeyCode value = PocketDimensionCartPlugin.ActionKey.Value; if (Input.GetKeyDown(value)) { _keyDownTime = Time.time; _holdRequestSent = false; } if (Input.GetKey(value) && !_holdRequestSent && Time.time - _keyDownTime >= PocketDimensionCartPlugin.HoldSeconds.Value) { _holdRequestSent = true; RequestEjectAll(player); } if (Input.GetKeyUp(value)) { if (!_holdRequestSent) { RequestEjectOne(player); } _holdRequestSent = false; } } private void HandleInteractEnter(PlayerAvatar player) { if (!(Time.time < _nextLocalEnterTime) && SemiFunc.InputDown((InputKey)2)) { _nextLocalEnterTime = Time.time + 2f; RequestEnter(player); } } private void HandleRoomExit(PlayerAvatar player) { //IL_0033: 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) if (!PlayerTouchingExit(player)) { _exitTouchTimer = 0f; return; } _exitTouchTimer += Time.deltaTime; ApplyExitPortalBrake(player); SemiFunc.UIFocusText("Leaving pocket dimension", Color.white, GetFocusFlashColor(), 0.1f); if (_exitTouchTimer >= 0.18f) { _exitTouchTimer = 0f; RequestLeave(player); } } private void ShowCartText() { //IL_0005: Unknown result type (might be due to invalid IL or missing references) //IL_000a: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) KeyCode value = PocketDimensionCartPlugin.ActionKey.Value; string text = ((object)(KeyCode)(ref value)).ToString(); string text2 = "Press " + text + " to pop out one valuable\nHold " + text + " to pop out all valuables"; SemiFunc.UIFocusText(text2, Color.white, GetFocusFlashColor(), 0.1f); } private void RequestEjectOne(PlayerAvatar player) { if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { int playerViewId = GetPlayerViewId(player); if (playerViewId != 0) { _cartPhotonView.RPC("PocketDimensionRequestEjectOne", (RpcTarget)2, new object[1] { playerViewId }); } } else { EjectOne(player); } } private void RequestEjectAll(PlayerAvatar player) { if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { int playerViewId = GetPlayerViewId(player); if (playerViewId != 0) { _cartPhotonView.RPC("PocketDimensionRequestEjectAll", (RpcTarget)2, new object[1] { playerViewId }); } } else { EjectAll(player); } } private void RequestEnter(PlayerAvatar player) { if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { int playerViewId = GetPlayerViewId(player); if (playerViewId != 0) { _cartPhotonView.RPC("PocketDimensionRequestEnter", (RpcTarget)2, new object[1] { playerViewId }); } } else { EnterRoom(player); } } [PunRPC] private void PocketDimensionRequestEjectOne(int playerViewId, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMasterClientOrSingleplayer() && RequestOwnerIsValid(playerViewId, info)) { PlayerAvatar player = GetPlayer(playerViewId); EjectOne(player); } } [PunRPC] private void PocketDimensionRequestEjectAll(int playerViewId, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMasterClientOrSingleplayer() && RequestOwnerIsValid(playerViewId, info)) { PlayerAvatar player = GetPlayer(playerViewId); EjectAll(player); } } [PunRPC] private void PocketDimensionRequestEnter(int playerViewId, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMasterClientOrSingleplayer() && RequestOwnerIsValid(playerViewId, info)) { PlayerAvatar player = GetPlayer(playerViewId); EnterRoom(player); } } [PunRPC] private void PocketDimensionRequestLeave(int playerViewId, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMasterClientOrSingleplayer() && RequestOwnerIsValid(playerViewId, info)) { PlayerAvatar player = GetPlayer(playerViewId); LeaveRoom(player); } } [PunRPC] private void PocketDimensionStabilizeExit(int playerViewId, Vector3 exitPosition, Quaternion exitRotation, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (SemiFunc.IsMultiplayer() && info.Sender != PhotonNetwork.MasterClient) { return; } PlayerAvatar player = GetPlayer(playerViewId); if (!((Object)(object)player == (Object)null)) { StabilizePlayerAfterPocketExit(player, exitPosition, exitRotation); RoomVolumeCheck roomVolumeCheck = player.RoomVolumeCheck; if (roomVolumeCheck != null) { roomVolumeCheck.CheckSet(); } } } private void EnterRoom(PlayerAvatar? player) { //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)player == (Object)null) && CanPlayerUseCartOnHost(player)) { RefreshSafeCartExitPose(force: true); player.Spawn(_playerSpawnPosition, Quaternion.LookRotation(Vector3.forward, Vector3.up)); RoomVolumeCheck roomVolumeCheck = player.RoomVolumeCheck; if (roomVolumeCheck != null) { roomVolumeCheck.CheckSet(); } } } private void LeaveRoom(PlayerAvatar? player) { //IL_0015: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001e: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)player == (Object)null)) { GetCartExitPose(out var position, out var rotation); player.Spawn(position, rotation); BroadcastExitStabilize(player, position, rotation); RoomVolumeCheck roomVolumeCheck = player.RoomVolumeCheck; if (roomVolumeCheck != null) { roomVolumeCheck.CheckSet(); } } } private void StabilizePlayerAfterPocketExit(PlayerAvatar player, Vector3 position, Quaternion rotation) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_0029: Unknown result type (might be due to invalid IL or missing references) //IL_0034: 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_0092: Unknown result type (might be due to invalid IL or missing references) //IL_0097: Unknown result type (might be due to invalid IL or missing references) //IL_00a2: Unknown result type (might be due to invalid IL or missing references) //IL_00a9: Unknown result type (might be due to invalid IL or missing references) //IL_00b4: 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_00ec: Unknown result type (might be due to invalid IL or missing references) player.FallDamageResetSet(2f); Rigidbody component = ((Component)player).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { component.position = position; component.rotation = rotation; component.velocity = Vector3.zero; component.angularVelocity = Vector3.zero; } PlayerTumble tumble = PocketDimensionCartAccess.GetTumble(player); if ((Object)(object)tumble != (Object)null) { tumble.TumbleRequest(false, false); tumble.TumbleOverrideTime(0.25f); tumble.DisableCustomGravity(0.25f); tumble.OverrideDisableTumbleMoveSound(0.25f); Rigidbody component2 = ((Component)tumble).GetComponent(); if (Object.op_Implicit((Object)(object)component2)) { component2.position = position + Vector3.up * 0.3f; component2.rotation = rotation; component2.velocity = Vector3.zero; component2.angularVelocity = Vector3.zero; } } if (PocketDimensionCartAccess.IsLocal(player) && Object.op_Implicit((Object)(object)PlayerController.instance)) { ((Component)PlayerController.instance).transform.position = position; ((Component)PlayerController.instance).transform.rotation = rotation; } } private void BroadcastExitStabilize(PlayerAvatar player, Vector3 position, Quaternion rotation) { //IL_000d: Unknown result type (might be due to invalid IL or missing references) //IL_000e: Unknown result type (might be due to invalid IL or missing references) //IL_006b: 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_006f: Unknown result type (might be due to invalid IL or missing references) //IL_0075: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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) int playerViewId = GetPlayerViewId(player); if (playerViewId == 0) { StabilizePlayerAfterPocketExit(player, position, rotation); } else if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { _cartPhotonView.RPC("PocketDimensionStabilizeExit", (RpcTarget)0, new object[3] { playerViewId, position, rotation }); } else { PocketDimensionStabilizeExit(playerViewId, position, rotation); } } private void ApplyExitPortalBrake(PlayerAvatar player) { DampenBody(((Component)player).GetComponent(), 0.15f); PlayerTumble tumble = PocketDimensionCartAccess.GetTumble(player); if ((Object)(object)tumble != (Object)null) { DampenBody(((Component)tumble).GetComponent(), 0.08f); tumble.DisableCustomGravity(0.12f); tumble.OverrideDisableTumbleMoveSound(0.12f); } if (PocketDimensionCartAccess.IsLocal(player) && Object.op_Implicit((Object)(object)PlayerController.instance)) { DampenBody(((Component)PlayerController.instance).GetComponent(), 0.15f); } } private static void DampenBody(Rigidbody body, float upwardLimit) { //IL_0012: Unknown result type (might be due to invalid IL or missing references) //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Unknown result type (might be due to invalid IL or missing references) //IL_0054: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0066: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)body) && !body.isKinematic) { Vector3 velocity = body.velocity; velocity.x *= 0.25f; velocity.z *= 0.25f; velocity.y = Mathf.Clamp(velocity.y * 0.2f, 0f - upwardLimit, upwardLimit); body.velocity = velocity; body.angularVelocity *= 0.15f; } } private bool CartCanOpenPocket() { if (!Object.op_Implicit((Object)(object)_cart) || !((Component)_cart).gameObject.activeInHierarchy || !Object.op_Implicit((Object)(object)((Component)_cart).GetComponent())) { return false; } return !PocketDimensionCartAccess.IsEquippedOrInInventory(((Component)_cart).GetComponent()); } private bool LocalPlayerCanUseCart(PlayerAvatar player, out bool insideCart) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_005c: Unknown result type (might be due to invalid IL or missing references) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008a: Unknown result type (might be due to invalid IL or missing references) //IL_0094: Unknown result type (might be due to invalid IL or missing references) if (!CartCanOpenPocket()) { insideCart = false; return false; } insideCart = PlayerInsideCartVolume(player); if (insideCart) { return true; } if (Object.op_Implicit((Object)(object)PhysGrabber.instance) && (Object)(object)PhysGrabber.instance.grabbedPhysGrabObject == (Object)(object)_cart.physGrabObject) { return true; } if (Vector3.Distance(((Component)player).transform.position, ((Component)_cart).transform.position) > 5.5f) { return false; } Transform aimTransform = GetAimTransform(player); if (!Object.op_Implicit((Object)(object)aimTransform)) { return false; } Ray val = default(Ray); ((Ray)(ref val))..ctor(aimTransform.position, aimTransform.forward); RaycastHit val2 = default(RaycastHit); if (!Physics.Raycast(val, ref val2, 6f, -1, (QueryTriggerInteraction)2)) { return false; } PhysGrabCart componentInParent = ((Component)((RaycastHit)(ref val2)).collider).GetComponentInParent(); return (Object)(object)componentInParent == (Object)(object)_cart; } private bool PlayerInsideCartVolume(PlayerAvatar player) { //IL_0040: 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_004f: 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_0059: Unknown result type (might be due to invalid IL or missing references) //IL_0082: Unknown result type (might be due to invalid IL or missing references) //IL_0083: 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_0094: Unknown result type (might be due to invalid IL or missing references) //IL_009e: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a4: Unknown result type (might be due to invalid IL or missing references) //IL_00af: Unknown result type (might be due to invalid IL or missing references) //IL_0063: 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_0069: Unknown result type (might be due to invalid IL or missing references) //IL_00b7: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Unknown result type (might be due to invalid IL or missing references) //IL_00ca: Unknown result type (might be due to invalid IL or missing references) //IL_00d5: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)player) || !Object.op_Implicit((Object)(object)_cart) || !Object.op_Implicit((Object)(object)_cart.inCart)) { return false; } BoxCollider component = ((Component)_cart.inCart).GetComponent(); Vector3 val = ((Component)player).transform.position + Vector3.up * 0.25f; if (Object.op_Implicit((Object)(object)component)) { return Vector3.Distance(((Collider)component).ClosestPoint(val), val) < 0.01f; } Vector3 val2 = _cart.inCart.InverseTransformPoint(val); Vector3 val3 = _cart.inCart.localScale * 0.5f; if (Mathf.Abs(val2.x) <= val3.x && Mathf.Abs(val2.y) <= val3.y) { return Mathf.Abs(val2.z) <= val3.z; } return false; } private bool CanPlayerUseCartOnHost(PlayerAvatar? player) { //IL_003a: 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) if (!PocketDimensionCartRuntime.IsRealLevel || (Object)(object)player == (Object)null || !Object.op_Implicit((Object)(object)_cart)) { return false; } if (LocalOrHostPlayerInsideRoom(player)) { return true; } if (!CartCanOpenPocket()) { return false; } if (!(Vector3.Distance(((Component)player).transform.position, ((Component)_cart).transform.position) <= 8f)) { return PlayerInsideCartVolume(player); } return true; } private bool LocalPlayerInsideRoom(PlayerAvatar? player) { //IL_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0015: 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) if ((Object)(object)player != (Object)null && Vector3.Distance(((Component)player).transform.position, _roomOrigin) <= 14f) { return Mathf.Abs(((Component)player).transform.position.y - _roomOrigin.y) <= 8f; } return false; } internal bool PlayerInsidePocketRoom(PlayerAvatar? player) { return LocalPlayerInsideRoom(player); } private bool LocalOrHostPlayerInsideRoom(PlayerAvatar? player) { return LocalPlayerInsideRoom(player); } private bool PlayerTouchingExit(PlayerAvatar player) { //IL_001d: Unknown result type (might be due to invalid IL or missing references) //IL_0022: Unknown result type (might be due to invalid IL or missing references) //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_0031: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) //IL_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_0058: 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_0067: 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_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_0079: Unknown result type (might be due to invalid IL or missing references) //IL_007e: Unknown result type (might be due to invalid IL or missing references) if (!Object.op_Implicit((Object)(object)player) || !Object.op_Implicit((Object)(object)_exitCollider)) { return false; } Vector3 val = ((Component)player).transform.position + Vector3.up * 0.35f; if (Vector3.Distance(_exitCollider.ClosestPoint(val), val) < 0.04f) { return true; } Vector3 val2 = ((Component)player).transform.position + Vector3.up * 1.1f; return Vector3.Distance(_exitCollider.ClosestPoint(val2), val2) < 0.04f; } private Transform GetAimTransform(PlayerAvatar player) { if (Object.op_Implicit((Object)(object)player.localCamera)) { return player.localCamera.GetOverrideTransform(); } Camera main = Camera.main; if (!Object.op_Implicit((Object)(object)main)) { return ((Component)player).transform; } return ((Component)main).transform; } private int GetPlayerViewId(PlayerAvatar player) { if (!Object.op_Implicit((Object)(object)player) || !Object.op_Implicit((Object)(object)player.photonView)) { return 0; } return player.photonView.ViewID; } private PlayerAvatar? GetPlayer(int playerViewId) { PhotonView val = PhotonView.Find(playerViewId); if (!Object.op_Implicit((Object)(object)val)) { return null; } return ((Component)val).GetComponent(); } private PhysGrabObject? GetPhysGrabObject(int viewId) { return PocketDimensionCartRuntime.ResolvePhysGrabObject(viewId); } private bool RequestOwnerIsValid(int playerViewId, PhotonMessageInfo info) { //IL_0020: 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_0036: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMultiplayer()) { return true; } PhotonView val = PhotonView.Find(playerViewId); if (!Object.op_Implicit((Object)(object)val)) { return false; } if (val.Owner != info.Sender && val.Controller != info.Sender) { return info.Sender == PhotonNetwork.MasterClient; } return true; } private Color GetFocusFlashColor() { //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_0032: 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) try { if (Object.op_Implicit((Object)(object)AssetManager.instance)) { return AssetManager.instance.colorYellow; } } catch { } return new Color(0.95f, 0.68f, 1f, 1f); } private void BuildRoom() { //IL_0047: Unknown result type (might be due to invalid IL or missing references) //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0053: 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_006c: Unknown result type (might be due to invalid IL or missing references) //IL_0071: Unknown result type (might be due to invalid IL or missing references) //IL_0078: Unknown result type (might be due to invalid IL or missing references) //IL_008c: Unknown result type (might be due to invalid IL or missing references) //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_009d: Unknown result type (might be due to invalid IL or missing references) //IL_00b1: Unknown result type (might be due to invalid IL or missing references) //IL_00b6: Unknown result type (might be due to invalid IL or missing references) //IL_00bb: Unknown result type (might be due to invalid IL or missing references) //IL_00d1: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Expected O, but got Unknown //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_00fb: Unknown result type (might be due to invalid IL or missing references) //IL_010f: Unknown result type (might be due to invalid IL or missing references) //IL_0128: Unknown result type (might be due to invalid IL or missing references) //IL_013b: Unknown result type (might be due to invalid IL or missing references) //IL_014f: Unknown result type (might be due to invalid IL or missing references) //IL_0154: Unknown result type (might be due to invalid IL or missing references) //IL_0168: Unknown result type (might be due to invalid IL or missing references) //IL_0181: Unknown result type (might be due to invalid IL or missing references) //IL_0194: Unknown result type (might be due to invalid IL or missing references) //IL_01a8: Unknown result type (might be due to invalid IL or missing references) //IL_01ad: Unknown result type (might be due to invalid IL or missing references) //IL_01c1: Unknown result type (might be due to invalid IL or missing references) //IL_01da: Unknown result type (might be due to invalid IL or missing references) //IL_01ed: Unknown result type (might be due to invalid IL or missing references) //IL_0201: Unknown result type (might be due to invalid IL or missing references) //IL_0206: Unknown result type (might be due to invalid IL or missing references) //IL_021a: Unknown result type (might be due to invalid IL or missing references) //IL_0233: Unknown result type (might be due to invalid IL or missing references) //IL_0246: Unknown result type (might be due to invalid IL or missing references) //IL_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0273: Unknown result type (might be due to invalid IL or missing references) //IL_028c: Unknown result type (might be due to invalid IL or missing references) //IL_029f: Unknown result type (might be due to invalid IL or missing references) //IL_02b3: Unknown result type (might be due to invalid IL or missing references) //IL_02cc: Unknown result type (might be due to invalid IL or missing references) int num = ((Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) ? _cartPhotonView.ViewID : _roomIndex); _roomOrigin = new Vector3(10000f + (float)num * 35f, 4000f, 10000f); _playerSpawnPosition = _roomOrigin + new Vector3(0f, 1.5f, 6f); _playerExitPosition = _roomOrigin + new Vector3(0f, 1.5f, 8.4f); _valuableExitPosition = _playerExitPosition + new Vector3(0f, 0.5f, 0f); _roomRoot = new GameObject($"Pocket Dimension Cart Room {num}"); CreateRoomBlock("Floor", _roomOrigin + new Vector3(0f, -0.1f, 0f), new Vector3(18f, 0.2f, 18f), new Color(0.12f, 0.08f, 0.18f, 1f), trigger: false); CreateRoomBlock("North Wall", _roomOrigin + new Vector3(0f, 3f, 9f), new Vector3(18f, 6f, 0.3f), new Color(0.16f, 0.1f, 0.24f, 1f), trigger: false); CreateRoomBlock("South Wall", _roomOrigin + new Vector3(0f, 3f, -9f), new Vector3(18f, 6f, 0.3f), new Color(0.16f, 0.1f, 0.24f, 1f), trigger: false); CreateRoomBlock("East Wall", _roomOrigin + new Vector3(9f, 3f, 0f), new Vector3(0.3f, 6f, 18f), new Color(0.16f, 0.1f, 0.24f, 1f), trigger: false); CreateRoomBlock("West Wall", _roomOrigin + new Vector3(-9f, 3f, 0f), new Vector3(0.3f, 6f, 18f), new Color(0.16f, 0.1f, 0.24f, 1f), trigger: false); GameObject val = CreateRoomBlock("Pocket Exit", _valuableExitPosition, new Vector3(4.5f, 3.2f, 2.2f), new Color(0.3f, 0.8f, 1f, 0.35f), trigger: true); _exitCollider = val.GetComponent(); val.AddComponent().SetController(this); } private GameObject CreateRoomBlock(string name, Vector3 position, Vector3 scale, Color color, bool trigger) { //IL_002a: Unknown result type (might be due to invalid IL or missing references) //IL_0036: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_008d: Expected O, but got Unknown //IL_008f: Unknown result type (might be due to invalid IL or missing references) GameObject val = GameObject.CreatePrimitive((PrimitiveType)3); ((Object)val).name = name; val.transform.SetParent(_roomRoot.transform); val.transform.position = position; val.transform.localScale = scale; Collider component = val.GetComponent(); component.isTrigger = trigger; Renderer component2 = val.GetComponent(); if (Object.op_Implicit((Object)(object)component2)) { Shader val2 = Shader.Find("Universal Render Pipeline/Lit"); if (!Object.op_Implicit((Object)(object)val2)) { val2 = Shader.Find("Standard"); } if (Object.op_Implicit((Object)(object)val2)) { Material val3 = new Material(val2); val3.color = color; component2.material = val3; } } int num = LayerMask.NameToLayer("Default"); if (num >= 0) { val.layer = num; } return val; } public bool OwnsStoredValuable(PhysGrabObject physGrabObject) { int viewId = PocketDimensionCartRuntime.GetViewId(physGrabObject); if (viewId != 0) { return _storedViewIds.Contains(viewId); } return false; } public void StoreValuable(PhysGrabObject physGrabObject) { //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) if (!PocketDimensionCartRuntime.IsRealLevel || !SemiFunc.IsMasterClientOrSingleplayer() || !CartCanOpenPocket() || !Object.op_Implicit((Object)(object)physGrabObject) || !Object.op_Implicit((Object)(object)((Component)physGrabObject).GetComponent()) || physGrabObject.grabbed || physGrabObject.playerGrabbing.Count > 0 || !PocketDimensionCartRuntime.CanAbsorb(physGrabObject)) { return; } int viewId = PocketDimensionCartRuntime.GetViewId(physGrabObject); if (viewId != 0 && !_storedViewIds.Contains(viewId)) { _storedViewIds.Add(viewId); PocketDimensionCartRuntime.MarkStored(physGrabObject, this); PocketDimensionStoredValuable pocketDimensionStoredValuable = ((Component)physGrabObject).GetComponent(); if (!Object.op_Implicit((Object)(object)pocketDimensionStoredValuable)) { pocketDimensionStoredValuable = ((Component)physGrabObject).gameObject.AddComponent(); } pocketDimensionStoredValuable.SetStored(this); ResetCartState(physGrabObject); PocketDimensionCartRuntime.ProtectValuable(physGrabObject, 0.75f); PocketDimensionCartRuntime.TeleportPhysGrabObject(physGrabObject, GetStoragePosition(_storedViewIds.Count - 1), Quaternion.identity); SyncStoredTotals(); } } public void EjectStoredFromRoom(PhysGrabObject physGrabObject) { if (SemiFunc.IsMasterClientOrSingleplayer() && OwnsStoredValuable(physGrabObject)) { EjectValuable(physGrabObject); } } private void EjectOne(PlayerAvatar? player) { if (CanPlayerUseCartOnHost(player)) { PhysGrabObject val = FindStoredValuable(preferReleased: true); if ((Object)(object)val != (Object)null) { EjectValuable(val); } } } private void EjectAll(PlayerAvatar? player) { if (CanPlayerUseCartOnHost(player) && !_ejectAllRunning) { ((MonoBehaviour)this).StartCoroutine(EjectAllRoutine()); } } private IEnumerator EjectAllRoutine() { _ejectAllRunning = true; while (_storedViewIds.Count > 0) { PhysGrabObject val = FindStoredValuable(preferReleased: true); if ((Object)(object)val == (Object)null) { CleanupStoredList(); break; } EjectValuable(val); yield return (object)new WaitForSeconds(Mathf.Max(0.05f, PocketDimensionCartPlugin.EjectStaggerSeconds.Value)); } _ejectAllRunning = false; } private void EjectValuable(PhysGrabObject physGrabObject) { //IL_00d3: Unknown result type (might be due to invalid IL or missing references) //IL_00d4: Unknown result type (might be due to invalid IL or missing references) //IL_00f9: Unknown result type (might be due to invalid IL or missing references) //IL_0103: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_011d: Unknown result type (might be due to invalid IL or missing references) //IL_0122: 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) if (!Object.op_Implicit((Object)(object)physGrabObject)) { return; } int viewId = PocketDimensionCartRuntime.GetViewId(physGrabObject); _storedViewIds.Remove(viewId); PocketDimensionCartRuntime.MarkReleased(physGrabObject, PocketDimensionCartPlugin.EjectCooldownSeconds.Value); SyncStoredTotals(); int num = ((viewId > 0) ? viewId : (-1)); foreach (PhysGrabber item in physGrabObject.playerGrabbing.ToList()) { if (Object.op_Implicit((Object)(object)item)) { item.ReleaseObject(num, 0.35f); } } physGrabObject.OverrideGrabDisable(0.35f); PocketDimensionStoredValuable component = ((Component)physGrabObject).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { component.SetReleased(PocketDimensionCartPlugin.EjectedProtectionSeconds.Value); } ResetCartState(physGrabObject); GetCartExitPose(out var position, out var rotation); PocketDimensionCartRuntime.ProtectValuable(physGrabObject, PocketDimensionCartPlugin.EjectedProtectionSeconds.Value); PocketDimensionCartRuntime.TeleportPhysGrabObject(physGrabObject, position, rotation); if (Object.op_Implicit((Object)(object)physGrabObject.rb)) { physGrabObject.rb.velocity = ((Component)_cart).transform.up * 1.4f + ((Component)_cart).transform.forward * 0.7f; physGrabObject.rb.angularVelocity = Vector3.zero; physGrabObject.rb.WakeUp(); } } public void AddStoredContentsToCartReadout() { if (Object.op_Implicit((Object)(object)_cart)) { if (SemiFunc.IsMasterClientOrSingleplayer()) { RefreshStoredTotals(); } if (_syncedStoredCount > 0 || _syncedStoredValue > 0) { PhysGrabCart cart = _cart; cart.itemsInCartCount += _syncedStoredCount; PhysGrabCart cart2 = _cart; cart2.haulCurrent += _syncedStoredValue; } } } public int AddStoredValueToDisplay(int baseValue) { if (SemiFunc.IsMasterClientOrSingleplayer()) { RefreshStoredTotals(); } return Mathf.Max(0, baseValue + _syncedStoredValue); } public bool UsesValueScreen(ValueScreen valueScreen) { if (Object.op_Implicit((Object)(object)_cart)) { return (Object)(object)_cart.valueScreen == (Object)(object)valueScreen; } return false; } private void SyncStoredTotals() { //IL_006a: 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) RefreshStoredTotals(); if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)_cartPhotonView) && _cartPhotonView.ViewID != 0) { _cartPhotonView.RPC("PocketDimensionSyncStoredTotals", (RpcTarget)0, new object[2] { _syncedStoredCount, _syncedStoredValue }); } else { PocketDimensionSyncStoredTotals(_syncedStoredCount, _syncedStoredValue); } } private void RefreshStoredTotals() { CleanupStoredList(); int num = 0; int num2 = 0; foreach (int storedViewId in _storedViewIds) { PhysGrabObject physGrabObject = GetPhysGrabObject(storedViewId); if (!((Object)(object)physGrabObject == (Object)null)) { num++; ValuableObject component = ((Component)physGrabObject).GetComponent(); if (Object.op_Implicit((Object)(object)component)) { num2 += (int)component.dollarValueCurrent; } } } _syncedStoredCount = num; _syncedStoredValue = num2; } [PunRPC] private void PocketDimensionSyncStoredTotals(int count, int value, PhotonMessageInfo info = default(PhotonMessageInfo)) { //IL_0007: Unknown result type (might be due to invalid IL or missing references) if (!SemiFunc.IsMultiplayer() || info.Sender == PhotonNetwork.MasterClient) { _syncedStoredCount = Mathf.Max(0, count); _syncedStoredValue = Mathf.Max(0, value); } } private PhysGrabObject? FindStoredValuable(bool preferReleased) { CleanupStoredList(); foreach (int storedViewId in _storedViewIds) { PhysGrabObject physGrabObject = GetPhysGrabObject(storedViewId); if ((Object)(object)physGrabObject != (Object)null && (!preferReleased || (!physGrabObject.grabbed && physGrabObject.playerGrabbing.Count == 0))) { return physGrabObject; } } foreach (int storedViewId2 in _storedViewIds) { PhysGrabObject physGrabObject2 = GetPhysGrabObject(storedViewId2); if ((Object)(object)physGrabObject2 != (Object)null) { return physGrabObject2; } } return null; } private void CleanupStoredList() { for (int num = _storedViewIds.Count - 1; num >= 0; num--) { if (!Object.op_Implicit((Object)(object)GetPhysGrabObject(_storedViewIds[num]))) { _storedViewIds.RemoveAt(num); } } } private Vector3 GetStoragePosition(int index) { //IL_0009: Unknown result type (might be due to invalid IL or missing references) //IL_002b: Unknown result type (might be due to invalid IL or missing references) //IL_0030: Unknown result type (might be due to invalid IL or missing references) int num = index % 5; int num2 = index / 5; return _roomOrigin + new Vector3((float)(num - 2) * 2.4f, 1.2f, -4.8f + (float)num2 * 2.4f); } private static void ResetCartState(PhysGrabObject physGrabObject) { if (Object.op_Implicit((Object)(object)physGrabObject) && Object.op_Implicit((Object)(object)physGrabObject.impactDetector)) { PhysGrabObjectImpactDetector impactDetector = physGrabObject.impactDetector; impactDetector.timerInCart = 0f; impactDetector.inCart = false; impactDetector.currentCart = null; impactDetector.currentCartPrev = null; impactDetector.ImpactDisable(0.25f); } } } [BepInPlugin("empress.repo.pocketdimensioncart", "Pocket Dimension Cart", "1.3.0")] public sealed class PocketDimensionCartPlugin : BaseUnityPlugin { public const string PluginGuid = "empress.repo.pocketdimensioncart"; public const string PluginName = "Pocket Dimension Cart"; public const string PluginVersion = "1.3.0"; internal static PocketDimensionCartPlugin Instance; internal static ConfigEntry ActionKey; internal static ConfigEntry HoldSeconds; internal static ConfigEntry EjectStaggerSeconds; internal static ConfigEntry EjectCooldownSeconds; internal static ConfigEntry EjectedProtectionSeconds; internal static ConfigEntry EnterByHoppingInCart; private Harmony _harmony; private void Awake() { //IL_00dd: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Expected O, but got Unknown Instance = this; ActionKey = ((BaseUnityPlugin)this).Config.Bind("Input", "ActionKey", (KeyCode)120, "Press near a cart to eject one stored valuable. Hold to eject all stored valuables."); HoldSeconds = ((BaseUnityPlugin)this).Config.Bind("Input", "HoldSeconds", 0.55f, "How long the action key must be held before eject-all starts."); EjectStaggerSeconds = ((BaseUnityPlugin)this).Config.Bind("Cart", "EjectStaggerSeconds", 0.18f, "Delay between each valuable when ejecting all."); EjectCooldownSeconds = ((BaseUnityPlugin)this).Config.Bind("Cart", "EjectCooldownSeconds", 2f, "How long an ejected valuable is blocked from being absorbed by a cart again."); EjectedProtectionSeconds = ((BaseUnityPlugin)this).Config.Bind("Cart", "EjectedProtectionSeconds", 2f, "Temporary damage protection after a valuable exits the pocket dimension."); EnterByHoppingInCart = ((BaseUnityPlugin)this).Config.Bind("Cart", "EnterByHoppingInCart", true, "Allows players to enter the pocket dimension by standing inside the cart."); _harmony = new Harmony("empress.repo.pocketdimensioncart"); _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Pocket Dimension Cart v1.3.0 loaded."); } } internal sealed class PocketDimensionStoredValuable : MonoBehaviour { private PhysGrabObject _physGrabObject; private PocketDimensionCartController? _owner; private float _protectUntil; private bool _stored; private void Awake() { _physGrabObject = ((Component)this).GetComponent(); } private void Update() { if (Object.op_Implicit((Object)(object)_physGrabObject) && (_stored || Time.time < _protectUntil)) { _physGrabObject.OverrideIndestructible(0.35f); _physGrabObject.OverrideBreakEffects(0.35f); if (Object.op_Implicit((Object)(object)_physGrabObject.impactDetector)) { _physGrabObject.impactDetector.ImpactDisable(0.35f); } } } public void SetStored(PocketDimensionCartController owner) { _owner = owner; _stored = true; Protect(1f); } public void SetReleased(float protectionSeconds) { _owner = null; _stored = false; Protect(protectionSeconds); } public void Protect(float seconds) { _protectUntil = Mathf.Max(_protectUntil, Time.time + Mathf.Max(0f, seconds)); } public PocketDimensionCartController? GetOwner() { return _owner; } } internal sealed class PocketDimensionValuableExitZone : MonoBehaviour { private PocketDimensionCartController _controller; public void SetController(PocketDimensionCartController controller) { _controller = controller; } private void OnTriggerEnter(Collider other) { TryEject(other); } private void OnTriggerStay(Collider other) { TryEject(other); } private void TryEject(Collider other) { if (Object.op_Implicit((Object)(object)_controller) && PocketDimensionCartRuntime.IsRealLevel && SemiFunc.IsMasterClientOrSingleplayer()) { PhysGrabObject componentInParent = ((Component)other).GetComponentInParent(); if (Object.op_Implicit((Object)(object)componentInParent) && _controller.OwnsStoredValuable(componentInParent)) { _controller.EjectStoredFromRoom(componentInParent); } } } } internal static class PocketDimensionCartAccess { private static readonly FieldRef? ItemCurrentState = CreateItemStateRef("currentState") ?? CreateItemStateRef("_currentState"); private static readonly FieldRef? ItemIsEquipped = CreateBoolRef("isEquipped"); private static readonly FieldRef? ItemIsEquipping = CreateBoolRef("isEquipping"); private static readonly FieldRef? ItemIsUnequipping = CreateBoolRef("isUnequipping"); private static readonly FieldRef? ItemEquippedSpot = CreateInventorySpotRef("equippedSpot"); private static readonly FieldRef? PlayerTumbleRef = CreatePlayerTumbleRef("tumble"); private static readonly FieldRef? PlayerIsLocalRef = CreatePlayerBoolRef("isLocal"); private static readonly FieldRef? PlayerIsSprintingRef = CreatePlayerBoolRef("isSprinting"); private static readonly FieldRef? TumblePlayerRef = CreateTumblePlayerRef("playerAvatar"); private static readonly FieldRef? TumbleIsTumblingRef = CreateTumbleBoolRef("isTumbling"); private static readonly FieldRef? ControllerPlayerRef = CreateControllerPlayerRef("playerAvatarScript"); private static readonly FieldRef? ControllerSprintingRef = CreateControllerBoolRef("sprinting"); private static readonly FieldRef? ControllerToggleSprintRef = CreateControllerBoolRef("toggleSprint"); private static readonly FieldRef? ControllerTumbleInputDisableRef = CreateControllerFloatRef("tumbleInputDisableTimer"); private static readonly FieldRef? ControllerSprintedTimerRef = CreateControllerFloatRef("SprintedTimer"); private static readonly FieldRef? ControllerSprintDrainTimerRef = CreateControllerFloatRef("SprintDrainTimer"); private static readonly FieldRef? ControllerSprintSpeedLerpRef = CreateControllerFloatRef("SprintSpeedLerp"); internal static bool IsEquippedOrInInventory(ItemEquippable itemEquippable) { if (!Object.op_Implicit((Object)(object)itemEquippable)) { return false; } try { if (itemEquippable.IsEquipped()) { return true; } } catch { } FieldRef itemCurrentState = ItemCurrentState; if (itemCurrentState != null) { try { if (itemCurrentState.Invoke(itemEquippable)) { return true; } } catch { } } if (!ReadBool(itemEquippable, ItemIsEquipped) && !ReadBool(itemEquippable, ItemIsEquipping) && !ReadBool(itemEquippable, ItemIsUnequipping)) { return ReadEquippedSpot(itemEquippable); } return true; } internal static PlayerTumble? GetTumble(PlayerAvatar player) { FieldRef playerTumbleRef = PlayerTumbleRef; if (playerTumbleRef == null || !Object.op_Implicit((Object)(object)player)) { return null; } try { return playerTumbleRef.Invoke(player); } catch { return null; } } internal static bool IsLocal(PlayerAvatar player) { FieldRef playerIsLocalRef = PlayerIsLocalRef; if (playerIsLocalRef == null || !Object.op_Implicit((Object)(object)player)) { return false; } try { return playerIsLocalRef.Invoke(player); } catch { return false; } } internal static PlayerAvatar? GetTumbleOwner(PlayerTumble tumble) { FieldRef tumblePlayerRef = TumblePlayerRef; if (tumblePlayerRef == null || !Object.op_Implicit((Object)(object)tumble)) { return null; } try { return tumblePlayerRef.Invoke(tumble); } catch { return null; } } internal static PlayerAvatar? GetControllerPlayer(PlayerController controller) { FieldRef controllerPlayerRef = ControllerPlayerRef; if (controllerPlayerRef == null || !Object.op_Implicit((Object)(object)controller)) { return null; } try { return controllerPlayerRef.Invoke(controller); } catch { return null; } } internal static void SuppressPocketRoomMovement(PlayerController? controller, PlayerAvatar player) { if (!Object.op_Implicit((Object)(object)player)) { return; } SetPlayerBool(player, PlayerIsSprintingRef, value: false); if (Object.op_Implicit((Object)(object)controller)) { SetControllerBool(controller, ControllerSprintingRef, value: false); SetControllerBool(controller, ControllerToggleSprintRef, value: false); SetControllerFloat(controller, ControllerTumbleInputDisableRef, 0.2f, useMax: true); SetControllerFloat(controller, ControllerSprintedTimerRef, 0f, useMax: false); SetControllerFloat(controller, ControllerSprintDrainTimerRef, 0f, useMax: false); SetControllerFloat(controller, ControllerSprintSpeedLerpRef, 0f, useMax: false); } PlayerTumble tumble = GetTumble(player); if ((Object)(object)tumble != (Object)null) { if (ReadTumbleBool(tumble, TumbleIsTumblingRef)) { tumble.TumbleRequest(false, false); } tumble.TumbleOverrideTime(0.2f); tumble.DisableCustomGravity(0.1f); tumble.OverrideDisableTumbleMoveSound(0.2f); } } private static bool ReadBool(ItemEquippable itemEquippable, FieldRef? accessor) { if (accessor == null) { return false; } try { return accessor.Invoke(itemEquippable); } catch { return false; } } private static bool ReadTumbleBool(PlayerTumble tumble, FieldRef? accessor) { if (accessor == null) { return false; } try { return accessor.Invoke(tumble); } catch { return false; } } private static void SetPlayerBool(PlayerAvatar player, FieldRef? accessor, bool value) { if (accessor == null) { return; } try { accessor.Invoke(player) = value; } catch { } } private static void SetControllerBool(PlayerController controller, FieldRef? accessor, bool value) { if (accessor == null) { return; } try { accessor.Invoke(controller) = value; } catch { } } private static void SetControllerFloat(PlayerController controller, FieldRef? accessor, float value, bool useMax) { if (accessor == null) { return; } try { accessor.Invoke(controller) = (useMax ? Mathf.Max(accessor.Invoke(controller), value) : value); } catch { } } private static bool ReadEquippedSpot(ItemEquippable itemEquippable) { FieldRef itemEquippedSpot = ItemEquippedSpot; if (itemEquippedSpot == null) { return false; } try { InventorySpot val = itemEquippedSpot.Invoke(itemEquippable); return Object.op_Implicit((Object)(object)val); } catch { return false; } } private static FieldRef? CreateItemStateRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateBoolRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateInventorySpotRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreatePlayerTumbleRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreatePlayerBoolRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateTumblePlayerRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateTumbleBoolRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateControllerPlayerRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateControllerBoolRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } private static FieldRef? CreateControllerFloatRef(string name) { try { return AccessTools.FieldRefAccess(name); } catch { return null; } } } internal static class PocketDimensionCartRuntime { private static readonly List Controllers = new List(); private static readonly Dictionary StoredOwners = new Dictionary(); private static readonly Dictionary AbsorbCooldowns = new Dictionary(); private static readonly Dictionary LocalPhysGrabObjects = new Dictionary(); private static int _nextRoomIndex; internal static bool IsRealLevel { get { try { if (!Object.op_Implicit((Object)(object)RunManager.instance) || !Object.op_Implicit((Object)(object)LevelGenerator.Instance) || !LevelGenerator.Instance.Generated) { return false; } if (SemiFunc.MenuLevel() || SemiFunc.RunIsShop() || SemiFunc.RunIsTutorial()) { return false; } return SemiFunc.RunIsLevel(); } catch { return false; } } } internal static bool CanAttachToCart { get { try { if (!Object.op_Implicit((Object)(object)RunManager.instance) || SemiFunc.MenuLevel() || SemiFunc.RunIsShop() || SemiFunc.RunIsTutorial()) { return false; } return SemiFunc.RunIsLevel(); } catch { return false; } } } internal static int ReserveRoomIndex() { _nextRoomIndex++; return _nextRoomIndex; } internal static void Register(PocketDimensionCartController controller) { if (!Controllers.Contains(controller)) { Controllers.Add(controller); } } internal static void Unregister(PocketDimensionCartController controller) { PocketDimensionCartController controller2 = controller; Controllers.Remove(controller2); int[] array = (from pair in StoredOwners where (Object)(object)pair.Value == (Object)(object)controller2 select pair.Key).ToArray(); foreach (int key in array) { StoredOwners.Remove(key); } } internal static void ResetLevelState() { Controllers.Clear(); StoredOwners.Clear(); AbsorbCooldowns.Clear(); LocalPhysGrabObjects.Clear(); _nextRoomIndex = 0; } internal static bool IsStored(PhysGrabObject physGrabObject) { int viewId = GetViewId(physGrabObject); if (viewId != 0) { return StoredOwners.ContainsKey(viewId); } return false; } internal static bool CanAbsorb(PhysGrabObject physGrabObject) { int viewId = GetViewId(physGrabObject); if (viewId == 0) { return true; } if (StoredOwners.ContainsKey(viewId)) { return false; } if (AbsorbCooldowns.TryGetValue(viewId, out var value) && Time.time < value) { return false; } if (AbsorbCooldowns.ContainsKey(viewId)) { AbsorbCooldowns.Remove(viewId); } return true; } internal static void MarkStored(PhysGrabObject physGrabObject, PocketDimensionCartController owner) { int viewId = GetViewId(physGrabObject); if (viewId != 0) { StoredOwners[viewId] = owner; } } internal static void MarkReleased(PhysGrabObject physGrabObject, float cooldown) { int viewId = GetViewId(physGrabObject); if (viewId != 0) { StoredOwners.Remove(viewId); AbsorbCooldowns[viewId] = Time.time + Mathf.Max(0.1f, cooldown); } } internal static PocketDimensionCartController? GetOwner(PhysGrabObject physGrabObject) { int viewId = GetViewId(physGrabObject); if (viewId == 0) { return null; } StoredOwners.TryGetValue(viewId, out PocketDimensionCartController value); return value; } internal static PocketDimensionCartController? GetControllerForValueScreen(ValueScreen valueScreen) { if (!Object.op_Implicit((Object)(object)valueScreen)) { return null; } foreach (PocketDimensionCartController controller in Controllers) { if (Object.op_Implicit((Object)(object)controller) && controller.UsesValueScreen(valueScreen)) { return controller; } } return null; } internal static bool PlayerInsideAnyPocketRoom(PlayerAvatar? player) { if ((Object)(object)player == (Object)null) { return false; } for (int num = Controllers.Count - 1; num >= 0; num--) { PocketDimensionCartController pocketDimensionCartController = Controllers[num]; if (!Object.op_Implicit((Object)(object)pocketDimensionCartController)) { Controllers.RemoveAt(num); } else if (pocketDimensionCartController.PlayerInsidePocketRoom(player)) { return true; } } return false; } internal static int GetViewId(PhysGrabObject physGrabObject) { if (!Object.op_Implicit((Object)(object)physGrabObject)) { return 0; } if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)physGrabObject.photonView) && physGrabObject.photonView.ViewID != 0) { return physGrabObject.photonView.ViewID; } int instanceID = ((Object)physGrabObject).GetInstanceID(); int num; switch (instanceID) { case 0: return 0; default: num = -Mathf.Abs(instanceID); break; case int.MinValue: num = instanceID; break; } int num2 = num; LocalPhysGrabObjects[num2] = physGrabObject; return num2; } internal static PhysGrabObject? ResolvePhysGrabObject(int viewId) { if (viewId == 0) { return null; } if (viewId < 0) { if (LocalPhysGrabObjects.TryGetValue(viewId, out PhysGrabObject value) && Object.op_Implicit((Object)(object)value)) { return value; } LocalPhysGrabObjects.Remove(viewId); return null; } PhotonView val = PhotonView.Find(viewId); if (!Object.op_Implicit((Object)(object)val)) { return null; } return ((Component)val).GetComponent(); } internal static void TeleportPhysGrabObject(PhysGrabObject physGrabObject, Vector3 position, Quaternion rotation) { //IL_0056: 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_006d: Unknown result type (might be due to invalid IL or missing references) //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_007b: Unknown result type (might be due to invalid IL or missing references) //IL_0086: Unknown result type (might be due to invalid IL or missing references) //IL_003e: Unknown result type (might be due to invalid IL or missing references) //IL_0047: Unknown result type (might be due to invalid IL or missing references) if (Object.op_Implicit((Object)(object)physGrabObject)) { if (SemiFunc.IsMultiplayer() && Object.op_Implicit((Object)(object)physGrabObject.photonView) && physGrabObject.photonView.ViewID != 0) { physGrabObject.photonView.RPC("SetPositionRPC", (RpcTarget)0, new object[2] { position, rotation }); } else { physGrabObject.Teleport(position, rotation); } Rigidbody rb = physGrabObject.rb; if (Object.op_Implicit((Object)(object)rb)) { rb.position = position; rb.rotation = rotation; rb.velocity = Vector3.zero; rb.angularVelocity = Vector3.zero; rb.WakeUp(); } } } internal static void ProtectValuable(PhysGrabObject physGrabObject, float seconds) { if (Object.op_Implicit((Object)(object)physGrabObject)) { PocketDimensionStoredValuable pocketDimensionStoredValuable = ((Component)physGrabObject).GetComponent(); if (!Object.op_Implicit((Object)(object)pocketDimensionStoredValuable)) { pocketDimensionStoredValuable = ((Component)physGrabObject).gameObject.AddComponent(); } pocketDimensionStoredValuable.Protect(seconds); } } } }