Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of SuitLockerWardrobe v1.0.0
BepInEx/plugins/SuitLockerWardrobe/SuitLockerWardrobe.dll
Decompiled 21 hours agousing System; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using BepInEx; using BepInEx.Bootstrap; using BepInEx.Configuration; using BepInEx.Logging; using GameNetcodeStuff; using UnityEngine; using UnityEngine.Events; using UnityEngine.Rendering.HighDefinition; using UnityEngine.SceneManagement; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyVersion("0.0.0.0")] namespace SuitLockerWardrobe; [BepInPlugin("clair.suitlockerwardrobe", "SuitLocker Wardrobe", "1.0.0")] [BepInDependency("dev.davesco.SuitWardrobeSimple", "0.3.0")] [BepInIncompatibility("clair.suitlocker")] public sealed class SuitLockerWardrobePlugin : BaseUnityPlugin { public const string Id = "clair.suitlockerwardrobe"; public const string WardrobeId = "dev.davesco.SuitWardrobeSimple"; private ConfigEntry<float> HoldSeconds; private ConfigEntry<float> RotationOffset; private ConfigEntry<float> Size; private ConfigEntry<float> MountBelowAnchor; private ConfigEntry<Vector3> PositionOffset; private AssetBundle bundle; private GameObject lockerPrefab; private GameObject Locker; private InteractTrigger lockerTrigger; private InteractTrigger lastWardrobeTrigger; private FieldInfo wardrobeTriggerField; private float nextScan; private bool loggedRack; private readonly Dictionary<Renderer, bool> hiddenRackRenderers = new Dictionary<Renderer, bool>(); private readonly Dictionary<Collider, bool> hiddenRackColliders = new Dictionary<Collider, bool>(); private readonly Dictionary<GameObject, bool> hiddenRackObjects = new Dictionary<GameObject, bool>(); private readonly Dictionary<Collider, bool> wardrobeColliders = new Dictionary<Collider, bool>(); private static PlayerControllerB LocalPlayer => Object.op_Implicit((Object)(object)GameNetworkManager.Instance) ? GameNetworkManager.Instance.localPlayerController : null; private InteractTrigger WardrobeTrigger { get { object? obj = wardrobeTriggerField?.GetValue(null); return (InteractTrigger)((obj is InteractTrigger) ? obj : null); } } private void Awake() { //IL_0030: Unknown result type (might be due to invalid IL or missing references) //IL_003a: Expected O, but got Unknown //IL_0050: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c2: Expected O, but got Unknown //IL_00f6: Unknown result type (might be due to invalid IL or missing references) //IL_0100: Expected O, but got Unknown //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_022f: Unknown result type (might be due to invalid IL or missing references) HoldSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("Interaction", "HoldSeconds", 0.7f, new ConfigDescription("Seconds to hold the game's interact control.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.2f, 3f), Array.Empty<object>())); PositionOffset = ((BaseUnityPlugin)this).Config.Bind<Vector3>("Placement", "PositionOffset", Vector3.zero, "Optional adjustment in locker-local meters for custom ship interiors."); RotationOffset = ((BaseUnityPlugin)this).Config.Bind<float>("Placement", "RotationOffset", 0f, "Extra locker rotation in degrees."); Size = ((BaseUnityPlugin)this).Config.Bind<float>("Placement", "LockerScale", 1.2f, new ConfigDescription("Locker size multiplier.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.5f, 1.5f), Array.Empty<object>())); MountBelowAnchor = ((BaseUnityPlugin)this).Config.Bind<float>("Placement", "MountBelowAnchor", 0.9f, new ConfigDescription("Locker center distance below the rack anchor.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0.2f, 1.8f), Array.Empty<object>())); Assembly assembly = ((object)Chainloader.PluginInfos["dev.davesco.SuitWardrobeSimple"].Instance).GetType().Assembly; wardrobeTriggerField = assembly.GetType("SuitWardrobeSimple.RackTrigger", throwOnError: false)?.GetField("_trigger", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic); if (wardrobeTriggerField == null || wardrobeTriggerField.FieldType != typeof(InteractTrigger)) { throw new InvalidOperationException("This version of SuitWardrobeSimple has an unsupported interaction interface. SuitLocker Wardrobe supports version 0.3.0."); } bundle = AssetBundle.LoadFromFile(Path.Combine(Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location), "suitlockerwardrobeassets")); if (!Object.op_Implicit((Object)(object)bundle) || !Object.op_Implicit((Object)(object)(lockerPrefab = bundle.LoadAsset<GameObject>("Assets/Locker/SuitLocker.prefab")))) { throw new InvalidOperationException("Place suitlockerwardrobeassets beside SuitLockerWardrobe.dll."); } MeshFilter component = lockerPrefab.GetComponent<MeshFilter>(); if (Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.sharedMesh) && lockerPrefab.transform.childCount == 0) { Bounds bounds = component.sharedMesh.bounds; if (!(Mathf.Abs(((Bounds)(ref bounds)).size.y - 1.95f) > 0.001f)) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"SuitLocker Wardrobe loaded. Hold interaction forwards to SuitWardrobeSimple's own handler."); return; } } throw new InvalidOperationException("SuitLocker Wardrobe requires the included baked mesh bundle."); } private void Update() { //IL_0098: 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) MirrorWardrobe(); if (Time.unscaledTime < nextScan) { return; } nextScan = Time.unscaledTime + 0.5f; StartOfRound instance = StartOfRound.Instance; if (!Object.op_Implicit((Object)(object)instance) || !Object.op_Implicit((Object)(object)instance.rightmostSuitPosition) || !Object.op_Implicit((Object)(object)instance.elevatorTransform) || !Object.op_Implicit((Object)(object)WardrobeTrigger)) { return; } UnlockableSuit[] array = Object.FindObjectsOfType<UnlockableSuit>(true); foreach (UnlockableSuit val in array) { Scene scene = ((Component)val).gameObject.scene; if (((Scene)(ref scene)).IsValid()) { HiddenSuit hiddenSuit = ((Component)val).GetComponent<HiddenSuit>(); if (!Object.op_Implicit((Object)(object)hiddenSuit)) { hiddenSuit = ((Component)val).gameObject.AddComponent<HiddenSuit>(); } hiddenSuit.Enforce(); } } if (!Object.op_Implicit((Object)(object)Locker)) { CreateLocker(instance); } HideOriginalRack(instance); } private void MirrorWardrobe() { InteractTrigger wardrobeTrigger = WardrobeTrigger; if (!Object.op_Implicit((Object)(object)wardrobeTrigger)) { if (Object.op_Implicit((Object)(object)lockerTrigger)) { lockerTrigger.interactable = false; lockerTrigger.disabledHoverTip = "Waiting for wardrobe..."; } return; } if ((Object)(object)wardrobeTrigger != (Object)(object)lastWardrobeTrigger) { lastWardrobeTrigger = wardrobeTrigger; ((BaseUnityPlugin)this).Logger.LogInfo((object)"Connected to SuitWardrobeSimple's original interaction handler."); } Collider[] componentsInChildren = ((Component)wardrobeTrigger).GetComponentsInChildren<Collider>(true); foreach (Collider val in componentsInChildren) { if (!wardrobeColliders.ContainsKey(val)) { wardrobeColliders[val] = val.enabled; } val.enabled = false; } if (Object.op_Implicit((Object)(object)lockerTrigger)) { lockerTrigger.interactable = ((Component)wardrobeTrigger).gameObject.activeInHierarchy && wardrobeTrigger.interactable; lockerTrigger.disabledHoverTip = wardrobeTrigger.disabledHoverTip; lockerTrigger.hoverIcon = wardrobeTrigger.hoverIcon; lockerTrigger.disabledHoverIcon = wardrobeTrigger.disabledHoverIcon; } } private void OpenWardrobe(PlayerControllerB player) { //IL_0038: Unknown result type (might be due to invalid IL or missing references) //IL_0048: Unknown result type (might be due to invalid IL or missing references) //IL_0058: Unknown result type (might be due to invalid IL or missing references) //IL_005d: Unknown result type (might be due to invalid IL or missing references) InteractTrigger wardrobeTrigger = WardrobeTrigger; if (Object.op_Implicit((Object)(object)player) && !((Object)(object)player != (Object)(object)LocalPlayer) && !player.isPlayerDead && Object.op_Implicit((Object)(object)Locker) && !(Vector3.Distance(((Component)player).transform.position, Locker.transform.position + Locker.transform.up) > 4.5f) && Object.op_Implicit((Object)(object)wardrobeTrigger) && ((Component)wardrobeTrigger).gameObject.activeInHierarchy && wardrobeTrigger.interactable) { wardrobeTrigger.Interact(((Component)player).transform); } } private void HideOriginalRack(StartOfRound round) { //IL_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0068: Unknown result type (might be due to invalid IL or missing references) //IL_006c: 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) Renderer[] array = Object.FindObjectsOfType<Renderer>(true); foreach (Renderer val in array) { if (Object.op_Implicit((Object)(object)Locker) && ((Component)val).transform.IsChildOf(Locker.transform)) { continue; } float num = Vector3.Distance(((Component)val).transform.position, round.rightmostSuitPosition.position); Bounds bounds = val.bounds; if (Vector3.Distance(((Bounds)(ref bounds)).center, round.rightmostSuitPosition.position) > 5f && num > 4f) { continue; } Transform val2 = null; if (((Component)val).transform.IsChildOf(round.elevatorTransform) && ((((Object)val).name == "NurbsPath.002" && num < 4f) || (((Object)val).name == "NurbsPath.004" && num < 0.6f))) { val2 = ((Component)val).transform; if (!hiddenRackObjects.ContainsKey(((Component)val).gameObject)) { hiddenRackObjects[((Component)val).gameObject] = ((Component)val).gameObject.activeSelf; } } Transform val3 = ((Component)val).transform; while (Object.op_Implicit((Object)(object)val3) && (Object)(object)val3 != (Object)(object)round.elevatorTransform) { string text = ((Object)val3).name.Replace(" ", "").Replace("_", "").ToLowerInvariant(); if (text.Contains("suitrack") || text.Contains("clothingrack") || text.Contains("clothesrack")) { val2 = val3; break; } val3 = val3.parent; } if (!Object.op_Implicit((Object)(object)val2)) { Material[] sharedMaterials = val.sharedMaterials; if (sharedMaterials.Length != 0 && sharedMaterials.All(IsRackMaterial)) { val2 = ((Component)val).transform; } MeshFilter component = ((Component)val).GetComponent<MeshFilter>(); if (!Object.op_Implicit((Object)(object)val2) && Object.op_Implicit((Object)(object)component) && Object.op_Implicit((Object)(object)component.sharedMesh)) { string text2 = ((Object)component.sharedMesh).name.Replace(" ", "").Replace("_", "").ToLowerInvariant(); if (text2.Contains("clothesrack") || text2.Contains("clothingrack") || text2.Contains("suitrack")) { val2 = ((Component)val).transform; } } } if (!Object.op_Implicit((Object)(object)val2)) { continue; } if (!hiddenRackRenderers.ContainsKey(val)) { hiddenRackRenderers[val] = val.enabled; } val.enabled = false; Collider[] componentsInChildren = ((Component)val2).GetComponentsInChildren<Collider>(true); foreach (Collider val4 in componentsInChildren) { if (!hiddenRackColliders.ContainsKey(val4)) { hiddenRackColliders[val4] = val4.enabled; } val4.enabled = false; } if (!loggedRack) { ((BaseUnityPlugin)this).Logger.LogInfo((object)("Replaced rack mesh: " + ((Object)val).name)); loggedRack = true; } } } private static bool IsRackMaterial(Material material) { if (!Object.op_Implicit((Object)(object)material)) { return false; } string text = ((Object)material).name.Replace(" ", "").Replace("_", "").ToLowerInvariant(); if (text.Contains("clothesrack") || text.Contains("clothingrack") || text.Contains("suitrack")) { return true; } string[] array = new string[2] { "_BaseColorMap", "_MainTex" }; foreach (string text2 in array) { Texture val = (material.HasProperty(text2) ? material.GetTexture(text2) : null); if (Object.op_Implicit((Object)(object)val)) { text = ((Object)val).name.Replace(" ", "").Replace("_", "").ToLowerInvariant(); if (text.Contains("clothesrack") || text.Contains("clothingrack") || text.Contains("suitrack")) { return true; } } } return false; } private void LateUpdate() { MirrorWardrobe(); foreach (KeyValuePair<Renderer, bool> hiddenRackRenderer in hiddenRackRenderers) { if (Object.op_Implicit((Object)(object)hiddenRackRenderer.Key)) { hiddenRackRenderer.Key.enabled = false; } } foreach (KeyValuePair<Collider, bool> hiddenRackCollider in hiddenRackColliders) { if (Object.op_Implicit((Object)(object)hiddenRackCollider.Key)) { hiddenRackCollider.Key.enabled = false; } } } private unsafe void CreateLocker(StartOfRound round) { //IL_0016: Unknown result type (might be due to invalid IL or missing references) //IL_001c: Unknown result type (might be due to invalid IL or missing references) //IL_0021: Unknown result type (might be due to invalid IL or missing references) //IL_0026: Unknown result type (might be due to invalid IL or missing references) //IL_002a: 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_004c: Unknown result type (might be due to invalid IL or missing references) //IL_0051: Unknown result type (might be due to invalid IL or missing references) //IL_0052: Unknown result type (might be due to invalid IL or missing references) //IL_0057: Unknown result type (might be due to invalid IL or missing references) //IL_005b: Unknown result type (might be due to invalid IL or missing references) //IL_0060: Unknown result type (might be due to invalid IL or missing references) //IL_0063: Unknown result type (might be due to invalid IL or missing references) //IL_0069: Unknown result type (might be due to invalid IL or missing references) //IL_006e: Unknown result type (might be due to invalid IL or missing references) //IL_0073: Unknown result type (might be due to invalid IL or missing references) //IL_0045: Unknown result type (might be due to invalid IL or missing references) //IL_004a: Unknown result type (might be due to invalid IL or missing references) //IL_0091: Unknown result type (might be due to invalid IL or missing references) //IL_0096: Unknown result type (might be due to invalid IL or missing references) //IL_009c: Unknown result type (might be due to invalid IL or missing references) //IL_00a1: Unknown result type (might be due to invalid IL or missing references) //IL_00a6: Unknown result type (might be due to invalid IL or missing references) //IL_00ad: Unknown result type (might be due to invalid IL or missing references) //IL_00b2: Unknown result type (might be due to invalid IL or missing references) //IL_00b8: Unknown result type (might be due to invalid IL or missing references) //IL_00c8: 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) //IL_00d2: 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_00e9: Unknown result type (might be due to invalid IL or missing references) //IL_00ed: Unknown result type (might be due to invalid IL or missing references) //IL_0113: Unknown result type (might be due to invalid IL or missing references) //IL_0118: Unknown result type (might be due to invalid IL or missing references) //IL_011a: 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_0123: 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_0087: 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_008e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: 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_0159: 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_0177: Unknown result type (might be due to invalid IL or missing references) //IL_017c: Unknown result type (might be due to invalid IL or missing references) //IL_017f: 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_0183: Unknown result type (might be due to invalid IL or missing references) //IL_020b: Unknown result type (might be due to invalid IL or missing references) //IL_020d: 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_01ae: 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_022a: Unknown result type (might be due to invalid IL or missing references) //IL_022f: Unknown result type (might be due to invalid IL or missing references) //IL_0234: Unknown result type (might be due to invalid IL or missing references) //IL_0236: Unknown result type (might be due to invalid IL or missing references) //IL_0239: 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_025a: Unknown result type (might be due to invalid IL or missing references) //IL_025f: Unknown result type (might be due to invalid IL or missing references) //IL_0261: Unknown result type (might be due to invalid IL or missing references) //IL_0264: Unknown result type (might be due to invalid IL or missing references) //IL_0269: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Unknown result type (might be due to invalid IL or missing references) //IL_0288: Unknown result type (might be due to invalid IL or missing references) //IL_028d: Unknown result type (might be due to invalid IL or missing references) //IL_0296: 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_02a0: Unknown result type (might be due to invalid IL or missing references) //IL_02a5: Unknown result type (might be due to invalid IL or missing references) //IL_02aa: Unknown result type (might be due to invalid IL or missing references) //IL_02af: 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_02e8: Unknown result type (might be due to invalid IL or missing references) //IL_03b0: Unknown result type (might be due to invalid IL or missing references) //IL_03b5: Unknown result type (might be due to invalid IL or missing references) //IL_03c3: Expected O, but got Unknown //IL_03ca: Unknown result type (might be due to invalid IL or missing references) //IL_0583: Unknown result type (might be due to invalid IL or missing references) //IL_059f: Unknown result type (might be due to invalid IL or missing references) //IL_05af: Unknown result type (might be due to invalid IL or missing references) //IL_05b6: Expected O, but got Unknown //IL_0609: Unknown result type (might be due to invalid IL or missing references) //IL_0625: Unknown result type (might be due to invalid IL or missing references) //IL_06d5: Unknown result type (might be due to invalid IL or missing references) //IL_06df: Expected O, but got Unknown //IL_06e5: Unknown result type (might be due to invalid IL or missing references) //IL_06ef: Expected O, but got Unknown //IL_06f5: Unknown result type (might be due to invalid IL or missing references) //IL_06ff: Expected O, but got Unknown //IL_0705: Unknown result type (might be due to invalid IL or missing references) //IL_070f: Expected O, but got Unknown //IL_0715: Unknown result type (might be due to invalid IL or missing references) //IL_071f: Expected O, but got Unknown //IL_0725: Unknown result type (might be due to invalid IL or missing references) //IL_072f: Expected O, but got Unknown //IL_07b1: Unknown result type (might be due to invalid IL or missing references) //IL_07b6: Unknown result type (might be due to invalid IL or missing references) //IL_07bb: Unknown result type (might be due to invalid IL or missing references) //IL_07d6: Unknown result type (might be due to invalid IL or missing references) //IL_07d8: Unknown result type (might be due to invalid IL or missing references) //IL_07dd: Unknown result type (might be due to invalid IL or missing references) //IL_0533: Unknown result type (might be due to invalid IL or missing references) //IL_0538: Unknown result type (might be due to invalid IL or missing references) Transform rightmostSuitPosition = round.rightmostSuitPosition; Transform elevatorTransform = round.elevatorTransform; Vector3 val = Vector3.ProjectOnPlane(rightmostSuitPosition.forward, elevatorTransform.up); Vector3 val2 = ((Vector3)(ref val)).normalized; if (((Vector3)(ref val2)).sqrMagnitude < 0.1f) { val2 = elevatorTransform.forward; } val = Vector3.Cross(elevatorTransform.up, val2); Vector3 val3 = ((Vector3)(ref val)).normalized; if (Vector3.Dot(elevatorTransform.position - rightmostSuitPosition.position, val3) < 0f) { val3 = -val3; } Vector3 val4 = rightmostSuitPosition.position + val2 * 0.45f + val3 * 0.55f - elevatorTransform.up * MountBelowAnchor.Value; Bounds bounds = lockerPrefab.GetComponent<MeshFilter>().sharedMesh.bounds; float num = ((Bounds)(ref bounds)).extents.z * Size.Value + 0.015f; float num2 = float.PositiveInfinity; val = Vector3.Cross(elevatorTransform.up, val3); Vector3 normalized = ((Vector3)(ref val)).normalized; float[] array = new float[3] { -0.45f, 0f, 0.45f }; foreach (float num3 in array) { Vector3 val5 = val4 + normalized * (((Bounds)(ref bounds)).size.x * Size.Value * num3); RaycastHit[] array2 = Physics.RaycastAll(val5, -val3, 3f, round.collidersAndRoomMaskAndDefault, (QueryTriggerInteraction)1); for (int j = 0; j < array2.Length; j++) { RaycastHit val6 = array2[j]; if (!(Vector3.Dot(((RaycastHit)(ref val6)).normal, val3) < 0.5f) && !(((RaycastHit)(ref val6)).distance < 0.02f)) { num2 = Mathf.Min(num2, ((RaycastHit)(ref val6)).distance); } } } val4 -= val3 * ((float.IsPositiveInfinity(num2) ? 0.7f : (num2 - num)) + 0.35f); Vector3 val7 = val4 - elevatorTransform.up * (1.95f * Size.Value * 0.5f); Quaternion val8 = Quaternion.LookRotation(val3, elevatorTransform.up) * Quaternion.Euler(0f, RotationOffset.Value, 0f); Locker = Object.Instantiate<GameObject>(lockerPrefab, val7 + val8 * PositionOffset.Value, val8, elevatorTransform); ((Object)Locker).name = "SuitLockerWardrobe"; Locker.transform.localScale = Vector3.one * Size.Value; Material val9 = (from item in round.unlockablesList.unlockables where item != null && Object.op_Implicit((Object)(object)item.suitMaterial) select item.suitMaterial).FirstOrDefault((Func<Material, bool>)((Material material) => material.HasProperty("_BaseColorMap"))); if (!Object.op_Implicit((Object)(object)val9)) { throw new InvalidOperationException("No configured game material available for SuitLocker."); } Renderer[] componentsInChildren = Locker.GetComponentsInChildren<Renderer>(); foreach (Renderer val10 in componentsInChildren) { Material sharedMaterial = val10.sharedMaterial; Material val11 = new Material(val9) { name = "SuitLockerWardrobeMetal" }; val11.SetColor("_BaseColor", Color.white); val11.SetTexture("_BaseColorMap", sharedMaterial.mainTexture); val11.SetFloat("_Smoothness", 0.18f); string[] array3 = new string[3] { "_NormalMap", "_MaskMap", "_EmissiveColorMap" }; foreach (string text in array3) { if (val11.HasProperty(text)) { val11.SetTexture(text, (Texture)null); } } string[] array4 = new string[4] { "_NORMALMAP", "_MASKMAP", "_EMISSIVE_COLOR_MAP", "_ALPHATEST_ON" }; foreach (string text2 in array4) { val11.DisableKeyword(text2); } if (val11.HasProperty("_AlphaCutoffEnable")) { val11.SetFloat("_AlphaCutoffEnable", 0f); } HDMaterial.ValidateMaterial(val11); val10.sharedMaterial = val11; val10.enabled = true; val10.forceRenderingOff = false; val10.renderingLayerMask = 257u; ((BaseUnityPlugin)this).Logger.LogInfo((object)("Locker renderer: " + ((Object)val10).name + "; shader " + ((Object)val11.shader).name + "; bounds " + ((object)val10.bounds/*cast due to .constrained prefix*/).ToString())); } BoxCollider val12 = Locker.AddComponent<BoxCollider>(); val12.center = new Vector3(0f, 0.975f, 0f); val12.size = new Vector3(1.2f, 1.95f, 0.5f); GameObject val13 = new GameObject("SuitLockerInteraction"); val13.transform.SetParent(Locker.transform, false); val13.layer = 9; val13.tag = "InteractTrigger"; BoxCollider val14 = val13.AddComponent<BoxCollider>(); ((Collider)val14).isTrigger = true; val14.center = new Vector3(0f, 1.05f, 0.31f); val14.size = new Vector3(1.24f, 1.8f, 0.25f); InteractTrigger trigger = val13.AddComponent<InteractTrigger>(); trigger.hoverTip = "Open wardrobe : [E]"; trigger.holdTip = "Opening wardrobe"; trigger.holdInteraction = true; trigger.timeToHold = HoldSeconds.Value; trigger.timeToHoldSpeedMultiplier = 1f; trigger.interactCooldown = true; trigger.cooldownTime = 0.5f; trigger.disableTriggerMesh = false; trigger.oneHandedItemAllowed = true; trigger.twoHandedItemAllowed = true; trigger.onInteract = new InteractEvent(); trigger.onInteractEarly = new InteractEvent(); trigger.onInteractEarlyOtherClients = new InteractEvent(); trigger.onStopInteract = new InteractEvent(); trigger.onCancelAnimation = new InteractEvent(); trigger.holdingInteractEvent = new InteractEventFloat(); lockerTrigger = trigger; ((UnityEvent<PlayerControllerB>)(object)trigger.onInteract).AddListener((UnityAction<PlayerControllerB>)OpenWardrobe); InteractTrigger val15 = ((IEnumerable<InteractTrigger>)Object.FindObjectsOfType<InteractTrigger>()).FirstOrDefault((Func<InteractTrigger, bool>)((InteractTrigger t) => (Object)(object)t != (Object)(object)trigger && Object.op_Implicit((Object)(object)t.hoverIcon))); if (Object.op_Implicit((Object)(object)val15)) { trigger.hoverIcon = val15.hoverIcon; } ManualLogSource logger = ((BaseUnityPlugin)this).Logger; string[] obj = new string[6] { "SuitLocker Wardrobe 1.0.0 wall-mounted at ", null, null, null, null, null }; val = elevatorTransform.InverseTransformPoint(Locker.transform.position); obj[1] = ((object)(*(Vector3*)(&val))/*cast due to .constrained prefix*/).ToString(); obj[2] = "; center "; val = elevatorTransform.InverseTransformPoint(val4); obj[3] = ((object)(*(Vector3*)(&val))/*cast due to .constrained prefix*/).ToString(); obj[4] = "; scale "; obj[5] = Size.Value.ToString(); logger.LogInfo((object)string.Concat(obj)); } private void OnDestroy() { if (Object.op_Implicit((Object)(object)Locker)) { Object.Destroy((Object)(object)Locker); } HiddenSuit[] array = Object.FindObjectsOfType<HiddenSuit>(true); foreach (HiddenSuit hiddenSuit in array) { Object.Destroy((Object)(object)hiddenSuit); } foreach (KeyValuePair<Renderer, bool> hiddenRackRenderer in hiddenRackRenderers) { if (Object.op_Implicit((Object)(object)hiddenRackRenderer.Key)) { hiddenRackRenderer.Key.enabled = hiddenRackRenderer.Value; } } foreach (KeyValuePair<Collider, bool> hiddenRackCollider in hiddenRackColliders) { if (Object.op_Implicit((Object)(object)hiddenRackCollider.Key)) { hiddenRackCollider.Key.enabled = hiddenRackCollider.Value; } } foreach (KeyValuePair<Collider, bool> wardrobeCollider in wardrobeColliders) { if (Object.op_Implicit((Object)(object)wardrobeCollider.Key)) { wardrobeCollider.Key.enabled = wardrobeCollider.Value; } } } } [DefaultExecutionOrder(32000)] public sealed class HiddenSuit : MonoBehaviour { private Renderer[] renderers = Array.Empty<Renderer>(); private Collider[] colliders = Array.Empty<Collider>(); private InteractTrigger[] triggers = Array.Empty<InteractTrigger>(); private readonly Dictionary<Renderer, bool> originalRenderers = new Dictionary<Renderer, bool>(); private readonly Dictionary<Collider, bool> originalColliders = new Dictionary<Collider, bool>(); private readonly Dictionary<InteractTrigger, bool> originalTriggers = new Dictionary<InteractTrigger, bool>(); private float nextRefresh; internal void Enforce() { if (Time.unscaledTime >= nextRefresh) { nextRefresh = Time.unscaledTime + 0.5f; renderers = ((Component)this).GetComponentsInChildren<Renderer>(true); colliders = ((Component)this).GetComponentsInChildren<Collider>(true); triggers = ((Component)this).GetComponentsInChildren<InteractTrigger>(true); Renderer[] array = renderers; foreach (Renderer val in array) { if (!originalRenderers.ContainsKey(val)) { originalRenderers[val] = val.enabled; } } Collider[] array2 = colliders; foreach (Collider val2 in array2) { if (!originalColliders.ContainsKey(val2)) { originalColliders[val2] = val2.enabled; } } InteractTrigger[] array3 = triggers; foreach (InteractTrigger val3 in array3) { if (!originalTriggers.ContainsKey(val3)) { originalTriggers[val3] = val3.interactable; } } } Renderer[] array4 = renderers; foreach (Renderer val4 in array4) { if (Object.op_Implicit((Object)(object)val4)) { val4.enabled = false; } } Collider[] array5 = colliders; foreach (Collider val5 in array5) { if (Object.op_Implicit((Object)(object)val5)) { val5.enabled = false; } } InteractTrigger[] array6 = triggers; foreach (InteractTrigger val6 in array6) { if (Object.op_Implicit((Object)(object)val6)) { val6.interactable = false; } } } private void LateUpdate() { Enforce(); } private void OnEnable() { nextRefresh = 0f; Enforce(); } private void OnDestroy() { foreach (KeyValuePair<Renderer, bool> originalRenderer in originalRenderers) { if (Object.op_Implicit((Object)(object)originalRenderer.Key)) { originalRenderer.Key.enabled = originalRenderer.Value; } } foreach (KeyValuePair<Collider, bool> originalCollider in originalColliders) { if (Object.op_Implicit((Object)(object)originalCollider.Key)) { originalCollider.Key.enabled = originalCollider.Value; } } foreach (KeyValuePair<InteractTrigger, bool> originalTrigger in originalTriggers) { if (Object.op_Implicit((Object)(object)originalTrigger.Key)) { originalTrigger.Key.interactable = originalTrigger.Value; } } } }