Decompiled source of chai tea v0.1.0

MintTea.dll

Decompiled 3 months ago
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
using System.Runtime.Versioning;
using BepInEx;
using BepInEx.Configuration;
using BepInEx.Logging;
using EntityStates;
using On.EntityStates;
using On.RoR2;
using R2API.Utils;
using RoR2;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("MintTea")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("MintTea")]
[assembly: AssemblyCopyright("Copyright ©  2021")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("57a82728-34f5-4024-9c24-40e2824c6bde")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.6.1", FrameworkDisplayName = ".NET Framework 4.6.1")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace MintTea;

internal class Configuration
{
	public static ConfigEntry<float> MaxAirAccel { get; set; }

	public static ConfigEntry<float> AirAccel { get; set; }

	public static ConfigEntry<bool> AutoHop { get; set; }

	public static void InitConfig(ConfigFile configFile)
	{
		MaxAirAccel = configFile.Bind<float>("Quake", "Max air acceleration", 3f, "I don't know what this number does. Default: 3");
		AirAccel = configFile.Bind<float>("Quake", "Air acceleration", 30f, "Higher values mean more speedgain while strafing. Default: 30");
		AutoHop = configFile.Bind<bool>("Quake", "Auto hop", true, "Automatically jump when landing while holding the jump key. Default: true");
	}
}
internal class DefaultMovement
{
	public static void AirMovement(CharacterMotor self, float deltaTime)
	{
		//IL_001f: Unknown result type (might be due to invalid IL or missing references)
		//IL_0024: Unknown result type (might be due to invalid IL or missing references)
		//IL_0094: Unknown result type (might be due to invalid IL or missing references)
		//IL_009b: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00c6: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
		//IL_00cf: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		//IL_008c: 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)
		float num = self.acceleration * (self.disableAirControlUntilCollision ? 0f : self.airControl);
		Vector3 val = self.moveDirection;
		if (!self.isFlying)
		{
			val.y = 0f;
		}
		CharacterBody obj = Reflection.Access<CharacterBody>(self, "body");
		if (obj != null && obj.isSprinting && 0f < ((Vector3)(ref val)).magnitude && ((Vector3)(ref val)).magnitude < 1f)
		{
			val /= ((Vector3)(ref val)).magnitude;
		}
		Vector3 val2 = val * self.walkSpeed;
		if (!self.isFlying)
		{
			val2.y = self.velocity.y;
		}
		self.velocity = Vector3.MoveTowards(self.velocity, val2, num * deltaTime);
	}

	public static void GroundMovement(CharacterMotor self, float deltaTime)
	{
		//IL_0009: Unknown result type (might be due to invalid IL or missing references)
		//IL_000e: 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_0085: 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_00b0: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b5: 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_006e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0076: Unknown result type (might be due to invalid IL or missing references)
		//IL_007b: Unknown result type (might be due to invalid IL or missing references)
		float acceleration = self.acceleration;
		Vector3 val = self.moveDirection;
		if (!self.isFlying)
		{
			val.y = 0f;
		}
		CharacterBody obj = Reflection.Access<CharacterBody>(self, "body");
		if (obj != null && obj.isSprinting && 0f < ((Vector3)(ref val)).magnitude && ((Vector3)(ref val)).magnitude < 1f)
		{
			val /= ((Vector3)(ref val)).magnitude;
		}
		Vector3 val2 = val * self.walkSpeed;
		if (!self.isFlying)
		{
			val2.y = self.velocity.y;
		}
		self.velocity = Vector3.MoveTowards(self.velocity, val2, acceleration * deltaTime);
	}
}
[NetworkCompatibility(/*Could not decode attribute arguments.*/)]
[BepInDependency(/*Could not decode attribute arguments.*/)]
[BepInPlugin("com.wellme.MintTea", "Mint tea", "0.1.4")]
public class MintTea : BaseUnityPlugin
{
	[Serializable]
	[CompilerGenerated]
	private sealed class <>c
	{
		public static readonly <>c <>9 = new <>c();

		public static hook_ApplyJumpVelocity <>9__1_3;

		internal void <Awake>b__1_3(orig_ApplyJumpVelocity orig, CharacterMotor characterMotor, CharacterBody characterBody, float horizontalBonus, float verticalBonus, bool vault)
		{
			//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_0018: Unknown result type (might be due to invalid IL or missing references)
			//IL_0023: 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_0079: 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_005c: 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)
			Vector3 velocity = characterMotor.velocity;
			orig.Invoke(characterMotor, characterBody, horizontalBonus, verticalBonus, vault);
			Vector3 velocity2 = characterMotor.moveDirection * characterBody.moveSpeed * horizontalBonus;
			if (((Vector3)(ref characterMotor.velocity)).sqrMagnitude < ((Vector3)(ref velocity2)).sqrMagnitude)
			{
				velocity2.y = characterMotor.velocity.y;
				characterMotor.velocity = velocity2;
			}
			else
			{
				velocity.y = characterMotor.velocity.y;
				characterMotor.velocity = velocity;
			}
		}
	}

	private Dictionary<CharacterMotor, MintTeaInfo> info = new Dictionary<CharacterMotor, MintTeaInfo>();

	public void Awake()
	{
		//IL_0020: Unknown result type (might be due to invalid IL or missing references)
		//IL_002a: Expected O, but got Unknown
		//IL_0054: Unknown result type (might be due to invalid IL or missing references)
		//IL_005e: Expected O, but got Unknown
		//IL_0041: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Expected O, but got Unknown
		//IL_0073: 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_007e: Expected O, but got Unknown
		Reflection.Logger = ((BaseUnityPlugin)this).Logger;
		Configuration.InitConfig(((BaseUnityPlugin)this).Config);
		CharacterMotor.PreMove += (hook_PreMove)delegate(orig_PreMove orig, CharacterMotor self, float deltaTime)
		{
			//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_001e: Unknown result type (might be due to invalid IL or missing references)
			//IL_001f: Unknown result type (might be due to invalid IL or missing references)
			Vector3 velocity3 = self.velocity;
			orig.Invoke(self, deltaTime);
			if (IsPlayerControlled(self))
			{
				self.velocity = velocity3;
				PreMove(self, deltaTime);
			}
		};
		if (Configuration.AutoHop.Value)
		{
			GenericCharacterMain.GatherInputs += (hook_GatherInputs)delegate(orig_GatherInputs orig, GenericCharacterMain self)
			{
				orig.Invoke(self);
				CharacterMotor motor2;
				if (Reflection.Access<bool>(self, "hasInputBank") && (motor2 = GetMotor(self)) != null)
				{
					GetInfo(motor2).GroundedJump = Reflection.AccessProperty<InputBankTest>(self, typeof(EntityState), "inputBank").jump.down;
				}
			};
		}
		GenericCharacterMain.ProcessJump += (hook_ProcessJump)delegate(orig_ProcessJump orig, GenericCharacterMain self)
		{
			CharacterMotor motor = GetMotor(self);
			if (motor != null && motor.isGrounded)
			{
				MintTeaInfo mintTeaInfo = GetInfo(motor);
				if (mintTeaInfo != null && mintTeaInfo.GroundedJump)
				{
					Reflection.Set(self, "jumpInputReceived", true);
				}
			}
			orig.Invoke(self);
		};
		object obj = <>c.<>9__1_3;
		if (obj == null)
		{
			hook_ApplyJumpVelocity val = delegate(orig_ApplyJumpVelocity orig, CharacterMotor characterMotor, CharacterBody characterBody, float horizontalBonus, float verticalBonus, bool vault)
			{
				//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_0018: Unknown result type (might be due to invalid IL or missing references)
				//IL_0023: 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_0079: 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_005c: 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)
				Vector3 velocity = characterMotor.velocity;
				orig.Invoke(characterMotor, characterBody, horizontalBonus, verticalBonus, vault);
				Vector3 velocity2 = characterMotor.moveDirection * characterBody.moveSpeed * horizontalBonus;
				if (((Vector3)(ref characterMotor.velocity)).sqrMagnitude < ((Vector3)(ref velocity2)).sqrMagnitude)
				{
					velocity2.y = characterMotor.velocity.y;
					characterMotor.velocity = velocity2;
				}
				else
				{
					velocity.y = characterMotor.velocity.y;
					characterMotor.velocity = velocity;
				}
			};
			<>c.<>9__1_3 = val;
			obj = (object)val;
		}
		GenericCharacterMain.ApplyJumpVelocity += (hook_ApplyJumpVelocity)obj;
	}

	private void PreMove(CharacterMotor self, float deltaTime)
	{
		//IL_006e: Unknown result type (might be due to invalid IL or missing references)
		if (!self.hasEffectiveAuthority)
		{
			return;
		}
		if (GetInfo(self).LeniencyFrame || !self.isGrounded)
		{
			Quake.AirMovement(self, Configuration.MaxAirAccel.Value, Configuration.AirAccel.Value);
		}
		else
		{
			DefaultMovement.GroundMovement(self, deltaTime);
		}
		if (self.useGravity)
		{
			self.velocity.y += Physics.gravity.y * deltaTime;
			if (self.isGrounded)
			{
				self.velocity.y = Mathf.Max(self.velocity.y, 0f);
			}
		}
		GetInfo(self).LeniencyFrame = !self.isGrounded;
	}

	private MintTeaInfo GetInfo(CharacterMotor motor)
	{
		if ((Object)(object)motor == (Object)null)
		{
			return null;
		}
		if (info.TryGetValue(motor, out var value))
		{
			return value;
		}
		return info[motor] = new MintTeaInfo
		{
			Motor = motor,
			LeniencyFrame = false
		};
	}

	private static CharacterMotor GetMotor(GenericCharacterMain genericCharacterMain)
	{
		return Reflection.AccessProperty<CharacterMotor>(genericCharacterMain, typeof(EntityState), "characterMotor");
	}

	private bool IsPlayerControlled(CharacterMotor motor)
	{
		foreach (PlayerCharacterMasterController instance in PlayerCharacterMasterController.instances)
		{
			object obj;
			if (instance == null)
			{
				obj = null;
			}
			else
			{
				CharacterMaster master = instance.master;
				if (master == null)
				{
					obj = null;
				}
				else
				{
					CharacterBody body = master.GetBody();
					obj = ((body != null) ? body.characterMotor : null);
				}
			}
			if ((Object)obj == (Object)(object)motor)
			{
				return true;
			}
		}
		return false;
	}
}
internal class MintTeaInfo
{
	public CharacterMotor Motor { get; set; }

	public bool LeniencyFrame { get; set; }

	public bool GroundedJump { get; set; }
}
internal class Reflection
{
	public static ManualLogSource Logger { get; set; }

	public static T Access<T>(object o, string field)
	{
		FieldInfo field2 = o.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.GetField);
		if (field2 == null)
		{
			ManualLogSource logger = Logger;
			if (logger != null)
			{
				logger.LogError((object)("Unrecognized field " + field + " in class " + o.GetType().FullName));
			}
		}
		return (T)field2.GetValue(o);
	}

	public static T AccessProperty<T>(object o, Type type, string field)
	{
		PropertyInfo property = type.GetProperty(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty);
		if (property == null)
		{
			ManualLogSource logger = Logger;
			if (logger != null)
			{
				logger.LogError((object)("Unrecognized property " + field + " in class " + type.FullName));
			}
		}
		return (T)property.GetValue(o);
	}

	public static void Set(object o, string field, object value)
	{
		FieldInfo field2 = o.GetType().GetField(field, BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.FlattenHierarchy | BindingFlags.GetField);
		field2.SetValue(o, value);
	}
}
internal class Quake
{
	public static void AirMovement(CharacterMotor characterMotor, float maxAirAccel, float airAccel)
	{
		//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_0037: Unknown result type (might be due to invalid IL or missing references)
		//IL_003c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0049: Unknown result type (might be due to invalid IL or missing references)
		//IL_004b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0050: Unknown result type (might be due to invalid IL or missing references)
		//IL_0054: 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_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_009a: 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_00ab: Unknown result type (might be due to invalid IL or missing references)
		Vector3 moveDirection = characterMotor.moveDirection;
		float num = (((double)((Vector3)(ref moveDirection)).sqrMagnitude > 0.0001) ? quake_getMoveSpeed(characterMotor) : 0f);
		if (num > maxAirAccel)
		{
			num = maxAirAccel;
		}
		Vector3 velocity = characterMotor.velocity;
		velocity.y = 0f;
		Vector3 val = velocity;
		moveDirection = characterMotor.moveDirection;
		float num2 = Vector3.Dot(val, ((Vector3)(ref moveDirection)).normalized);
		float num3 = num - num2;
		if (num3 > 0f)
		{
			float num4 = airAccel * num;
			if (num4 > num3)
			{
				num4 = num3;
			}
			Vector3 velocity2 = characterMotor.velocity;
			moveDirection = characterMotor.moveDirection;
			characterMotor.velocity = velocity2 + ((Vector3)(ref moveDirection)).normalized * num4;
		}
	}

	private static float quake_getMoveSpeed(CharacterMotor characterMotor)
	{
		return characterMotor.walkSpeed;
	}
}