Decompiled source of Majoras Mask v1.0.0

BinaryView.dll

Decompiled 3 weeks ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using BepInEx;
using BepInEx.Logging;
using HarmonyLib;
using Microsoft.CodeAnalysis;
using Photon.Pun;
using UnityEngine;
using UnityEngine.Events;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: TargetFramework(".NETStandard,Version=v2.1", FrameworkDisplayName = ".NET Standard 2.1")]
[assembly: AssemblyCompany("Omniscye")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+31d33a1e262fb9cd936a8fd3f583fdd7bc996e5a")]
[assembly: AssemblyProduct("BinaryView")]
[assembly: AssemblyTitle("BinaryView")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Method | AttributeTargets.Interface | AttributeTargets.Delegate, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableContextAttribute : Attribute
	{
		public readonly byte Flag;

		public NullableContextAttribute(byte P_0)
		{
			Flag = P_0;
		}
	}
	[CompilerGenerated]
	[Microsoft.CodeAnalysis.Embedded]
	[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace ValuableMask
{
	[BepInPlugin("omniscye.valuablemask", "ValuableMask", "1.2.1")]
	public class ValuableMaskPlugin : BaseUnityPlugin
	{
		internal static ValuableMaskPlugin Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		private void Awake()
		{
			Instance = this;
			Logger.LogInfo((object)"ValuableMask v1.2.1 loaded.");
		}
	}
	public class ValuableMaskLatch : Trap
	{
		[CompilerGenerated]
		private sealed class <FloatRoutine>d__41 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public int grabberViewId;

			public Vector3 originWorldPos;

			public ValuableMaskLatch <>4__this;

			private float <t>5__1;

			private Vector3 <startPos>5__2;

			private int <i>5__3;

			private int <i>5__4;

			private float <k>5__5;

			private float <phase>5__6;

			private Vector3 <shake>5__7;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <FloatRoutine>d__41(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_005d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0062: Unknown result type (might be due to invalid IL or missing references)
				//IL_0078: Unknown result type (might be due to invalid IL or missing references)
				//IL_007d: Unknown result type (might be due to invalid IL or missing references)
				//IL_0093: Unknown result type (might be due to invalid IL or missing references)
				//IL_0098: Unknown result type (might be due to invalid IL or missing references)
				//IL_00f5: Unknown result type (might be due to invalid IL or missing references)
				//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
				//IL_044a: Unknown result type (might be due to invalid IL or missing references)
				//IL_0466: Unknown result type (might be due to invalid IL or missing references)
				//IL_0476: Unknown result type (might be due to invalid IL or missing references)
				//IL_049e: Unknown result type (might be due to invalid IL or missing references)
				//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
				//IL_04a8: Unknown result type (might be due to invalid IL or missing references)
				//IL_04be: Unknown result type (might be due to invalid IL or missing references)
				//IL_04c4: Unknown result type (might be due to invalid IL or missing references)
				//IL_04c9: Unknown result type (might be due to invalid IL or missing references)
				//IL_04df: Unknown result type (might be due to invalid IL or missing references)
				//IL_036c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0377: Unknown result type (might be due to invalid IL or missing references)
				//IL_0382: Unknown result type (might be due to invalid IL or missing references)
				//IL_0398: Unknown result type (might be due to invalid IL or missing references)
				//IL_0282: Unknown result type (might be due to invalid IL or missing references)
				//IL_0287: Unknown result type (might be due to invalid IL or missing references)
				//IL_0297: Unknown result type (might be due to invalid IL or missing references)
				//IL_029c: Unknown result type (might be due to invalid IL or missing references)
				//IL_02a1: Unknown result type (might be due to invalid IL or missing references)
				//IL_0314: Unknown result type (might be due to invalid IL or missing references)
				//IL_0319: Unknown result type (might be due to invalid IL or missing references)
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>4__this._origParent = ((Component)<>4__this).transform.parent;
					<>4__this._origLocalPos = ((Component)<>4__this).transform.localPosition;
					<>4__this._origLocalRot = ((Component)<>4__this).transform.localRotation;
					<>4__this._origLocalScale = ((Component)<>4__this).transform.localScale;
					<>4__this._rbHad = (Object)(object)<>4__this._rb != (Object)null;
					if (<>4__this._rbHad)
					{
						<>4__this._rbWasKinematic = <>4__this._rb.isKinematic;
						<>4__this._rbPrevConstraints = <>4__this._rb.constraints;
						<>4__this._rb.isKinematic = true;
						<>4__this._rb.constraints = (RigidbodyConstraints)126;
					}
					<>4__this._colsPrev = new bool[<>4__this._cols.Length];
					<i>5__3 = 0;
					while (<i>5__3 < <>4__this._cols.Length)
					{
						<>4__this._colsPrev[<i>5__3] = <>4__this._cols[<i>5__3].enabled;
						<>4__this._cols[<i>5__3].enabled = false;
						<i>5__3++;
					}
					<>4__this._ptvPrevEnabled = new bool[<>4__this._ptv.Length];
					<i>5__4 = 0;
					while (<i>5__4 < <>4__this._ptv.Length)
					{
						if (Object.op_Implicit((Object)(object)<>4__this._ptv[<i>5__4]))
						{
							<>4__this._ptvPrevEnabled[<i>5__4] = ((Behaviour)<>4__this._ptv[<i>5__4]).enabled;
							((Behaviour)<>4__this._ptv[<i>5__4]).enabled = false;
						}
						<i>5__4++;
					}
					<>4__this.ForceReleaseFromAllGrabbers();
					<>4__this._floatAnchor = originWorldPos + Vector3.up * <>4__this.floatHeight;
					<>4__this._floatTimer = 0f;
					if (Object.op_Implicit((Object)(object)<>4__this._audio) && Object.op_Implicit((Object)(object)<>4__this.startFloatClip))
					{
						<>4__this._audio.PlayOneShot(<>4__this.startFloatClip);
					}
					<t>5__1 = 0f;
					<startPos>5__2 = ((Component)<>4__this).transform.position;
					((Component)<>4__this).transform.SetParent((Transform)null, true);
					goto IL_03cd;
				case 1:
					<>1__state = -1;
					goto IL_03cd;
				case 2:
					{
						<>1__state = -1;
						break;
					}
					IL_03cd:
					if (!<>4__this._resolved && <t>5__1 < 0.25f)
					{
						<t>5__1 += Time.deltaTime;
						<k>5__5 = Mathf.Clamp01(<t>5__1 / 0.25f);
						((Component)<>4__this).transform.position = Vector3.Lerp(<startPos>5__2, <>4__this._floatAnchor, <k>5__5);
						((Component)<>4__this).transform.Rotate(Vector3.up, <>4__this.spinDegreesPerSecond * Time.deltaTime, (Space)0);
						<>2__current = null;
						<>1__state = 1;
						return true;
					}
					break;
				}
				if (!<>4__this._resolved)
				{
					<>4__this._floatTimer += Time.deltaTime;
					<phase>5__6 = <>4__this._floatTimer * <>4__this.shakeFrequency * MathF.PI * 2f;
					<shake>5__7 = ((Component)<>4__this).transform.right * (Mathf.Sin(<phase>5__6) * <>4__this.shakeAmplitude) + ((Component)<>4__this).transform.forward * (Mathf.Cos(<phase>5__6 * 0.5f) * (<>4__this.shakeAmplitude * 0.5f));
					((Component)<>4__this).transform.position = <>4__this._floatAnchor + <shake>5__7;
					((Component)<>4__this).transform.Rotate(Vector3.up, <>4__this.spinDegreesPerSecond * Time.deltaTime, (Space)0);
					<>2__current = null;
					<>1__state = 2;
					return true;
				}
				return false;
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <MasterResolveRoutine>d__36 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ValuableMaskLatch <>4__this;

			private bool <explode>5__1;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <MasterResolveRoutine>d__36(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(<>4__this.floatSeconds);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					<explode>5__1 = Random.value < Mathf.Clamp01(<>4__this.explodeChance);
					if (<explode>5__1)
					{
						((Trap)<>4__this).photonView.RPC("RPC_ExplodeNow", (RpcTarget)0, Array.Empty<object>());
					}
					else
					{
						((Trap)<>4__this).photonView.RPC("RPC_SafeNow", (RpcTarget)0, Array.Empty<object>());
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[CompilerGenerated]
		private sealed class <SingleplayerResolveRoutine>d__37 : IEnumerator<object>, IEnumerator, IDisposable
		{
			private int <>1__state;

			private object <>2__current;

			public ValuableMaskLatch <>4__this;

			object IEnumerator<object>.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			object IEnumerator.Current
			{
				[DebuggerHidden]
				get
				{
					return <>2__current;
				}
			}

			[DebuggerHidden]
			public <SingleplayerResolveRoutine>d__37(int <>1__state)
			{
				this.<>1__state = <>1__state;
			}

			[DebuggerHidden]
			void IDisposable.Dispose()
			{
				<>1__state = -2;
			}

			private bool MoveNext()
			{
				//IL_002c: Unknown result type (might be due to invalid IL or missing references)
				//IL_0036: Expected O, but got Unknown
				switch (<>1__state)
				{
				default:
					return false;
				case 0:
					<>1__state = -1;
					<>2__current = (object)new WaitForSeconds(<>4__this.floatSeconds);
					<>1__state = 1;
					return true;
				case 1:
					<>1__state = -1;
					if (Random.value < Mathf.Clamp01(<>4__this.explodeChance))
					{
						<>4__this.RPC_ExplodeNow();
					}
					else
					{
						<>4__this.RPC_SafeNow();
					}
					return false;
				}
			}

			bool IEnumerator.MoveNext()
			{
				//ILSpy generated this explicit interface implementation from .override directive in MoveNext
				return this.MoveNext();
			}

			[DebuggerHidden]
			void IEnumerator.Reset()
			{
				throw new NotSupportedException();
			}
		}

		[Header("Float & Shake")]
		public float floatSeconds = 5f;

		public float floatHeight = 1.1f;

		public float shakeAmplitude = 0.35f;

		public float shakeFrequency = 6f;

		public float spinDegreesPerSecond = 180f;

		[Header("Explosion")]
		[Range(0f, 1f)]
		public float explodeChance = 0.33f;

		public float explosionSize = 1f;

		public int explosionDamageMin = 50;

		public int explosionDamageMax = 100;

		public UnityEvent onDetonate;

		[Header("SFX")]
		public AudioClip startFloatClip;

		public AudioSource audioSource;

		private AudioSource _audio;

		private bool _grabPrev;

		private bool _armed;

		private bool _resolved;

		private Rigidbody _rb;

		private bool _rbHad;

		private bool _rbWasKinematic;

		private RigidbodyConstraints _rbPrevConstraints;

		private Collider[] _cols = Array.Empty<Collider>();

		private bool[] _colsPrev;

		private PhotonTransformView[] _ptv = Array.Empty<PhotonTransformView>();

		private bool[] _ptvPrevEnabled;

		private Transform _origParent;

		private Vector3 _origLocalPos;

		private Quaternion _origLocalRot;

		private Vector3 _origLocalScale;

		private Vector3 _floatAnchor;

		private float _floatTimer;

		private ParticleScriptExplosion _particleScriptExplosion;

		private ItemAttributes _itemAttributes;

		private PhysGrabObjectImpactDetector _impactDetector;

		public override void Start()
		{
			((Trap)this).Start();
			_audio = (AudioSource)(Object.op_Implicit((Object)(object)audioSource) ? ((object)audioSource) : ((object)((Component)this).GetComponent<AudioSource>()));
			if (!Object.op_Implicit((Object)(object)_audio))
			{
				_audio = ((Component)this).gameObject.AddComponent<AudioSource>();
			}
			_audio.playOnAwake = false;
			_audio.loop = false;
			_audio.spatialBlend = 1f;
			_audio.rolloffMode = (AudioRolloffMode)0;
			_audio.minDistance = 4f;
			_audio.maxDistance = 28f;
			_rb = ((Component)this).GetComponent<Rigidbody>();
			_cols = ((Component)this).GetComponentsInChildren<Collider>(true);
			_ptv = ((Component)this).GetComponentsInChildren<PhotonTransformView>(true);
			_particleScriptExplosion = ((Component)this).GetComponent<ParticleScriptExplosion>();
			_itemAttributes = ((Component)this).GetComponent<ItemAttributes>();
			_impactDetector = ((Component)this).GetComponent<PhysGrabObjectImpactDetector>();
		}

		public override void Update()
		{
			((Trap)this).Update();
			if (!SemiFunc.IsMultiplayer() || PhotonNetwork.IsMasterClient)
			{
				bool flag = Object.op_Implicit((Object)(object)base.physGrabObject) && base.physGrabObject.grabbed;
				if (flag && !_grabPrev)
				{
					BeginFloatSequence(broadcast: true);
				}
				_grabPrev = flag;
			}
		}

		private void BeginFloatSequence(bool broadcast)
		{
			//IL_008e: 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)
			if (!_armed)
			{
				_armed = true;
				PhotonView val = FindGrabberPhotonViewRobust();
				int num = (Object.op_Implicit((Object)(object)val) ? val.ViewID : (-1));
				if (broadcast && SemiFunc.IsMultiplayer())
				{
					base.photonView.RPC("RPC_BeginFloat", (RpcTarget)0, new object[2]
					{
						num,
						((Component)this).transform.position
					});
					((MonoBehaviour)this).StartCoroutine(MasterResolveRoutine());
				}
				else
				{
					((MonoBehaviour)this).StartCoroutine(FloatRoutine(num, ((Component)this).transform.position));
					((MonoBehaviour)this).StartCoroutine(SingleplayerResolveRoutine());
				}
			}
		}

		[IteratorStateMachine(typeof(<MasterResolveRoutine>d__36))]
		private IEnumerator MasterResolveRoutine()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <MasterResolveRoutine>d__36(0)
			{
				<>4__this = this
			};
		}

		[IteratorStateMachine(typeof(<SingleplayerResolveRoutine>d__37))]
		private IEnumerator SingleplayerResolveRoutine()
		{
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <SingleplayerResolveRoutine>d__37(0)
			{
				<>4__this = this
			};
		}

		[PunRPC]
		private void RPC_BeginFloat(int grabberViewId, Vector3 originWorldPos)
		{
			//IL_0010: Unknown result type (might be due to invalid IL or missing references)
			if (!_resolved)
			{
				((MonoBehaviour)this).StartCoroutine(FloatRoutine(grabberViewId, originWorldPos));
			}
		}

		[PunRPC]
		private void RPC_ExplodeNow()
		{
			if (!_resolved)
			{
				_resolved = true;
				((MonoBehaviour)this).StopAllCoroutines();
				EndFloatRestore();
				TryExplode();
			}
		}

		[PunRPC]
		private void RPC_SafeNow()
		{
			if (!_resolved)
			{
				_resolved = true;
				((MonoBehaviour)this).StopAllCoroutines();
				EndFloatRestore();
			}
		}

		[IteratorStateMachine(typeof(<FloatRoutine>d__41))]
		private IEnumerator FloatRoutine(int grabberViewId, Vector3 originWorldPos)
		{
			//IL_0015: Unknown result type (might be due to invalid IL or missing references)
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//yield-return decompiler failed: Unexpected instruction in Iterator.Dispose()
			return new <FloatRoutine>d__41(0)
			{
				<>4__this = this,
				grabberViewId = grabberViewId,
				originWorldPos = originWorldPos
			};
		}

		private void EndFloatRestore()
		{
			//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bc: Unknown result type (might be due to invalid IL or missing references)
			if (Object.op_Implicit((Object)(object)_origParent))
			{
				((Component)this).transform.SetParent(_origParent, true);
			}
			for (int i = 0; i < _ptv.Length; i++)
			{
				if (Object.op_Implicit((Object)(object)_ptv[i]))
				{
					((Behaviour)_ptv[i]).enabled = _ptvPrevEnabled[i];
				}
			}
			for (int j = 0; j < _cols.Length; j++)
			{
				_cols[j].enabled = _colsPrev[j];
			}
			if (_rbHad)
			{
				_rb.isKinematic = _rbWasKinematic;
				_rb.constraints = _rbPrevConstraints;
			}
			((Component)this).transform.localScale = _origLocalScale;
		}

		private void TryExplode()
		{
			//IL_0060: Unknown result type (might be due to invalid IL or missing references)
			if (onDetonate != null && ((UnityEventBase)onDetonate).GetPersistentEventCount() > 0)
			{
				onDetonate.Invoke();
			}
			else if (Object.op_Implicit((Object)(object)_particleScriptExplosion) && (Object)(object)_particleScriptExplosion.explosionPreset != (Object)null)
			{
				_particleScriptExplosion.Spawn(((Component)this).transform.position, explosionSize, explosionDamageMin, explosionDamageMax, 1f, false, false, 1f);
			}
			if (SemiFunc.IsMasterClientOrSingleplayer())
			{
				if ((Object)(object)_itemAttributes != (Object)null && (Object)(object)StatsManager.instance != (Object)null)
				{
					StatsManager.instance.ItemRemove(_itemAttributes.instanceName);
				}
				if ((Object)(object)_impactDetector != (Object)null)
				{
					_impactDetector.DestroyObject(true);
				}
			}
		}

		private void ForceReleaseFromAllGrabbers()
		{
			if ((Object)(object)base.physGrabObject == (Object)null)
			{
				return;
			}
			foreach (PhysGrabber item in base.physGrabObject.playerGrabbing.ToList())
			{
				if (!SemiFunc.IsMultiplayer())
				{
					item.ReleaseObject(base.photonView.ViewID, 0.1f);
					continue;
				}
				item.photonView.RPC("ReleaseObjectRPC", (RpcTarget)0, new object[3]
				{
					false,
					0.1f,
					base.photonView.ViewID
				});
			}
		}

		private PhotonView FindGrabberPhotonViewRobust()
		{
			if (Object.op_Implicit((Object)(object)base.physGrabObject) && Object.op_Implicit((Object)(object)base.physGrabObject.lastPlayerGrabbing) && Object.op_Implicit((Object)(object)base.physGrabObject.lastPlayerGrabbing.photonView))
			{
				return base.physGrabObject.lastPlayerGrabbing.photonView;
			}
			Transform parent = ((Component)this).transform.parent;
			while ((Object)(object)parent != (Object)null)
			{
				PhotonView component = ((Component)parent).GetComponent<PhotonView>();
				if (Object.op_Implicit((Object)(object)component))
				{
					return component;
				}
				parent = parent.parent;
			}
			return null;
		}
	}
	[BepInPlugin("omniscye.valuablemask.events", "ValuableMask.Events", "1.0.0")]
	public class ValuableMaskEventsPlugin : BaseUnityPlugin
	{
		internal static ValuableMaskEventsPlugin Instance { get; private set; }

		internal static ManualLogSource Logger => Instance._logger;

		private ManualLogSource _logger => ((BaseUnityPlugin)this).Logger;

		internal Harmony? Harmony { get; set; }

		private void Awake()
		{
			//IL_0016: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Expected O, but got Unknown
			//IL_0022: Expected O, but got Unknown
			Instance = this;
			if (Harmony == null)
			{
				Harmony val = new Harmony("omniscye.valuablemask.events");
				Harmony val2 = val;
				Harmony = val;
			}
			Harmony.PatchAll();
			Logger.LogInfo((object)"ValuableMask.Events v1.0.0 loaded");
		}
	}
	internal enum ValuableMaskEventKind
	{
		TeleportAllValuablesToMask,
		KillRandomPlayer,
		TeleportRandomPlayerToPoint,
		SpawnRandomItemsNearMask,
		GrantRandomPlayerUpgrade,
		TurnOffAllLighting,
		RandomizeAllPlayerColors,
		SwitchLevel,
		LowGravityGlobal,
		DropAllHeldItems
	}
	[HarmonyPatch(typeof(ValuableMaskLatch))]
	internal static class ValuableMaskLatchPatches
	{
		[HarmonyPostfix]
		[HarmonyPatch("RPC_BeginFloat")]
		private static void RPC_BeginFloat_Postfix(ValuableMaskLatch __instance)
		{
			if (!Object.op_Implicit((Object)(object)((Component)__instance).GetComponent<ValuableMaskEventRelay>()))
			{
				((Component)__instance).gameObject.AddComponent<ValuableMaskEventRelay>();
			}
		}

		[HarmonyPostfix]
		[HarmonyPatch("RPC_SafeNow")]
		private static void RPC_SafeNow_Postfix(ValuableMaskLatch __instance)
		{
			ValuableMaskEventRelay.TryFire(__instance, exploded: false);
		}

		[HarmonyPostfix]
		[HarmonyPatch("RPC_ExplodeNow")]
		private static void RPC_ExplodeNow_Postfix(ValuableMaskLatch __instance)
		{
			ValuableMaskEventRelay.TryFire(__instance, exploded: true);
		}
	}
	public class ValuableMaskEventRelay : MonoBehaviourPun
	{
		private bool fired;

		public static void TryFire(ValuableMaskLatch latch, bool exploded)
		{
			if (Object.op_Implicit((Object)(object)latch))
			{
				ValuableMaskEventRelay valuableMaskEventRelay = ((Component)latch).GetComponent<ValuableMaskEventRelay>();
				if (!Object.op_Implicit((Object)(object)valuableMaskEventRelay))
				{
					valuableMaskEventRelay = ((Component)latch).gameObject.AddComponent<ValuableMaskEventRelay>();
				}
				valuableMaskEventRelay.FireIfHost(latch, exploded);
			}
		}

		private void FireIfHost(ValuableMaskLatch latch, bool exploded)
		{
			//IL_00f3: Unknown result type (might be due to invalid IL or missing references)
			if (fired || (SemiFunc.IsMultiplayer() && !PhotonNetwork.IsMasterClient))
			{
				return;
			}
			fired = true;
			int num = Random.Range(0, 10);
			int num2 = -1;
			if (num == 1 || num == 2)
			{
				List<PlayerAvatar> list = SemiFunc.PlayerGetList();
				list.RemoveAll((PlayerAvatar x) => (Object)(object)x == (Object)null);
				if (list.Count > 0)
				{
					PlayerAvatar val = list[Random.Range(0, list.Count)];
					if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.photonView))
					{
						num2 = val.photonView.ViewID;
					}
				}
			}
			((MonoBehaviourPun)this).photonView.RPC("VM_DoEvent", (RpcTarget)0, new object[3]
			{
				num,
				((Component)latch).transform.position,
				num2
			});
		}

		[PunRPC]
		private void VM_DoEvent(int evt, Vector3 maskPos, int targetPlayerViewId)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_0108: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00b4: 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_00e9: Unknown result type (might be due to invalid IL or missing references)
			switch ((ValuableMaskEventKind)evt)
			{
			case ValuableMaskEventKind.TeleportAllValuablesToMask:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					TeleportAllValuables(maskPos);
				}
				break;
			case ValuableMaskEventKind.KillRandomPlayer:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					PlayerAvatar val = FindPlayerByViewId(targetPlayerViewId);
					if (Object.op_Implicit((Object)(object)val))
					{
						val.PlayerDeath(-1);
					}
				}
				break;
			case ValuableMaskEventKind.TeleportRandomPlayerToPoint:
			{
				if (!SemiFunc.IsMasterClientOrSingleplayer())
				{
					break;
				}
				PlayerAvatar val2 = FindPlayerByViewId(targetPlayerViewId);
				if (Object.op_Implicit((Object)(object)val2))
				{
					Vector3 position = ((Component)val2).transform.position;
					LevelPoint val3 = SemiFunc.LevelPointGet(position, 8f, 60f);
					if (Object.op_Implicit((Object)(object)val3))
					{
						val2.Spawn(((Component)val3).transform.position, ((Component)val3).transform.rotation);
					}
				}
				break;
			}
			case ValuableMaskEventKind.SpawnRandomItemsNearMask:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					SpawnItems(maskPos, 3);
				}
				break;
			case ValuableMaskEventKind.GrantRandomPlayerUpgrade:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					GrantRandomUpgrade();
				}
				break;
			case ValuableMaskEventKind.TurnOffAllLighting:
				TurnOffAllLightsLocal();
				break;
			case ValuableMaskEventKind.RandomizeAllPlayerColors:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					RandomizeColors();
				}
				break;
			case ValuableMaskEventKind.SwitchLevel:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					RunManager.instance.ChangeLevel(true, false, (ChangeLevelType)0);
				}
				break;
			case ValuableMaskEventKind.LowGravityGlobal:
				LowGravityLocal(20f);
				break;
			case ValuableMaskEventKind.DropAllHeldItems:
				if (SemiFunc.IsMasterClientOrSingleplayer())
				{
					DropAllHeldItemsHost();
				}
				break;
			}
		}

		private PlayerAvatar FindPlayerByViewId(int viewId)
		{
			if (viewId == -1)
			{
				return null;
			}
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			for (int i = 0; i < list.Count; i++)
			{
				PlayerAvatar val = list[i];
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.photonView) && val.photonView.ViewID == viewId)
				{
					return val;
				}
			}
			return null;
		}

		private void TeleportAllValuables(Vector3 pos)
		{
			//IL_0073: Unknown result type (might be due to invalid IL or missing references)
			//IL_0083: Unknown result type (might be due to invalid IL or missing references)
			//IL_0088: Unknown result type (might be due to invalid IL or missing references)
			//IL_008a: Unknown result type (might be due to invalid IL or missing references)
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_008d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0092: Unknown result type (might be due to invalid IL or missing references)
			//IL_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_00aa: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ac: Unknown result type (might be due to invalid IL or missing references)
			ValuableObject[] array = Object.FindObjectsOfType<ValuableObject>(true);
			int num = 0;
			float num2 = 1.5f;
			foreach (ValuableObject val in array)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					PhysGrabObject component = ((Component)val).GetComponent<PhysGrabObject>();
					if (Object.op_Implicit((Object)(object)component))
					{
						float num3 = (float)(num % 24) * (MathF.PI / 12f);
						int num4 = num / 24;
						Vector3 val2 = new Vector3(Mathf.Cos(num3), 0f, Mathf.Sin(num3)) * (num2 + (float)num4 * 0.9f);
						Vector3 val3 = pos + val2 + Vector3.up * 0.2f;
						component.Teleport(val3, Quaternion.identity);
						num++;
					}
				}
			}
		}

		private void SpawnItems(Vector3 center, int amount)
		{
			//IL_008b: Unknown result type (might be due to invalid IL or missing references)
			//IL_009f: Unknown result type (might be due to invalid IL or missing references)
			//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
			//IL_00b3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c2: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c9: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ce: Unknown result type (might be due to invalid IL or missing references)
			//IL_0104: Unknown result type (might be due to invalid IL or missing references)
			//IL_0106: 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_00ea: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)ShopManager.instance))
			{
				return;
			}
			List<Item> potentialItems = ShopManager.instance.potentialItems;
			if (potentialItems == null || potentialItems.Count == 0)
			{
				return;
			}
			for (int i = 0; i < amount; i++)
			{
				Item val = potentialItems[Random.Range(0, potentialItems.Count)];
				if (!((Object)(object)val == (Object)null) && val.prefab != null)
				{
					float num = (float)i * (MathF.PI * 2f / (float)Mathf.Max(1, amount));
					Vector3 val2 = center + new Vector3(Mathf.Cos(num), 0f, Mathf.Sin(num)) * 1.2f + Vector3.up * 0.1f;
					Quaternion identity = Quaternion.identity;
					if (SemiFunc.IsMultiplayer())
					{
						PhotonNetwork.InstantiateRoomObject(val.prefab.ResourcePath, val2, identity, (byte)0, (object[])null);
					}
					else
					{
						Object.Instantiate<GameObject>(val.prefab.Prefab, val2, identity);
					}
				}
			}
		}

		private void GrantRandomUpgrade()
		{
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null || list.Count == 0)
			{
				return;
			}
			PlayerAvatar val = list[Random.Range(0, list.Count)];
			if (Object.op_Implicit((Object)(object)val))
			{
				string steamID = val.steamID;
				switch (Random.Range(0, 11))
				{
				case 0:
					PunManager.instance.UpgradePlayerHealth(steamID, 1);
					break;
				case 1:
					PunManager.instance.UpgradePlayerEnergy(steamID, 1);
					break;
				case 2:
					PunManager.instance.UpgradePlayerExtraJump(steamID, 1);
					break;
				case 3:
					PunManager.instance.UpgradePlayerTumbleLaunch(steamID, 1);
					break;
				case 4:
					PunManager.instance.UpgradePlayerTumbleClimb(steamID, 1);
					break;
				case 5:
					PunManager.instance.UpgradePlayerTumbleWings(steamID, 1);
					break;
				case 6:
					PunManager.instance.UpgradePlayerSprintSpeed(steamID, 1);
					break;
				case 7:
					PunManager.instance.UpgradePlayerCrouchRest(steamID, 1);
					break;
				case 8:
					PunManager.instance.UpgradePlayerGrabStrength(steamID, 1);
					break;
				case 9:
					PunManager.instance.UpgradePlayerThrowStrength(steamID, 1);
					break;
				case 10:
					PunManager.instance.UpgradePlayerGrabRange(steamID, 1);
					break;
				}
			}
		}

		private void RandomizeColors()
		{
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null || list.Count == 0)
			{
				return;
			}
			int count = AssetManager.instance.playerColors.Count;
			if (count <= 0)
			{
				return;
			}
			for (int i = 0; i < list.Count; i++)
			{
				PlayerAvatar val = list[i];
				if (Object.op_Implicit((Object)(object)val))
				{
					int num = Random.Range(0, count);
					val.PlayerAvatarSetColor(num);
				}
			}
		}

		private void TurnOffAllLightsLocal()
		{
			Light[] array = Object.FindObjectsOfType<Light>(true);
			foreach (Light val in array)
			{
				if (Object.op_Implicit((Object)(object)val))
				{
					((Behaviour)val).enabled = false;
				}
			}
		}

		private void LowGravityLocal(float time)
		{
			if (Object.op_Implicit((Object)(object)PlayerController.instance))
			{
				PlayerController.instance.AntiGravity(time);
			}
		}

		private void DropAllHeldItemsHost()
		{
			List<PlayerAvatar> list = SemiFunc.PlayerGetList();
			if (list == null || list.Count == 0)
			{
				return;
			}
			for (int i = 0; i < list.Count; i++)
			{
				PlayerAvatar val = list[i];
				if (Object.op_Implicit((Object)(object)val) && Object.op_Implicit((Object)(object)val.physGrabber) && Object.op_Implicit((Object)(object)val.physGrabber.photonView))
				{
					val.photonView.RPC("ReleaseObjectRPC", (RpcTarget)0, new object[3] { false, 0.1f, -1 });
				}
			}
		}
	}
}