Decompiled source of SuitLockerWardrobe v1.0.0

BepInEx/plugins/SuitLockerWardrobe/SuitLockerWardrobe.dll

Decompiled 21 hours ago
using 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;
			}
		}
	}
}