Decompiled source of PeakLobbyBoost v1.0.1

PeakLobbyBoost.dll

Decompiled 3 hours 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 System.Security;
using System.Security.Permissions;
using BepInEx;
using Microsoft.CodeAnalysis;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyCompany("PeakLobbyBoost")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+467b1027a4fbc0ddb98a643aa1f47e2de9ebdd57")]
[assembly: AssemblyProduct("PeakLobbyBoost")]
[assembly: AssemblyTitle("PeakLobbyBoost")]
[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.Module, AllowMultiple = false, Inherited = false)]
	internal sealed class RefSafetyRulesAttribute : Attribute
	{
		public readonly int Version;

		public RefSafetyRulesAttribute(int P_0)
		{
			Version = P_0;
		}
	}
}
namespace PeakLobbyBoost
{
	[BepInPlugin("com.mountainfarmer.peaklobbyboost", "Peak Lobby Boost", "1.0.0")]
	[BepInProcess("PEAK.exe")]
	public class Plugin : BaseUnityPlugin
	{
		public const string ModGuid = "com.mountainfarmer.peaklobbyboost";

		public const string ModName = "Peak Lobby Boost";

		public const string ModVersion = "1.0.0";

		private const float SPEED_MULTIPLIER = 1.5f;

		private const float STAMINA_REFILL_AMOUNT = 100f;

		private const float JUMP_MULTIPLIER = 2.5f;

		private const float CLIMB_MULTIPLIER = 4.5f;

		private FieldInfo localCharacterField;

		private PropertyInfo inAirportProperty;

		private FieldInfo characterDataField;

		private PropertyInfo currentStaminaProperty;

		private FieldInfo refsField;

		private FieldInfo movementField;

		private FieldInfo movementModifierField;

		private FieldInfo sprintMultiplierField;

		private FieldInfo jumpImpulseField;

		private FieldInfo climbingField;

		private FieldInfo climbSpeedModField;

		private PropertyInfo playerCharacterProperty;

		private MethodInfo getAllPlayersMethod;

		private Dictionary<object, float> originalMovementModifiers = new Dictionary<object, float>();

		private Dictionary<object, float> originalSprintMultipliers = new Dictionary<object, float>();

		private Dictionary<object, float> originalJumpImpulses = new Dictionary<object, float>();

		private Dictionary<object, float> originalClimbSpeeds = new Dictionary<object, float>();

		private HashSet<object> playersInAirport = new HashSet<object>();

		private void Awake()
		{
			((BaseUnityPlugin)this).Logger.LogInfo((object)"Peak Lobby Boost v1.0.0 loaded!");
			CacheReflection();
		}

		private void CacheReflection()
		{
			try
			{
				Type type = Type.GetType("Character, Assembly-CSharp");
				if (type != null)
				{
					localCharacterField = type.GetField("localCharacter", BindingFlags.Static | BindingFlags.Public);
					inAirportProperty = type.GetProperty("inAirport", BindingFlags.Instance | BindingFlags.Public);
					characterDataField = type.GetField("data", BindingFlags.Instance | BindingFlags.Public);
					refsField = type.GetField("refs", BindingFlags.Instance | BindingFlags.Public);
				}
				Type type2 = Type.GetType("CharacterData, Assembly-CSharp");
				if (type2 != null)
				{
					currentStaminaProperty = type2.GetProperty("currentStamina", BindingFlags.Instance | BindingFlags.Public);
				}
				Type type3 = Type.GetType("Character+CharacterRefs, Assembly-CSharp");
				if (type3 != null)
				{
					movementField = type3.GetField("movement", BindingFlags.Instance | BindingFlags.Public);
					climbingField = type3.GetField("climbing", BindingFlags.Instance | BindingFlags.Public);
				}
				Type type4 = Type.GetType("CharacterMovement, Assembly-CSharp");
				if (type4 != null)
				{
					movementModifierField = type4.GetField("movementModifier", BindingFlags.Instance | BindingFlags.Public);
					sprintMultiplierField = type4.GetField("sprintMultiplier", BindingFlags.Instance | BindingFlags.Public);
					jumpImpulseField = type4.GetField("jumpImpulse", BindingFlags.Instance | BindingFlags.Public);
				}
				Type type5 = Type.GetType("CharacterClimbing, Assembly-CSharp");
				if (type5 != null)
				{
					climbSpeedModField = type5.GetField("climbSpeedMod", BindingFlags.Instance | BindingFlags.Public);
				}
				Type typeFromHandle = typeof(Player);
				playerCharacterProperty = typeFromHandle.GetProperty("character", BindingFlags.Instance | BindingFlags.Public);
				Type type6 = Type.GetType("PlayerHandler, Assembly-CSharp");
				if (type6 != null)
				{
					getAllPlayersMethod = type6.GetMethod("GetAllPlayers", BindingFlags.Static | BindingFlags.Public);
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Reflection cached successfully");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to cache reflection: " + ex.Message));
			}
		}

		private void Update()
		{
			try
			{
				object localCharacter = GetLocalCharacter();
				if (localCharacter != null)
				{
					bool flag = IsInAirport(localCharacter);
					bool flag2 = playersInAirport.Contains(localCharacter);
					if (flag && !flag2)
					{
						OnPlayerEnterAirport(localCharacter);
						playersInAirport.Add(localCharacter);
					}
					else if (!flag && flag2)
					{
						OnPlayerExitAirport(localCharacter);
						playersInAirport.Remove(localCharacter);
					}
					if (flag)
					{
						ApplyInfiniteStamina(localCharacter);
					}
				}
			}
			catch
			{
			}
		}

