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 HarmonyLib;
using Photon.Pun;
using Unity.Profiling;
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("TestMode")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("TestMode")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("d2645733-f963-4c1f-8730-d00109b9cf6f")]
[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 RescueHookCustomizer
{
[BepInPlugin("Extern.RescueHookCustomizer", "RescueHookCustomizer", "0.7.110")]
[ContentWarningPlugin("RescueHookCustomizer", "0.7.110", true)]
public class Plugin : BaseUnityPlugin
{
private bool menu;
private const float menuWidth = 300f;
private const float menuHeight = 600f;
private Rect menuRT;
private KeyCode activationKey = (KeyCode)289;
public static float range = 30f;
private float sliderRange = 30f;
public static float launchForce = 10f;
private float sliderLaunchForce = 10f;
public static float spring = 120f;
private float sliderSpring = 120f;
public static float forceOnSwingStop = 50f;
private static float sliderForceOnSwingStop = 50f;
public static float dragForce = 100f;
private float sliderDragForce = 100f;
public static float maxDistanceMultiplier = 0.65f;
public static float minDistanceMultiplier = 0f;
public static bool infinityCharges = false;
public static bool spiderManMode = false;
public static bool alternativeSpidermanMode = false;
public static bool activeRagdollOnUse = true;
public static bool useGravity = false;
public static bool ragdollAndImpulseOnStopUse = false;
public static bool movingInAir = false;
public static bool dragForceOnOwner = true;
private void Awake()
{
//IL_0024: Unknown result type (might be due to invalid IL or missing references)
//IL_0029: Unknown result type (might be due to invalid IL or missing references)
//IL_0033: Unknown result type (might be due to invalid IL or missing references)
//IL_0039: Expected O, but got Unknown
LoadConfig();
menuRT = new Rect((float)Screen.width - 300f, 0f, 300f, 600f);
Harmony val = new Harmony("Extern.RescueHookCustomizer");
val.PatchAll();
((BaseUnityPlugin)this).Logger.LogInfo((object)"Plugin TestMode (by Extern) is loaded!");
}
private void Update()
{
//IL_0002: Unknown result type (might be due to invalid IL or missing references)
if (Input.GetKeyDown(activationKey))
{
menu = !menu;
}
}
private void OnGUI()
{
//IL_000f: Unknown result type (might be due to invalid IL or missing references)
//IL_001b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Expected O, but got Unknown
//IL_002b: Unknown result type (might be due to invalid IL or missing references)
//IL_0030: Unknown result type (might be due to invalid IL or missing references)
if (menu)
{
menuRT = GUILayout.Window(1, menuRT, new WindowFunction(UserMenu), "Rescue hook customizer (by Extern) v0.7.110", (GUILayoutOption[])(object)new GUILayoutOption[0]);
}
}
public static void DestroyObj(Object obj)
{
Object.Destroy(obj);
}
private void LoadConfig()
{
if (PlayerPrefs.GetInt("haveSave") == 1)
{
infinityCharges = PlayerPrefs.GetInt("infinityCharges") == 1;
spiderManMode = PlayerPrefs.GetInt("spiderManMode") == 1;
activeRagdollOnUse = PlayerPrefs.GetInt("activeRagdollOnUse") == 1;
useGravity = PlayerPrefs.GetInt("useGravity") == 1;
ragdollAndImpulseOnStopUse = PlayerPrefs.GetInt("ragdollAndImpulseOnStopUse") == 1;
movingInAir = PlayerPrefs.GetInt("movingInAir") == 1;
alternativeSpidermanMode = PlayerPrefs.GetInt("alternativeSpidermanMode") == 1;
dragForceOnOwner = PlayerPrefs.GetInt("dragForceOnOwner") == 1;
range = PlayerPrefs.GetFloat("range");
launchForce = PlayerPrefs.GetFloat("launchForce");
spring = PlayerPrefs.GetFloat("spring");
maxDistanceMultiplier = PlayerPrefs.GetFloat("maxDistanceMultiplier");
minDistanceMultiplier = PlayerPrefs.GetFloat("minDistanceMultiplier");
sliderRange = PlayerPrefs.GetFloat("sliderRange");
sliderLaunchForce = PlayerPrefs.GetFloat("sliderLaunchForce");
forceOnSwingStop = PlayerPrefs.GetFloat("forceOnSwingStop");
dragForce = PlayerPrefs.GetFloat("dragForce");
}
else
{
PlayerPrefs.SetInt("haveSave", 1);
SaveConfig();
}
}
private void SaveConfig()
{
PlayerPrefs.SetInt("infinityCharges", infinityCharges ? 1 : 0);
PlayerPrefs.SetInt("spiderManMode", spiderManMode ? 1 : 0);
PlayerPrefs.SetInt("activeRagdollOnUse", activeRagdollOnUse ? 1 : 0);
PlayerPrefs.SetInt("useGravity", useGravity ? 1 : 0);
PlayerPrefs.SetInt("ragdollAndImpulseOnStopUse", ragdollAndImpulseOnStopUse ? 1 : 0);
PlayerPrefs.SetInt("movingInAir", movingInAir ? 1 : 0);
PlayerPrefs.SetInt("alternativeSpidermanMode", alternativeSpidermanMode ? 1 : 0);
PlayerPrefs.SetInt("dragForceOnOwner", dragForceOnOwner ? 1 : 0);
PlayerPrefs.SetFloat("range", range);
PlayerPrefs.SetFloat("launchForce", launchForce);
PlayerPrefs.SetFloat("spring", spring);
PlayerPrefs.SetFloat("maxDistanceMultiplier", maxDistanceMultiplier);
PlayerPrefs.SetFloat("minDistanceMultiplier", minDistanceMultiplier);
PlayerPrefs.SetFloat("sliderRange", sliderRange);
PlayerPrefs.SetFloat("sliderLaunchForce", sliderLaunchForce);
PlayerPrefs.SetFloat("forceOnSwingStop", forceOnSwingStop);
PlayerPrefs.SetFloat("dragForce", dragForce);
}
private void ResetProperties()
{
range = 30f;
launchForce = 10f;
infinityCharges = false;
spiderManMode = false;
activeRagdollOnUse = true;
useGravity = false;
ragdollAndImpulseOnStopUse = false;
movingInAir = false;
alternativeSpidermanMode = false;
spring = 120f;
maxDistanceMultiplier = 0.65f;
minDistanceMultiplier = 0f;
sliderRange = 30f;
sliderLaunchForce = 10f;
forceOnSwingStop = 50f;
dragForceOnOwner = true;
}
private void UserMenu(int id)
{
infinityCharges = GUILayout.Toggle(infinityCharges, "Infinity charges", Array.Empty<GUILayoutOption>());
spiderManMode = GUILayout.Toggle(spiderManMode, "Spiderman mode", Array.Empty<GUILayoutOption>());
alternativeSpidermanMode = GUILayout.Toggle(alternativeSpidermanMode, "Alternative spiderman mode", Array.Empty<GUILayoutOption>());
activeRagdollOnUse = GUILayout.Toggle(activeRagdollOnUse, "Active ragdoll on use", Array.Empty<GUILayoutOption>());
useGravity = GUILayout.Toggle(useGravity, "Use gravity on fire", Array.Empty<GUILayoutOption>());
ragdollAndImpulseOnStopUse = GUILayout.Toggle(ragdollAndImpulseOnStopUse, "Ragdoll and impulse on stop use", Array.Empty<GUILayoutOption>());
movingInAir = GUILayout.Toggle(movingInAir, "Moving in air", Array.Empty<GUILayoutOption>());
dragForceOnOwner = GUILayout.Toggle(dragForceOnOwner, "Drag force on owner", Array.Empty<GUILayoutOption>());
GUILayout.Label($"Range: {range} (default: {30f})", Array.Empty<GUILayoutOption>());
sliderRange = GUILayout.HorizontalSlider(sliderRange, 1f, 1000f, Array.Empty<GUILayoutOption>());
range = (int)sliderRange;
GUILayout.Label($"Launch force: {launchForce} (default: {10f})", Array.Empty<GUILayoutOption>());
sliderLaunchForce = GUILayout.HorizontalSlider(sliderLaunchForce, 1f, 500f, Array.Empty<GUILayoutOption>());
launchForce = (int)sliderLaunchForce;
GUILayout.Label($"Drag force: {dragForce} (default: {100f})", Array.Empty<GUILayoutOption>());
sliderDragForce = GUILayout.HorizontalSlider(sliderDragForce, 1f, 10000f, Array.Empty<GUILayoutOption>());
dragForce = (int)sliderDragForce;
GUILayout.Label($"Spring: {spring} (default: {120f})", Array.Empty<GUILayoutOption>());
sliderSpring = GUILayout.HorizontalSlider(sliderSpring, 1f, 1000f, Array.Empty<GUILayoutOption>());
spring = (int)sliderSpring;
GUILayout.Label($"Force on swing stop: {forceOnSwingStop} (default: {50f})", Array.Empty<GUILayoutOption>());
sliderForceOnSwingStop = GUILayout.HorizontalSlider(sliderForceOnSwingStop, 1f, 5000f, Array.Empty<GUILayoutOption>());
forceOnSwingStop = (int)sliderForceOnSwingStop;
GUILayout.Label($"Max spring distance multiplier: {maxDistanceMultiplier} (default: {0.65f})", Array.Empty<GUILayoutOption>());
maxDistanceMultiplier = GUILayout.HorizontalSlider(maxDistanceMultiplier, 0f, 2f, Array.Empty<GUILayoutOption>());
GUILayout.Label($"Min spring distance multiplier: {minDistanceMultiplier} (default: {0f})", Array.Empty<GUILayoutOption>());
minDistanceMultiplier = GUILayout.HorizontalSlider(minDistanceMultiplier, 0f, 2f, Array.Empty<GUILayoutOption>());
if (GUILayout.Button("Reset (no save)", (GUILayoutOption[])(object)new GUILayoutOption[0]))
{
ResetProperties();
}
if (GUILayout.Button("Save config", (GUILayoutOption[])(object)new GUILayoutOption[0]))
{
SaveConfig();
}
if (GUILayout.Button("Load config", (GUILayoutOption[])(object)new GUILayoutOption[0]))
{
LoadConfig();
}
GUI.DragWindow();
}
}
public static class PluginConfig
{
public const float defaultRange = 30f;
public const float leftRange = 1f;
public const float rightRange = 1000f;
public const float defaultLaunchForce = 10f;
public const float leftLaunchForce = 1f;
public const float rightLaunchForce = 500f;
public const float springDefault = 120f;
public const float springLeft = 1f;
public const float springRight = 1000f;
public const float damper = 60f;
public const float massScale = 46f;
public const float dragForceDefault = 100f;
public const float dragForceLeft = 1f;
public const float dragForceRight = 10000f;
public const float distanceMultiplierLeft = 0f;
public const float distanceMultiplierRight = 2f;
public const float maxDistanceMultiplierDefault = 0.65f;
public const float minDistanceMultiplierDefault = 0f;
public const float forceOnSwingStopDefault = 50f;
public const float leftForceOnSwingStop = 1f;
public const float rightForceOnSwingStop = 5000f;
public const bool infinityChargesDefault = false;
public const bool spiderManModeDefault = false;
public const bool alternativeSpidermanModeDefault = false;
public const bool activeRagdollOnUseDefault = true;
public const bool useGravityDefault = false;
public const bool ragdollAndImpulseOnStopUseDefault = false;
public const bool movingInAirDefault = false;
public const bool dragForceOnOwnerDefault = true;
}
public class PluginInfo : BaseUnityPlugin
{
public const string pluginGuid = "Extern.RescueHookCustomizer";
public const string pluginName = "RescueHookCustomizer";
public const string pluginVersion = "0.7.110";
}
}
namespace RescueHookCustomizer.Patch
{
[HarmonyPatch(typeof(PlayerRagdoll))]
public class PlayerRagdollPatch
{
public static FieldInfo playerField = typeof(PlayerRagdoll).GetField("player", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo rigListField = typeof(PlayerRagdoll).GetField("rigList", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo simplifiedFollowAnimMarkerField = typeof(PlayerRagdoll).GetField("simplifiedFollowAnimMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo groundRaycastMarkerField = typeof(PlayerRagdoll).GetField("groundRaycastMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo handleCollisionsMarkerField = typeof(PlayerRagdoll).GetField("handleCollisionsMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo clearSavedCollisionsMarkerField = typeof(PlayerRagdoll).GetField("clearSavedCollisionsMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo followAnimMarkerField = typeof(PlayerRagdoll).GetField("followAnimMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo dragMarkerField = typeof(PlayerRagdoll).GetField("dragMarker", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo ragdollMethodInfo = typeof(Player).GetMethod("Ragdoll", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo toggleGravityMethodInfo = typeof(PlayerRagdoll).GetMethod("ToggleGravity", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo followAnimSimplifiedMethodInfo = typeof(PlayerRagdoll).GetMethod("FollowAnimSimplified", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo handleCollisionsMethodInfo = typeof(PlayerRagdoll).GetMethod("HandleCollisions", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo clearSavedCollisionsMethodInfo = typeof(PlayerRagdoll).GetMethod("ClearSavedCollisions", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo followAnimMethodInfo = typeof(PlayerRagdoll).GetMethod("FollowAnim", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo dragMethodInfo = typeof(PlayerRagdoll).GetMethod("Drag", BindingFlags.Instance | BindingFlags.NonPublic);
[HarmonyPatch("FixedUpdateHandled")]
[HarmonyPrefix]
public static bool FixedUpdateHandledPatch(PlayerRagdoll __instance)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
//IL_0133: Unknown result type (might be due to invalid IL or missing references)
//IL_0138: Unknown result type (might be due to invalid IL or missing references)
//IL_013c: Unknown result type (might be due to invalid IL or missing references)
//IL_0141: Unknown result type (might be due to invalid IL or missing references)
//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
//IL_00d6: Unknown result type (might be due to invalid IL or missing references)
//IL_00da: Unknown result type (might be due to invalid IL or missing references)
//IL_00df: Unknown result type (might be due to invalid IL or missing references)
//IL_01c2: Unknown result type (might be due to invalid IL or missing references)
//IL_01b4: Unknown result type (might be due to invalid IL or missing references)
//IL_01e6: Unknown result type (might be due to invalid IL or missing references)
//IL_01eb: Unknown result type (might be due to invalid IL or missing references)
//IL_01ef: Unknown result type (might be due to invalid IL or missing references)
//IL_01f4: Unknown result type (might be due to invalid IL or missing references)
//IL_0221: Unknown result type (might be due to invalid IL or missing references)
//IL_0226: Unknown result type (might be due to invalid IL or missing references)
//IL_022a: Unknown result type (might be due to invalid IL or missing references)
//IL_022f: Unknown result type (might be due to invalid IL or missing references)
//IL_025c: Unknown result type (might be due to invalid IL or missing references)
//IL_0261: Unknown result type (might be due to invalid IL or missing references)
//IL_0265: Unknown result type (might be due to invalid IL or missing references)
//IL_026a: Unknown result type (might be due to invalid IL or missing references)
//IL_0297: Unknown result type (might be due to invalid IL or missing references)
//IL_029c: Unknown result type (might be due to invalid IL or missing references)
//IL_02a0: Unknown result type (might be due to invalid IL or missing references)
//IL_02a5: Unknown result type (might be due to invalid IL or missing references)
Player val = (Player)playerField.GetValue(__instance);
List<Rigidbody> list = (List<Rigidbody>)rigListField.GetValue(__instance);
if ((bool)ragdollMethodInfo.Invoke(val, null) || (RescueHookPatch.swing && Plugin.useGravity))
{
if (!list[0].useGravity)
{
toggleGravityMethodInfo.Invoke(__instance, new object[1] { true });
}
return false;
}
if (list[0].useGravity)
{
toggleGravityMethodInfo.Invoke(__instance, new object[1] { false });
}
ProfilerMarker val2;
if (val.data.simplifiedRagdoll)
{
val2 = (ProfilerMarker)simplifiedFollowAnimMarkerField.GetValue(__instance);
AutoScope val3 = ((ProfilerMarker)(ref val2)).Auto();
try
{
followAnimSimplifiedMethodInfo.Invoke(__instance, null);
return false;
}
finally
{
((IDisposable)(AutoScope)(ref val3)).Dispose();
}
}
val.data.groundBelow = false;
val.data.groundBelow = val.data.isGrounded;
val2 = (ProfilerMarker)groundRaycastMarkerField.GetValue(__instance);
AutoScope val4 = ((ProfilerMarker)(ref val2)).Auto();
try
{
if (val.refs.controller.alwaysGroundRaycast || (val.data.sinceGrounded < 0.1f && val.data.sinceJump > 0.25f && val.refs.controller.groundRaycast && ((Vector3)(ref val.data.movementVector)).magnitude > 0.1f))
{
__instance.GroundRaycast(false, false, false);
}
else
{
__instance.GroundRaycast(true, false, false);
}
}
finally
{
((IDisposable)(AutoScope)(ref val4)).Dispose();
}
val2 = (ProfilerMarker)handleCollisionsMarkerField.GetValue(__instance);
AutoScope val5 = ((ProfilerMarker)(ref val2)).Auto();
try
{
handleCollisionsMethodInfo.Invoke(__instance, null);
}
finally
{
((IDisposable)(AutoScope)(ref val5)).Dispose();
}
val2 = (ProfilerMarker)clearSavedCollisionsMarkerField.GetValue(__instance);
AutoScope val6 = ((ProfilerMarker)(ref val2)).Auto();
try
{
clearSavedCollisionsMethodInfo.Invoke(__instance, null);
}
finally
{
((IDisposable)(AutoScope)(ref val6)).Dispose();
}
val2 = (ProfilerMarker)followAnimMarkerField.GetValue(__instance);
AutoScope val7 = ((ProfilerMarker)(ref val2)).Auto();
try
{
followAnimMethodInfo.Invoke(__instance, null);
}
finally
{
((IDisposable)(AutoScope)(ref val7)).Dispose();
}
val2 = (ProfilerMarker)dragMarkerField.GetValue(__instance);
AutoScope val8 = ((ProfilerMarker)(ref val2)).Auto();
try
{
dragMethodInfo.Invoke(__instance, null);
}
finally
{
((IDisposable)(AutoScope)(ref val8)).Dispose();
}
return false;
}
}
[HarmonyPatch(typeof(RescueHook))]
public class RescueHookPatch
{
public const float gravity = 9.80665f;
public static float startDistance;
public static bool fireActive = false;
public static bool swing = false;
public static Vector3 lastPlayerPos;
public static Vector3 _hit;
public static SpringJoint joint;
public static MethodInfo GetBodypart_PR = typeof(PlayerRagdoll).GetMethod("GetBodypart", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo AddForce_PR = typeof(PlayerRagdoll).GetMethod("AddForce", BindingFlags.Instance | BindingFlags.NonPublic, null, new Type[2]
{
typeof(Vector3),
typeof(ForceMode)
}, null);
public static MethodInfo Fall_PR = typeof(PlayerRagdoll).GetMethod("Fall", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo Center_Player = typeof(Player).GetMethod("Center", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo LetGo = typeof(RescueHook).GetMethod("LetGo", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo toggleGravity = typeof(PlayerRagdoll).GetMethod("ToggleGravity", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo rigField = typeof(Bodypart).GetField("rig", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo rigListField = typeof(PlayerRagdoll).GetField("rigList", BindingFlags.Instance | BindingFlags.NonPublic);
[HarmonyPatch("Fire")]
[HarmonyPrefix]
private static bool FirePatch(RescueHook __instance, ref BatteryEntry ___m_batteryEntry, ref float ___sinceFire, ref Player ___playerHoldingItem)
{
//IL_003f: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_0055: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_006f: Unknown result type (might be due to invalid IL or missing references)
//IL_0074: Unknown result type (might be due to invalid IL or missing references)
//IL_00b2: Unknown result type (might be due to invalid IL or missing references)
//IL_00bd: Unknown result type (might be due to invalid IL or missing references)
//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
//IL_0126: Unknown result type (might be due to invalid IL or missing references)
//IL_01b6: Unknown result type (might be due to invalid IL or missing references)
//IL_0174: Unknown result type (might be due to invalid IL or missing references)
//IL_019a: Unknown result type (might be due to invalid IL or missing references)
if (!Plugin.infinityCharges)
{
BatteryEntry obj = ___m_batteryEntry;
obj.m_charge -= ___m_batteryEntry.m_maxCharge / (float)__instance.maxCharges;
}
((ItemDataEntry)___m_batteryEntry).SetDirty();
___sinceFire = 0f;
RaycastHit val = HelperFunctions.LineCheck(__instance.firePoint.position, __instance.firePoint.position + __instance.firePoint.forward * Plugin.range, (LayerType)5, 0f);
MethodInfo method = typeof(RescueHook).GetMethod("RescueNothing", BindingFlags.Instance | BindingFlags.NonPublic);
if (!Object.op_Implicit((Object)(object)((RaycastHit)(ref val)).transform))
{
method.Invoke(__instance, new object[1] { __instance.firePoint.position + __instance.firePoint.forward * Plugin.range });
return false;
}
Player componentInParent = ((Component)((RaycastHit)(ref val)).transform).GetComponentInParent<Player>();
if (Object.op_Implicit((Object)(object)componentInParent))
{
MethodInfo method2 = typeof(RescueHook).GetMethod("RescueRagdollCharacter", BindingFlags.Instance | BindingFlags.NonPublic);
method2.Invoke(__instance, new object[2] { componentInParent, val });
return false;
}
if (!Object.op_Implicit((Object)(object)((RaycastHit)(ref val)).rigidbody))
{
MethodInfo method3 = typeof(RescueHook).GetMethod("RescueWall", BindingFlags.Instance | BindingFlags.NonPublic);
method3.Invoke(__instance, new object[1] { val });
if (Plugin.spiderManMode || Plugin.alternativeSpidermanMode)
{
StartSwing(___playerHoldingItem, ((RaycastHit)(ref val)).point);
}
return false;
}
method.Invoke(__instance, new object[1] { ((RaycastHit)(ref val)).point });
return false;
}
[HarmonyPatch("FixedUpdate")]
[HarmonyPrefix]
private static bool FixedUpdatePatch(RescueHook __instance, ref float ___sinceFire, ref Player ___targetPlayer, ref Vector3 ___targetPos, Rigidbody ___targetRig, ref Player ___playerHoldingItem, ref float ___massFactor, ref LineRenderer ___line)
{
//IL_0053: Unknown result type (might be due to invalid IL or missing references)
//IL_0058: Unknown result type (might be due to invalid IL or missing references)
//IL_0059: Unknown result type (might be due to invalid IL or missing references)
//IL_005e: Unknown result type (might be due to invalid IL or missing references)
//IL_005f: Unknown result type (might be due to invalid IL or missing references)
//IL_0064: Unknown result type (might be due to invalid IL or missing references)
//IL_0068: Unknown result type (might be due to invalid IL or missing references)
//IL_006d: 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_006f: 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)
//IL_0081: Unknown result type (might be due to invalid IL or missing references)
//IL_008e: Unknown result type (might be due to invalid IL or missing references)
//IL_0098: Unknown result type (might be due to invalid IL or missing references)
//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
//IL_00a7: Unknown result type (might be due to invalid IL or missing references)
//IL_00b7: Unknown result type (might be due to invalid IL or missing references)
//IL_00fa: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
//IL_053e: Unknown result type (might be due to invalid IL or missing references)
//IL_0544: Unknown result type (might be due to invalid IL or missing references)
//IL_055b: Unknown result type (might be due to invalid IL or missing references)
//IL_0561: Unknown result type (might be due to invalid IL or missing references)
//IL_0143: Unknown result type (might be due to invalid IL or missing references)
//IL_014a: Expected O, but got Unknown
//IL_0156: Unknown result type (might be due to invalid IL or missing references)
//IL_015d: Expected O, but got Unknown
//IL_0182: Unknown result type (might be due to invalid IL or missing references)
//IL_0194: Unknown result type (might be due to invalid IL or missing references)
//IL_0199: Unknown result type (might be due to invalid IL or missing references)
//IL_019e: Unknown result type (might be due to invalid IL or missing references)
//IL_01a2: Unknown result type (might be due to invalid IL or missing references)
//IL_01a7: Unknown result type (might be due to invalid IL or missing references)
//IL_01b8: Unknown result type (might be due to invalid IL or missing references)
//IL_01c3: Unknown result type (might be due to invalid IL or missing references)
//IL_02bc: Unknown result type (might be due to invalid IL or missing references)
//IL_02c3: Unknown result type (might be due to invalid IL or missing references)
//IL_02c8: Unknown result type (might be due to invalid IL or missing references)
//IL_02cd: Unknown result type (might be due to invalid IL or missing references)
//IL_02d1: Unknown result type (might be due to invalid IL or missing references)
//IL_02db: Unknown result type (might be due to invalid IL or missing references)
//IL_02ed: Unknown result type (might be due to invalid IL or missing references)
//IL_02f4: Unknown result type (might be due to invalid IL or missing references)
//IL_0233: Unknown result type (might be due to invalid IL or missing references)
//IL_0235: Unknown result type (might be due to invalid IL or missing references)
//IL_023f: Unknown result type (might be due to invalid IL or missing references)
//IL_0256: Unknown result type (might be due to invalid IL or missing references)
//IL_0260: Unknown result type (might be due to invalid IL or missing references)
//IL_027e: Unknown result type (might be due to invalid IL or missing references)
//IL_0285: Unknown result type (might be due to invalid IL or missing references)
//IL_028a: Unknown result type (might be due to invalid IL or missing references)
//IL_028f: Unknown result type (might be due to invalid IL or missing references)
//IL_0293: Unknown result type (might be due to invalid IL or missing references)
//IL_029d: Unknown result type (might be due to invalid IL or missing references)
//IL_02a7: Unknown result type (might be due to invalid IL or missing references)
//IL_039e: Unknown result type (might be due to invalid IL or missing references)
//IL_03b1: Unknown result type (might be due to invalid IL or missing references)
//IL_03b6: Unknown result type (might be due to invalid IL or missing references)
//IL_03bb: Unknown result type (might be due to invalid IL or missing references)
//IL_03bf: Unknown result type (might be due to invalid IL or missing references)
//IL_03c4: Unknown result type (might be due to invalid IL or missing references)
//IL_05ec: Unknown result type (might be due to invalid IL or missing references)
//IL_05f2: Unknown result type (might be due to invalid IL or missing references)
//IL_0609: Unknown result type (might be due to invalid IL or missing references)
//IL_060f: Unknown result type (might be due to invalid IL or missing references)
//IL_044e: Unknown result type (might be due to invalid IL or missing references)
//IL_0455: Unknown result type (might be due to invalid IL or missing references)
//IL_048b: Unknown result type (might be due to invalid IL or missing references)
//IL_0492: Expected O, but got Unknown
//IL_049e: Unknown result type (might be due to invalid IL or missing references)
//IL_04a3: Unknown result type (might be due to invalid IL or missing references)
//IL_04aa: Unknown result type (might be due to invalid IL or missing references)
//IL_04b4: Unknown result type (might be due to invalid IL or missing references)
//IL_04db: Unknown result type (might be due to invalid IL or missing references)
//IL_04e2: Expected O, but got Unknown
//IL_04ee: Unknown result type (might be due to invalid IL or missing references)
//IL_04f3: Unknown result type (might be due to invalid IL or missing references)
//IL_04fa: Unknown result type (might be due to invalid IL or missing references)
//IL_0504: Unknown result type (might be due to invalid IL or missing references)
___sinceFire += Time.fixedDeltaTime;
Vector3 val2;
if (swing && Plugin.alternativeSpidermanMode && (Object)(object)___playerHoldingItem.refs.ragdoll != (Object)null)
{
PlayerRagdoll ragdoll = ___playerHoldingItem.refs.ragdoll;
Vector3 val = (Vector3)Center_Player.Invoke(___playerHoldingItem, null);
val2 = _hit - val;
Vector3 normalized = ((Vector3)(ref val2)).normalized;
float num = Vector3.Distance(val, _hit);
Vector3 val3 = normalized * 9.80665f * (num / startDistance) * Plugin.spring * 10f;
AddForce_PR.Invoke(ragdoll, new object[2]
{
val3,
(object)(ForceMode)0
});
}
if (__instance.isPulling && fireActive)
{
if (Object.op_Implicit((Object)(object)___targetPlayer))
{
___targetPos = ___targetRig.position;
}
if (___sinceFire > 0.25f)
{
PlayerRagdoll ragdoll2 = ___playerHoldingItem.refs.ragdoll;
Bodypart obj = (Bodypart)GetBodypart_PR.Invoke(ragdoll2, new object[1] { (object)(BodypartType)17 });
Rigidbody val4 = (Rigidbody)rigField.GetValue(obj);
if (Object.op_Implicit((Object)(object)___targetPlayer))
{
PlayerRagdoll ragdoll3 = ___targetPlayer.refs.ragdoll;
val2 = ((Component)__instance).transform.position - (Vector3)Center_Player.Invoke(___targetPlayer, null);
Vector3 normalized2 = ((Vector3)(ref val2)).normalized;
AddForce_PR.Invoke(ragdoll3, new object[2]
{
normalized2 * (Plugin.dragForce / ___massFactor),
(object)(ForceMode)5
});
___targetPlayer.data.sinceRescueDragged = 0f;
___targetPlayer.data.sinceGrounded = Mathf.Clamp(___targetPlayer.data.sinceGrounded, 0f, 1f);
if (Plugin.dragForceOnOwner)
{
AddForce_PR.Invoke(ragdoll2, new object[2]
{
-normalized2 * Plugin.dragForce * Mathf.Clamp(___massFactor, 0f, 10f) * 0.1f,
(object)(ForceMode)5
});
val2 = ___targetRig.position - val4.position;
val4.AddForce(((Vector3)(ref val2)).normalized * Plugin.dragForce * 0.3f, (ForceMode)5);
}
val2 = ((Component)__instance).transform.position - ___targetRig.position;
___targetRig.AddForce(((Vector3)(ref val2)).normalized * Plugin.dragForce, (ForceMode)5);
if (Vector3.Distance(__instance.dragPoint.position, ___targetRig.position) < 2f || ___sinceFire > 2f)
{
LetGo.Invoke(__instance, null);
}
else if (((ItemInstanceBehaviour)__instance).isHeldByMe && Player.localPlayer.input.clickWasPressed)
{
MethodInfo method = typeof(RescueHook).GetMethod("CallLetGo", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(__instance, null);
}
}
else
{
if (___playerHoldingItem.data.fallTime <= 0f && !__instance.hitNothing)
{
val2 = ___targetPos - (Vector3)Center_Player.Invoke(___playerHoldingItem, null);
Vector3 normalized3 = ((Vector3)(ref val2)).normalized;
__instance.fly = true;
if (Plugin.activeRagdollOnUse)
{
Fall_PR.Invoke(ragdoll2, new object[1] { 2f });
}
if (Plugin.useGravity)
{
toggleGravity.Invoke(ragdoll2, new object[1] { true });
}
if (!Plugin.spiderManMode && !Plugin.alternativeSpidermanMode)
{
AddForce_PR.Invoke(ragdoll2, new object[2]
{
normalized3 * Plugin.launchForce,
(object)(ForceMode)2
});
Bodypart obj2 = (Bodypart)GetBodypart_PR.Invoke(ragdoll2, new object[1] { (object)(BodypartType)17 });
((Rigidbody)rigField.GetValue(obj2)).AddForce(normalized3 * Plugin.launchForce * 1f, (ForceMode)2);
Bodypart obj3 = (Bodypart)GetBodypart_PR.Invoke(ragdoll2, new object[1] { (object)(BodypartType)2 });
((Rigidbody)rigField.GetValue(obj3)).AddForce(normalized3 * Plugin.launchForce * 1f, (ForceMode)2);
}
}
if (___sinceFire > 0.5f)
{
LetGo.Invoke(__instance, null);
}
}
}
__instance.ropeRender.DisplayRope(__instance.dragPoint.position, ___targetPos, ___sinceFire, ___line);
__instance.currentDistance = Vector3.Distance(__instance.dragPoint.position, ___targetPos);
return false;
}
__instance.fly = false;
if (!Plugin.spiderManMode && !Plugin.alternativeSpidermanMode)
{
MethodInfo method2 = typeof(RescueHook).GetMethod("StopDisplayRope", BindingFlags.Instance | BindingFlags.NonPublic);
method2.Invoke(__instance, null);
}
if ((Plugin.spiderManMode || Plugin.alternativeSpidermanMode) && fireActive && ((ItemInstanceBehaviour)__instance).isHeldByMe)
{
__instance.ropeRender.DisplayRope(__instance.dragPoint.position, ___targetPos, ___sinceFire, ___line);
__instance.currentDistance = Vector3.Distance(__instance.dragPoint.position, ___targetPos);
}
return false;
}
[HarmonyPatch("Update")]
[HarmonyPrefix]
private static bool UpdatePatch(RescueHook __instance, ref Player ___playerHoldingItem, ref BatteryEntry ___m_batteryEntry, ref float ___sinceFire)
{
bool flag = false;
if (Object.op_Implicit((Object)(object)___playerHoldingItem))
{
if (___playerHoldingItem.input.aimIsPressed)
{
if (!__instance.lightObject.activeSelf)
{
__instance.lightObject.SetActive(true);
__instance.darkObject.SetActive(false);
}
}
else if (__instance.lightObject.activeSelf)
{
__instance.lightObject.SetActive(false);
__instance.darkObject.SetActive(true);
}
}
if (___m_batteryEntry.m_charge <= 0f)
{
flag = true;
}
if (((ItemInstanceBehaviour)__instance).isHeldByMe && Player.localPlayer.input.clickWasPressed && !Player.localPlayer.HasLockedInput() && ___sinceFire > 0.25f && !fireActive && !flag)
{
fireActive = true;
MethodInfo method = typeof(RescueHook).GetMethod("Fire", BindingFlags.Instance | BindingFlags.NonPublic);
method.Invoke(__instance, null);
}
else if (((ItemInstanceBehaviour)__instance).isHeldByMe && Player.localPlayer.input.clickWasReleased && fireActive)
{
fireActive = false;
if (Plugin.spiderManMode || Plugin.alternativeSpidermanMode)
{
MethodInfo method2 = typeof(RescueHook).GetMethod("StopDisplayRope", BindingFlags.Instance | BindingFlags.NonPublic);
method2.Invoke(__instance, null);
StopSwing(___playerHoldingItem);
}
}
OnUpdateReturn(___playerHoldingItem);
return false;
}
private static void StartSwing(Player playerHoldingItem, Vector3 hit)
{
//IL_0017: 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_0041: Unknown result type (might be due to invalid IL or missing references)
//IL_0047: Expected O, but got Unknown
//IL_0052: Unknown result type (might be due to invalid IL or missing references)
//IL_0077: 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_008f: Unknown result type (might be due to invalid IL or missing references)
//IL_0090: 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_00ec: Unknown result type (might be due to invalid IL or missing references)
//IL_00ed: Unknown result type (might be due to invalid IL or missing references)
//IL_00fe: Unknown result type (might be due to invalid IL or missing references)
//IL_00ff: Unknown result type (might be due to invalid IL or missing references)
if (!swing)
{
swing = true;
_hit = hit;
Bodypart obj = (Bodypart)GetBodypart_PR.Invoke(playerHoldingItem.refs.ragdoll, new object[1] { (object)(BodypartType)2 });
joint = ((Component)(Rigidbody)rigField.GetValue(obj)).gameObject.AddComponent<SpringJoint>();
((Joint)joint).autoConfigureConnectedAnchor = false;
((Joint)joint).connectedAnchor = hit;
Vector3 val = (Vector3)Center_Player.Invoke(playerHoldingItem, null);
float num = Vector3.Distance(hit, val);
joint.maxDistance = num * Plugin.maxDistanceMultiplier;
joint.minDistance = num * Plugin.minDistanceMultiplier;
joint.spring = Plugin.spring;
joint.damper = 60f;
((Joint)joint).massScale = 46f;
lastPlayerPos = val;
if (Plugin.alternativeSpidermanMode)
{
startDistance = Vector3.Distance(val, hit);
}
}
}
private static void StopSwing(Player playerHoldingItem)
{
//IL_003b: Unknown result type (might be due to invalid IL or missing references)
//IL_0040: Unknown result type (might be due to invalid IL or missing references)
//IL_0045: Unknown result type (might be due to invalid IL or missing references)
//IL_004a: Unknown result type (might be due to invalid IL or missing references)
//IL_004d: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: 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_00aa: 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)
if (swing)
{
swing = false;
playerHoldingItem.data.sinceGrounded = 0f;
Plugin.DestroyObj((Object)(object)joint);
Vector3 val = (Vector3)Center_Player.Invoke(playerHoldingItem, null) - lastPlayerPos;
Vector3 normalized = ((Vector3)(ref val)).normalized;
Console.WriteLine(normalized);
if (Plugin.ragdollAndImpulseOnStopUse)
{
Fall_PR.Invoke(playerHoldingItem.refs.ragdoll, new object[1] { 2f });
AddForce_PR.Invoke(playerHoldingItem.refs.ragdoll, new object[2]
{
normalized * Plugin.forceOnSwingStop,
(object)(ForceMode)1
});
}
}
}
private static void OnUpdateReturn(Player playerHoldingItem)
{
//IL_0017: Unknown result type (might be due to invalid IL or missing references)
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
if (swing)
{
lastPlayerPos = (Vector3)Center_Player.Invoke(playerHoldingItem, null);
}
}
}
[HarmonyPatch(typeof(PlayerController))]
public class PlayerControllerPatch
{
public static MethodInfo ragdollMethodInfo = typeof(Player).GetMethod("Ragdoll", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo playerField = typeof(PlayerController).GetField("player", BindingFlags.Instance | BindingFlags.NonPublic);
public static FieldInfo jumpForceTimeField = typeof(PlayerController).GetField("jumpForceTime", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo simpleMovementMethodInfo = typeof(PlayerController).GetMethod("SimpleMovement", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo constantGravityMethodInfo = typeof(PlayerController).GetMethod("ConstantGravity", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo gravityMethodInfo = typeof(PlayerController).GetMethod("Gravity", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo standingMethodInfo = typeof(PlayerController).GetMethod("Standing", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo movementMethodInfo = typeof(PlayerController).GetMethod("Movement", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo bodyRotationMethodInfo = typeof(PlayerController).GetMethod("BodyRotation", BindingFlags.Instance | BindingFlags.NonPublic);
public static MethodInfo applyJumpForceMethodInfo = typeof(PlayerController).GetMethod("ApplyJumpForce", BindingFlags.Instance | BindingFlags.NonPublic);
[HarmonyPatch("FixedUpdate")]
[HarmonyPrefix]
private static bool FixedUpdatePatch(PlayerController __instance)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
Player val = (Player)playerField.GetValue(__instance);
if ((bool)ragdollMethodInfo.Invoke(val, null) || (!Plugin.movingInAir && RescueHookPatch.swing))
{
return false;
}
if (!val.data.physicsAreReady)
{
return false;
}
if (val.data.simplifiedRagdoll && val.refs.view.IsMine)
{
simpleMovementMethodInfo.Invoke(__instance, null);
return false;
}
if (!val.data.carried)
{
if (!RescueHookPatch.swing)
{
constantGravityMethodInfo.Invoke(__instance, null);
}
else
{
val.data.sinceGrounded = 0f;
}
if (!val.data.isGrounded)
{
if (!RescueHookPatch.swing)
{
gravityMethodInfo.Invoke(__instance, null);
}
}
else
{
standingMethodInfo.Invoke(__instance, null);
}
}
movementMethodInfo.Invoke(__instance, null);
bodyRotationMethodInfo.Invoke(__instance, null);
if ((float)jumpForceTimeField.GetValue(__instance) > 0f)
{
applyJumpForceMethodInfo.Invoke(__instance, null);
}
return false;
}
[HarmonyPatch("TryJump")]
[HarmonyPrefix]
public static bool TryJumpPatch(PlayerController __instance)
{
//IL_000c: Unknown result type (might be due to invalid IL or missing references)
//IL_0012: Expected O, but got Unknown
Player val = (Player)playerField.GetValue(__instance);
if (val.data.sinceGrounded < 0.5f && val.data.sinceJump > 0.6f && ((!RescueHookPatch.swing && !Plugin.movingInAir) || Plugin.movingInAir))
{
val.refs.view.RPC("RPCA_Jump", (RpcTarget)0, Array.Empty<object>());
val.data.isCrouching = false;
}
return false;
}
}
}