Decompiled source of Triforce v1.0.1

BepInEx/plugins/Omniscye-Empress_Triforce/EmpressTriforce.dll

Decompiled 16 hours ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using ExitGames.Client.Photon;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using Photon.Realtime;
using REPOLib.Modules;
using UnityEngine;
using UnityEngine.Networking;
using UnityEngine.Rendering;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Empress")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("EmpressTriforce")]
[assembly: AssemblyTitle("EmpressTriforce")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace Empress.REPO.Triforce
{
	[BepInDependency(/*Could not decode attribute arguments.*/)]
	[BepInPlugin("com.empress.repo.triforce", "Empress Triforce", "1.0.0")]
	public sealed class EmpressTriforcePlugin : BaseUnityPlugin
	{
		public const string PluginGuid = "com.empress.repo.triforce";

		public const string PluginName = "Empress Triforce";

		public const string PluginVersion = "1.0.0";

		public const string ItemName = "Empress Triforce";

		internal const byte TriforceUseEventCode = 187;

		private static bool _photonHooked;

		private static LoadBalancingClient _hookedClient;

		private Harmony _harmony;

		internal static EmpressTriforcePlugin Instance { get; private set; }

		internal static ManualLogSource Log { get; private set; }

		internal static TriforceSettings Settings { get; private set; }

		internal static string PluginDirectory { get; private set; }

		private void Awake()
		{
			//IL_006f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0079: Expected O, but got Unknown
			Instance = this;
			Log = ((BaseUnityPlugin)this).Logger;
			PluginDirectory = Path.GetDirectoryName(((BaseUnityPlugin)this).Info.Location);
			Settings = new TriforceSettings(((BaseUnityPlugin)this).Config);
			((Component)this).gameObject.transform.parent = null;
			((Object)((Component)this).gameObject).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)(object)((Component)this).gameObject);
			TriforceAssets.Load();
			TriforceItemBuilder.RegisterItem();
			_harmony = new Harmony("com.empress.repo.triforce");
			_harmony.PatchAll(typeof(EmpressTriforcePlugin).Assembly);
			TriforceRuntime.EnsureHost();
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Empress Triforce v1.0.0 loaded.");
		}

		private void OnDestroy()
		{
			RemovePhotonHook();
		}

		internal static void EnsurePhotonHooked()
		{
			LoadBalancingClient networkingClient = PhotonNetwork.NetworkingClient;
			if (networkingClient != null && (!_photonHooked || _hookedClient != networkingClient))
			{
				if (_hookedClient != null)
				{
					_hookedClient.EventReceived -= OnPhotonEvent;
				}
				networkingClient.EventReceived -= OnPhotonEvent;
				networkingClient.EventReceived += OnPhotonEvent;
				_hookedClient = networkingClient;
				_photonHooked = true;
			}
		}

		internal static void RemovePhotonHook()
		{
			if (_hookedClient != null)
			{
				_hookedClient.EventReceived -= OnPhotonEvent;
			}
			_hookedClient = null;
			_photonHooked = false;
		}

		private static void OnPhotonEvent(EventData ev)
		{
			if (ev.CustomData is object[] data)
			{
				TriforceRuntime instance = TriforceRuntime.Instance;
				if (!((Object)(object)instance == (Object)null) && ev.Code == 187)
				{
					instance.ReceiveTriforceUse(data);
				}
			}
		}

		internal static void RaiseToAll(byte code, object[] data)
		{
			//IL_0025: Unknown result type (might be due to invalid IL or missing references)
			//IL_002a: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Expected O, but got Unknown
			//IL_0035: Unknown result type (might be due to invalid IL or missing references)
			EnsurePhotonHooked();
			if (!PhotonNetwork.InRoom)
			{
				if (code == 187)
				{
					TriforceRuntime.Instance?.ReceiveTriforceUse(data);
				}
			}
			else
			{
				RaiseEventOptions val = new RaiseEventOptions
				{
					Receivers = (ReceiverGroup)1
				};
				PhotonNetwork.RaiseEvent(code, (object)data, val, SendOptions.SendReliable);
			}
		}
	}
	internal sealed class TriforceSettings
	{
		public readonly ConfigEntry<int> ShopPrice;

		public readonly ConfigEntry<float> PulseTime;

		public readonly ConfigEntry<float> BlastRadius;

		public readonly ConfigEntry<float> BlastForce;

		public readonly ConfigEntry<int> HealAmount;

		public readonly ConfigEntry<float> Volume;

		public readonly ConfigEntry<float> HearingRange;

		public TriforceSettings(ConfigFile config)
		{
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0033: Expected O, but got Unknown
			//IL_0062: Unknown result type (might be due to invalid IL or missing references)
			//IL_006c: Expected O, but got Unknown
			//IL_009b: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Expected O, but got Unknown
			//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
			//IL_00de: Expected O, but got Unknown
			//IL_0107: Unknown result type (might be due to invalid IL or missing references)
			//IL_0111: Expected O, but got Unknown
			//IL_0140: Unknown result type (might be due to invalid IL or missing references)
			//IL_014a: Expected O, but got Unknown
			//IL_0179: Unknown result type (might be due to invalid IL or missing references)
			//IL_0183: Expected O, but got Unknown
			ShopPrice = config.Bind<int>("Triforce", "ShopPrice", 40, new ConfigDescription("In game shop price in thousands. 40 means 40K on the shelf.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(1, 500), Array.Empty<object>()));
			PulseTime = config.Bind<float>("Triforce", "PulseTime", 5f, new ConfigDescription("Seconds into the use sound when the pulse fires.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(2f, 15f), Array.Empty<object>()));
			BlastRadius = config.Bind<float>("Triforce", "BlastRadius", 10f, new ConfigDescription("How far the pulse blasts players and items back.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(3f, 30f), Array.Empty<object>()));
			BlastForce = config.Bind<float>("Triforce", "BlastForce", 12f, new ConfigDescription("How hard the pulse shoves everything.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(2f, 40f), Array.Empty<object>()));
			HealAmount = config.Bind<int>("Triforce", "HealAmount", 100, new ConfigDescription("How much health every player gets at the pulse.", (AcceptableValueBase)(object)new AcceptableValueRange<int>(10, 200), Array.Empty<object>()));
			Volume = config.Bind<float>("Audio", "Volume", 0.8f, new ConfigDescription("Triforce sound volume.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(0f, 1f), Array.Empty<object>()));
			HearingRange = config.Bind<float>("Audio", "HearingRange", 14f, new ConfigDescription("How many meters away players can hear the triforce.", (AcceptableValueBase)(object)new AcceptableValueRange<float>(4f, 40f), Array.Empty<object>()));
		}
	}
	internal static class TriforceAccess
	{
		private static readonly FieldInfo ItemLocalizedNameField = AccessTools.Field(typeof(Item), "itemNameLocalized");

		private static readonly FieldRef<ItemAttributes, string> ItemNameRef = AccessTools.FieldRefAccess<ItemAttributes, string>("itemName");

		private static readonly FieldRef<ItemAttributes, string> InstanceNameRef = AccessTools.FieldRefAccess<ItemAttributes, string>("instanceName");

		private static readonly FieldRef<PlayerController, float> InputDisableTimerRef = AccessTools.FieldRefAccess<PlayerController, float>("InputDisableTimer");

		private static readonly FieldRef<PhysGrabObject, bool> HeldByLocalRef = AccessTools.FieldRefAccess<PhysGrabObject, bool>("heldByLocalPlayer");

		private static readonly FieldRef<PlayerAvatar, bool> IsDisabledRef = AccessTools.FieldRefAccess<PlayerAvatar, bool>("isDisabled");

		private static readonly FieldRef<PlayerAvatar, PlayerHealth> AvatarHealthRef = AccessTools.FieldRefAccess<PlayerAvatar, PlayerHealth>("playerHealth");

		private static readonly FieldRef<RunManager, bool> LevelIsShopRef = AccessTools.FieldRefAccess<RunManager, bool>("levelIsShop");

		internal static bool InputAllowed()
		{
			if ((Object)(object)PlayerController.instance != (Object)null)
			{
				return InputDisableTimerRef.Invoke(PlayerController.instance) <= 0f;
			}
			return false;
		}

		internal static bool InShop()
		{
			if (!SemiFunc.RunIsShop() && !SemiFunc.RunIsLobby())
			{
				if ((Object)(object)RunManager.instance != (Object)null)
				{
					return LevelIsShopRef.Invoke(RunManager.instance);
				}
				return false;
			}
			return true;
		}

		internal static bool HeldByLocal(PhysGrabObject grab)
		{
			if ((Object)(object)grab != (Object)null)
			{
				return HeldByLocalRef.Invoke(grab);
			}
			return false;
		}

		internal static bool IsDisabled(PlayerAvatar avatar)
		{
			if ((Object)(object)avatar != (Object)null)
			{
				return IsDisabledRef.Invoke(avatar);
			}
			return false;
		}

		internal static PlayerHealth Health(PlayerAvatar avatar)
		{
			if (!((Object)(object)avatar != (Object)null))
			{
				return null;
			}
			return AvatarHealthRef.Invoke(avatar);
		}

		internal static PlayerAvatar LocalAvatar()
		{
			if (!((Object)(object)PlayerController.instance != (Object)null))
			{
				return null;
			}
			return PlayerController.instance.playerAvatarScript;
		}

		internal static List<PlayerAvatar> Players()
		{
			if (!((Object)(object)GameDirector.instance != (Object)null) || GameDirector.instance.PlayerList == null)
			{
				return new List<PlayerAvatar>();
			}
			return GameDirector.instance.PlayerList;
		}

		internal static void SetItemName(ItemAttributes attributes, string name)
		{
			if (!((Object)(object)attributes == (Object)null))
			{
				ItemNameRef.Invoke(attributes) = name;
				InstanceNameRef.Invoke(attributes) = name;
			}
		}

		internal static string InstanceName(ItemAttributes attributes)
		{
			if (!((Object)(object)attributes != (Object)null))
			{
				return null;
			}
			return InstanceNameRef.Invoke(attributes);
		}

		internal static void ClearLocalizedName(Item item)
		{
			if ((Object)(object)item != (Object)null)
			{
				ItemLocalizedNameField?.SetValue(item, null);
			}
		}
	}
	internal static class TriforceAssets
	{
		private const string BundleFile = "empresstriforce.empress";

		private const string PrefabName = "EmpressTriforce";

		private static AssetBundle _bundle;

		private static bool _loaded;

		private static readonly Dictionary<string, AudioClip> Clips = new Dictionary<string, AudioClip>(StringComparer.OrdinalIgnoreCase);

		internal static GameObject TriforcePrefab { get; private set; }

		internal static AudioClip Clip(string name)
		{
			Clips.TryGetValue(name, out var value);
			return value;
		}

		internal static void Load()
		{
			if (_loaded)
			{
				return;
			}
			_loaded = true;
			string text = Path.Combine(EmpressTriforcePlugin.PluginDirectory ?? string.Empty, "bundles", "empresstriforce.empress");
			if (File.Exists(text))
			{
				_bundle = AssetBundle.LoadFromFile(text);
				TriforcePrefab = (((Object)(object)_bundle != (Object)null) ? _bundle.LoadAsset<GameObject>("EmpressTriforce") : null);
				if ((Object)(object)TriforcePrefab == (Object)null && (Object)(object)_bundle != (Object)null)
				{
					string text2 = _bundle.GetAllAssetNames().FirstOrDefault((string name) => name.EndsWith(".prefab"));
					if (!string.IsNullOrEmpty(text2))
					{
						TriforcePrefab = _bundle.LoadAsset<GameObject>(text2);
					}
				}
			}
			else
			{
				ManualLogSource log = EmpressTriforcePlugin.Log;
				if (log != null)
				{
					log.LogError((object)("Empress Triforce bundle missing: " + text));
				}
			}
			ManualLogSource log2 = EmpressTriforcePlugin.Log;
			if (log2 != null)
			{
				log2.LogInfo((object)("Empress Triforce assets loaded. Model: " + (((Object)(object)TriforcePrefab != (Object)null) ? ((Object)TriforcePrefab).name : "MISSING")));
			}
		}

		internal static IEnumerator LoadAudio()
		{
			string path = Path.Combine(EmpressTriforcePlugin.PluginDirectory ?? string.Empty, "audio");
			if (!Directory.Exists(path))
			{
				yield break;
			}
			string[] files = Directory.GetFiles(path, "*.ogg");
			foreach (string text in files)
			{
				string key = Path.GetFileNameWithoutExtension(text);
				UnityWebRequest request = UnityWebRequestMultimedia.GetAudioClip("file://" + text, (AudioType)14);
				try
				{
					yield return request.SendWebRequest();
					if ((int)request.result == 1)
					{
						AudioClip content = DownloadHandlerAudioClip.GetContent(request);
						if ((Object)(object)content != (Object)null)
						{
							((Object)content).name = key;
							Clips[key] = content;
						}
					}
				}
				finally
				{
					((IDisposable)request)?.Dispose();
				}
			}
			ManualLogSource log = EmpressTriforcePlugin.Log;
			if (log != null)
			{
				log.LogInfo((object)("Empress Triforce audio loaded: " + Clips.Count + " clips."));
			}
		}
	}
	internal sealed class TriforceItem : MonoBehaviour
	{
		private PhysGrabObject _grab;

		private PhotonView _view;

		private bool _used;

		private void Awake()
		{
			_grab = ((Component)this).GetComponent<PhysGrabObject>();
			_view = ((Component)this).GetComponent<PhotonView>();
		}

		private void Update()
		{
			//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_0089: Unknown result type (might be due to invalid IL or missing references)
			//IL_0097: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
			if (!_used && !((Object)(object)_grab == (Object)null) && !TriforceAccess.InShop() && TriforceAccess.HeldByLocal(_grab) && TriforceAccess.InputAllowed() && SemiFunc.InputDown((InputKey)2))
			{
				_used = true;
				int num = (((Object)(object)_view != (Object)null) ? _view.ViewID : (-1));
				Vector3 position = ((Component)this).transform.position;
				EmpressTriforcePlugin.EnsurePhotonHooked();
				EmpressTriforcePlugin.RaiseToAll(187, new object[4] { num, position.x, position.y, position.z });
				Renderer[] componentsInChildren = ((Component)this).GetComponentsInChildren<Renderer>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					componentsInChildren[i].enabled = false;
				}
			}
		}
	}
	internal static class TriforceItemBuilder
	{
		private static readonly string[] TemplatePaths = new string[4] { "Items/Item Grenade Human", "Items/Item Grenade Explosive", "Items/Item Grenade Stun", "Items/Item Grenade Duct Taped" };

		private static GameObject _prefab;

		private static Item _item;

		private static bool _registered;

		internal static void RegisterItem()
		{
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0089: Expected O, but got Unknown
			//IL_02b7: Unknown result type (might be due to invalid IL or missing references)
			//IL_01a2: 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)
			if (_registered)
			{
				return;
			}
			GameObject val = null;
			for (int i = 0; i < TemplatePaths.Length; i++)
			{
				val = Resources.Load<GameObject>(TemplatePaths[i]);
				if ((Object)(object)val != (Object)null)
				{
					break;
				}
			}
			if ((Object)(object)val == (Object)null)
			{
				EmpressTriforcePlugin.Log.LogError((object)"Empress Triforce could not find a template item.");
				return;
			}
			ItemAttributes component = val.GetComponent<ItemAttributes>();
			if ((Object)(object)component == (Object)null || (Object)(object)component.item == (Object)null)
			{
				EmpressTriforcePlugin.Log.LogError((object)"Empress Triforce template has no ItemAttributes.");
				return;
			}
			GameObject val2 = new GameObject("Empress Triforce Prefabs");
			Object.DontDestroyOnLoad((Object)(object)val2);
			((Object)val2).hideFlags = (HideFlags)61;
			val2.SetActive(false);
			_prefab = Object.Instantiate<GameObject>(val, val2.transform);
			((Object)_prefab).name = "Empress Triforce";
			MonoBehaviour[] componentsInChildren = _prefab.GetComponentsInChildren<MonoBehaviour>(true);
			foreach (MonoBehaviour val3 in componentsInChildren)
			{
				if (!((Object)(object)val3 == (Object)null))
				{
					string name = ((object)val3).GetType().Name;
					if (name.StartsWith("ItemGrenade") || name == "ItemToggle" || name == "ItemBattery")
					{
						Object.DestroyImmediate((Object)(object)val3);
					}
				}
			}
			Renderer[] componentsInChildren2 = _prefab.GetComponentsInChildren<Renderer>(true);
			for (int j = 0; j < componentsInChildren2.Length; j++)
			{
				componentsInChildren2[j].enabled = false;
			}
			if ((Object)(object)TriforceAssets.TriforcePrefab != (Object)null)
			{
				GameObject val4 = Object.Instantiate<GameObject>(TriforceAssets.TriforcePrefab, _prefab.transform, false);
				((Object)val4).name = "Empress Triforce Visual";
				val4.transform.localPosition = new Vector3(0f, 0.06f, 0f);
				val4.transform.localRotation = Quaternion.identity;
				Collider[] componentsInChildren3 = val4.GetComponentsInChildren<Collider>(true);
				for (int j = 0; j < componentsInChildren3.Length; j++)
				{
					Object.DestroyImmediate((Object)(object)componentsInChildren3[j]);
				}
				Animation component2 = val4.GetComponent<Animation>();
				if ((Object)(object)component2 != (Object)null)
				{
					AnimationClip clip = component2.clip;
					if ((Object)(object)clip != (Object)null)
					{
						clip.SampleAnimation(val4, Mathf.Max(0f, clip.length - 0.001f));
					}
					Object.DestroyImmediate((Object)(object)component2);
				}
				ScaleToSize(val4, 0.5f);
				componentsInChildren2 = val4.GetComponentsInChildren<Renderer>(true);
				for (int j = 0; j < componentsInChildren2.Length; j++)
				{
					componentsInChildren2[j].enabled = true;
				}
				ReplaceColliders(val4);
			}
			_prefab.AddComponent<TriforceItem>();
			Item item = component.item;
			_item = Object.Instantiate<Item>(item);
			((Object)_item).name = "Empress Triforce";
			_item.itemName = "Empress Triforce";
			TriforceAccess.ClearLocalizedName(_item);
			_item.itemSecretShopType = (itemSecretShopType)0;
			_item.maxAmount = 3;
			_item.maxAmountInShop = 2;
			_item.maxPurchase = false;
			_item.maxPurchaseAmount = 3;
			float value = (float)EmpressTriforcePlugin.Settings.ShopPrice.Value * 250f;
			Value val5 = (((Object)(object)item.value != (Object)null) ? Object.Instantiate<Value>(item.value) : ScriptableObject.CreateInstance<Value>());
			SetFloatFieldContaining(val5, "min", value);
			SetFloatFieldContaining(val5, "max", value);
			_item.value = val5;
			ItemAttributes component3 = _prefab.GetComponent<ItemAttributes>();
			component3.item = _item;
			TriforceAccess.SetItemName(component3, "Empress Triforce");
			_registered = Items.RegisterItem(component3) != null;
			EmpressTriforcePlugin.Log.LogInfo((object)("Empress Triforce item registered: " + _registered));
		}

		private static void ReplaceColliders(GameObject visual)
		{
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e8: Unknown result type (might be due to invalid IL or missing references)
			//IL_00f2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ff: 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)
			List<Collider> list = new List<Collider>();
			Collider[] componentsInChildren = _prefab.GetComponentsInChildren<Collider>(true);
			foreach (Collider val in componentsInChildren)
			{
				if ((Object)(object)val != (Object)null && ((Object)(object)visual == (Object)null || !((Component)val).transform.IsChildOf(visual.transform)))
				{
					list.Add(val);
				}
			}
			if (list.Count == 0)
			{
				return;
			}
			GameObject gameObject = ((Component)list[0]).gameObject;
			PhysicMaterial sharedMaterial = list[0].sharedMaterial;
			for (int num = list.Count - 1; num >= 0; num--)
			{
				if (!((Object)(object)list[num] == (Object)null))
				{
					if ((Object)(object)((Component)list[num]).gameObject == (Object)(object)gameObject)
					{
						Object.DestroyImmediate((Object)(object)list[num]);
					}
					else
					{
						Object.DestroyImmediate((Object)(object)((Component)list[num]).gameObject);
					}
				}
			}
			Bounds val2 = BoundsInSpace(gameObject.transform, visual);
			BoxCollider obj = gameObject.AddComponent<BoxCollider>();
			obj.center = ((Bounds)(ref val2)).center;
			obj.size = Vector3.Max(((Bounds)(ref val2)).size, new Vector3(0.08f, 0.05f, 0.08f));
			((Collider)obj).sharedMaterial = sharedMaterial;
		}

		private static Bounds BoundsInSpace(Transform space, GameObject target)
		{
			//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_010e: 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_0055: Unknown result type (might be due to invalid IL or missing references)
			//IL_0061: Unknown result type (might be due to invalid IL or missing references)
			//IL_0066: 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_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_00b9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00be: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c3: 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_00cc: 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_00d3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ec: Unknown result type (might be due to invalid IL or missing references)
			//IL_00da: 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)
			Bounds result = default(Bounds);
			((Bounds)(ref result))..ctor(Vector3.zero, Vector3.zero);
			bool flag = false;
			MeshFilter[] componentsInChildren = target.GetComponentsInChildren<MeshFilter>(true);
			foreach (MeshFilter val in componentsInChildren)
			{
				if ((Object)(object)val == (Object)null || (Object)(object)val.sharedMesh == (Object)null)
				{
					continue;
				}
				Bounds bounds = val.sharedMesh.bounds;
				Matrix4x4 val2 = space.worldToLocalMatrix * ((Component)val).transform.localToWorldMatrix;
				for (int j = 0; j < 8; j++)
				{
					Vector3 val3 = ((Bounds)(ref bounds)).center + Vector3.Scale(((Bounds)(ref bounds)).extents, new Vector3(((j & 1) == 0) ? (-1f) : 1f, ((j & 2) == 0) ? (-1f) : 1f, ((j & 4) == 0) ? (-1f) : 1f));
					Vector3 val4 = ((Matrix4x4)(ref val2)).MultiplyPoint3x4(val3);
					if (!flag)
					{
						((Bounds)(ref result))..ctor(val4, Vector3.zero);
						flag = true;
					}
					else
					{
						((Bounds)(ref result)).Encapsulate(val4);
					}
				}
			}
			return result;
		}

		internal static void ScaleToSize(GameObject target, float maxDimension)
		{
			//IL_0008: Unknown result type (might be due to invalid IL or missing references)
			//IL_000d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0127: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0057: Unknown result type (might be due to invalid IL or missing references)
			//IL_005c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0070: Unknown result type (might be due to invalid IL or missing references)
			//IL_0075: Unknown result type (might be due to invalid IL or missing references)
			//IL_007a: Unknown result type (might be due to invalid IL or missing references)
			//IL_016d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0173: Unknown result type (might be due to invalid IL or missing references)
			//IL_0086: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: 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_00d7: 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_00dd: 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_00fb: 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_00eb: Unknown result type (might be due to invalid IL or missing references)
			Bounds val = default(Bounds);
			((Bounds)(ref val))..ctor(target.transform.position, Vector3.zero);
			bool flag = false;
			MeshFilter[] componentsInChildren = target.GetComponentsInChildren<MeshFilter>(true);
			foreach (MeshFilter val2 in componentsInChildren)
			{
				if ((Object)(object)val2 == (Object)null || (Object)(object)val2.sharedMesh == (Object)null)
				{
					continue;
				}
				Bounds bounds = val2.sharedMesh.bounds;
				Matrix4x4 val3 = target.transform.worldToLocalMatrix * ((Component)val2).transform.localToWorldMatrix;
				for (int j = 0; j < 8; j++)
				{
					Vector3 val4 = ((Bounds)(ref bounds)).center + Vector3.Scale(((Bounds)(ref bounds)).extents, new Vector3(((j & 1) == 0) ? (-1f) : 1f, ((j & 2) == 0) ? (-1f) : 1f, ((j & 4) == 0) ? (-1f) : 1f));
					Vector3 val5 = ((Matrix4x4)(ref val3)).MultiplyPoint3x4(val4);
					if (!flag)
					{
						((Bounds)(ref val))..ctor(val5, Vector3.zero);
						flag = true;
					}
					else
					{
						((Bounds)(ref val)).Encapsulate(val5);
					}
				}
			}
			if (flag)
			{
				float num = Mathf.Max(((Bounds)(ref val)).size.x, Mathf.Max(((Bounds)(ref val)).size.y, ((Bounds)(ref val)).size.z));
				if (!(num <= 0.0001f))
				{
					float num2 = maxDimension / num;
					target.transform.localScale = target.transform.localScale * num2;
				}
			}
		}

		private static void SetFloatFieldContaining(object target, string token, float value)
		{
			if (target == null)
			{
				return;
			}
			FieldInfo[] fields = target.GetType().GetFields(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
			foreach (FieldInfo fieldInfo in fields)
			{
				if (fieldInfo.FieldType == typeof(float) && fieldInfo.Name.ToLowerInvariant().Contains(token))
				{
					fieldInfo.SetValue(target, value);
				}
			}
		}
	}
	internal sealed class TriforceRuntime : MonoBehaviour
	{
		private sealed class UseEffect
		{
			internal int ItemViewId;

			internal GameObject Root;

			internal Transform Model;

			internal Renderer[] ModelRenderers;

			internal Animation Anim;

			internal AudioSource UseAudio;

			internal AudioSource PulseAudio;

			internal Light Glow;

			internal Transform Shockwave;

			internal Material ShockwaveMaterial;

			internal Vector3 StartPos;

			internal float StartTime;

			internal bool Pulsed;
		}

		private const float RiseTime = 1.2f;

		private const float RiseHeight = 1f;

		private readonly List<UseEffect> _effects = new List<UseEffect>();

		public static TriforceRuntime Instance { get; private set; }

		public static TriforceRuntime EnsureHost()
		{
			//IL_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0029: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0037: Expected O, but got Unknown
			if ((Object)(object)Instance != (Object)null)
			{
				return Instance;
			}
			GameObject val = new GameObject("Empress Triforce Runtime");
			val.transform.parent = null;
			((Object)val).hideFlags = (HideFlags)61;
			Object.DontDestroyOnLoad((Object)val);
			Instance = val.AddComponent<TriforceRuntime>();
			return Instance;
		}

		private void Awake()
		{
			Instance = this;
			((MonoBehaviour)this).StartCoroutine(TriforceAssets.LoadAudio());
		}

		private void Update()
		{
			//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_00dc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e1: 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_028a: Unknown result type (might be due to invalid IL or missing references)
			//IL_02a8: Unknown result type (might be due to invalid IL or missing references)
			//IL_02ad: Unknown result type (might be due to invalid IL or missing references)
			//IL_02d5: Unknown result type (might be due to invalid IL or missing references)
			EmpressTriforcePlugin.EnsurePhotonHooked();
			float value = EmpressTriforcePlugin.Settings.PulseTime.Value;
			float value2 = EmpressTriforcePlugin.Settings.Volume.Value;
			for (int num = _effects.Count - 1; num >= 0; num--)
			{
				UseEffect useEffect = _effects[num];
				if ((Object)(object)useEffect.Root == (Object)null)
				{
					_effects.RemoveAt(num);
				}
				else
				{
					float num2 = Time.time - useEffect.StartTime;
					float num3 = Mathf.SmoothStep(0f, 1f, Mathf.Clamp01(num2 / 1.2f)) * 1f;
					float num4 = ((num2 > 1.2f) ? (Mathf.Sin((num2 - 1.2f) * 2.2f) * 0.06f) : 0f);
					useEffect.Root.transform.position = useEffect.StartPos + Vector3.up * (num3 + num4);
					if ((Object)(object)useEffect.Model != (Object)null && !useEffect.Pulsed)
					{
						float num5 = Mathf.Clamp01(num2 / value);
						float num6 = Mathf.Lerp(60f, 900f, num5 * num5);
						useEffect.Model.Rotate(0f, num6 * Time.deltaTime, 0f, (Space)0);
					}
					if ((Object)(object)useEffect.UseAudio != (Object)null)
					{
						float num7 = Mathf.Clamp01(num2 / 0.4f);
						float num8 = (useEffect.Pulsed ? Mathf.Clamp01(1f - (num2 - value) / 0.6f) : 1f);
						useEffect.UseAudio.volume = num7 * num8 * value2;
					}
					if (!useEffect.Pulsed && num2 >= value)
					{
						useEffect.Pulsed = true;
						DoPulse(useEffect);
					}
					if (useEffect.Pulsed)
					{
						float num9 = num2 - value;
						if ((Object)(object)useEffect.PulseAudio != (Object)null && (Object)(object)useEffect.PulseAudio.clip != (Object)null)
						{
							float num10 = Mathf.Clamp01(num9 / 0.08f) * Mathf.Clamp01((useEffect.PulseAudio.clip.length - num9) / 0.7f);
							useEffect.PulseAudio.volume = Mathf.Clamp01(num10) * value2;
						}
						if ((Object)(object)useEffect.Shockwave != (Object)null)
						{
							float num11 = 1f - Mathf.Pow(1f - Mathf.Clamp01(num9 / 0.6f), 2f);
							float num12 = Mathf.Lerp(0.6f, EmpressTriforcePlugin.Settings.BlastRadius.Value * 2f, num11);
							useEffect.Shockwave.localScale = Vector3.one * num12;
							if ((Object)(object)useEffect.ShockwaveMaterial != (Object)null)
							{
								Color color = useEffect.ShockwaveMaterial.color;
								color.a = 0.22f * (1f - Mathf.Clamp01(num9 / 0.7f));
								useEffect.ShockwaveMaterial.color = color;
							}
							if (num9 > 0.8f)
							{
								((Component)useEffect.Shockwave).gameObject.SetActive(false);
							}
						}
						if ((Object)(object)useEffect.Glow != (Object)null)
						{
							useEffect.Glow.intensity = Mathf.Lerp(6f, 0f, Mathf.Clamp01(num9 / 1.2f));
						}
					}
					else if ((Object)(object)useEffect.Glow != (Object)null)
					{
						useEffect.Glow.intensity = 1.2f + Mathf.Clamp01(num2 / value) * 2f;
					}
					if (num2 >= value + 3.2f)
					{
						Object.Destroy((Object)(object)useEffect.Root);
						_effects.RemoveAt(num);
					}
				}
			}
		}

		internal void ReceiveTriforceUse(object[] data)
		{
			//IL_0065: Unknown result type (might be due to invalid IL or missing references)
			if (data == null || data.Length < 4)
			{
				return;
			}
			int num = Convert.ToInt32(data[0]);
			for (int i = 0; i < _effects.Count; i++)
			{
				if (_effects[i].ItemViewId == num)
				{
					return;
				}
			}
			Vector3 position = default(Vector3);
			((Vector3)(ref position))..ctor(Convert.ToSingle(data[1]), Convert.ToSingle(data[2]), Convert.ToSingle(data[3]));
			_effects.Add(BuildEffect(num, position));
			if (!SemiFunc.IsMasterClientOrSingleplayer() || num <= 0)
			{
				return;
			}
			PhotonView val = PhotonView.Find(num);
			if ((Object)(object)val != (Object)null && (Object)(object)((Component)val).gameObject != (Object)null)
			{
				string text = TriforceAccess.InstanceName(((Component)val).gameObject.GetComponent<ItemAttributes>());
				if ((Object)(object)StatsManager.instance != (Object)null && !string.IsNullOrEmpty(text))
				{
					StatsManager.instance.ItemRemove(text);
				}
				if (PhotonNetwork.InRoom)
				{
					PhotonNetwork.Destroy(((Component)val).gameObject);
				}
				else
				{
					Object.Destroy((Object)(object)((Component)val).gameObject);
				}
			}
		}

		private UseEffect BuildEffect(int itemViewId, Vector3 position)
		{
			//IL_0005: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Expected O, but got Unknown
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_015a: 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_0064: Unknown result type (might be due to invalid IL or missing references)
			//IL_0227: Unknown result type (might be due to invalid IL or missing references)
			//IL_0238: Unknown result type (might be due to invalid IL or missing references)
			//IL_0242: Unknown result type (might be due to invalid IL or missing references)
			//IL_0256: Unknown result type (might be due to invalid IL or missing references)
			//IL_025b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0270: Unknown result type (might be due to invalid IL or missing references)
			//IL_027c: Expected O, but got Unknown
			//IL_02ef: Unknown result type (might be due to invalid IL or missing references)
			//IL_02f0: Unknown result type (might be due to invalid IL or missing references)
			GameObject val = new GameObject("Empress Triforce Effect");
			val.transform.position = position;
			Transform model = null;
			Renderer[] modelRenderers = null;
			Animation val2 = null;
			if ((Object)(object)TriforceAssets.TriforcePrefab != (Object)null)
			{
				GameObject val3 = Object.Instantiate<GameObject>(TriforceAssets.TriforcePrefab, val.transform, false);
				((Object)val3).name = "Triforce";
				val3.transform.localPosition = Vector3.zero;
				val3.transform.localRotation = Quaternion.identity;
				Collider[] componentsInChildren = val3.GetComponentsInChildren<Collider>(true);
				for (int i = 0; i < componentsInChildren.Length; i++)
				{
					Object.Destroy((Object)(object)componentsInChildren[i]);
				}
				model = val3.transform;
				modelRenderers = val3.GetComponentsInChildren<Renderer>(true);
				val2 = val3.GetComponent<Animation>();
				if ((Object)(object)val2 != (Object)null && (Object)(object)val2.clip != (Object)null)
				{
					val2.clip.SampleAnimation(val3, Mathf.Max(0f, val2.clip.length - 0.001f));
				}
				TriforceItemBuilder.ScaleToSize(val3, 0.5f);
				if ((Object)(object)val2 != (Object)null && (Object)(object)val2.clip != (Object)null)
				{
					val2[((Object)val2.clip).name].wrapMode = (WrapMode)1;
					val2.Play(((Object)val2.clip).name);
				}
			}
			Light val4 = val.AddComponent<Light>();
			val4.type = (LightType)2;
			val4.color = new Color(1f, 0.85f, 0.3f);
			val4.range = 7f;
			val4.intensity = 1.2f;
			val4.shadows = (LightShadows)0;
			float value = EmpressTriforcePlugin.Settings.HearingRange.Value;
			AudioSource val5 = BuildAudioSource(val, value);
			val5.clip = TriforceAssets.Clip("triforce_use");
			val5.volume = 0f;
			if ((Object)(object)val5.clip != (Object)null)
			{
				val5.Play();
			}
			AudioSource val6 = BuildAudioSource(val, value);
			val6.clip = TriforceAssets.Clip("triforce_pulse");
			GameObject val7 = GameObject.CreatePrimitive((PrimitiveType)0);
			Object.Destroy((Object)(object)val7.GetComponent<Collider>());
			((Object)val7).name = "Pulse";
			val7.transform.SetParent(val.transform, false);
			val7.transform.localPosition = Vector3.zero;
			val7.transform.localScale = Vector3.one * 0.6f;
			Material val8 = new Material(Shader.Find("Sprites/Default"))
			{
				color = new Color(1f, 0.9f, 0.45f, 0f)
			};
			Renderer component = val7.GetComponent<Renderer>();
			component.sharedMaterial = val8;
			component.shadowCastingMode = (ShadowCastingMode)0;
			val7.SetActive(false);
			return new UseEffect
			{
				ItemViewId = itemViewId,
				Root = val,
				Model = model,
				ModelRenderers = modelRenderers,
				Anim = val2,
				UseAudio = val5,
				PulseAudio = val6,
				Glow = val4,
				Shockwave = val7.transform,
				ShockwaveMaterial = val8,
				StartPos = position,
				StartTime = Time.time
			};
		}

		private static AudioSource BuildAudioSource(GameObject host, float hearing)
		{
			AudioSource obj = host.AddComponent<AudioSource>();
			obj.spatialBlend = 1f;
			obj.minDistance = Mathf.Min(2f, hearing * 0.15f);
			obj.maxDistance = hearing;
			obj.rolloffMode = (AudioRolloffMode)1;
			obj.playOnAwake = false;
			return obj;
		}

		private void DoPulse(UseEffect effect)
		{
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			//IL_0114: Unknown result type (might be due to invalid IL or missing references)
			//IL_0119: 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_0152: 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_0157: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			//IL_0161: Unknown result type (might be due to invalid IL or missing references)
			//IL_0166: Unknown result type (might be due to invalid IL or missing references)
			//IL_016c: 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_017b: Unknown result type (might be due to invalid IL or missing references)
			//IL_023b: 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_026e: Unknown result type (might be due to invalid IL or missing references)
			Vector3 position = effect.Root.transform.position;
			if ((Object)(object)effect.Anim != (Object)null)
			{
				effect.Anim.Stop();
			}
			if (effect.ModelRenderers != null)
			{
				for (int i = 0; i < effect.ModelRenderers.Length; i++)
				{
					if ((Object)(object)effect.ModelRenderers[i] != (Object)null)
					{
						effect.ModelRenderers[i].enabled = false;
					}
				}
			}
			if ((Object)(object)effect.Shockwave != (Object)null)
			{
				((Component)effect.Shockwave).gameObject.SetActive(true);
			}
			if ((Object)(object)effect.PulseAudio != (Object)null && (Object)(object)effect.PulseAudio.clip != (Object)null)
			{
				effect.PulseAudio.volume = 0f;
				effect.PulseAudio.Play();
			}
			float value = EmpressTriforcePlugin.Settings.BlastRadius.Value;
			float value2 = EmpressTriforcePlugin.Settings.BlastForce.Value;
			PlayerAvatar val = TriforceAccess.LocalAvatar();
			if ((Object)(object)val != (Object)null && !TriforceAccess.IsDisabled(val) && (Object)(object)PlayerController.instance != (Object)null)
			{
				Vector3 val2 = ((Component)val).transform.position - position;
				if (((Vector3)(ref val2)).magnitude <= value)
				{
					val2.y *= 0.35f;
					Vector3 val3 = ((((Vector3)(ref val2)).sqrMagnitude > 0.01f) ? ((Vector3)(ref val2)).normalized : Vector3.up);
					PlayerController.instance.ForceImpulse(val3 * value2 + Vector3.up * value2 * 0.3f);
				}
			}
			if (!SemiFunc.IsMasterClientOrSingleplayer())
			{
				return;
			}
			List<PlayerAvatar> list = TriforceAccess.Players();
			for (int j = 0; j < list.Count; j++)
			{
				PlayerAvatar val4 = list[j];
				if ((Object)(object)val4 != (Object)null && TriforceAccess.IsDisabled(val4))
				{
					val4.Revive(false);
				}
			}
			for (int k = 0; k < list.Count; k++)
			{
				PlayerHealth val5 = TriforceAccess.Health(list[k]);
				if ((Object)(object)val5 != (Object)null)
				{
					val5.HealOther(EmpressTriforcePlugin.Settings.HealAmount.Value, true);
				}
			}
			PhysGrabObject[] array = Object.FindObjectsOfType<PhysGrabObject>();
			foreach (PhysGrabObject val6 in array)
			{
				if (!((Object)(object)val6 == (Object)null) && !(Vector3.Distance(((Component)val6).transform.position, position) > value))
				{
					Rigidbody component = ((Component)val6).GetComponent<Rigidbody>();
					if ((Object)(object)component != (Object)null && !component.isKinematic)
					{
						component.AddExplosionForce(value2 * 2.2f, position, value, 0.5f, (ForceMode)1);
					}
				}
			}
		}
	}
}