		private object GetLocalCharacter()
		{
			try
			{
				if (localCharacterField == null)
				{
					return null;
				}
				return localCharacterField.GetValue(null);
			}
			catch
			{
				return null;
			}
		}

		private IEnumerable GetAllPlayers()
		{
			try
			{
				if (getAllPlayersMethod != null)
				{
					return getAllPlayersMethod.Invoke(null, null) as IEnumerable;
				}
				return Object.FindObjectsOfType<Player>();
			}
			catch
			{
				return null;
			}
		}

		private object GetCharacterFromPlayer(object player)
		{
			try
			{
				if (playerCharacterProperty == null)
				{
					return null;
				}
				return playerCharacterProperty.GetValue(player);
			}
			catch
			{
				return null;
			}
		}

		private bool IsInAirport(object character)
		{
			try
			{
				if (inAirportProperty == null)
				{
					return false;
				}
				return (bool)inAirportProperty.GetValue(character);
			}
			catch
			{
				return false;
			}
		}

		private void OnPlayerEnterAirport(object character)
		{
			try
			{
				object characterMovement = GetCharacterMovement(character);
				if (characterMovement != null)
				{
					if (movementModifierField != null && !originalMovementModifiers.ContainsKey(character))
					{
						float num = (float)movementModifierField.GetValue(characterMovement);
						originalMovementModifiers[character] = num;
						movementModifierField.SetValue(characterMovement, num * 1.5f);
					}
					if (sprintMultiplierField != null && !originalSprintMultipliers.ContainsKey(character))
					{
						float num2 = (float)sprintMultiplierField.GetValue(characterMovement);
						originalSprintMultipliers[character] = num2;
						sprintMultiplierField.SetValue(characterMovement, num2 * 1.5f);
					}
					if (jumpImpulseField != null && !originalJumpImpulses.ContainsKey(character))
					{
						float num3 = (float)jumpImpulseField.GetValue(characterMovement);
						originalJumpImpulses[character] = num3;
						jumpImpulseField.SetValue(characterMovement, num3 * 2.5f);
					}
				}
				object characterClimbing = GetCharacterClimbing(character);
				if (characterClimbing != null && climbSpeedModField != null && !originalClimbSpeeds.ContainsKey(character))
				{
					float num4 = (float)climbSpeedModField.GetValue(characterClimbing);
					originalClimbSpeeds[character] = num4;
					climbSpeedModField.SetValue(characterClimbing, num4 * 4.5f);
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Player entered airport - all boosts applied!");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to apply boosts: " + ex.Message));
			}
		}

		private void OnPlayerExitAirport(object character)
		{
			try
			{
				object characterMovement = GetCharacterMovement(character);
				if (characterMovement != null)
				{
					if (movementModifierField != null && originalMovementModifiers.TryGetValue(character, out var value))
					{
						movementModifierField.SetValue(characterMovement, value);
						originalMovementModifiers.Remove(character);
					}
					if (sprintMultiplierField != null && originalSprintMultipliers.TryGetValue(character, out var value2))
					{
						sprintMultiplierField.SetValue(characterMovement, value2);
						originalSprintMultipliers.Remove(character);
					}
					if (jumpImpulseField != null && originalJumpImpulses.TryGetValue(character, out var value3))
					{
						jumpImpulseField.SetValue(characterMovement, value3);
						originalJumpImpulses.Remove(character);
					}
				}
				object characterClimbing = GetCharacterClimbing(character);
				if (characterClimbing != null && climbSpeedModField != null && originalClimbSpeeds.TryGetValue(character, out var value4))
				{
					climbSpeedModField.SetValue(characterClimbing, value4);
					originalClimbSpeeds.Remove(character);
				}
				((BaseUnityPlugin)this).Logger.LogInfo((object)"Player exited airport - all values restored");
			}
			catch (Exception ex)
			{
				((BaseUnityPlugin)this).Logger.LogError((object)("Failed to restore values: " + ex.Message));
			}
		}

		private void ApplyInfiniteStamina(object character)
		{
			try
			{
				if (!(characterDataField == null))
				{
					object value = characterDataField.GetValue(character);
					if (value != null && !(currentStaminaProperty == null))
					{
						currentStaminaProperty.SetValue(value, 100f);
					}
				}
			}
			catch
			{
			}
		}

		private object GetCharacterMovement(object character)
		{
			try
			{
				if (refsField == null)
				{
					return null;
				}
				object value = refsField.GetValue(character);
				if (value == null)
				{
					return null;
				}
				if (movementField == null)
				{
					return null;
				}
				return movementField.GetValue(value);
			}
			catch
			{
				return null;
			}
		}

		private object GetCharacterClimbing(object character)
		{
			try
			{
				if (refsField == null)
				{
					return null;
				}
				object value = refsField.GetValue(character);
				if (value == null)
				{
					return null;
				}
				if (climbingField == null)
				{
					return null;
				}
				return climbingField.GetValue(value);
			}
			catch
			{
				return null;
			}
		}
	}
}