Decompiled source of PalThrow v1.6.5

PalThrow.dll

Decompiled 3 days ago
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 HarmonyLib;
using Photon.Pun;
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("PalThrow")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("PalThrow")]
[assembly: AssemblyCopyright("Copyright ©  2025")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("15a56718-251a-4536-8cc0-c9f38bd1b995")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: TargetFramework(".NETFramework,Version=v4.7.2", FrameworkDisplayName = ".NET Framework 4.7.2")]
[assembly: AssemblyVersion("1.0.0.0")]
namespace PalThrow;

[BepInPlugin("com.lamia.palthrow", "PalThrow", "1.6.5")]
public class Plugin : BaseUnityPlugin
{
	public static ConfigEntry<float> BaseThrowStrength;

	public static ConfigEntry<float> MaxChargeTime;

	public static ConfigEntry<float> StaminaCost;

	public static ConfigEntry<float> MinThrowStrength;

	public static ConfigEntry<float> MaxThrowStrength;

	public static ConfigEntry<KeyCode> ThrowKey;

	internal static ManualLogSource Log;

	private void Awake()
	{
		//IL_00d2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00d8: Expected O, but got Unknown
		ThrowKey = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("Controls", "ThrowKey", (KeyCode)120, "The key to activate the slide");
		MaxChargeTime = ((BaseUnityPlugin)this).Config.Bind<float>("General", "MaxChargeTime", 3f, "Max charge time in seconds.");
		StaminaCost = ((BaseUnityPlugin)this).Config.Bind<float>("General", "StaminaCost", 1f, "Stamina drain per second multiplier.");
		MinThrowStrength = ((BaseUnityPlugin)this).Config.Bind<float>("Throwing", "MinThrowStrength", 0.5f, "Throw strength at 0% charge.");
		MaxThrowStrength = ((BaseUnityPlugin)this).Config.Bind<float>("Throwing", "MaxThrowStrength", 2.5f, "Throw strength at 100% charge.");
		Log = ((BaseUnityPlugin)this).Logger;
		Log.LogInfo((object)"PalThrow loaded.");
		Harmony val = new Harmony("com.lamia.palthrow");
		val.PatchAll();
	}
}
[HarmonyPatch(typeof(Character), "Awake")]
public static class PalThrow
{
	[HarmonyPostfix]
	public static void AwakePatch(Character __instance)
	{
		if ((Object)(object)((Component)__instance).GetComponent<PalThrowManager>() == (Object)null)
		{
			((Component)__instance).gameObject.AddComponent<PalThrowManager>();
			Plugin.Log.LogInfo((object)("PalThrowManager added to: " + ((Object)__instance).name));
		}
	}
}
public class PalThrowManager : MonoBehaviourPun
{
	private Character character;

	private float chargeTime = 0f;

	private float lastThrowTime = -999f;

	private bool isCharging = false;

	private void Start()
	{
		character = ((Component)this).GetComponent<Character>();
	}

	private void Update()
	{
		//IL_0084: Unknown result type (might be due to invalid IL or missing references)
		if (!character.IsLocal)
		{
			return;
		}
		if (Time.time < lastThrowTime + 3f)
		{
			isCharging = false;
			chargeTime = 0f;
			return;
		}
		Character characterStandingOnMe = GetCharacterStandingOnMe();
		if ((Object)(object)characterStandingOnMe == (Object)null)
		{
			if (isCharging)
			{
				isCharging = false;
				chargeTime = 0f;
			}
		}
		else if (Input.GetKey(Plugin.ThrowKey.Value))
		{
			if (!isCharging)
			{
				isCharging = true;
				chargeTime = 0f;
			}
			chargeTime += Time.deltaTime;
			if (chargeTime >= Plugin.MaxChargeTime.Value)
			{
				chargeTime = Plugin.MaxChargeTime.Value;
				character.data.sinceUseStamina = 0f;
				return;
			}
			float num = Plugin.StaminaCost.Value * 0.2f * Time.deltaTime;
			if (character.GetTotalStamina() > num)
			{
				character.AddStamina(0f - num);
				character.data.sinceUseStamina = 0f;
				return;
			}
			chargeTime = Mathf.Max(new float[1] { 0.01f });
			character.PassOutInstantly();
			isCharging = false;
		}
		else if (isCharging)
		{
			Throw(characterStandingOnMe);
			characterStandingOnMe = null;
		}
	}

	private void Throw(Character target)
	{
		isCharging = false;
		if ((Object)(object)target == (Object)null)
		{
			Plugin.Log.LogInfo((object)"No character is currently standing on you.");
			chargeTime = 0f;
			return;
		}
		chargeTime = Mathf.Clamp(chargeTime, 0f, Plugin.MaxChargeTime.Value);
		float num = chargeTime / Plugin.MaxChargeTime.Value;
		float strength = Mathf.Lerp(Plugin.MinThrowStrength.Value, Plugin.MaxThrowStrength.Value, num) * 1000f;
		DoThrow(target, strength);
		lastThrowTime = Time.time;
		chargeTime = 0f;
	}

	private Character GetCharacterStandingOnMe()
	{
		Character[] array = Object.FindObjectsOfType<Character>();
		foreach (Character val in array)
		{
			if ((Object)(object)val != (Object)(object)character && (Object)(object)val.data.lastStoodOnPlayer == (Object)(object)character && val.data.sinceStandOnPlayer <= 0.3f)
			{
				return val;
			}
		}
		return null;
	}

	private void DoThrow(Character target, float strength)
	{
		//IL_0067: Unknown result type (might be due to invalid IL or missing references)
		//IL_006c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0099: Unknown result type (might be due to invalid IL or missing references)
		if ((Object)(object)target == (Object)null || (Object)(object)target.data.lastStoodOnPlayer != (Object)(object)character)
		{
			Plugin.Log.LogWarning((object)"Invalid throw target.");
			return;
		}
		Camera main = Camera.main;
		if ((Object)(object)main == (Object)null)
		{
			Plugin.Log.LogWarning((object)"Main camera not found.");
			return;
		}
		Vector3 forward = ((Component)main).transform.forward;
		((MonoBehaviourPun)this).photonView.RPC("ThrowCharacterRpc", (RpcTarget)0, new object[3]
		{
			target.refs.view.ViewID,
			forward,
			strength
		});
		target.data.lastStoodOnPlayer = null;
		Plugin.Log.LogInfo((object)$"Threw {((Object)target).name} with strength {strength:F2}.");
	}

	[PunRPC]
	public void ThrowCharacterRpc(int viewID, Vector3 direction, float strength)
	{
		//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_0053: Unknown result type (might be due to invalid IL or missing references)
		//IL_0087: Unknown result type (might be due to invalid IL or missing references)
		Character val = FindCharacterByViewID(viewID);
		if ((Object)(object)val == (Object)null)
		{
			Plugin.Log.LogWarning((object)"Target character not found via ViewID.");
			return;
		}
		foreach (Bodypart part in val.refs.ragdoll.partList)
		{
			Vector3 val2 = direction * strength;
			part.AddForce(val2, (ForceMode)5);
		}
		Plugin.Log.LogInfo((object)$"[RPC] Threw {((Object)val).name} in direction {direction} with strength {strength}.");
	}

	private Character FindCharacterByViewID(int viewID)
	{
		foreach (Character allCharacter in Character.AllCharacters)
		{
			if ((Object)(object)allCharacter.refs.view != (Object)null && allCharacter.refs.view.ViewID == viewID)
			{
				return allCharacter;
			}
		}
		return null;
	}
}