The BepInEx console will not appear when launching like it does for other games on Thunderstore. This is normal (and helps prevent crashes during startup). You can turn it back on in your BepInEx.cfg file.
Decompiled source of PalThrow v1.6.5
PalThrow.dll
Decompiled 3 days agousing 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; } }