Decompiled source of ZeroGravity v2.1.0

plugins/ZeroGravityMod.dll

Decompiled 5 days ago
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using HarmonyLib;
using Photon.Pun;
using UnityEngine;

[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("ZeroGravityMod")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("ZeroGravityMod")]
[assembly: AssemblyTitle("ZeroGravityMod")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace ZeroGravityMod;

[BepInPlugin("yourname.peak.zerogravity", "ZeroGravity", "2.2.0")]
public class ZeroGravityPlugin : BaseUnityPlugin
{
	[CompilerGenerated]
	private sealed class <PlayWarningBeeps>d__22 : IEnumerator<object>, IEnumerator, IDisposable
	{
		private int <>1__state;

		private object <>2__current;

		public ZeroGravityPlugin <>4__this;

		private int <i>5__2;

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

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

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

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

		private bool MoveNext()
		{
			//IL_0038: Unknown result type (might be due to invalid IL or missing references)
			//IL_0042: Expected O, but got Unknown
			int num = <>1__state;
			ZeroGravityPlugin zeroGravityPlugin = <>4__this;
			switch (num)
			{
			default:
				return false;
			case 0:
				<>1__state = -1;
				<i>5__2 = 0;
				break;
			case 1:
				<>1__state = -1;
				<i>5__2++;
				break;
			}
			if (<i>5__2 < 3)
			{
				zeroGravityPlugin._alarmSource.Play();
				<>2__current = (object)new WaitForSeconds(1f);
				<>1__state = 1;
				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();
		}
	}

	public const string GUID = "yourname.peak.zerogravity";

	public const string NAME = "ZeroGravity";

	public const string VERSION = "2.2.0";

	internal static ManualLogSource Log;

	internal static ZeroGravityPlugin Instance;

	private ConfigEntry<float> _countdownSeconds;

	private ConfigEntry<float> _floatDurationSeconds;

	private ConfigEntry<string> _triggerKey;

	private float _timer;

	private bool _loopActive;

	private bool _hasStarted;

	private bool _countingDown;

	private bool _floatActive;

	private bool _warningPlayed;

	private Vector3 _normalGravity;

	private const float LIFT = 150f;

	private const float WARNING_SECONDS = 3f;

	private AudioSource _alarmSource;

	private Harmony _harmony;

	private void Awake()
	{
		//IL_0081: 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_00f4: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fe: Expected O, but got Unknown
		Instance = this;
		Log = ((BaseUnityPlugin)this).Logger;
		_countdownSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("General", "CountdownSeconds", 180f, "Seconds of countdown before float. Default: 180 (3 minutes).");
		_floatDurationSeconds = ((BaseUnityPlugin)this).Config.Bind<float>("General", "FloatDurationSeconds", 10f, "How many seconds the float lasts. Default: 10.");
		_triggerKey = ((BaseUnityPlugin)this).Config.Bind<string>("General", "TriggerKey", "l", "Key to start the loop. Default: l.");
		_normalGravity = Physics.gravity;
		_alarmSource = ((Component)this).gameObject.AddComponent<AudioSource>();
		_alarmSource.spatialBlend = 0f;
		_alarmSource.volume = 0.8f;
		_alarmSource.loop = false;
		_alarmSource.playOnAwake = false;
		_alarmSource.clip = CreateBeepClip(880f, 0.18f);
		_harmony = new Harmony("yourname.peak.zerogravity");
		_harmony.PatchAll();
		Log.LogInfo((object)("ZeroGravity v2.2.0 loaded! Press " + _triggerKey.Value + " to start the loop for ALL players."));
	}

	private void Update()
	{
		if (!_hasStarted && Input.GetKeyDown(_triggerKey.Value.ToLower()))
		{
			if ((Object)(object)Character.localCharacter != (Object)null)
			{
				Instance._hasStarted = true;
				((MonoBehaviourPun)Character.localCharacter).photonView.RPC("ZeroGravity_StartLoop", (RpcTarget)0, Array.Empty<object>());
			}
			else
			{
				Instance._hasStarted = true;
				StartLoop();
			}
		}
		if (!_loopActive)
		{
			return;
		}
		_timer += Time.deltaTime;
		if (_countingDown)
		{
			if (!_warningPlayed && _timer >= _countdownSeconds.Value - 3f)
			{
				_warningPlayed = true;
				((MonoBehaviour)this).StartCoroutine(PlayWarningBeeps());
				Log.LogInfo((object)"[ZeroGravity] Warning beeps!");
			}
			if (_timer >= _countdownSeconds.Value)
			{
				_countingDown = false;
				ActivateFloat();
			}
		}
		else if (_floatActive && _timer >= _floatDurationSeconds.Value)
		{
			DeactivateFloat();
			_countingDown = true;
			_warningPlayed = false;
			_timer = 0f;
			Log.LogInfo((object)$"[ZeroGravity] Next float in {_countdownSeconds.Value}s.");
		}
	}

	public void StartLoop()
	{
		_loopActive = true;
		_countingDown = true;
		_warningPlayed = false;
		_timer = 0f;
		Log.LogInfo((object)$"[ZeroGravity] Loop started! Float in {_countdownSeconds.Value}s.");
	}

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

	private void FixedUpdate()
	{
		//IL_0074: 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)
		if (!_floatActive)
		{
			return;
		}
		foreach (Character allCharacter in Character.AllCharacters)
		{
			if ((Object)(object)allCharacter == (Object)null || allCharacter.data.dead)
			{
				continue;
			}
			foreach (Bodypart part in allCharacter.refs.ragdoll.partList)
			{
				if (!((Object)(object)part == (Object)null) && !((Object)(object)part.Rig == (Object)null))
				{
					part.Rig.AddForce(Vector3.up * 150f, (ForceMode)5);
				}
			}
		}
	}

	private void ActivateFloat()
	{
		//IL_0012: Unknown result type (might be due to invalid IL or missing references)
		_floatActive = true;
		_timer = 0f;
		Physics.gravity = Vector3.zero;
		Log.LogInfo((object)"[ZeroGravity] Float ON!");
	}

	private void DeactivateFloat()
	{
		//IL_0008: Unknown result type (might be due to invalid IL or missing references)
		_floatActive = false;
		Physics.gravity = _normalGravity;
		Log.LogInfo((object)"[ZeroGravity] Float OFF.");
	}

	private void OnDestroy()
	{
		//IL_0001: Unknown result type (might be due to invalid IL or missing references)
		Physics.gravity = _normalGravity;
		Harmony harmony = _harmony;
		if (harmony != null)
		{
			harmony.UnpatchSelf();
		}
	}

	private static AudioClip CreateBeepClip(float frequency, float duration)
	{
		int num = 44100;
		int num2 = Mathf.CeilToInt((float)num * duration);
		float[] array = new float[num2];
		for (int i = 0; i < num2; i++)
		{
			float num3 = (float)i / (float)num;
			float num4 = Mathf.Clamp01((float)(num2 - i) / ((float)num * 0.02f));
			array[i] = Mathf.Sin(MathF.PI * 2f * frequency * num3) * num4;
		}
		AudioClip obj = AudioClip.Create("ZeroGravWarning", num2, 1, num, false);
		obj.SetData(array, 0);
		return obj;
	}
}
[HarmonyPatch(typeof(Character))]
public static class CharacterPatch
{
	[HarmonyPatch("Awake")]
	[HarmonyPostfix]
	public static void Awake_Postfix(Character __instance)
	{
		if ((Object)(object)((Component)__instance).GetComponent<ZeroGravityRPC>() == (Object)null)
		{
			((Component)__instance).gameObject.AddComponent<ZeroGravityRPC>();
		}
	}
}
public class ZeroGravityRPC : MonoBehaviourPun
{
	[PunRPC]
	public void ZeroGravity_StartLoop()
	{
		ZeroGravityPlugin.Instance?.StartLoop();
	}
}