Decompiled source of StorableValuables v1.0.4
StorableValuables.dll
Decompiled 5 hours ago
The result has been truncated due to the large size, download it to view full contents!
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 BepInEx.Logging; using HarmonyLib; using Microsoft.CodeAnalysis; using TMPro; using UnityEngine; using UnityEngine.Rendering; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)] [assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")] [assembly: IgnoresAccessChecksTo("")] [assembly: AssemblyCompany("Tolga")] [assembly: AssemblyConfiguration("Release")] [assembly: AssemblyFileVersion("1.0.4.0")] [assembly: AssemblyInformationalVersion("1.0.4")] [assembly: AssemblyProduct("StorableValuables")] [assembly: AssemblyTitle("StorableValuables")] [assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)] [assembly: AssemblyVersion("1.0.4.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 StoreValuables { public static class Config { public static ConfigEntry<bool> EnableValuableStorage; public static ConfigEntry<bool> EnableStaminaDrain; public static ConfigEntry<bool> EnableMovementPenalty; public static ConfigEntry<bool> EnableAutoDropOnStaminaDepletion; public static ConfigEntry<bool> EnableDamageOnDrop; public static ConfigEntry<float> StaminaDrainBase; public static ConfigEntry<float> StaminaDrainWeightMultiplier; public static ConfigEntry<string> StaminaDrainCalculationMode; public static ConfigEntry<float> StaminaDepletionThreshold; public static ConfigEntry<float> StaminaWarningThreshold; public static ConfigEntry<float> MovementSpeedPenaltyPerWeight; public static ConfigEntry<float> MinMovementSpeedMultiplier; public static ConfigEntry<float> MaxMovementSpeedPenalty; public static ConfigEntry<bool> ApplyToSprintSpeed; public static ConfigEntry<bool> ApplyToCrouchSpeed; public static ConfigEntry<string> MovementPenaltyCalculationMode; public static ConfigEntry<float> DamagePercentage; public static ConfigEntry<float> MinDamageAmount; public static ConfigEntry<float> MaxDamageAmount; public static ConfigEntry<string> DamageCalculationMode; public static ConfigEntry<float> MaxWeightPerSlot; public static ConfigEntry<float> MaxTotalWeight; public static ConfigEntry<bool> AllowMultipleValuablesPerSlot; public static ConfigEntry<bool> RequireEmptySlot; public static ConfigEntry<bool> AutoReleaseOnDeath; public static ConfigEntry<bool> ShowWeightIndicator; public static ConfigEntry<bool> ShowStaminaDrainIndicator; public static ConfigEntry<bool> ShowStaminaWarning; public static ConfigEntry<Color> StaminaWarningColor; public static ConfigEntry<bool> ShowDamageNotification; public static ConfigEntry<string> WeightDisplayFormat; public static ConfigEntry<string> StaminaDrainDisplayFormat; public static ConfigEntry<float> TotalWeightHudOffsetX; public static ConfigEntry<float> TotalWeightHudOffsetY; public static ConfigEntry<bool> NetworkSyncEnabled; public static ConfigEntry<string> PhysicsModeOnStore; public static ConfigEntry<Vector3> DropPositionOffset; public static ConfigEntry<float> DropForce; public static ConfigEntry<float> DropDistance; public static ConfigEntry<float> CooldownAfterDrop; public static ConfigEntry<bool> ShowRotatingIcon; public static ConfigEntry<bool> DebugLogging; public static void Initialize(ConfigFile configFile) { //IL_00b0: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Expected O, but got Unknown //IL_00e8: Unknown result type (might be due to invalid IL or missing references) //IL_00f2: Expected O, but got Unknown //IL_012c: Unknown result type (might be due to invalid IL or missing references) //IL_0136: Expected O, but got Unknown //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016e: Expected O, but got Unknown //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a6: Expected O, but got Unknown //IL_01d4: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Expected O, but got Unknown //IL_020c: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Expected O, but got Unknown //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Expected O, but got Unknown //IL_02c6: Unknown result type (might be due to invalid IL or missing references) //IL_02d0: Expected O, but got Unknown //IL_02fe: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Expected O, but got Unknown //IL_0336: Unknown result type (might be due to invalid IL or missing references) //IL_0340: Expected O, but got Unknown //IL_036e: Unknown result type (might be due to invalid IL or missing references) //IL_0378: Expected O, but got Unknown //IL_03ba: Unknown result type (might be due to invalid IL or missing references) //IL_03c4: Expected O, but got Unknown //IL_03f2: Unknown result type (might be due to invalid IL or missing references) //IL_03fc: Expected O, but got Unknown //IL_042a: Unknown result type (might be due to invalid IL or missing references) //IL_0434: Expected O, but got Unknown //IL_04e6: Unknown result type (might be due to invalid IL or missing references) //IL_057c: Unknown result type (might be due to invalid IL or missing references) //IL_0586: Expected O, but got Unknown //IL_05b4: Unknown result type (might be due to invalid IL or missing references) //IL_05be: Expected O, but got Unknown //IL_061b: Unknown result type (might be due to invalid IL or missing references) //IL_0625: Expected O, but got Unknown //IL_0644: Unknown result type (might be due to invalid IL or missing references) //IL_0681: Unknown result type (might be due to invalid IL or missing references) //IL_068b: Expected O, but got Unknown //IL_06b9: Unknown result type (might be due to invalid IL or missing references) //IL_06c3: Expected O, but got Unknown //IL_06f1: Unknown result type (might be due to invalid IL or missing references) //IL_06fb: Expected O, but got Unknown EnableValuableStorage = configFile.Bind<bool>("Feature Toggles", "EnableValuableStorage", true, "Master toggle to enable/disable storing valuables in inventory"); EnableStaminaDrain = configFile.Bind<bool>("Feature Toggles", "EnableStaminaDrain", true, "Enable/disable stamina drain while holding valuables"); EnableMovementPenalty = configFile.Bind<bool>("Feature Toggles", "EnableMovementPenalty", true, "Enable/disable movement speed penalty based on weight"); EnableAutoDropOnStaminaDepletion = configFile.Bind<bool>("Feature Toggles", "EnableAutoDropOnStaminaDepletion", true, "Enable/disable automatic drop when stamina reaches 0"); EnableDamageOnDrop = configFile.Bind<bool>("Feature Toggles", "EnableDamageOnDrop", true, "Enable/disable damage to valuable when dropped due to stamina depletion"); StaminaDrainBase = configFile.Bind<float>("Stamina System", "StaminaDrainBase", 5f, new ConfigDescription("Base stamina drain per second (applies even with no weight)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1000f), Array.Empty<object>())); StaminaDrainWeightMultiplier = configFile.Bind<float>("Stamina System", "StaminaDrainWeightMultiplier", 2f, new ConfigDescription("Additional stamina drain per unit of weight", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1000f), Array.Empty<object>())); StaminaDrainCalculationMode = configFile.Bind<string>("Stamina System", "StaminaDrainCalculationMode", "Linear", new ConfigDescription("How weight affects stamina drain: Linear or Exponential", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[2] { "Linear", "Exponential" }), Array.Empty<object>())); StaminaDepletionThreshold = configFile.Bind<float>("Stamina System", "StaminaDepletionThreshold", 0f, new ConfigDescription("Stamina level at which auto-drop triggers (0 = exact zero)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1000f), Array.Empty<object>())); StaminaWarningThreshold = configFile.Bind<float>("Stamina System", "StaminaWarningThreshold", 20f, new ConfigDescription("Stamina level to show warning UI (0 = disabled)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1000f), Array.Empty<object>())); MovementSpeedPenaltyPerWeight = configFile.Bind<float>("Movement Speed", "MovementSpeedPenaltyPerWeight", 0.1f, new ConfigDescription("Speed reduction per unit of weight (0.1 = 10% per weight)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MinMovementSpeedMultiplier = configFile.Bind<float>("Movement Speed", "MinMovementSpeedMultiplier", 0.3f, new ConfigDescription("Minimum movement speed (0.3 = 30% of base speed)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MaxMovementSpeedPenalty = configFile.Bind<float>("Movement Speed", "MaxMovementSpeedPenalty", 0.7f, new ConfigDescription("Maximum speed reduction (0.7 = can reduce up to 70%, leaving 30% minimum)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); ApplyToSprintSpeed = configFile.Bind<bool>("Movement Speed", "ApplyToSprintSpeed", true, "Apply penalty to sprint speed as well"); ApplyToCrouchSpeed = configFile.Bind<bool>("Movement Speed", "ApplyToCrouchSpeed", true, "Apply penalty to crouch speed as well"); MovementPenaltyCalculationMode = configFile.Bind<string>("Movement Speed", "MovementPenaltyCalculationMode", "Linear", new ConfigDescription("How weight affects movement: Linear, Exponential, or Step", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[3] { "Linear", "Exponential", "Step" }), Array.Empty<object>())); DamagePercentage = configFile.Bind<float>("Damage System", "DamagePercentage", 0.1f, new ConfigDescription("Percentage of value lost (0.1 = 10%, 1.0 = 100%)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>())); MinDamageAmount = configFile.Bind<float>("Damage System", "MinDamageAmount", 1f, new ConfigDescription("Minimum damage amount in dollars (prevents tiny damages)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1000000f), Array.Empty<object>())); MaxDamageAmount = configFile.Bind<float>("Damage System", "MaxDamageAmount", -1f, new ConfigDescription("Maximum damage amount (-1 = no limit, otherwise caps damage)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1000000f), Array.Empty<object>())); DamageCalculationMode = configFile.Bind<string>("Damage System", "DamageCalculationMode", "Percentage", new ConfigDescription("How damage is calculated: Percentage, Fixed, or WeightBased", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[3] { "Percentage", "Fixed", "WeightBased" }), Array.Empty<object>())); MaxWeightPerSlot = configFile.Bind<float>("Storage System", "MaxWeightPerSlot", -1f, new ConfigDescription("Maximum weight allowed per slot (-1 = unlimited)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1000000f), Array.Empty<object>())); MaxTotalWeight = configFile.Bind<float>("Storage System", "MaxTotalWeight", -1f, new ConfigDescription("Maximum total weight across all slots (-1 = unlimited)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 1000000f), Array.Empty<object>())); AllowMultipleValuablesPerSlot = configFile.Bind<bool>("Storage System", "AllowMultipleValuablesPerSlot", false, "Not implemented yet; currently has no effect (reserved for a future feature)."); RequireEmptySlot = configFile.Bind<bool>("Storage System", "RequireEmptySlot", true, "Require slot to be empty before storing (prevents overwriting)"); AutoReleaseOnDeath = configFile.Bind<bool>("Storage System", "AutoReleaseOnDeath", true, "Automatically drop all stored valuables when player dies"); ShowWeightIndicator = configFile.Bind<bool>("Visual/UI", "ShowWeightIndicator", true, "Show weight indicator in inventory UI"); ShowStaminaDrainIndicator = configFile.Bind<bool>("Visual/UI", "ShowStaminaDrainIndicator", true, "Show stamina drain rate in UI"); ShowStaminaWarning = configFile.Bind<bool>("Visual/UI", "ShowStaminaWarning", true, "Show warning when stamina is low"); StaminaWarningColor = configFile.Bind<Color>("Visual/UI", "StaminaWarningColor", Color.red, "Color for stamina warning UI"); ShowDamageNotification = configFile.Bind<bool>("Visual/UI", "ShowDamageNotification", true, "Show notification when valuable takes damage on drop"); WeightDisplayFormat = configFile.Bind<string>("Visual/UI", "WeightDisplayFormat", "{0:F1} kg", "Format string for weight display"); StaminaDrainDisplayFormat = configFile.Bind<string>("Visual/UI", "StaminaDrainDisplayFormat", "-{0:F1}/s", "Format string for stamina drain display"); TotalWeightHudOffsetX = configFile.Bind<float>("Visual/UI", "TotalWeightHudOffsetX", -24f, new ConfigDescription("Total weight HUD text offset X (anchored to right-center; negative moves left)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-2000f, 2000f), Array.Empty<object>())); TotalWeightHudOffsetY = configFile.Bind<float>("Visual/UI", "TotalWeightHudOffsetY", -60f, new ConfigDescription("Total weight HUD text offset Y (anchored to right-center; negative moves down)", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-2000f, 2000f), Array.Empty<object>())); NetworkSyncEnabled = configFile.Bind<bool>("Advanced", "NetworkSyncEnabled", false, "Not implemented yet; currently has no effect (reserved for a future multiplayer sync feature)."); PhysicsModeOnStore = configFile.Bind<string>("Advanced", "PhysicsModeOnStore", "Kinematic", new ConfigDescription("How to handle physics when storing: Kinematic, Disable, or Keep", (AcceptableValueBase)(object)new AcceptableValueList<string>(new string[3] { "Kinematic", "Disable", "Keep" }), Array.Empty<object>())); DropPositionOffset = configFile.Bind<Vector3>("Advanced", "DropPositionOffset", new Vector3(0f, 0.5f, 1f), "Offset from player position when dropping valuable"); DropForce = configFile.Bind<float>("Advanced", "DropForce", 2f, new ConfigDescription("Force applied when dropping valuable", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-100f, 100f), Array.Empty<object>())); DropDistance = configFile.Bind<float>("Advanced", "DropDistance", 2f, new ConfigDescription("Distance in front of camera to drop valuable when unequipping", (AcceptableValueBase)(object)new AcceptableValueRange<float>(-1f, 100f), Array.Empty<object>())); CooldownAfterDrop = configFile.Bind<float>("Advanced", "CooldownAfterDrop", 1f, new ConfigDescription("Cooldown in seconds before can store again after auto-drop", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 600f), Array.Empty<object>())); ShowRotatingIcon = configFile.Bind<bool>("Advanced", "ShowRotatingIcon", true, "Rotate the 3D model in inventory slot for better visibility"); DebugLogging = configFile.Bind<bool>("Advanced", "DebugLogging", false, "Enable debug logging for troubleshooting"); } } internal static class ExtractionHaulSync { internal static void RemoveFromHaulList(ValuableObject valuable, string context) { if ((Object)(object)valuable == (Object)null) { return; } try { if (SemiFunc.IsMasterClientOrSingleplayer()) { RoundDirector instance = RoundDirector.instance; if (instance?.dollarHaulList != null && instance.dollarHaulList.Contains(((Component)valuable).gameObject)) { instance.dollarHaulList.Remove(((Component)valuable).gameObject); StoreValuables.Logger.LogDebug((object)("[" + context + "] Removed '" + ((Object)((Component)valuable).gameObject).name + "' from RoundDirector.dollarHaulList")); } } } catch (Exception ex) { StoreValuables.Logger.LogDebug((object)("[" + context + "] RemoveFromHaulList failed: " + ex.Message)); } } internal static void RefreshRoomVolumesAndSyncHaulList(ValuableObject valuable, string context) { if ((Object)(object)valuable == (Object)null) { return; } try { if (!SemiFunc.IsMasterClientOrSingleplayer()) { return; } RoomVolumeCheck component = ((Component)valuable).GetComponent<RoomVolumeCheck>(); if ((Object)(object)component != (Object)null) { component.CheckSet(); } bool flag = false; if ((Object)(object)component != (Object)null && component.CurrentRooms != null) { foreach (RoomVolume currentRoom in component.CurrentRooms) { if ((Object)(object)currentRoom != (Object)null && currentRoom.Extraction) { flag = true; break; } } } RoundDirector instance = RoundDirector.instance; if (instance?.dollarHaulList != null) { bool flag2 = instance.dollarHaulList.Contains(((Component)valuable).gameObject); if (flag && !flag2) { instance.dollarHaulList.Add(((Component)valuable).gameObject); StoreValuables.Logger.LogDebug((object)("[" + context + "] Added '" + ((Object)((Component)valuable).gameObject).name + "' to RoundDirector.dollarHaulList (now in extraction)")); } else if (!flag && flag2) { instance.dollarHaulList.Remove(((Component)valuable).gameObject); StoreValuables.Logger.LogDebug((object)("[" + context + "] Removed '" + ((Object)((Component)valuable).gameObject).name + "' from RoundDirector.dollarHaulList (not in extraction)")); } } } catch (Exception ex) { StoreValuables.Logger.LogDebug((object)("[" + context + "] RefreshRoomVolumesAndSyncHaulList failed: " + ex.Message)); } } } public class ItemPreviewer : MonoBehaviour { [CompilerGenerated] private sealed class <DisableIconsAfterFrame>d__14 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ItemPreviewer <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DisableIconsAfterFrame>d__14(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { int num = <>1__state; ItemPreviewer itemPreviewer = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; if (!itemPreviewer._previewActive) { return false; } <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = null; <>1__state = 2; return true; case 2: { <>1__state = -1; Image[] componentsInChildren = ((Component)itemPreviewer).GetComponentsInChildren<Image>(true); foreach (Image val in componentsInChildren) { if (!itemPreviewer._previewActive) { return false; } if (!((Object)(object)val == (Object)null) && !((Object)(object)((Component)val).gameObject == (Object)null) && (!((Object)(object)itemPreviewer.uiDisplay != (Object)null) || !((Object)(object)((Component)val).gameObject == (Object)(object)((Component)itemPreviewer.uiDisplay).gameObject)) && (((Object)((Component)val).gameObject).name == "Icon" || ((Object)((Component)val).gameObject).name.Contains("Icon"))) { itemPreviewer.TrackAndDisableIcon(val); } } SpriteRenderer[] componentsInChildren2 = ((Component)itemPreviewer).GetComponentsInChildren<SpriteRenderer>(true); if (componentsInChildren2.Length != 0) { SpriteRenderer[] array = componentsInChildren2; foreach (SpriteRenderer val2 in array) { if (!itemPreviewer._previewActive) { return false; } if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)null) && (((Object)((Component)val2).gameObject).name == "Icon" || ((Object)((Component)val2).gameObject).name.Contains("Icon"))) { itemPreviewer.TrackAndDisableIcon(val2); } } } return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } [CompilerGenerated] private sealed class <RenderAfterFrame>d__22 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public ItemPreviewer <>4__this; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <RenderAfterFrame>d__22(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { //IL_020a: Unknown result type (might be due to invalid IL or missing references) //IL_0226: Unknown result type (might be due to invalid IL or missing references) //IL_022b: Unknown result type (might be due to invalid IL or missing references) //IL_0240: Unknown result type (might be due to invalid IL or missing references) //IL_024c: Unknown result type (might be due to invalid IL or missing references) //IL_0252: Unknown result type (might be due to invalid IL or missing references) //IL_0255: Unknown result type (might be due to invalid IL or missing references) //IL_0266: Expected O, but got Unknown //IL_0074: Unknown result type (might be due to invalid IL or missing references) //IL_00bf: 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_0199: 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_01b2: Unknown result type (might be due to invalid IL or missing references) int num = <>1__state; ItemPreviewer itemPreviewer = <>4__this; switch (num) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; if ((Object)(object)itemPreviewer.previewCamera != (Object)null && (Object)(object)itemPreviewer.renderTexture != (Object)null && (Object)(object)itemPreviewer.uiDisplay != (Object)null) { ((Component)itemPreviewer.previewCamera).transform.LookAt(itemPreviewer._currentLookTargetWorld); if (!itemPreviewer.renderTexture.IsCreated()) { itemPreviewer.renderTexture.Create(); } itemPreviewer.previewCamera.targetTexture = itemPreviewer.renderTexture; itemPreviewer.uiDisplay.texture = (Texture)(object)itemPreviewer.renderTexture; ((Graphic)itemPreviewer.uiDisplay).color = Color.white; ((Behaviour)itemPreviewer.uiDisplay).enabled = true; Transform transform = ((Component)itemPreviewer.uiDisplay).transform; RectTransform val = (RectTransform)(object)((transform is RectTransform) ? transform : null); if ((Object)(object)val != (Object)null) { ((Transform)val).SetAsLastSibling(); } if ((Object)(object)itemPreviewer.currentPreviewObject != (Object)null) { Renderer[] componentsInChildren = itemPreviewer.currentPreviewObject.GetComponentsInChildren<Renderer>(); int num2 = 0; int num3 = 0; uint num4 = 0u; Renderer[] array = componentsInChildren; foreach (Renderer val2 in array) { if ((Object)(object)val2 != (Object)null && val2.enabled) { num2++; if (((Component)val2).gameObject.layer == 23) { num3++; } if (val2.renderingLayerMask > num4) { num4 = val2.renderingLayerMask; } } } } _ = ((Behaviour)itemPreviewer.previewCamera).enabled; ((Behaviour)itemPreviewer.previewCamera).enabled = false; bool fog = RenderSettings.fog; Color ambientLight = RenderSettings.ambientLight; float ambientIntensity = RenderSettings.ambientIntensity; RenderSettings.fog = false; RenderSettings.ambientLight = Color.white * 0.5f; RenderSettings.ambientIntensity = Mathf.Max(ambientIntensity, 1f); try { if ((Object)(object)itemPreviewer._previewReflectionProbe != (Object)null) { try { itemPreviewer._previewReflectionProbe.RenderProbe(); } catch (Exception) { } } itemPreviewer.previewCamera.Render(); itemPreviewer.previewCamera.Render(); } finally { RenderSettings.fog = fog; RenderSettings.ambientLight = ambientLight; RenderSettings.ambientIntensity = ambientIntensity; } RenderTexture.active = itemPreviewer.renderTexture; Texture2D val3 = new Texture2D(1, 1); val3.ReadPixels(new Rect(0f, 0f, 1f, 1f), 0, 0); val3.Apply(); val3.GetPixel(0, 0); RenderTexture.active = null; Object.Destroy((Object)val3); } return false; } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } public GameObject? currentPreviewObject; public Camera? previewCamera; public RenderTexture? renderTexture; public RawImage? uiDisplay; public GameObject? previewStage; private ReflectionProbe? _previewReflectionProbe; private bool _previewActive; private float _nextIconRescanTime; private readonly List<(Image img, bool enabled, bool active)> _disabledIconImages = new List<(Image, bool, bool)>(); private readonly List<(SpriteRenderer sr, bool enabled, bool active)> _disabledIconSpriteRenderers = new List<(SpriteRenderer, bool, bool)>(); private Vector3 _currentLookTargetWorld; private int _previewStageSlotIndex = -1; private void Awake() { //IL_0077: Unknown result type (might be due to invalid IL or missing references) //IL_0081: Expected O, but got Unknown //IL_009f: Unknown result type (might be due to invalid IL or missing references) //IL_00c1: Unknown result type (might be due to invalid IL or missing references) //IL_00c6: 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_00f1: 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_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0144: Expected O, but got Unknown //IL_016f: 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_023d: Unknown result type (might be due to invalid IL or missing references) //IL_0247: Expected O, but got Unknown //IL_03b8: Unknown result type (might be due to invalid IL or missing references) //IL_03bf: Expected O, but got Unknown //IL_04d6: Unknown result type (might be due to invalid IL or missing references) //IL_04e2: Unknown result type (might be due to invalid IL or missing references) //IL_04f8: Unknown result type (might be due to invalid IL or missing references) //IL_0504: Unknown result type (might be due to invalid IL or missing references) //IL_0510: Unknown result type (might be due to invalid IL or missing references) //IL_051c: Unknown result type (might be due to invalid IL or missing references) //IL_0458: Unknown result type (might be due to invalid IL or missing references) //IL_0466: Unknown result type (might be due to invalid IL or missing references) //IL_0474: Unknown result type (might be due to invalid IL or missing references) //IL_0482: Unknown result type (might be due to invalid IL or missing references) //IL_0490: Unknown result type (might be due to invalid IL or missing references) //IL_049e: Unknown result type (might be due to invalid IL or missing references) //IL_04ac: Unknown result type (might be due to invalid IL or missing references) //IL_04ba: Unknown result type (might be due to invalid IL or missing references) //IL_04c8: Unknown result type (might be due to invalid IL or missing references) //IL_0594: Unknown result type (might be due to invalid IL or missing references) //IL_0648: Unknown result type (might be due to invalid IL or missing references) StoreValuables.Logger.LogDebug((object)("[ItemPreviewer] Awake called for " + ((Object)((Component)this).gameObject).name)); _previewStageSlotIndex = TryGetInventorySlotIndex(); float num = ((_previewStageSlotIndex >= 0) ? ((float)(_previewStageSlotIndex + 1) * 100f) : 100f); float num2 = (float)Mathf.Abs(((Object)this).GetInstanceID() % 10) * 2f; previewStage = new GameObject($"PreviewStage_{((Object)this).GetInstanceID()}"); previewStage.transform.position = new Vector3(0f, -10000f - num - num2, 0f); ((Object)previewStage).hideFlags = (HideFlags)61; SetupReflectionProbe(); GameObject val = new GameObject("PreviewLight"); val.transform.SetParent(previewStage.transform); val.transform.localPosition = new Vector3(0f, 0f, 0f); ((Object)val).hideFlags = (HideFlags)61; Light val2 = val.AddComponent<Light>(); val2.type = (LightType)2; val2.range = 10f; val2.intensity = 4f; val2.cullingMask = 8388608; ConfigureHDRPLight(val2); GameObject val3 = new GameObject("PreviewCam"); val3.transform.SetParent(previewStage.transform); val3.transform.localPosition = new Vector3(0f, 0f, -1.5f); ((Object)val3).hideFlags = (HideFlags)61; previewCamera = val3.AddComponent<Camera>(); previewCamera.clearFlags = (CameraClearFlags)2; previewCamera.backgroundColor = new Color(0.15f, 0.15f, 0.15f, 1f); previewCamera.cullingMask = 8388608; ((Behaviour)previewCamera).enabled = false; previewCamera.orthographic = false; previewCamera.fieldOfView = 30f; previewCamera.nearClipPlane = 0.1f; previewCamera.farClipPlane = 10f; ConfigureHDRPCamera(previewCamera); if ((Object)(object)renderTexture == (Object)null) { renderTexture = new RenderTexture(256, 256, 16, (RenderTextureFormat)0); ((Object)renderTexture).name = $"PreviewRT_{((Object)this).GetInstanceID()}"; renderTexture.Create(); } previewCamera.targetTexture = renderTexture; Transform val4 = ((Component)this).transform.Find("ModItemPreview"); RectTransform val5 = null; int layer = ((Component)this).gameObject.layer; try { Image val6 = ((IEnumerable<Image>)((Component)this).GetComponentsInChildren<Image>(true)).FirstOrDefault((Func<Image, bool>)((Image i) => (Object)(object)i != (Object)null && (Object)(object)((Component)i).gameObject != (Object)null && (((Object)((Component)i).gameObject).name == "Icon" || ((Object)((Component)i).gameObject).name.Contains("Icon")))); val5 = (RectTransform)(((Object)(object)val6 != (Object)null) ? /*isinst with value type is only supported in some contexts*/: null); if ((Object)(object)val6 != (Object)null && (Object)(object)((Component)val6).gameObject != (Object)null) { layer = ((Component)val6).gameObject.layer; } } catch { val5 = null; } GameObject val7; if ((Object)(object)val4 != (Object)null) { StoreValuables.Logger.LogDebug((object)"[ItemPreviewer] Found existing ModItemPreview, reusing it"); val7 = ((Component)val4).gameObject; uiDisplay = val7.GetComponent<RawImage>(); if ((Object)(object)uiDisplay == (Object)null) { uiDisplay = val7.AddComponent<RawImage>(); } } else { Transform val8 = (((Object)(object)val5 != (Object)null && (Object)(object)((Component)val5).transform.parent != (Object)null) ? ((Component)val5).transform.parent : ((Component)this).transform); val7 = new GameObject("ModItemPreview", new Type[1] { typeof(RectTransform) }); val7.transform.SetParent(val8, false); val7.AddComponent<LayoutElement>().ignoreLayout = true; uiDisplay = val7.AddComponent<RawImage>(); } try { val7.layer = layer; if ((Object)(object)uiDisplay != (Object)null) { ((Component)uiDisplay).gameObject.layer = layer; } } catch { } if ((Object)(object)uiDisplay != (Object)null) { Transform transform = ((Component)uiDisplay).transform; RectTransform val9 = (RectTransform)(object)((transform is RectTransform) ? transform : null); if ((Object)(object)val9 != (Object)null) { if ((Object)(object)val5 != (Object)null) { val9.anchorMin = val5.anchorMin; val9.anchorMax = val5.anchorMax; val9.pivot = val5.pivot; val9.anchoredPosition3D = val5.anchoredPosition3D; val9.sizeDelta = val5.sizeDelta; ((Transform)val9).localRotation = ((Transform)val5).localRotation; ((Transform)val9).localScale = ((Transform)val5).localScale; val9.offsetMin = val5.offsetMin; val9.offsetMax = val5.offsetMax; } else { val9.anchorMin = Vector2.zero; val9.anchorMax = Vector2.one; val9.pivot = new Vector2(0.5f, 0.5f); val9.anchoredPosition = Vector2.zero; val9.sizeDelta = Vector2.zero; ((Transform)val9).localScale = Vector3.one; } ((Transform)val9).SetAsLastSibling(); } } Canvas val10 = val7.GetComponent<Canvas>(); if ((Object)(object)val10 == (Object)null) { val10 = val7.AddComponent<Canvas>(); } Canvas val11 = null; if ((Object)(object)val7.transform.parent != (Object)null) { val11 = ((Component)val7.transform.parent).GetComponentInParent<Canvas>(); } val10.overrideSorting = true; if ((Object)(object)val11 != (Object)null && (Object)(object)val11 != (Object)(object)val10) { val10.renderMode = val11.renderMode; val10.worldCamera = val11.worldCamera; val10.planeDistance = val11.planeDistance; val10.sortingLayerID = val11.sortingLayerID; val10.sortingOrder = val11.sortingOrder + 1; } else { val10.sortingOrder = 5000; } if ((Object)(object)val7.GetComponent<GraphicRaycaster>() == (Object)null) { val7.AddComponent<GraphicRaycaster>(); } if ((Object)(object)uiDisplay != (Object)null && (Object)(object)renderTexture != (Object)null) { uiDisplay.texture = (Texture)(object)renderTexture; ((Graphic)uiDisplay).raycastTarget = false; ((Behaviour)uiDisplay).enabled = false; ((Graphic)uiDisplay).color = Color.white; StoreValuables.Logger.LogDebug((object)"[ItemPreviewer] Awake: Assigned renderTexture to RawImage"); } else { StoreValuables.Logger.LogError((object)$"[ItemPreviewer] Failed to setup uiDisplay or renderTexture is null. uiDisplay: {(Object)(object)uiDisplay != (Object)null}, renderTexture: {(Object)(object)renderTexture != (Object)null}"); } } public void SetItem(GameObject? itemPrefab) { //IL_032b: Unknown result type (might be due to invalid IL or missing references) //IL_0330: Unknown result type (might be due to invalid IL or missing references) //IL_0382: Unknown result type (might be due to invalid IL or missing references) //IL_0391: Unknown result type (might be due to invalid IL or missing references) //IL_03a0: Unknown result type (might be due to invalid IL or missing references) //IL_03e6: Unknown result type (might be due to invalid IL or missing references) //IL_03ed: Unknown result type (might be due to invalid IL or missing references) //IL_042c: Unknown result type (might be due to invalid IL or missing references) //IL_0433: Unknown result type (might be due to invalid IL or missing references) //IL_0438: Unknown result type (might be due to invalid IL or missing references) //IL_044f: Unknown result type (might be due to invalid IL or missing references) //IL_0115: Unknown result type (might be due to invalid IL or missing references) //IL_012a: Unknown result type (might be due to invalid IL or missing references) //IL_02de: Unknown result type (might be due to invalid IL or missing references) //IL_02e3: Unknown result type (might be due to invalid IL or missing references) //IL_02e7: Unknown result type (might be due to invalid IL or missing references) //IL_02ec: Unknown result type (might be due to invalid IL or missing references) //IL_0308: Unknown result type (might be due to invalid IL or missing references) //IL_02ff: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0263: Unknown result type (might be due to invalid IL or missing references) //IL_0268: Unknown result type (might be due to invalid IL or missing references) StoreValuables.Logger.LogDebug((object)("[ItemPreviewer] SetItem called with " + (((Object)(object)itemPrefab != (Object)null) ? ((Object)itemPrefab).name : "null"))); if ((Object)(object)itemPrefab == (Object)null) { _previewActive = false; RestoreDisabledIcons(); _nextIconRescanTime = 0f; } if ((Object)(object)currentPreviewObject != (Object)null) { Object.Destroy((Object)(object)currentPreviewObject); currentPreviewObject = null; } if ((Object)(object)itemPrefab == (Object)null || (Object)(object)renderTexture == (Object)null || (Object)(object)uiDisplay == (Object)null || (Object)(object)previewCamera == (Object)null) { if ((Object)(object)uiDisplay != (Object)null) { ((Behaviour)uiDisplay).enabled = false; } if ((Object)(object)previewCamera != (Object)null) { ((Behaviour)previewCamera).enabled = false; } return; } _previewActive = true; ((MonoBehaviour)this).StartCoroutine(DisableIconsAfterFrame()); ((Behaviour)uiDisplay).enabled = true; currentPreviewObject = Object.Instantiate<GameObject>(itemPrefab, previewStage.transform); currentPreviewObject.transform.localPosition = Vector3.zero; currentPreviewObject.transform.localRotation = Quaternion.identity; ((Object)currentPreviewObject).name = "Preview_" + ((Object)itemPrefab).name; List<Component> list = new List<Component>(); MonoBehaviour[] componentsInChildren = currentPreviewObject.GetComponentsInChildren<MonoBehaviour>(); foreach (MonoBehaviour val in componentsInChildren) { if (!(val is ItemPreviewer)) { list.Add((Component)(object)val); } } foreach (Component item in list) { Object.Destroy((Object)(object)item); } Rigidbody[] componentsInChildren2 = currentPreviewObject.GetComponentsInChildren<Rigidbody>(); for (int i = 0; i < componentsInChildren2.Length; i++) { Object.Destroy((Object)(object)componentsInChildren2[i]); } Collider[] componentsInChildren3 = currentPreviewObject.GetComponentsInChildren<Collider>(); for (int i = 0; i < componentsInChildren3.Length; i++) { Object.Destroy((Object)(object)componentsInChildren3[i]); } LODGroup[] componentsInChildren4 = currentPreviewObject.GetComponentsInChildren<LODGroup>(true); foreach (LODGroup val2 in componentsInChildren4) { if ((Object)(object)val2 != (Object)null) { Object.DestroyImmediate((Object)(object)val2); } } SetupRenderersForPreview(currentPreviewObject); currentPreviewObject.SetActive(true); Bounds meshBounds = default(Bounds); ((Bounds)(ref meshBounds))..ctor(Vector3.zero, Vector3.zero); bool flag = false; int num = 0; int num2 = 0; Renderer[] componentsInChildren5 = currentPreviewObject.GetComponentsInChildren<Renderer>(true); Vector3 size; foreach (Renderer val3 in componentsInChildren5) { if ((Object)(object)val3 == (Object)null) { continue; } num++; if (val3 is ParticleSystemRenderer || !val3.enabled) { continue; } try { if (val3.sharedMaterials == null || val3.sharedMaterials.Length == 0) { continue; } goto IL_02d1; } catch { } continue; IL_02d1: Bounds val4 = RendererLocalBoundsToRootLocalBounds(currentPreviewObject.transform, val3); size = ((Bounds)(ref val4)).size; if (!(((Vector3)(ref size)).sqrMagnitude < 1E-06f)) { if (!flag) { meshBounds = val4; flag = true; } else { ((Bounds)(ref meshBounds)).Encapsulate(val4); } num2++; } } if (flag) { size = ((Bounds)(ref meshBounds)).size; if (!(((Vector3)(ref size)).magnitude < 0.001f)) { float num3 = Mathf.Max(new float[3] { ((Bounds)(ref meshBounds)).size.x, ((Bounds)(ref meshBounds)).size.y, ((Bounds)(ref meshBounds)).size.z }); if (num3 < 0.01f) { num3 = 1f; StoreValuables.Logger.LogWarning((object)"[ItemPreviewer] Bounds too small, using fallback maxDim 1.0"); } float num4 = 0.8f / num3; currentPreviewObject.transform.localScale = Vector3.one * num4; StoreValuables.Logger.LogInfo((object)$"[ItemPreviewer] Scaled {((Object)itemPrefab).name} by {num4} (maxDim: {num3})"); currentPreviewObject.transform.localPosition = -(((Bounds)(ref meshBounds)).center * num4); PositionCameraForPreview(currentPreviewObject, previewCamera, meshBounds, num4); ((MonoBehaviour)this).StartCoroutine(RenderAfterFrame()); return; } } StoreValuables.Logger.LogError((object)("[ItemPreviewer] Item " + ((Object)itemPrefab).name + " has no valid Renderers or bounds!")); ((Behaviour)uiDisplay).enabled = false; ((Behaviour)previewCamera).enabled = false; } [IteratorStateMachine(typeof(<DisableIconsAfterFrame>d__14))] private IEnumerator DisableIconsAfterFrame() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <DisableIconsAfterFrame>d__14(0) { <>4__this = this }; } private int TryGetInventorySlotIndex() { try { InventorySpot component = ((Component)this).GetComponent<InventorySpot>(); if ((Object)(object)component != (Object)null) { return component.inventorySpotIndex; } } catch { } return -1; } private bool IsTracked(Image img) { for (int i = 0; i < _disabledIconImages.Count; i++) { if ((Object)(object)_disabledIconImages[i].img == (Object)(object)img) { return true; } } return false; } private bool IsTracked(SpriteRenderer sr) { for (int i = 0; i < _disabledIconSpriteRenderers.Count; i++) { if ((Object)(object)_disabledIconSpriteRenderers[i].sr == (Object)(object)sr) { return true; } } return false; } private void TrackAndDisableIcon(Image img) { if (!((Object)(object)img == (Object)null) && !((Object)(object)((Component)img).gameObject == (Object)null) && (!((Object)(object)uiDisplay != (Object)null) || !((Object)(object)((Component)img).gameObject == (Object)(object)((Component)uiDisplay).gameObject))) { if (!IsTracked(img)) { _disabledIconImages.Add((img, ((Behaviour)img).enabled, ((Component)img).gameObject.activeSelf)); } ((Behaviour)img).enabled = false; ((Component)img).gameObject.SetActive(false); } } private void TrackAndDisableIcon(SpriteRenderer sr) { if (!((Object)(object)sr == (Object)null) && !((Object)(object)((Component)sr).gameObject == (Object)null)) { if (!IsTracked(sr)) { _disabledIconSpriteRenderers.Add((sr, ((Renderer)sr).enabled, ((Component)sr).gameObject.activeSelf)); } ((Renderer)sr).enabled = false; ((Component)sr).gameObject.SetActive(false); } } private void ReDisableTrackedIconsIfNeeded() { for (int i = 0; i < _disabledIconImages.Count; i++) { Image item = _disabledIconImages[i].img; if (!((Object)(object)item == (Object)null) && !((Object)(object)((Component)item).gameObject == (Object)null) && (((Behaviour)item).enabled || ((Component)item).gameObject.activeSelf)) { ((Behaviour)item).enabled = false; ((Component)item).gameObject.SetActive(false); } } for (int j = 0; j < _disabledIconSpriteRenderers.Count; j++) { SpriteRenderer item2 = _disabledIconSpriteRenderers[j].sr; if (!((Object)(object)item2 == (Object)null) && !((Object)(object)((Component)item2).gameObject == (Object)null) && (((Renderer)item2).enabled || ((Component)item2).gameObject.activeSelf)) { ((Renderer)item2).enabled = false; ((Component)item2).gameObject.SetActive(false); } } } private void RestoreDisabledIcons() { for (int i = 0; i < _disabledIconImages.Count; i++) { var (val, enabled, active) = _disabledIconImages[i]; if (!((Object)(object)val == (Object)null) && !((Object)(object)((Component)val).gameObject == (Object)null)) { try { ((Component)val).gameObject.SetActive(active); ((Behaviour)val).enabled = enabled; } catch { } } } _disabledIconImages.Clear(); for (int j = 0; j < _disabledIconSpriteRenderers.Count; j++) { var (val2, enabled2, active2) = _disabledIconSpriteRenderers[j]; if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)null)) { try { ((Component)val2).gameObject.SetActive(active2); ((Renderer)val2).enabled = enabled2; } catch { } } } _disabledIconSpriteRenderers.Clear(); } [IteratorStateMachine(typeof(<RenderAfterFrame>d__22))] private IEnumerator RenderAfterFrame() { //yield-return decompiler failed: Unexpected instruction in Iterator.Dispose() return new <RenderAfterFrame>d__22(0) { <>4__this = this }; } private void PositionCameraForPreview(GameObject previewObj, Camera? cam, Bounds meshBounds, float appliedScale) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0020: 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_0027: 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_002f: 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_0057: 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_00be: Unknown result type (might be due to invalid IL or missing references) //IL_00ce: 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_0124: 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_012d: Unknown result type (might be due to invalid IL or missing references) //IL_0135: Unknown result type (might be due to invalid IL or missing references) //IL_0139: Unknown result type (might be due to invalid IL or missing references) //IL_0149: 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_004b: Unknown result type (might be due to invalid IL or missing references) //IL_01c9: Unknown result type (might be due to invalid IL or missing references) //IL_01ca: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: Unknown result type (might be due to invalid IL or missing references) //IL_01e6: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)previewObj == (Object)null || (Object)(object)cam == (Object)null) { return; } Vector3 val = (_currentLookTargetWorld = previewObj.transform.TransformPoint(((Bounds)(ref meshBounds)).center)); Vector3 val2 = ((Bounds)(ref meshBounds)).size; if (((Vector3)(ref val2)).sqrMagnitude < 0.0001f) { ((Bounds)(ref meshBounds))..ctor(Vector3.zero, Vector3.one); } Vector3 val3 = ((Bounds)(ref meshBounds)).extents * Mathf.Max(appliedScale, 0.0001f); cam.fieldOfView = 40f; float num = cam.fieldOfView * (MathF.PI / 180f) * 0.5f; float num2 = Mathf.Atan(Mathf.Tan(num) * cam.aspect); float num3 = Mathf.Max(Mathf.Tan(num), 0.0001f); float num4 = Mathf.Max(Mathf.Tan(num2), 0.0001f); float num5 = val3.y / (num3 * 0.85f); float num6 = val3.x / (num4 * 0.85f); float num7 = Mathf.Max(val3.z, 0.05f); float num8 = Mathf.Max(num5, num6) + num7; num8 = Mathf.Clamp(num8, 0.6f, 6f); val2 = new Vector3(0.5f, 0.5f, -1.5f); Vector3 normalized = ((Vector3)(ref val2)).normalized; ((Component)cam).transform.localPosition = normalized * num8; ((Component)cam).transform.LookAt(val); cam.nearClipPlane = 0.01f; cam.farClipPlane = Mathf.Max(10f, num8 + 10f); Renderer[] componentsInChildren = previewObj.GetComponentsInChildren<Renderer>(); int num9 = 0; int num10 = 0; Renderer[] array = componentsInChildren; foreach (Renderer val4 in array) { if ((Object)(object)val4 != (Object)null && val4.enabled) { num9++; if (((Component)val4).gameObject.layer == 23) { num10++; } } } Vector3 val5 = val; StoreValuables.Logger.LogDebug((object)$"[ItemPreviewer] Camera positioned at local {((Component)cam).transform.localPosition}, looking at world {val5}, FOV: {cam.fieldOfView}"); } private static Bounds WorldBoundsToLocalBounds(Transform root, Bounds worldBounds) { //IL_0002: Unknown result type (might be due to invalid IL or missing references) //IL_0007: 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_000f: Unknown result type (might be due to invalid IL or missing references) //IL_0018: Unknown result type (might be due to invalid IL or missing references) //IL_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_002b: 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) //IL_003f: Unknown result type (might be due to invalid IL or missing references) //IL_0044: 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_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005e: 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_006b: 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) //IL_0077: 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) //IL_0084: Unknown result type (might be due to invalid IL or missing references) //IL_008b: 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_0098: 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_00a5: Unknown result type (might be due to invalid IL or missing references) //IL_00aa: 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_00b7: 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_00c4: Unknown result type (might be due to invalid IL or missing references) //IL_00cb: 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_00d8: Unknown result type (might be due to invalid IL or missing references) //IL_00dd: 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_00ea: Unknown result type (might be due to invalid IL or missing references) //IL_00f1: Unknown result type (might be due to invalid IL or missing references) //IL_00f7: Unknown result type (might be due to invalid IL or missing references) //IL_00fe: Unknown result type (might be due to invalid IL or missing references) //IL_0104: 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) //IL_0110: Unknown result type (might be due to invalid IL or missing references) //IL_0117: 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_0124: Unknown result type (might be due to invalid IL or missing references) //IL_012a: 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_0137: Unknown result type (might be due to invalid IL or missing references) //IL_013e: Unknown result type (might be due to invalid IL or missing references) //IL_0143: Unknown result type (might be due to invalid IL or missing references) //IL_014a: Unknown result type (might be due to invalid IL or missing references) //IL_0150: Unknown result type (might be due to invalid IL or missing references) //IL_0157: Unknown result type (might be due to invalid IL or missing references) //IL_015d: Unknown result type (might be due to invalid IL or missing references) //IL_0164: Unknown result type (might be due to invalid IL or missing references) //IL_016a: Unknown result type (might be due to invalid IL or missing references) //IL_0171: Unknown result type (might be due to invalid IL or missing references) //IL_0176: Unknown result type (might be due to invalid IL or missing references) //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0183: Unknown result type (might be due to invalid IL or missing references) //IL_018a: 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_0197: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01a4: Unknown result type (might be due to invalid IL or missing references) //IL_01a9: Unknown result type (might be due to invalid IL or missing references) //IL_01b4: Unknown result type (might be due to invalid IL or missing references) //IL_01b9: Unknown result type (might be due to invalid IL or missing references) //IL_01be: Unknown result type (might be due to invalid IL or missing references) //IL_01d3: Unknown result type (might be due to invalid IL or missing references) //IL_01d8: Unknown result type (might be due to invalid IL or missing references) //IL_01ef: Unknown result type (might be due to invalid IL or missing references) Vector3 center = ((Bounds)(ref worldBounds)).center; Vector3 extents = ((Bounds)(ref worldBounds)).extents; Vector3[] array = (Vector3[])(object)new Vector3[8] { new Vector3(center.x - extents.x, center.y - extents.y, center.z - extents.z), new Vector3(center.x - extents.x, center.y - extents.y, center.z + extents.z), new Vector3(center.x - extents.x, center.y + extents.y, center.z - extents.z), new Vector3(center.x - extents.x, center.y + extents.y, center.z + extents.z), new Vector3(center.x + extents.x, center.y - extents.y, center.z - extents.z), new Vector3(center.x + extents.x, center.y - extents.y, center.z + extents.z), new Vector3(center.x + extents.x, center.y + extents.y, center.z - extents.z), new Vector3(center.x + extents.x, center.y + extents.y, center.z + extents.z) }; Bounds result = default(Bounds); ((Bounds)(ref result))..ctor(root.InverseTransformPoint(array[0]), Vector3.zero); for (int i = 1; i < array.Length; i++) { ((Bounds)(ref result)).Encapsulate(root.InverseTransformPoint(array[i])); } return result; } private static Bounds RendererLocalBoundsToRootLocalBounds(Transform root, Renderer renderer) { //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_000c: Unknown result type (might be due to invalid IL or missing references) //IL_0011: Unknown result type (might be due to invalid IL or missing references) //IL_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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_001f: Unknown result type (might be due to invalid IL or missing references) //IL_0024: Unknown result type (might be due to invalid IL or missing references) //IL_026e: Unknown result type (might be due to invalid IL or missing references) //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_0068: 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_0076: 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_0083: Unknown result type (might be due to invalid IL or missing references) //IL_0089: Unknown result type (might be due to invalid IL or missing references) //IL_0090: 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_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_00af: 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_00bc: Unknown result type (might be due to invalid IL or missing references) //IL_00c3: 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_00d0: 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) //IL_00dc: Unknown result type (might be due to invalid IL or missing references) //IL_00e2: Unknown result type (might be due to invalid IL or missing references) //IL_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_00fc: 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_0108: 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_0115: Unknown result type (might be due to invalid IL or missing references) //IL_011c: 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_0129: Unknown result type (might be due to invalid IL or missing references) //IL_012f: Unknown result type (might be due to invalid IL or missing references) //IL_0136: 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_0142: Unknown result type (might be due to invalid IL or missing references) //IL_0148: 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_0155: Unknown result type (might be due to invalid IL or missing references) //IL_015c: Unknown result type (might be due to invalid IL or missing references) //IL_0162: Unknown result type (might be due to invalid IL or missing references) //IL_0169: Unknown result type (might be due to invalid IL or missing references) //IL_016e: 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_017b: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_0188: Unknown result type (might be due to invalid IL or missing references) //IL_018f: 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_019c: Unknown result type (might be due to invalid IL or missing references) //IL_01a1: 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_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bb: Unknown result type (might be due to invalid IL or missing references) //IL_01c2: Unknown result type (might be due to invalid IL or missing references) //IL_01c8: Unknown result type (might be due to invalid IL or missing references) //IL_01cf: 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) //IL_01db: Unknown result type (might be due to invalid IL or missing references) //IL_01e1: Unknown result type (might be due to invalid IL or missing references) //IL_01e8: Unknown result type (might be due to invalid IL or missing references) //IL_01ee: Unknown result type (might be due to invalid IL or missing references) //IL_01f5: Unknown result type (might be due to invalid IL or missing references) //IL_01fb: Unknown result type (might be due to invalid IL or missing references) //IL_0202: Unknown result type (might be due to invalid IL or missing references) //IL_0207: Unknown result type (might be due to invalid IL or missing references) //IL_0216: Unknown result type (might be due to invalid IL or missing references) //IL_021b: Unknown result type (might be due to invalid IL or missing references) //IL_0220: Unknown result type (might be due to invalid IL or missing references) //IL_0225: Unknown result type (might be due to invalid IL or missing references) //IL_0229: Unknown result type (might be due to invalid IL or missing references) //IL_022b: 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_003b: Unknown result type (might be due to invalid IL or missing references) //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0244: Unknown result type (might be due to invalid IL or missing references) //IL_0249: Unknown result type (might be due to invalid IL or missing references) //IL_024e: Unknown result type (might be due to invalid IL or missing references) //IL_0253: Unknown result type (might be due to invalid IL or missing references) //IL_0257: Unknown result type (might be due to invalid IL or missing references) //IL_026b: Unknown result type (might be due to invalid IL or missing references) Bounds localBounds = default(Bounds); try { localBounds = renderer.localBounds; } catch { ((Bounds)(ref localBounds))..ctor(Vector3.zero, Vector3.zero); } Vector3 size = ((Bounds)(ref localBounds)).size; if (((Vector3)(ref size)).sqrMagnitude < 1E-06f) { try { return WorldBoundsToLocalBounds(root, renderer.bounds); } catch { return new Bounds(Vector3.zero, Vector3.zero); } } Vector3 center = ((Bounds)(ref localBounds)).center; Vector3 extents = ((Bounds)(ref localBounds)).extents; Vector3[] array = (Vector3[])(object)new Vector3[8] { new Vector3(center.x - extents.x, center.y - extents.y, center.z - extents.z), new Vector3(center.x - extents.x, center.y - extents.y, center.z + extents.z), new Vector3(center.x - extents.x, center.y + extents.y, center.z - extents.z), new Vector3(center.x - extents.x, center.y + extents.y, center.z + extents.z), new Vector3(center.x + extents.x, center.y - extents.y, center.z - extents.z), new Vector3(center.x + extents.x, center.y - extents.y, center.z + extents.z), new Vector3(center.x + extents.x, center.y + extents.y, center.z - extents.z), new Vector3(center.x + extents.x, center.y + extents.y, center.z + extents.z) }; Vector3 val = root.InverseTransformPoint(((Component)renderer).transform.TransformPoint(array[0])); Bounds result = default(Bounds); ((Bounds)(ref result))..ctor(val, Vector3.zero); for (int i = 1; i < array.Length; i++) { Vector3 val2 = root.InverseTransformPoint(((Component)renderer).transform.TransformPoint(array[i])); ((Bounds)(ref result)).Encapsulate(val2); } return result; } private void SetupReflectionProbe() { //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_003f: 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_0057: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00cd: Unknown result type (might be due to invalid IL or missing references) if (!((Object)(object)previewStage == (Object)null) && !((Object)(object)_previewReflectionProbe != (Object)null)) { GameObject val = new GameObject("PreviewReflectionProbe"); val.transform.SetParent(previewStage.transform, false); val.transform.localPosition = Vector3.zero; ((Object)val).hideFlags = (HideFlags)61; val.layer = 23; ReflectionProbe val2 = val.AddComponent<ReflectionProbe>(); val2.mode = (ReflectionProbeMode)1; val2.refreshMode = (ReflectionProbeRefreshMode)2; val2.timeSlicingMode = (ReflectionProbeTimeSlicingMode)2; val2.intensity = 1f; val2.boxProjection = true; val2.size = new Vector3(10f, 10f, 10f); val2.cullingMask = 8388608; val2.clearFlags = (ReflectionProbeClearFlags)2; val2.backgroundColor = new Color(0.2f, 0.2f, 0.2f, 1f); _previewReflectionProbe = val2; } } private void Update() { //IL_0025: Unknown result type (might be due to invalid IL or missing references) //IL_002f: Unknown result type (might be due to invalid IL or missing references) //IL_0039: Unknown result type (might be due to invalid IL or missing references) if ((Object)(object)currentPreviewObject != (Object)null && Config.ShowRotatingIcon.Value) { currentPreviewObject.transform.Rotate(Vector3.up * 45f * Time.deltaTime); } if (!_previewActive || !((Object)(object)currentPreviewObject != (Object)null)) { return; } ReDisableTrackedIconsIfNeeded(); if (_disabledIconImages.Count != 0 || _disabledIconSpriteRenderers.Count != 0) { return; } float unscaledTime = Time.unscaledTime; if (!(_nextIconRescanTime <= 0f) && !(unscaledTime >= _nextIconRescanTime)) { return; } _nextIconRescanTime = unscaledTime + 1f; try { Image[] componentsInChildren = ((Component)this).GetComponentsInChildren<Image>(true); foreach (Image val in componentsInChildren) { if (!((Object)(object)val == (Object)null) && !((Object)(object)((Component)val).gameObject == (Object)null) && (!((Object)(object)uiDisplay != (Object)null) || !((Object)(object)((Component)val).gameObject == (Object)(object)((Component)uiDisplay).gameObject)) && (((Object)((Component)val).gameObject).name == "Icon" || ((Object)((Component)val).gameObject).name.Contains("Icon"))) { TrackAndDisableIcon(val); } } SpriteRenderer[] componentsInChildren2 = ((Component)this).GetComponentsInChildren<SpriteRenderer>(true); foreach (SpriteRenderer val2 in componentsInChildren2) { if (!((Object)(object)val2 == (Object)null) && !((Object)(object)((Component)val2).gameObject == (Object)null) && (((Object)((Component)val2).gameObject).name == "Icon" || ((Object)((Component)val2).gameObject).name.Contains("Icon"))) { TrackAndDisableIcon(val2); } } } catch { } } private void OnDestroy() { StoreValuables.Logger.LogDebug((object)"[ItemPreviewer] OnDestroy called, cleaning up"); RestoreDisabledIcons(); _previewActive = false; if ((Object)(object)currentPreviewObject != (Object)null) { Object.Destroy((Object)(object)currentPreviewObject); } if ((Object)(object)renderTexture != (Object)null) { renderTexture.Release(); Object.Destroy((Object)(object)renderTexture); } if ((Object)(object)previewStage != (Object)null) { Object.Destroy((Object)(object)previewStage); } } private void SetupRenderersForPreview(GameObject obj) { SetupRenderersRecursive(obj.transform, 23); } private void SetupRenderersRecursive(Transform t, int layer) { //IL_0040: Unknown result type (might be due to invalid IL or missing references) //IL_0046: Expected O, but got Unknown ((Component)t).gameObject.layer = layer; Renderer component = ((Component)t).GetComponent<Renderer>(); if ((Object)(object)component != (Object)null) { component.renderingLayerMask = uint.MaxValue; component.enabled = true; component.shadowCastingMode = (ShadowCastingMode)1; } foreach (Transform item in t) { Transform t2 = item; SetupRenderersRecursive(t2, layer); } } private void SetLayerRecursively(GameObject obj, int layer) { //IL_001b: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Expected O, but got Unknown obj.layer = layer; foreach (Transform item in obj.transform) { Transform val = item; SetLayerRecursively(((Component)val).gameObject, layer); } } private Type? GetHDRPType(string typeName) { string text = "UnityEngine.Rendering.HighDefinition." + typeName; string[] array = new string[4] { "Unity.RenderPipelines.HighDefinition.Runtime", "Unity.RenderPipelines.HighDefinition.Runtime.dll", "UnityEngine.Rendering.HighDefinition", "HighDefinition.Runtime" }; foreach (string text2 in array) { try { Type type = Type.GetType(text + ", " + text2); if (type != null) { return type; } } catch { } } Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies(); foreach (Assembly assembly in assemblies) { try { string text3 = assembly.GetName().Name ?? "Unknown"; Type type2 = assembly.GetType(text); if (type2 != null) { return type2; } if (!text3.Contains("Render") && !text3.Contains("HighDefinition") && !text3.Contains("HDRP") && !text3.Contains("Rendering") && !text3.Contains("Unity")) { continue; } try { Type[] types = assembly.GetTypes(); foreach (Type type3 in types) { if (type3.Name == typeName && type3.Namespace != null && type3.Namespace.Contains("HighDefinition")) { return type3; } } } catch (Exception) { } } catch { } } try { Camera main = Camera.main; if ((Object)(object)main != (Object)null) { Component[] components = ((Component)main).GetComponents<Component>(); foreach (Component val in components) { if ((Object)(object)val != (Object)null && ((object)val).GetType().Name == typeName) { return ((object)val).GetType(); } } } } catch { } return null; } private void ConfigureHDRPCamera(Camera cam) { //IL_004a: 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_0053: 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)(object)cam == (Object)null) { return; } try { Component component = ((Component)cam).GetComponent("HDAdditionalCameraData"); if ((Object)(object)component == (Object)null) { return; } Type type = ((object)component).GetType(); PropertyInfo property = type.GetProperty("volumeLayerMask"); if (property != null && property.CanWrite) { LayerMask val = LayerMask.op_Implicit(0); property.SetValue(component, val, null); } PropertyInfo property2 = type.GetProperty("clearColorMode"); if (property2 != null && property2.CanWrite) { Type propertyType = property2.PropertyType; if (propertyType != null && propertyType.IsEnum) { foreach (object value in Enum.GetValues(propertyType)) { if (value != null && value.ToString() == "Color") { property2.SetValue(component, value, null); break; } } } } PropertyInfo property3 = type.GetProperty("backgroundColorHDR"); if (property3 != null && property3.CanWrite) { Color val2 = default(Color); ((Color)(ref val2))..ctor(0.15f, 0.15f, 0.15f, 1f); property3.SetValue(component, val2, null); } } catch (Exception ex) { StoreValuables.Logger.LogWarning((object)("[ItemPreviewer] HDRP camera configuration failed: " + ex.Message)); } } private bool ConfigureHDRPLight(Light light) { if ((Object)(object)light == (Object)null) { return false; } try { Type hDRPType = GetHDRPType("HDAdditionalLightData"); if (hDRPType == null) { return false; } Component val = ((Component)light).GetComponent(hDRPType); if ((Object)(object)val == (Object)null) { val = ((Component)light).gameObject.AddComponent(hDRPType); } PropertyInfo property = hDRPType.GetProperty("lightUnit"); if (property != null && property.CanWrite) { Type propertyType = property.PropertyType; if (propertyType != null && propertyType.IsEnum) { foreach (object value in Enum.GetValues(propertyType)) { if (value != null && value.ToString() == "Lumens") { property.SetValue(val, value); break; } } } } PropertyInfo property2 = hDRPType.GetProperty("affectDiffuse"); if (property2 != null && property2.CanWrite) { property2.SetValue(val, true); } PropertyInfo property3 = hDRPType.GetProperty("affectSpecular"); if (property3 != null && property3.CanWrite) { property3.SetValue(val, true); } PropertyInfo property4 = hDRPType.GetProperty("shadowResolution"); if (property4 != null && property4.CanWrite) { Type propertyType2 = property4.PropertyType; if (propertyType2 != null && propertyType2.IsEnum) { foreach (object value2 in Enum.GetValues(propertyType2)) { if (value2 != null && (value2.ToString() == "None" || value2.ToString() == "ShadowResolution_None")) { property4.SetValue(val, value2); break; } } } } PropertyInfo property5 = hDRPType.GetProperty("lightlayersMask"); if (property5 != null && property5.CanWrite) { property5.SetValue(val, uint.MaxValue); } light.intensity = 2000f; return true; } catch (Exception ex) { StoreValuables.Logger.LogWarning((object)("[ItemPreviewer] HDRP light configuration failed: " + ex.Message)); return false; } } } [BepInPlugin("Tolga.StoreValuables", "StorableValuables", "1.0.4")] public class StoreValuables : BaseUnityPlugin { internal static StoreValuables Instance { get; private set; } internal static ManualLogSource Logger => Instance._logger; private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger; internal Harmony? Harmony { get; set; } private void Awake() { Instance = this; ((Component)this).gameObject.transform.parent = null; ((Object)((Component)this).gameObject).hideFlags = (HideFlags)61; Config.Initialize(((BaseUnityPlugin)this).Config); Patch(); Logger.LogInfo((object)$"{((BaseUnityPlugin)this).Info.Metadata.GUID} v{((BaseUnityPlugin)this).Info.Metadata.Version} has loaded!"); } internal void Patch() { //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_0020: Expected O, but got Unknown //IL_0025: Expected O, but got Unknown if (Harmony == null) { Harmony val = new Harmony(((BaseUnityPlugin)this).Info.Metadata.GUID); Harmony val2 = val; Harmony = val; } Harmony.PatchAll(); } internal void Unpatch() { Harmony? harmony = Harmony; if (harmony != null) { harmony.UnpatchSelf(); } } } public class ValuableStorageManager { private static ValuableStorageManager? _instance; private readonly Dictionary<int, ValuableObject> _storedValuables = new Dictionary<int, ValuableObject>(); private readonly Dictionary<int, bool> _originalIsKinematic = new Dictionary<int, bool>(); private readonly Dictionary<int, bool> _originalUseGravity = new Dictionary<int, bool>(); public static ValuableStorageManager Instance { get { if (_instance == null) { _instance = new ValuableStorageManager(); } return _instance; } } private void PruneDestroyedEntries() { if (_storedValuables.Count == 0) { return; } List<int> list = null; foreach (KeyValuePair<int, ValuableObject> storedValuable in _storedValuables) { if ((Object)(object)storedValuable.Value == (Object)null) { if (list == null) { list = new List<int>(); } list.Add(storedValuable.Key); } } if (list == null) { return; } foreach (int item in list) { _storedValuables.Remove(item); _originalIsKinematic.Remove(item); _originalUseGravity.Remove(item); } } public bool IsSlotOccupied(int slotIndex) { if (!_storedValuables.TryGetValue(slotIndex, out ValuableObject value)) { return false; } if ((Object)(object)value == (Object)null) { _storedValuables.Remove(slotIndex); _originalIsKinematic.Remove(slotIndex); _originalUseGravity.Remove(slotIndex); return false; } return true; } public ValuableObject? GetStoredValuable(int slotIndex) { if (!_storedValuables.TryGetValue(slotIndex, out ValuableObject value)) { return null; } if ((Object)(object)value == (Object)null) { _storedValuables.Remove(slotIndex); _originalIsKinematic.Remove(slotIndex); _originalUseGravity.Remove(slotIndex); return null; } return value; } public bool StoreValuable(int slotIndex, ValuableObject? valuable) { StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] StoreValuable called for slot {slotIndex}"); if ((Object)(object)valuable == (Object)null) { StoreValuables.Logger.LogError((object)"[ValuableStorageManager] Valuable is null!"); return false; } if (!Config.EnableValuableStorage.Value) { StoreValuables.Logger.LogDebug((object)"[ValuableStorageManager] Valuable storage is disabled"); return false; } if (Config.RequireEmptySlot.Value && IsSlotOccupied(slotIndex)) { StoreValuables.Logger.LogWarning((object)$"[ValuableStorageManager] Slot {slotIndex} is already occupied"); return false; } float weightForValuable = GetWeightForValuable(valuable); StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] Valuable weight: {weightForValuable}"); if (Config.MaxWeightPerSlot.Value > 0f && weightForValuable > Config.MaxWeightPerSlot.Value) { StoreValuables.Logger.LogWarning((object)$"[ValuableStorageManager] Valuable weight {weightForValuable} exceeds max per slot {Config.MaxWeightPerSlot.Value}"); return false; } float totalWeight = GetTotalWeight(); StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] Current total weight: {totalWeight}, new total would be: {totalWeight + weightForValuable}"); if (Config.MaxTotalWeight.Value > 0f && totalWeight + weightForValuable > Config.MaxTotalWeight.Value) { StoreValuables.Logger.LogWarning((object)$"[ValuableStorageManager] Total weight {totalWeight + weightForValuable} would exceed max {Config.MaxTotalWeight.Value}"); return false; } _storedValuables[slotIndex] = valuable; StoreValuables.Logger.LogDebug((object)"[ValuableStorageManager] Valuable added to storage dictionary"); PhysGrabObject physGrabObject = valuable.physGrabObject; if ((Object)(object)physGrabObject != (Object)null && (Object)(object)physGrabObject.rb != (Object)null) { _originalIsKinematic[slotIndex] = physGrabObject.rb.isKinematic; _originalUseGravity[slotIndex] = physGrabObject.rb.useGravity; StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] Saved original physics state - isKinematic: {_originalIsKinematic[slotIndex]}, useGravity: {_originalUseGravity[slotIndex]}"); switch (Config.PhysicsModeOnStore.Value.ToLower()) { case "kinematic": physGrabObject.rb.isKinematic = true; physGrabObject.rb.useGravity = false; StoreValuables.Logger.LogDebug((object)"[ValuableStorageManager] Set physics to kinematic"); break; case "disable": physGrabObject.rb.isKinematic = true; physGrabObject.rb.useGravity = false; StoreValuables.Logger.LogDebug((object)"[ValuableStorageManager] Set physics to disabled"); break; case "keep": StoreValuables.Logger.LogDebug((object)"[ValuableStorageManager] Keeping original physics state"); break; default: if (Config.DebugLogging.Value) { StoreValuables.Logger.LogWarning((object)("[ValuableStorageManager] Unknown PhysicsModeOnStore '" + Config.PhysicsModeOnStore.Value + "', defaulting to Keep.")); } break; } } else { StoreValuables.Logger.LogWarning((object)"[ValuableStorageManager] physGrabObject or rb is null!"); } StoreValuables.Logger.LogInfo((object)$"[ValuableStorageManager] Successfully stored valuable in slot {slotIndex}, weight: {weightForValuable}, total weight: {GetTotalWeight()}"); return true; } public bool RemoveValuable(int slotIndex, bool restorePhysics = true) { StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] RemoveValuable called for slot {slotIndex}, restorePhysics: {restorePhysics}"); if (!_storedValuables.TryGetValue(slotIndex, out ValuableObject value)) { StoreValuables.Logger.LogWarning((object)$"[ValuableStorageManager] No valuable found in slot {slotIndex}"); return false; } StoreValuables.Logger.LogDebug((object)("[ValuableStorageManager] Found valuable: " + ((Object)((Component)value).gameObject).name)); if (restorePhysics) { PhysGrabObject physGrabObject = value.physGrabObject; if ((Object)(object)physGrabObject != (Object)null && (Object)(object)physGrabObject.rb != (Object)null) { if (_originalIsKinematic.TryGetValue(slotIndex, out var value2)) { physGrabObject.rb.isKinematic = value2; StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] Restored isKinematic to: {value2}"); } if (_originalUseGravity.TryGetValue(slotIndex, out var value3)) { physGrabObject.rb.useGravity = value3; StoreValuables.Logger.LogDebug((object)$"[ValuableStorageManager] Restored useGravity to: {value3}"); } } else { StoreValuables.Logger.LogWarning((object)"[ValuableStorageManager] physGrabObject or rb is null, cannot restore physics"); } } _storedValuables.Remove(slotIndex); _originalIsKinematic.Remove(slotIndex); _originalUseGravity.Remove(slotIndex); StoreValuables.Logger.LogInfo((object)$"[ValuableStorageManager] Removed valuable from slot {slotIndex}"); return true; } public float GetTotalWeight() { PruneDestroyedEntries(); float num = 0f; foreach (ValuableObject value in _storedValuables.Values) { num += GetWeightForValuable(value); } return num; } public float GetWeightForSlot(int slotIndex) { if (!_storedValuables.TryGetValue(slotIndex, out ValuableObject value)) { return 0f; } return GetWeightForValuable(value); } private static float GetWeightForValuable(ValuableObject? valuable) { if ((Object)(object)valuable == (Object)null) { return 0f; } try { if ((Object)(object)((Component)valuable).GetComponentInParent<MapObject>() != (Object)null) { return 0f; } } catch { } return valuable.physAttributePreset?.mass ?? 0f; } public Dictionary<int, ValuableObject> GetAllStoredValuables() { PruneDestroyedEntries(); Dictionary<int, ValuableObject> dictionary = new Dictionary<int, ValuableObject>(); foreach (KeyValuePair<int, ValuableObject> storedValuable in _storedValuables) { if (!((Object)(object)storedValuable.Value == (Object)null)) { dictionary[storedValuable.Key] = storedValuable.Value; } } return dictionary; } public void ClearAll() { foreach (int item in new List<int>(_storedValuables.Keys)) { RemoveValuable(item); } } public int GetStoredCount() { return _storedValuables.Count; } } internal static class ModVersion { public const string Version = "1.0.4"; } } namespace StoreValuables.Patches { [HarmonyPatch(typeof(InventorySpot))] internal static class InventorySpotPatch { [CompilerGenerated] private sealed class <DisableIconAfterUpdate>d__17 : IEnumerator<object>, IEnumerator, IDisposable { private int <>1__state; private object <>2__current; public InventorySpot spot; object IEnumerator<object>.Current { [DebuggerHidden] get { return <>2__current; } } object IEnumerator.Current { [DebuggerHidden] get { return <>2__current; } } [DebuggerHidden] public <DisableIconAfterUpdate>d__17(int <>1__state) { this.<>1__state = <>1__state; } [DebuggerHidden] void IDisposable.Dispose() { <>1__state = -2; } private bool MoveNext() { switch (<>1__state) { default: return false; case 0: <>1__state = -1; <>2__current = null; <>1__state = 1; return true; case 1: <>1__state = -1; <>2__current = null; <>1__state = 2; return true; case 2: { <>1__state = -1; Image[] componentsInChildren = ((Component)spot).GetComponentsInChildren<Image>(true); foreach (Image val in componentsInChildren) { if (((Object)((Component)val).gameObject).name == "Icon" || ((Object)((Component)val).gameObject).name.Contains("Icon")) { _ = ((Behaviour)val).enabled; _ = ((Component)val).gameObject.activeSelf; ((Behaviour)val).enabled = false; ((Component)val).gameObject.SetActive(false); } } SpriteRenderer[] componentsInChildren2 = ((Component)spot).GetComponentsInChildren<SpriteRenderer>(true); foreach (SpriteRenderer val2 in componentsInChildren2) { if (((Object)((Component)val2).gameObject).name == "Icon" || ((Object)((Component)val2).gameObject).name.Contains("Icon")) { _ = ((Renderer)val2).enabled; ((Renderer)val2).enabled = false; ((Component)val2).gameObject.SetActive(false); } } return false; } } } bool IEnumerator.MoveNext() { //ILSpy generated this explicit interface implementation from .override directive in MoveNext return this.MoveNext(); } [DebuggerHidden] void IEnumerator.Reset() { throw new NotSupportedException(); } } private const string OverlayTextObjectName = "StoreValuables_OverlayText"; [HarmonyPrefix] [HarmonyPatch("SetEmoji")] private static bool SetEmoji_Prefix(InventorySpot __instance, Sprite emoji) { if ((Object)(object)ValuableStorageManager.Instance.GetStoredValuable(__instance.inventorySpotIndex) != (Object)null && (Object)(object)__instance.CurrentItem == (Object)null) { if ((Object)(object)__instance.inventoryIcon != (Object)null) { ((Behaviour)__instance.inventoryIcon).enabled = false; if ((Object)(object)((Component)__instance.inventoryIcon).gameObject != (Object)null) { ((Component)__instance.inventoryIcon).gameObject.SetActive(false); } } if ((Object)(object)__instance.noItem != (Object)null) { ((Behaviour)__instance.noItem).enabled = false; } return false; } return true; } [HarmonyPrefix] [HarmonyPatch("HandleInput")] private static bool HandleInput_Prefix(InventorySpot __instance) { StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] HandleInput called for slot {__instance.inventorySpotIndex}"); if (!Config.EnableValuableStorage.Value) { StoreValuables.Logger.LogDebug((object)"[InventorySpotPatch] Valuable storage disabled, continuing with original method"); return true; } if (SemiFunc.RunIsArena()) { StoreValuables.Logger.LogDebug((object)"[InventorySpotPatch] In arena, continuing with original method"); return true; } if ((Object)(object)PlayerController.instance != (Object)null && PlayerController.instance.InputDisableTimer > 0f) { StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Input disabled (timer: {PlayerController.instance.InputDisableTimer}), continuing with original method"); return true; } bool flag = __instance.IsOccupied(); StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Slot {__instance.inventorySpotIndex} IsOccupied: {flag}"); if (flag) { ValuableObject storedValuable = ValuableStorageManager.Instance.GetStoredValuable(__instance.inventorySpotIndex); StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Slot {__instance.inventorySpotIndex} has stored valuable: {(Object)(object)storedValuable != (Object)null}"); if ((Object)(object)storedValuable != (Object)null) { StoreValuables.Logger.LogInfo((object)$"[InventorySpotPatch] Unequipping valuable from slot {__instance.inventorySpotIndex}"); UnequipValuable(__instance.inventorySpotIndex, storedValuable); return false; } StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Slot {__instance.inventorySpotIndex} occupied by regular item, continuing with original method"); return true; } if ((Object)(object)PhysGrabber.instance != (Object)null) { StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] PhysGrabber.instance exists, grabbed: {PhysGrabber.instance.grabbed}"); if (PhysGrabber.instance.grabbed) { PhysGrabObject grabbedPhysGrabObject = PhysGrabber.instance.grabbedPhysGrabObject; StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Grabbed object: {(Object)(object)grabbedPhysGrabObject != (Object)null}"); if ((Object)(object)grabbedPhysGrabObject != (Object)null) { ValuableObject component = ((Component)grabbedPhysGrabObject).GetComponent<ValuableObject>(); StoreValuables.Logger.LogDebug((object)$"[InventorySpotPatch] Grabbed object has ValuableObject: {(Object)(object)component != (Object)null}"); if ((Object)(object)component != (Object)null) { StoreValuables.Logger.LogInfo((object)$"[InventorySpotPatch] Attempting to store valuable in slot {__instance.inventorySpotIndex}"); if (StoreValuable(__instance.inventorySpotIndex, component)) { StoreValuables.Logger.LogInfo((object)"[InventorySpotPatch] Successfully stored valuable, releasing grab"); PhysGrabber.instance.ReleaseObject(-1, 0.1f); return false; } StoreValuables.Logger.LogWarning((object)$"[InventorySpotPatch] Failed to store valuable in slot {__instance.inventorySpotIndex}"); } } } } else { StoreValuables.Logger.LogDebug((object)"[InventorySpotPatch] PhysGrabber.instance is null"); } StoreValuables.Logger.LogDebug((object)"[InventorySpotPatch] No valuable to store, continuing with original method"); return true; } private static bool StoreValuable(int slotIndex, ValuableObject valuable) { StoreValuables.Logger.LogDebug((object)$"[StoreValuable] Starting storage process for slot {slotIndex}"); if ((Object)(object)valuable == (Object)null) { StoreValuables.Logger.LogError((object)"[StoreValuable] Valuable is null!"); return false; } StoreValuables.Logger.LogDebug((object)$"[StoreValuable] Valuable name: {((Object)((Component)valuable).gameObject).name}, value: {valuable.dollarValueCurrent}"); if (ValuableStorageManager.Instance.StoreValuable(slotIndex, valuable)) { StoreValuables.Logger.LogInfo((object)$"[StoreValuable] Successfully stored valuable in slot {slotIndex}, hiding GameObject"); ExtractionHaulSync.RemoveFromHaulList(valuable, "StoreValuable"); ((Component)valuable).gameObject.SetActive(false); StoreValuables.Logger.LogDebug((object)"[StoreValuable] GameObject.SetActive(false) called"); Inventory instance = Inventory.instance; InventorySpot val = ((instance != null) ? instance.GetSpotByIndex(slotIndex) : null); if ((Object)(object)val != (Object)null) { StoreValuables.Logger.LogDebug((object)$"[StoreValuable] Updating inventory UI for slot {slotIndex}"); val.UpdateUI(); } else { StoreValuables.Logger.LogWarning((object)"[StoreValuable] Inventory.instance or GetSpotByIndex returned null"); } return true; } StoreValuables.Logger.LogWarning((object)"[StoreValuable] ValuableStorageManager.StoreValuable returned false"); return false; } private static void UnequipValuable(int slotIndex, ValuableObject valuable) { //IL_0062: 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_01c3: Unknown result type (might be due to invalid IL or missing references) //IL_01ce: 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) //IL_01d9: Unknown result type (might be due to invalid IL or missing references) //IL_01de: Unknown result type (might be due to invalid IL or missing references) //IL_00c7: Unknown result type (might be due to invalid IL or missing references) //IL_00db: Unknown result type (might be due to invalid IL or missing references) //IL_00ef: 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_0131: Unknown result type (might be due to invalid IL or missing references) //IL_01e9: Unknown result type (might be due to invalid IL or missing references) //IL_0172: 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_0187: Unknown result type (might be due to invalid IL or missing references) //IL_018c: Unknown result type (might be due to invalid IL or missing references) //IL_0191: Unknown result type (might be due to invalid IL or missing references) //IL_019c: Unknown result type (might be due to invalid IL or missing references) //IL_0146: 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) //IL_0156: Unknown result type (might be due to invalid IL or missing references) //IL_0292: Unknown result type (might be due to invalid IL or missing references) //IL_0293: 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) //IL_02ce: Unknown result type (might be due to invalid IL or missing references) //IL_02d8: Unknown result type (might be due to invalid IL or missing references) //IL_02dd: Unknown result type (might be due to invalid IL or missing references) //IL_02e2: Unknown result type (might be due to invalid IL or missing references) //IL_02ee: Unknown result type (might be due to invalid IL or missing references) //IL_0301: Unknown result type (might be due to invalid IL or missing references) //IL_0303: Unknown result type (might be due to invalid IL or missing references) //IL_0298: Unknown result type (might be due to invalid IL or missing references) //IL_029c: Unknown result type (might be due to invalid IL or missing references) //IL_02a6: Unknown result type (might be due to invalid IL or missing references) //IL_02ab: Unknown result type (might be due to invalid IL or missing references) //IL_02b0: Unknown result t