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;
}
}