using System; using System.Collections; using System.Collections.Generic; using System.Diagnostics; using System.IO; using System.Linq; using System.Reflection; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Runtime.Versioning; using BepInEx; using BepInEx.Configuration; using HarmonyLib; using ParkourKnuckle.UI; using TMPro; using UnityEngine; using UnityEngine.EventSystems; using UnityEngine.Events; using UnityEngine.UI; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("KnuckleTesting")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("KnuckleTesting")] [assembly: AssemblyCopyright("Copyright © 2026")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("9407f467-496e-4117-8715-bdfe3bce9f1b")] [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 ParkourKnuckle { [BepInPlugin("com.nimius.parkourknuckle", "Parkour Knuckle", "1.2.1")] public class Plugin : BaseUnityPlugin { private Harmony _harmony; public static ConfigEntry EnableParkourRotation; public static ConfigEntry EnableParkourFOV; public static ConfigEntry EnableParkourShake; public static ConfigEntry EnableWallRunHelper; public static bool isUIVisible = false; public static ConfigFile ProgressionFile; public static Dictionary SkillConfigs = new Dictionary(); private void Awake() { //IL_0093: Unknown result type (might be due to invalid IL or missing references) //IL_009d: Expected O, but got Unknown //IL_0279: Unknown result type (might be due to invalid IL or missing references) //IL_0283: Expected O, but got Unknown EnableParkourRotation = ((BaseUnityPlugin)this).Config.Bind("Camera Settings", "Use Parkour Rotation", true, "Determines whether the camera will tilt and rotate differently when doing parkour actions."); EnableParkourFOV = ((BaseUnityPlugin)this).Config.Bind("Camera Settings", "Use Parkour FOV", true, "Determines whether the camera will zoom in and out during specific parkour actions."); EnableParkourShake = ((BaseUnityPlugin)this).Config.Bind("Camera Settings", "Use Parkour Shake", true, "Determines whether the camera will shake during specific parkour actions."); EnableWallRunHelper = ((BaseUnityPlugin)this).Config.Bind("UI Settings", "Use the Wall Run Helper", false, "When a wall run is able to be performed, the sides of your screen will glow."); string text = Path.Combine(Paths.ConfigPath, "parkourprogress.cfg"); ProgressionFile = new ConfigFile(text, true); SkillConfigs["QuickTurning"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "QuickTurning", false, ""); SkillConfigs["Sliding"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "Sliding", false, ""); SkillConfigs["SlideJumping"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "SlideJumping", false, ""); SkillConfigs["Leaping"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "Leaping", false, ""); SkillConfigs["Rolling"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "Rolling", false, ""); SkillConfigs["WallKicking"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "WallKicking", false, ""); SkillConfigs["WallRunning"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "WallRunning", false, ""); SkillConfigs["VerticalWallRunning"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "VerticalWallRunning", false, ""); SkillConfigs["WallRunBoost"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Progression", "WallRunBoost", false, ""); SkillConfigs["HeightCurrency"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Currency", "HeightCurrency", 0f, ""); SkillConfigs["MaxHeight"] = (ConfigEntryBase)(object)ProgressionFile.Bind("Currency", "MaxHeight", 0f, ""); _harmony = new Harmony("com.nimius.parkourknuckle"); _harmony.PatchAll(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Harmony Patches applied successfully."); ParkourUI.Initialize(); ((BaseUnityPlugin)this).Logger.LogInfo((object)"Parkour UI Engine Initialized."); } } [HarmonyPatch(typeof(ENT_Player), "Update")] public class PlayerModifierPatch { private static Quaternion targetRotation; private static bool isRotating = false; private static readonly float turnSpeed = 24f; public static bool onCooldown = false; public static readonly float CooldownDur = 0.2f; public static float CooldownTime = 0f; public static float chargeStartTime; public static bool isCharging; public static float currentCharge; public static readonly float maxChargeTime = 3.5f; public static float leapCooldownTime = 0f; public static readonly float leapCooldownDur = 2f; private static readonly float leapForceMultiplier = 1f; public static bool leapCooldown = false; private static readonly float minStamina = 1f; private static readonly float maxStamina = 6f; private static readonly float upwardArcForce = 1f; private static bool isHolding = false; public static bool hasWallRunInAir = false; private static readonly float tiltLerpSpeed = 4f; private static float gripValue = 0f; public static bool isHorizRun = false; private static int spaceTapCount = 0; private static float spaceTapTimer = 0f; private const float doubleTapWindow = 0.3f; public static bool wallLeft; public static bool wallRight; public static bool canRun; public static bool isVerticalRun = false; public static bool hasWallRunVertical = false; private static float verticalGraceTimer = 0f; private static readonly float maxGraceTime = 0.2f; public static bool wallFront; public static bool canVert; private static bool isVaulting = false; private static Vector3 vaultTargetPos; private static float vaultTimer = 0f; private static readonly float vaultDuration = 2f; private static bool isSliding = false; private static readonly float minSlideSpeed = 6f; private static Vector3 slideDir; private static bool canSlide = true; private static float slideTime = 0f; private static readonly float slideDuration = 1.8f; private static Vector3 slideStartPos; private static Vector3 slideTargetPos; private static float startY; private static bool wasGrounded; private static bool isRotatingRoll = false; private static Quaternion startRotationRoll; private static Vector3 rollStartPos; private static Vector3 rollTargetPos; private static Vector3 rollDir; private static float rollTimer = 0f; private static readonly float rollDur = 0.5f; private static bool cancelNextRollingFallDamage = false; private static float rollingFallDamageCancelExpiresAt = -1f; private const float rollingFallDamageCancelGrace = 0.2f; public static float levelHighestHeight; public static int highestMilestone = 0; public static float liveRunHeight = 0f; public static bool isConsumableUltimate = false; public static int roidedCount = 0; public static float previousCurrency = 0f; private static void ArmRollingFallDamageCancel() { cancelNextRollingFallDamage = true; rollingFallDamageCancelExpiresAt = Time.time + 0.2f; } private static void ExpireRollingFallDamageCancel() { if (cancelNextRollingFallDamage && Time.time > rollingFallDamageCancelExpiresAt) { cancelNextRollingFallDamage = false; rollingFallDamageCancelExpiresAt = -1f; } } public static bool TryCancelRollingFallDamage(DamageInfo info) { ExpireRollingFallDamageCancel(); if (!cancelNextRollingFallDamage || info == null || !info.HasTag("falling")) { return false; } cancelNextRollingFallDamage = false; rollingFallDamageCancelExpiresAt = -1f; return true; } [HarmonyPostfix] public static void Postfix(ENT_Player __instance) { //IL_017d: Unknown result type (might be due to invalid IL or missing references) //IL_0182: Unknown result type (might be due to invalid IL or missing references) //IL_019d: Unknown result type (might be due to invalid IL or missing references) //IL_01ae: Unknown result type (might be due to invalid IL or missing references) //IL_01b3: Unknown result type (might be due to invalid IL or missing references) //IL_013a: Unknown result type (might be due to invalid IL or missing references) //IL_014e: Unknown result type (might be due to invalid IL or missing references) //IL_0153: Unknown result type (might be due to invalid IL or missing references) //IL_0158: Unknown result type (might be due to invalid IL or missing references) //IL_04a9: Unknown result type (might be due to invalid IL or missing references) //IL_04ae: Unknown result type (might be due to invalid IL or missing references) //IL_04b8: Unknown result type (might be due to invalid IL or missing references) //IL_04bd: Unknown result type (might be due to invalid IL or missing references) //IL_04c2: Unknown result type (might be due to invalid IL or missing references) //IL_04c6: Unknown result type (might be due to invalid IL or missing references) //IL_04cd: Unknown result type (might be due to invalid IL or missing references) //IL_04d2: Unknown result type (might be due to invalid IL or missing references) //IL_04d5: Unknown result type (might be due to invalid IL or missing references) //IL_0798: Unknown result type (might be due to invalid IL or missing references) //IL_07a7: Unknown result type (might be due to invalid IL or missing references) //IL_0628: Unknown result type (might be due to invalid IL or missing references) //IL_062d: Unknown result type (might be due to invalid IL or missing references) //IL_0632: Unknown result type (might be due to invalid IL or missing references) //IL_063a: Unknown result type (might be due to invalid IL or missing references) //IL_063f: Unknown result type (might be due to invalid IL or missing references) //IL_0659: Unknown result type (might be due to invalid IL or missing references) //IL_065e: Unknown result type (might be due to invalid IL or missing references) //IL_0668: Unknown result type (might be due to invalid IL or missing references) //IL_066d: Unknown result type (might be due to invalid IL or missing references) //IL_0672: Unknown result type (might be due to invalid IL or missing references) //IL_0689: Unknown result type (might be due to invalid IL or missing references) //IL_0690: Unknown result type (might be due to invalid IL or missing references) //IL_08cc: Unknown result type (might be due to invalid IL or missing references) //IL_08d7: Unknown result type (might be due to invalid IL or missing references) //IL_08dc: Unknown result type (might be due to invalid IL or missing references) //IL_08f8: Unknown result type (might be due to invalid IL or missing references) //IL_0903: Unknown result type (might be due to invalid IL or missing references) //IL_0c00: Unknown result type (might be due to invalid IL or missing references) //IL_0c0f: Unknown result type (might be due to invalid IL or missing references) //IL_0c14: Unknown result type (might be due to invalid IL or missing references) //IL_0c22: Unknown result type (might be due to invalid IL or missing references) //IL_0c27: Unknown result type (might be due to invalid IL or missing references) //IL_0c34: Unknown result type (might be due to invalid IL or missing references) //IL_0c7f: Unknown result type (might be due to invalid IL or missing references) //IL_0c8a: Unknown result type (might be due to invalid IL or missing references) //IL_09cb: Unknown result type (might be due to invalid IL or missing references) //IL_09c2: Unknown result type (might be due to invalid IL or missing references) //IL_09d0: Unknown result type (might be due to invalid IL or missing references) //IL_09d2: Unknown result type (might be due to invalid IL or missing references) //IL_09d4: Unknown result type (might be due to invalid IL or missing references) //IL_09d9: Unknown result type (might be due to invalid IL or missing references) //IL_09de: Unknown result type (might be due to invalid IL or missing references) //IL_09e2: Unknown result type (might be due to invalid IL or missing references) //IL_09e7: Unknown result type (might be due to invalid IL or missing references) //IL_09ef: Unknown result type (might be due to invalid IL or missing references) //IL_09fa: Unknown result type (might be due to invalid IL or missing references) //IL_0a2b: Unknown result type (might be due to invalid IL or missing references) //IL_0a33: Unknown result type (might be due to invalid IL or missing references) //IL_0a4b: Unknown result type (might be due to invalid IL or missing references) //IL_0a4d: Unknown result type (might be due to invalid IL or missing references) //IL_0a52: Unknown result type (might be due to invalid IL or missing references) //IL_0a7d: Unknown result type (might be due to invalid IL or missing references) //IL_0a7f: Unknown result type (might be due to invalid IL or missing references) //IL_0a90: Unknown result type (might be due to invalid IL or missing references) //IL_0a95: Unknown result type (might be due to invalid IL or missing references) //IL_0a9a: Unknown result type (might be due to invalid IL or missing references) //IL_0aa8: Unknown result type (might be due to invalid IL or missing references) //IL_0aad: Unknown result type (might be due to invalid IL or missing references) //IL_0aba: Unknown result type (might be due to invalid IL or missing references) //IL_0ac6: Unknown result type (might be due to invalid IL or missing references) //IL_0acd: Unknown result type (might be due to invalid IL or missing references) //IL_0af0: Unknown result type (might be due to invalid IL or missing references) //IL_0af5: Unknown result type (might be due to invalid IL or missing references) //IL_0aff: Unknown result type (might be due to invalid IL or missing references) //IL_0b04: Unknown result type (might be due to invalid IL or missing references) //IL_0dfc: Unknown result type (might be due to invalid IL or missing references) //IL_0e03: Unknown result type (might be due to invalid IL or missing references) //IL_0e13: Unknown result type (might be due to invalid IL or missing references) //IL_0e18: Unknown result type (might be due to invalid IL or missing references) //IL_0e1f: Unknown result type (might be due to invalid IL or missing references) //IL_0e2f: Unknown result type (might be due to invalid IL or missing references) //IL_0e34: Unknown result type (might be due to invalid IL or missing references) //IL_0e39: Unknown result type (might be due to invalid IL or missing references) //IL_0e3c: Unknown result type (might be due to invalid IL or missing references) //IL_0eee: Unknown result type (might be due to invalid IL or missing references) //IL_0ef3: Unknown result type (might be due to invalid IL or missing references) //IL_0efd: Unknown result type (might be due to invalid IL or missing references) //IL_0f0e: Unknown result type (might be due to invalid IL or missing references) //IL_0f13: Unknown result type (might be due to invalid IL or missing references) //IL_140d: Unknown result type (might be due to invalid IL or missing references) //IL_141d: Unknown result type (might be due to invalid IL or missing references) //IL_1432: Unknown result type (might be due to invalid IL or missing references) //IL_1434: Unknown result type (might be due to invalid IL or missing references) //IL_1439: Unknown result type (might be due to invalid IL or missing references) //IL_143b: Unknown result type (might be due to invalid IL or missing references) //IL_0fba: Unknown result type (might be due to invalid IL or missing references) //IL_0fbf: Unknown result type (might be due to invalid IL or missing references) //IL_1003: Unknown result type (might be due to invalid IL or missing references) //IL_1008: Unknown result type (might be due to invalid IL or missing references) //IL_100d: Unknown result type (might be due to invalid IL or missing references) //IL_1015: Unknown result type (might be due to invalid IL or missing references) //IL_101a: Unknown result type (might be due to invalid IL or missing references) //IL_1024: Unknown result type (might be due to invalid IL or missing references) //IL_1029: Unknown result type (might be due to invalid IL or missing references) //IL_102e: Unknown result type (might be due to invalid IL or missing references) //IL_1030: Unknown result type (might be due to invalid IL or missing references) //IL_1032: Unknown result type (might be due to invalid IL or missing references) //IL_1040: Unknown result type (might be due to invalid IL or missing references) //IL_1047: Unknown result type (might be due to invalid IL or missing references) //IL_104c: Unknown result type (might be due to invalid IL or missing references) //IL_1051: Unknown result type (might be due to invalid IL or missing references) //IL_176f: Unknown result type (might be due to invalid IL or missing references) //IL_1774: Unknown result type (might be due to invalid IL or missing references) //IL_1787: Unknown result type (might be due to invalid IL or missing references) //IL_178c: Unknown result type (might be due to invalid IL or missing references) //IL_1794: Unknown result type (might be due to invalid IL or missing references) //IL_1799: Unknown result type (might be due to invalid IL or missing references) //IL_17a3: Unknown result type (might be due to invalid IL or missing references) //IL_17a8: Unknown result type (might be due to invalid IL or missing references) //IL_17ad: Unknown result type (might be due to invalid IL or missing references) //IL_17b7: Unknown result type (might be due to invalid IL or missing references) //IL_17bc: Unknown result type (might be due to invalid IL or missing references) //IL_17c1: Unknown result type (might be due to invalid IL or missing references) //IL_14db: Unknown result type (might be due to invalid IL or missing references) //IL_14e0: Unknown result type (might be due to invalid IL or missing references) //IL_14f5: Unknown result type (might be due to invalid IL or missing references) //IL_14fa: Unknown result type (might be due to invalid IL or missing references) //IL_14ff: Unknown result type (might be due to invalid IL or missing references) //IL_1504: Unknown result type (might be due to invalid IL or missing references) //IL_1519: Unknown result type (might be due to invalid IL or missing references) //IL_151e: Unknown result type (might be due to invalid IL or missing references) //IL_1523: Unknown result type (might be due to invalid IL or missing references) //IL_1069: Unknown result type (might be due to invalid IL or missing references) //IL_106e: Unknown result type (might be due to invalid IL or missing references) //IL_17dd: Unknown result type (might be due to invalid IL or missing references) //IL_17e2: Unknown result type (might be due to invalid IL or missing references) //IL_15db: Unknown result type (might be due to invalid IL or missing references) //IL_15e2: Unknown result type (might be due to invalid IL or missing references) //IL_15e7: Unknown result type (might be due to invalid IL or missing references) //IL_15ee: Unknown result type (might be due to invalid IL or missing references) //IL_15f3: Unknown result type (might be due to invalid IL or missing references) //IL_15f8: Unknown result type (might be due to invalid IL or missing references) //IL_10eb: Unknown result type (might be due to invalid IL or missing references) //IL_10f6: Unknown result type (might be due to invalid IL or missing references) //IL_108f: Unknown result type (might be due to invalid IL or missing references) //IL_1094: Unknown result type (might be due to invalid IL or missing references) //IL_109e: Unknown result type (might be due to invalid IL or missing references) //IL_10a3: Unknown result type (might be due to invalid IL or missing references) //IL_10ad: Unknown result type (might be due to invalid IL or missing references) //IL_18f6: Unknown result type (might be due to invalid IL or missing references) //IL_113a: Unknown result type (might be due to invalid IL or missing references) //IL_113c: Unknown result type (might be due to invalid IL or missing references) //IL_1bd6: Unknown result type (might be due to invalid IL or missing references) //IL_1948: Unknown result type (might be due to invalid IL or missing references) //IL_1863: Unknown result type (might be due to invalid IL or missing references) //IL_129c: Unknown result type (might be due to invalid IL or missing references) //IL_12a6: Unknown result type (might be due to invalid IL or missing references) //IL_12c1: Unknown result type (might be due to invalid IL or missing references) //IL_12c6: Unknown result type (might be due to invalid IL or missing references) //IL_12c9: Unknown result type (might be due to invalid IL or missing references) //IL_127e: Unknown result type (might be due to invalid IL or missing references) //IL_1283: Unknown result type (might be due to invalid IL or missing references) //IL_1290: Unknown result type (might be due to invalid IL or missing references) //IL_1155: Unknown result type (might be due to invalid IL or missing references) //IL_1157: Unknown result type (might be due to invalid IL or missing references) //IL_115e: Unknown result type (might be due to invalid IL or missing references) //IL_1163: Unknown result type (might be due to invalid IL or missing references) //IL_1168: Unknown result type (might be due to invalid IL or missing references) //IL_116a: Unknown result type (might be due to invalid IL or missing references) //IL_116c: Unknown result type (might be due to invalid IL or missing references) //IL_1a5a: Unknown result type (might be due to invalid IL or missing references) //IL_1a6b: Unknown result type (might be due to invalid IL or missing references) //IL_1a70: Unknown result type (might be due to invalid IL or missing references) //IL_1668: Unknown result type (might be due to invalid IL or missing references) //IL_1189: Unknown result type (might be due to invalid IL or missing references) //IL_118e: Unknown result type (might be due to invalid IL or missing references) //IL_1198: Unknown result type (might be due to invalid IL or missing references) //IL_119d: Unknown result type (might be due to invalid IL or missing references) //IL_11a2: Unknown result type (might be due to invalid IL or missing references) //IL_11a4: Unknown result type (might be due to invalid IL or missing references) //IL_11a6: Unknown result type (might be due to invalid IL or missing references) //IL_11a8: Unknown result type (might be due to invalid IL or missing references) //IL_1ad4: Unknown result type (might be due to invalid IL or missing references) //IL_1ad9: Unknown result type (might be due to invalid IL or missing references) //IL_1ae0: Unknown result type (might be due to invalid IL or missing references) //IL_1ae5: Unknown result type (might be due to invalid IL or missing references) //IL_1aed: Unknown result type (might be due to invalid IL or missing references) //IL_1af2: Unknown result type (might be due to invalid IL or missing references) //IL_1afc: Unknown result type (might be due to invalid IL or missing references) //IL_1b01: Unknown result type (might be due to invalid IL or missing references) //IL_1b06: Unknown result type (might be due to invalid IL or missing references) //IL_1b10: Unknown result type (might be due to invalid IL or missing references) //IL_1b15: Unknown result type (might be due to invalid IL or missing references) //IL_1b1a: Unknown result type (might be due to invalid IL or missing references) //IL_1a95: Unknown result type (might be due to invalid IL or missing references) //IL_18ae: Unknown result type (might be due to invalid IL or missing references) //IL_18c8: Unknown result type (might be due to invalid IL or missing references) //IL_18cd: Unknown result type (might be due to invalid IL or missing references) //IL_11dc: Unknown result type (might be due to invalid IL or missing references) //IL_11e1: Unknown result type (might be due to invalid IL or missing references) //IL_11eb: Unknown result type (might be due to invalid IL or missing references) //IL_11f0: Unknown result type (might be due to invalid IL or missing references) //IL_11fa: Unknown result type (might be due to invalid IL or missing references) //IL_1b36: Unknown result type (might be due to invalid IL or missing references) //IL_1b3b: Unknown result type (might be due to invalid IL or missing references) //IL_1991: Unknown result type (might be due to invalid IL or missing references) //IL_1996: Unknown result type (might be due to invalid IL or missing references) //IL_19af: Unknown result type (might be due to invalid IL or missing references) //IL_19b4: Unknown result type (might be due to invalid IL or missing references) //IL_19d9: Unknown result type (might be due to invalid IL or missing references) //IL_19de: Unknown result type (might be due to invalid IL or missing references) //IL_19e3: Unknown result type (might be due to invalid IL or missing references) //IL_19e8: Unknown result type (might be due to invalid IL or missing references) //IL_19f2: Unknown result type (might be due to invalid IL or missing references) //IL_19f7: Unknown result type (might be due to invalid IL or missing references) //IL_19fc: Unknown result type (might be due to invalid IL or missing references) //IL_1217: Unknown result type (might be due to invalid IL or missing references) //IL_121c: Unknown result type (might be due to invalid IL or missing references) //IL_1226: Unknown result type (might be due to invalid IL or missing references) //IL_122b: Unknown result type (might be due to invalid IL or missing references) //IL_1230: Unknown result type (might be due to invalid IL or missing references) //IL_1b7c: Unknown result type (might be due to invalid IL or missing references) if (CL_GameManager.gamemode.allowLeaderboardScoring) { CL_GameManager.gamemode.allowLeaderboardScoring = false; } CharacterController component = ((Component)__instance).GetComponent(); bool isGrounded = component.isGrounded; isHolding = false; ExpireRollingFallDamageCancel(); Hand[] hands = __instance.hands; foreach (Hand val in hands) { if ((Object)(object)val.handhold != (Object)null && val.handhold.GetHolding()) { isHolding = true; break; } } if (onCooldown) { if (!isRotating) { CooldownTime += Time.deltaTime; } if (CooldownTime >= CooldownDur) { onCooldown = false; CooldownTime = 0f; } } if (Input.GetKeyUp((KeyCode)120) && !onCooldown && !isHorizRun && ((GameEntity)__instance).health > 0f && ((ConfigEntry)(object)Plugin.SkillConfigs["QuickTurning"]).Value) { onCooldown = true; targetRotation = ((Component)__instance).transform.rotation * Quaternion.Euler(0f, 180f, 0f); isRotating = true; } if (isRotating) { ((Component)__instance).transform.rotation = Quaternion.Slerp(((Component)__instance).transform.rotation, targetRotation, Time.deltaTime * (turnSpeed * (float)(roidedCount / 2 + 1))); if (Quaternion.Angle(((Component)__instance).transform.rotation, targetRotation) < 0.5f) { isRotating = false; } } if (leapCooldown) { if (isGrounded || isHolding) { leapCooldownTime += Time.deltaTime; } if (leapCooldownTime >= leapCooldownDur) { leapCooldown = false; leapCooldownTime = 0f; } } if (Input.GetKeyDown((KeyCode)103) && (isGrounded || isHolding) && !leapCooldown && ((ConfigEntry)(object)Plugin.SkillConfigs["Leaping"]).Value && (isGrounded || isHolding)) { bool flag = true; Hand[] hands2 = __instance.hands; foreach (Hand val2 in hands2) { if (val2.gripStrength < minStamina) { flag = false; } } if (flag) { chargeStartTime = Time.time; isCharging = true; } } currentCharge = 0f; if (isCharging && Input.GetKey((KeyCode)103) && (isGrounded || isHolding) && !leapCooldown) { currentCharge = Mathf.Min(Time.time - chargeStartTime, maxChargeTime); if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(currentCharge * Time.deltaTime * 0.025f); Hand[] hands3 = __instance.hands; foreach (Hand val3 in hands3) { val3.ShakeHand(currentCharge * Time.deltaTime * 0.025f); } } if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(currentCharge * 0.1f, false); } } if (Input.GetKeyUp((KeyCode)103) && isCharging && (isGrounded || isHolding) && !leapCooldown && ((ConfigEntry)(object)Plugin.SkillConfigs["Leaping"]).Value) { if (!isGrounded && !isHolding) { isCharging = false; return; } currentCharge = Mathf.Min(Time.time - chargeStartTime, maxChargeTime); float num = Mathf.Min(Time.time - chargeStartTime, maxChargeTime); float num2 = num * (leapForceMultiplier * (float)(roidedCount / 2 + 1)); float num3 = Mathf.CeilToInt(Mathf.Lerp(minStamina, maxStamina, num / maxChargeTime)); Vector3 val4 = ((Component)__instance.cam).transform.forward + Vector3.up * upwardArcForce; Vector3 directionalForce = ((Vector3)(ref val4)).normalized * num2; ((GameEntity)__instance).SetDirectionalForce(directionalForce); Hand[] hands4 = __instance.hands; foreach (Hand val5 in hands4) { if (!isConsumableUltimate) { val5.gripStrength -= num3; if (val5.gripStrength < 0f) { val5.gripStrength = 0f; } } if (val5.IsHolding()) { val5.DropHand(true); } } leapCooldown = true; isCharging = false; } if (!isGrounded) { currentCharge = 0f; isHolding = false; isCharging = false; } if (Input.GetKeyDown((KeyCode)32) && Input.GetKey((KeyCode)115) && ((ConfigEntry)(object)Plugin.SkillConfigs["WallKicking"]).Value) { bool flag2 = true; Hand[] hands5 = __instance.hands; foreach (Hand val6 in hands5) { if (val6.gripStrength < 1f) { flag2 = false; } } if (!isHolding && flag2) { Vector3 val7 = -((Component)__instance).transform.forward; RaycastHit val8 = default(RaycastHit); if (Physics.Raycast(((Component)__instance).transform.position, val7, ref val8, 1.2f)) { Vector3 val9 = ((RaycastHit)(ref val8)).normal + Vector3.up * 1.2f; float num4 = 1.5f * (float)(roidedCount / 2 + 1); ((GameEntity)__instance).SetDirectionalForce(((Vector3)(ref val9)).normalized * num4); if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(num4, false); } if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(Time.deltaTime * 0.15f); } Hand[] hands6 = __instance.hands; foreach (Hand val10 in hands6) { if (!isConsumableUltimate) { val10.gripStrength -= 1f; if (val10.gripStrength < 0f) { val10.gripStrength = 0f; } } } } } } if (isGrounded && !isVerticalRun && !isHolding) { isHorizRun = false; isVerticalRun = false; hasWallRunInAir = false; hasWallRunVertical = false; ((Collider)component).enabled = true; ((Component)__instance).transform.rotation = Quaternion.Euler(0f, ((Component)__instance).transform.eulerAngles.y, 0f); } if (!isGrounded && isHolding) { isHorizRun = false; isVerticalRun = false; hasWallRunInAir = true; hasWallRunVertical = true; ((Collider)component).enabled = true; } canRun = true; bool flag3 = true; Hand[] hands7 = __instance.hands; foreach (Hand val11 in hands7) { gripValue = val11.gripStrength; if (val11.gripStrength <= 0f) { canRun = false; } } if (!canRun) { flag3 = false; } if (Input.GetKeyDown((KeyCode)32)) { spaceTapCount++; if (spaceTapCount == 1) { spaceTapTimer = 0.3f; } } if (spaceTapTimer > 0f && (!isVerticalRun || !isHorizRun)) { spaceTapTimer -= Time.deltaTime; } else { spaceTapCount = 0; } RaycastHit val12 = default(RaycastHit); wallLeft = Physics.Raycast(((Component)__instance).transform.position, -((Component)__instance).transform.right, ref val12, 1.2f); RaycastHit val13 = default(RaycastHit); wallRight = Physics.Raycast(((Component)__instance).transform.position, ((Component)__instance).transform.right, ref val13, 1.2f); bool flag4 = spaceTapCount >= 2; bool flag5 = Input.GetKey((KeyCode)32) && (Input.GetKey((KeyCode)97) || Input.GetKey((KeyCode)100)); if (!hasWallRunInAir && flag5 && (wallLeft || wallRight) && (isHorizRun || flag4)) { if (((ConfigEntry)(object)Plugin.SkillConfigs["WallRunning"]).Value) { if (flag3) { isHorizRun = true; spaceTapCount = 2; ((Collider)component).enabled = false; Vector3 val14 = (wallLeft ? ((RaycastHit)(ref val12)).normal : ((RaycastHit)(ref val13)).normal); Vector3 val15 = Vector3.Cross(val14, Vector3.up); Vector3 val16 = ((Vector3)(ref val15)).normalized; RaycastHit val17 = default(RaycastHit); if (Physics.Raycast(((Component)__instance).transform.position, ((Component)__instance).transform.forward, ref val17, 1.2f)) { isHorizRun = false; hasWallRunInAir = true; ((Collider)component).enabled = true; return; } if (Vector3.Dot(val16, ((Component)__instance).transform.forward) < 0f) { val16 = -val16; } float num6 = ((!Plugin.EnableParkourRotation.Value) ? 0f : (wallLeft ? (-15f) : 15f)); Quaternion val18 = Quaternion.LookRotation(val16) * Quaternion.Euler(0f, 0f, num6); ((Component)__instance).transform.rotation = Quaternion.Slerp(((Component)__instance).transform.rotation, val18, Time.deltaTime * tiltLerpSpeed); ((GameEntity)__instance).SetDirectionalForce(val16 * 0.8f * (gripValue * 0.1f * ((float)roidedCount / 3.5f + 1f)) + Vector3.up * 0.1f); if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(Mathf.Lerp(1f, 0f, gripValue / 10f), false); } if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(Time.deltaTime * 0.25f); } Hand[] hands8 = __instance.hands; foreach (Hand val19 in hands8) { val19.gripStrength -= Time.deltaTime * (2.5f / (float)(roidedCount / 8 + 1)); if (val19.gripStrength < 0f) { val19.gripStrength = 0f; } } } else { isHorizRun = false; hasWallRunInAir = true; ((Collider)component).enabled = true; } } } else { Quaternion val20 = Quaternion.Euler(0f, ((Component)__instance).transform.eulerAngles.y, 0f); ((Component)__instance).transform.rotation = Quaternion.Slerp(((Component)__instance).transform.rotation, val20, Time.deltaTime * tiltLerpSpeed); if (!isGrounded && ((Collider)component).enabled && spaceTapTimer <= 0f) { hasWallRunInAir = true; } ((Collider)component).enabled = true; isHorizRun = false; } RaycastHit val21 = default(RaycastHit); wallFront = Physics.Raycast(((Component)__instance).transform.position, ((Component)__instance).transform.forward, ref val21, 1.2f); bool flag6 = Input.GetKey((KeyCode)32) && Input.GetKey((KeyCode)119); bool flag7 = spaceTapCount >= 2; if (isVerticalRun) { if (flag6) { verticalGraceTimer = 0f; } else { verticalGraceTimer += Time.deltaTime; } } canVert = true; bool flag8 = true; Hand[] hands9 = __instance.hands; foreach (Hand val22 in hands9) { if (val22.gripStrength <= 0f) { canVert = false; } } if (!canVert) { flag8 = false; } if (isVerticalRun && !flag8) { isVerticalRun = false; hasWallRunVertical = true; return; } if (isVerticalRun && Input.GetKeyDown((KeyCode)32) && verticalGraceTimer > 0f && verticalGraceTimer < maxGraceTime && ((ConfigEntry)(object)Plugin.SkillConfigs["WallRunBoost"]).Value) { float num9 = 1.5f * (float)(roidedCount / 2 + 1); float num10 = 1.5f * (float)(roidedCount / 2 + 1); Vector3 directionalForce2 = ((RaycastHit)(ref val21)).normal * num9 * (gripValue * 0.1f) + Vector3.up * num10 * (gripValue * 0.1f); ((GameEntity)__instance).SetDirectionalForce(directionalForce2); if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(2f, false); } isVerticalRun = false; verticalGraceTimer = 0f; hasWallRunVertical = true; ((Collider)component).enabled = true; return; } if (isVerticalRun && verticalGraceTimer >= maxGraceTime) { isVerticalRun = false; hasWallRunVertical = true; ((Collider)component).enabled = true; verticalGraceTimer = 0f; } if (isVaulting) { vaultTimer += Time.deltaTime; ((Component)__instance).transform.position = Vector3.Lerp(((Component)__instance).transform.position, vaultTargetPos, vaultDuration); if (Vector3.Distance(((Component)__instance).transform.position, vaultTargetPos) < 0.1f) { isVaulting = false; ((Collider)component).enabled = true; } return; } if (flag6 && !hasWallRunVertical && wallFront && (!hasWallRunVertical || isVerticalRun) && verticalGraceTimer == 0f && ((ConfigEntry)(object)Plugin.SkillConfigs["VerticalWallRunning"]).Value && (isVerticalRun || flag7)) { float num11 = Vector3.Angle(((RaycastHit)(ref val21)).normal, Vector3.up); if (flag3 && num11 > 80f && num11 < 100f) { isVerticalRun = true; spaceTapCount = 2; ((Collider)component).enabled = false; Vector3 val23 = -((RaycastHit)(ref val21)).normal; Vector3 val24 = ((Component)__instance).transform.position + Vector3.up * 1.5f; bool flag9 = Physics.Raycast(val24, val23, 0.25f); Quaternion val25 = Quaternion.LookRotation(Vector3.up, ((RaycastHit)(ref val21)).normal); RaycastHit val26 = default(RaycastHit); if (flag9 && (!Plugin.EnableParkourRotation.Value || Quaternion.Angle(((Component)__instance).transform.rotation, val25) < 25f) && Physics.SphereCast(((Component)__instance).transform.position + Vector3.up * 1f, 0.3f, Vector3.up, ref val26, 0.7f)) { isVaulting = false; hasWallRunVertical = true; isVerticalRun = false; ((Collider)component).enabled = true; return; } if (Physics.Raycast(((Component)__instance).transform.position, ((Component)__instance).transform.up, 3f)) { isVaulting = false; hasWallRunVertical = true; isVerticalRun = false; ((Collider)component).enabled = true; return; } if (!flag9 && !Physics.Raycast(val24, val23, 1f)) { Vector3 val27 = val24 + val23 * 1f; RaycastHit val28 = default(RaycastHit); if (Physics.Raycast(val27, Vector3.down, ref val28, 2f)) { Vector3 val29 = ((RaycastHit)(ref val28)).point + Vector3.up * 0.5f; RaycastHit val30 = default(RaycastHit); if (Physics.Raycast(val29, -val23, ref val30, 1.5f) && ((RaycastHit)(ref val30)).distance < 0.2f) { return; } if (!Physics.SphereCast(((RaycastHit)(ref val28)).point + Vector3.up * 0.1f, 0.3f, Vector3.up, ref val26, 1.8f)) { vaultTargetPos = ((RaycastHit)(ref val28)).point + Vector3.up * 1.1f; isVaulting = true; vaultTimer = 0f; isVerticalRun = false; hasWallRunVertical = true; ((Collider)component).enabled = false; return; } } } if (Plugin.EnableParkourRotation.Value) { ((Component)__instance).transform.rotation = Quaternion.Slerp(((Component)__instance).transform.rotation, val25, Time.deltaTime * 10f); } Vector3 directionalForce3 = Vector3.up * 0.4f * (gripValue * (0.15f * (float)(roidedCount / 3 + 1))); ((GameEntity)__instance).SetDirectionalForce(directionalForce3); if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(Mathf.Lerp(1f, 0f, gripValue / 10f), false); } if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(Time.deltaTime * 0.4f); } Hand[] hands10 = __instance.hands; foreach (Hand val31 in hands10) { val31.gripStrength -= Time.deltaTime * (4.5f / (float)(roidedCount / 8 + 1)); if (val31.gripStrength < 0f) { val31.gripStrength = 0f; } } return; } } if (!isGrounded && !isVerticalRun && !isVaulting && verticalGraceTimer <= 0f && spaceTapTimer <= 0f && ((ConfigEntry)(object)Plugin.SkillConfigs["VerticalWallRunning"]).Value && ((Collider)component).enabled) { hasWallRunVertical = true; } Vector3 val32 = default(Vector3); ((Vector3)(ref val32))..ctor(component.velocity.x, 0f, component.velocity.z); Vector3 val33 = ((Component)__instance).transform.InverseTransformDirection(val32); bool flag10 = val33.z > 0.1f; float magnitude = ((Vector3)(ref val32)).magnitude; if (!__instance.IsCrouching() || isGrounded) { canSlide = true; } if (isGrounded && __instance.IsCrouching() && !isSliding && canSlide && ((ConfigEntry)(object)Plugin.SkillConfigs["Sliding"]).Value && magnitude >= minSlideSpeed && flag10) { isSliding = true; canSlide = false; slideDir = ((Vector3)(ref val32)).normalized; slideTime = 0f; slideStartPos = ((Component)__instance).transform.position; slideTargetPos = slideStartPos + slideDir * (10f * (float)(roidedCount / 2 + 1)); ((Collider)component).enabled = false; if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(Time.deltaTime * 0.1f); } } if (isSliding) { if (Input.GetKeyDown((KeyCode)32) && ((ConfigEntry)(object)Plugin.SkillConfigs["SlideJumping"]).Value) { float num13 = 1f - slideTime / slideDuration; float num14 = 1f * num13 * (float)(roidedCount / 2 + 1); float num15 = 1.5f * num13 * (float)(roidedCount / 2 + 1); Vector3 directionalForce4 = slideDir * num14 + Vector3.up * num15; float num16 = ((Vector3)(ref directionalForce4)).magnitude * 1f; bool flag11 = true; bool flag12 = true; Hand[] hands11 = __instance.hands; foreach (Hand val34 in hands11) { if (val34.gripStrength < num16) { flag11 = false; break; } } if (!flag11) { flag12 = false; } if (flag12) { ((GameEntity)__instance).SetDirectionalForce(directionalForce4); if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(((Vector3)(ref directionalForce4)).magnitude * Time.deltaTime * 0.1f); } if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(2f, false); } Hand[] hands12 = __instance.hands; foreach (Hand val35 in hands12) { if (!isConsumableUltimate) { val35.gripStrength -= num16; if (val35.gripStrength < 0f) { val35.gripStrength = 0f; } } } isSliding = false; ((Collider)component).enabled = true; return; } } slideTime += Time.deltaTime; float num19 = slideTime / slideDuration; float num20 = 1f - (1f - num19) * (1f - num19); Vector3 position = Vector3.Lerp(slideStartPos, slideTargetPos, num20 * (float)(roidedCount / 10 + 1)); if (Physics.Raycast(((Component)__instance).transform.position + Vector3.up * 0.05f + slideDir * 0.3f, slideDir, 0.8f)) { slideTargetPos = ((Component)__instance).transform.position; slideTime = slideDuration; if (Plugin.EnableParkourShake.Value) { CL_CameraControl.Shake(Time.deltaTime * 0.1f); } isSliding = false; ((Collider)component).enabled = true; return; } if (num19 >= 1f || !__instance.IsCrouching() || !isGrounded) { isSliding = false; ((Collider)component).enabled = true; } else { ((Component)__instance).transform.position = position; if (Plugin.EnableParkourFOV.Value) { __instance.FOVShock(Mathf.Lerp(1.5f, 0f, num20), false); } if (Plugin.EnableParkourRotation.Value) { Transform transform = ((Component)__instance).transform; transform.rotation *= Quaternion.Euler(5f * Time.deltaTime, 0f, 0f); } } } if (wasGrounded && !isGrounded) { startY = ((Component)__instance).transform.position.y; } if (!wasGrounded && isGrounded && ((ConfigEntry)(object)Plugin.SkillConfigs["Rolling"]).Value) { float num21 = startY - ((Component)__instance).transform.position.y; if (num21 >= 15f && __instance.IsCrouching() && !isRotatingRoll) { isRotatingRoll = true; rollTimer = 0f; startRotationRoll = ((Component)__instance).transform.rotation; ((Collider)component).enabled = false; ArmRollingFallDamageCancel(); rollDir = ((Component)__instance).transform.forward; rollDir.y = 0f; ((Vector3)(ref rollDir)).Normalize(); rollStartPos = ((Component)__instance).transform.position; rollTargetPos = rollStartPos + rollDir * 5f; } } if (isRotatingRoll) { rollTimer += Time.deltaTime; float num22 = rollTimer / rollDur; float num23 = Mathf.Lerp(0f, 360f, num22); if (Plugin.EnableParkourRotation.Value) { ((Component)__instance).transform.rotation = startRotationRoll * Quaternion.Euler(num23, 0f, 0f); } if (num22 >= 1f) { ((Component)__instance).transform.rotation = startRotationRoll; __instance.UnLock(); isRotatingRoll = false; } float num24 = rollTimer / rollDur; float num25 = 1f - (1f - num24) * (1f - num24); Vector3 position2 = Vector3.Lerp(rollStartPos, rollTargetPos, num25); if (Physics.Raycast(((Component)__instance).transform.position + Vector3.up * 0.05f + rollDir * 0.3f, rollDir, 0.8f)) { rollTargetPos = ((Component)__instance).transform.position; rollTimer = rollDur; ((Collider)component).enabled = true; return; } if (num24 >= 1f) { ((Collider)component).enabled = true; } else { ((Component)__instance).transform.position = position2; } } wasGrounded = isGrounded; float value = ((ConfigEntry)(object)Plugin.SkillConfigs["MaxHeight"]).Value; float value2 = ((ConfigEntry)(object)Plugin.SkillConfigs["HeightCurrency"]).Value; int num26 = (int)(levelHighestHeight / 100f); levelHighestHeight = ((Component)__instance).transform.position.y; if (((GameEntity)__instance).health <= 0f) { if (levelHighestHeight > value) { ((ConfigEntry)(object)Plugin.SkillConfigs["MaxHeight"]).Value = levelHighestHeight; } liveRunHeight = 0f; highestMilestone = 0; return; } if (liveRunHeight < value) { liveRunHeight = value; } int num27 = 0; if (num26 <= highestMilestone) { return; } int num28 = num26 - highestMilestone; previousCurrency = value2; ConfigEntry obj = (ConfigEntry)(object)Plugin.SkillConfigs["HeightCurrency"]; obj.Value += (float)num28 * 10f; if (levelHighestHeight > liveRunHeight && value >= 100f) { int num29 = (int)(levelHighestHeight / 100f); num27 += num29; if (num27 > 10) { num27 = 10; } ConfigEntry obj2 = (ConfigEntry)(object)Plugin.SkillConfigs["HeightCurrency"]; obj2.Value += (float)num27; liveRunHeight = levelHighestHeight; } ((MonoBehaviour)ParkourUI.Instance).StartCoroutine(ParkourUI.Instance.AnimateCurrencyGain((int)previousCurrency, num28 * 10 + num27)); highestMilestone = num26; } } [HarmonyPatch(typeof(ENT_Player), "Damage")] public class RollingFallDamagePatch { [HarmonyPrefix] public static bool Prefix(DamageInfo info, ref bool __result) { if (!PlayerModifierPatch.TryCancelRollingFallDamage(info)) { return true; } __result = false; return false; } } [HarmonyPatch(typeof(EventSystem), "Update")] public class WorldUpdate { private static bool playerExisted; [HarmonyPrefix] public static void Postfix() { float levelHighestHeight = PlayerModifierPatch.levelHighestHeight; ENT_Player playerObject = ENT_Player.playerObject; float value = ((ConfigEntry)(object)Plugin.SkillConfigs["MaxHeight"]).Value; if ((Object)(object)playerObject != (Object)null) { if (!playerExisted) { playerExisted = true; } if (((GameEntity)(playerObject?)).curBuffs != null) { IEnumerable enumerable = ((((object)((GameEntity)playerObject).curBuffs).GetType().GetFields(BindingFlags.DeclaredOnly | BindingFlags.Instance | BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic).FirstOrDefault((FieldInfo f) => f.FieldType == typeof(List))?.GetValue(((GameEntity)playerObject).curBuffs) is List source) ? (from b in source.SelectMany((BuffContainer c) => c?.buffs ?? new List()) where b != null && !string.IsNullOrEmpty(b.id) select b.id) : null); PlayerModifierPatch.isConsumableUltimate = enumerable?.Any((string name) => name == "pilled" || name == "roided") ?? false; PlayerModifierPatch.roidedCount = Mathf.Min(enumerable?.Count((string name) => name == "roided") ?? 0, 5); } } if ((Object)(object)playerObject == (Object)null && playerExisted) { if (levelHighestHeight > value) { ((ConfigEntry)(object)Plugin.SkillConfigs["MaxHeight"]).Value = levelHighestHeight; } PlayerModifierPatch.liveRunHeight = 0f; PlayerModifierPatch.highestMilestone = 0; playerExisted = false; } if (ParkourUI.hasPurchased) { ((ConfigEntry)(object)Plugin.SkillConfigs["HeightCurrency"]).Value = ParkourUI.newCurrencyAmount; ParkourUI.hasPurchased = false; ParkourUI.UpdateCurrencyDisplay(); } } } } namespace ParkourKnuckle.UI { public class ParkourUI : MonoBehaviour { private const float percentLineFillRequiredToUnlock = 0.5f; private const float popInDuration = 0.25f; private const float popOutDuration = 0.18f; private const float nodeAnimateDuration = 0.35f; private GameObject uiInstance; private GameObject skillTreePanel; private GameObject openButtonObj; private GameObject closeButtonObj; private Transform contentTransform; private GameObject clickOutsideBlocker; private static TextMeshProUGUI currencyTextComponent; private static TextMeshProUGUI heightTextComponent; private GameObject currencyIconObj; private GameObject currencyAddObj; private TextMeshProUGUI mainText; private TextMeshProUGUI infoText; private CanvasGroup currencyAddCanvasGroup; private GameObject resetConfirmBox; private Button confirmButton; private Button denyButton; private GameObject abilityTimesContainer; private GameObject leapAbilityBox; private GameObject qtAbilityBox; private Image leapAbilityTimer; private Image leapForceGlow; private Image qtAbilityTimer; private GameObject loadingScreen; private GameObject loadingImages; private TextMeshProUGUI mapLoadingText; private TextMeshProUGUI seedLoadingText; private TextMeshProUGUI idLoadingText; private GameObject wallRunFadeHelper; private GameObject wallRunLeft; private GameObject wallRunRight; private GameObject wallRunUp; private CanvasGroup wallRunLeftGroup = null; private CanvasGroup wallRunRightGroup = null; private CanvasGroup wallRunUpGroup = null; private GameObject optionsContentObj; private GameObject forwardButtonObj; private GameObject backButtonObj; private Transform headerGroup; private TextMeshProUGUI textHeaderComponent; private Toggle cameraRotationToggle; private Toggle cameraFOVToggle; private Toggle cameraShakeToggle; private Toggle uiGlowToggle; private Button resetProgressButton; private GameObject descriptionPanelObj; private TextMeshProUGUI perkDescriptionText; private Button purchaseButton; private TextMeshProUGUI purchaseButtonText; private TextMeshProUGUI perkCurrencyText; private GameObject perkCurrencyIcon; private string currentlySelectedSkillKey = string.Empty; private bool pendingPurchaseAnimation = false; private readonly Dictionary skillButtons = new Dictionary(); private readonly Dictionary skillDependencies = new Dictionary(); private readonly Dictionary skillLines = new Dictionary(); private readonly List activeAnimations = new List(); private readonly Dictionary activeButtonCoroutines = new Dictionary(); private readonly Dictionary graffitiScreens = new Dictionary(); public static bool hasPurchased = false; public static float newCurrencyAmount = 0f; public static bool purchaseTrue = true; private readonly Dictionary perkDescriptions = new Dictionary { { "QuickTurning", "You can quick turn 180 degrees at any point with no debuff by tapping X. This may help save time when you need to turn around at fast intervals." }, { "Sliding", "While running (or moving at a high velocity), hold down the crouch key to slide." }, { "SlideJumping", "During a slide, you can jump to gain a boost. This boost does consume hand stamina. As the duration of your slide grows, less power will be put into the boost, however, less stamina will be taken." }, { "Leaping", "Holding G will cause you to charge up a leap. The longer you charge your leap, the further your leap will go, but your stamina will be consumed the more you charge your leap." }, { "Rolling", "While you are falling from great height, hold down your crouch button to initiate a roll when you land. This takes no stamina and prevents fall damage from the landing impact." }, { "WallKicking", "While your back is turned away from a wall, hold S and press the spacebar to kick off of that wall. holding down S after the kick will allow you to control your distance while in the air." }, { "WallRunning", "You can run on the side of walls by standing close to a wall and double tapping and holding the spacebar and holding A or D depending on which side of the wall you are standing near. This consumes very little hand stamina." }, { "VerticalWallRunning", "You have the ability to run up to walls and climb them without needing any tools whatsoever. Double tap and hold spacebar and hold W at the same time while facing a wall to begin a vertical wall run. This consumes a moderate amount of hand stamina.\r\n\r\n" }, { "WallRunBoost", "While vertically wall running, you can release W and quickly tap spacebar to kick off of the wall and give yourself a backwards boost. This does not use up your stamina, however, the power of the boost is determined by your hand stamina." } }; private readonly Dictionary configToIconMap = new Dictionary { { "QuickTurning", "QuickTurnIcon" }, { "Sliding", "SlideIcon" }, { "SlideJumping", "SlideJumpIcon" }, { "Leaping", "LeapIcon" }, { "Rolling", "RollIcon" }, { "WallKicking", "WallKickIcon" }, { "WallRunning", "WRHIcon" }, { "VerticalWallRunning", "WRVIcon" }, { "WallRunBoost", "WRBIcon" } }; private readonly Dictionary skillPrices = new Dictionary { { "QuickTurning", 0f }, { "Sliding", 15f }, { "SlideJumping", 30f }, { "Leaping", 100f }, { "Rolling", 75f }, { "WallKicking", 30f }, { "WallRunning", 50f }, { "VerticalWallRunning", 60f }, { "WallRunBoost", 75f } }; private Coroutine activePanelPopCoroutine; private Coroutine activeButtonPopCoroutine; private bool isAnimatingBranch = false; private bool wasPlayerObjectPresent = false; private const float wobbleSpeed = 2.5f; private const float wobbleMagnitude = 4f; private const float noiseSpacing = 100f; private const float FADE_SPEED = 5f; private readonly Dictionary nodeOriginPositions = new Dictionary(); private RectTransform quickTurnRect; private readonly Dictionary lineOriginPositions = new Dictionary(); private RectTransform lineToSlideRect; private GameObject perkIconHolderObj; private readonly Dictionary perkIcons = new Dictionary(); private bool hadLoading = false; private string activeGraffitiName = null; private float playerCheckTimer = 0f; private const float PLAYER_CHECK_INTERVAL = 0.2f; private bool cachedIsPlayerPresent = false; private CL_GameManager cachedGameManager = null; private RectTransform cachedPerkIconRect = null; public static ParkourUI Instance { get; private set; } public static void Initialize() { //IL_0017: Unknown result type (might be due to invalid IL or missing references) //IL_001d: Expected O, but got Unknown if (!((Object)(object)Instance != (Object)null)) { GameObject val = new GameObject("ParkourKnuckle_UIHost"); Object.DontDestroyOnLoad((Object)(object)val); Instance = val.AddComponent(); Instance.LoadAndBuildUI(); } } private void Update() { //IL_015b: Unknown result type (might be due to invalid IL or missing references) //IL_099e: 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_03cf: Unknown result type (might be due to invalid IL or missing references) //IL_03df: Unknown result type (might be due to invalid IL or missing references) //IL_0404: Unknown result type (might be due to invalid IL or missing references) playerCheckTimer += Time.deltaTime; if (playerCheckTimer >= 0.2f) { playerCheckTimer = 0f; cachedIsPlayerPresent = (Object)(object)GameObject.Find("CL_Player") != (Object)null; } bool flag = cachedIsPlayerPresent; if (flag && !wasPlayerObjectPresent) { wasPlayerObjectPresent = true; if (Plugin.isUIVisible) { ToggleUIPanel(showMainPanel: false); } if ((Object)(object)openButtonObj != (Object)null) { openButtonObj.SetActive(false); } if ((Object)(object)currencyIconObj != (Object)null) { currencyIconObj.SetActive(false); } if ((Object)(object)abilityTimesContainer != (Object)null) { abilityTimesContainer.SetActive(true); } if ((Object)(object)wallRunFadeHelper != (Object)null) { wallRunFadeHelper.SetActive(true); } } else if (!flag && wasPlayerObjectPresent) { wasPlayerObjectPresent = false; if ((Object)(object)openButtonObj != (Object)null && !Plugin.isUIVisible) { openButtonObj.SetActive(true); openButtonObj.transform.localScale = Vector3.one; } if ((Object)(object)currencyIconObj != (Object)null) { currencyIconObj.SetActive(true); UpdateCurrencyDisplay(); } if ((Object)(object)abilityTimesContainer != (Object)null) { abilityTimesContainer.SetActive(false); } if ((Object)(object)wallRunFadeHelper != (Object)null) { wallRunFadeHelper.SetActive(false); } } if (flag) { if ((Object)(object)qtAbilityBox != (Object)null) { if (((ConfigEntry)(object)Plugin.SkillConfigs["QuickTurning"]).Value && ((GameEntity)ENT_Player.playerObject).health > 0f && !cachedGameManager.isPaused) { qtAbilityBox.SetActive(true); } else { qtAbilityBox.SetActive(false); } if ((Object)(object)qtAbilityTimer != (Object)null && PlayerModifierPatch.onCooldown) { qtAbilityTimer.fillAmount = PlayerModifierPatch.CooldownTime / PlayerModifierPatch.CooldownDur; } else if ((Object)(object)qtAbilityTimer != (Object)null) { qtAbilityTimer.fillAmount = 1f; } } if ((Object)(object)leapAbilityBox != (Object)null) { if (((ConfigEntry)(object)Plugin.SkillConfigs["Leaping"]).Value && ((GameEntity)ENT_Player.playerObject).health > 0f && !cachedGameManager.isPaused) { leapAbilityBox.SetActive(true); } else { leapAbilityBox.SetActive(false); } if ((Object)(object)leapAbilityTimer != (Object)null && PlayerModifierPatch.leapCooldown) { leapAbilityTimer.fillAmount = PlayerModifierPatch.leapCooldownTime / PlayerModifierPatch.leapCooldownDur; } else if ((Object)(object)leapAbilityTimer != (Object)null) { leapAbilityTimer.fillAmount = 1f; } if ((Object)(object)leapForceGlow != (Object)null && PlayerModifierPatch.isCharging) { leapForceGlow.fillAmount = PlayerModifierPatch.currentCharge / PlayerModifierPatch.maxChargeTime; ((Graphic)leapForceGlow).color = new Color(((Graphic)leapForceGlow).color.r, ((Graphic)leapForceGlow).color.g, ((Graphic)leapForceGlow).color.b, Mathf.Max(0.1f, leapForceGlow.fillAmount / 2f)); } else if ((Object)(object)leapForceGlow != (Object)null) { leapForceGlow.fillAmount = 0f; } } if ((Object)(object)currencyIconObj != (Object)null && (((GameEntity)ENT_Player.playerObject).health <= 0f || cachedGameManager.isPaused)) { currencyIconObj.SetActive(true); } else if ((Object)(object)currencyIconObj != (Object)null && ((GameEntity)ENT_Player.playerObject).health > 0f && !cachedGameManager.isPaused) { currencyIconObj.SetActive(false); } if ((Object)(object)wallRunFadeHelper != (Object)null && Plugin.EnableWallRunHelper.Value) { if ((Object)(object)wallRunLeftGroup != (Object)null) { float num = ((PlayerModifierPatch.canRun && PlayerModifierPatch.wallLeft && !PlayerModifierPatch.hasWallRunInAir && !PlayerModifierPatch.isHorizRun) ? 1f : 0f); wallRunLeftGroup.alpha = Mathf.MoveTowards(wallRunLeftGroup.alpha, num, 5f * Time.deltaTime); } if ((Object)(object)wallRunRightGroup != (Object)null) { float num2 = ((PlayerModifierPatch.canRun && PlayerModifierPatch.wallRight && !PlayerModifierPatch.hasWallRunInAir && !PlayerModifierPatch.isHorizRun) ? 1f : 0f); wallRunRightGroup.alpha = Mathf.MoveTowards(wallRunRightGroup.alpha, num2, 5f * Time.deltaTime); } if ((Object)(object)wallRunUpGroup != (Object)null) { float num3 = ((PlayerModifierPatch.canVert && PlayerModifierPatch.wallFront && !PlayerModifierPatch.hasWallRunVertical && !PlayerModifierPatch.isVerticalRun) ? 1f : 0f); wallRunUpGroup.alpha = Mathf.MoveTowards(wallRunUpGroup.alpha, num3, 5f * Time.deltaTime); } if ((Object)(object)cachedGameManager != (Object)null) { if (cachedGameManager.isPaused) { wallRunFadeHelper.SetActive(false); } else if (((GameEntity)ENT_Player.playerObject).health <= 0f) { wallRunFadeHelper.SetActive(false); } else { wallRunFadeHelper.SetActive(true); } } } else if ((Object)(object)wallRunFadeHelper != (Object)null && !Plugin.EnableWallRunHelper.Value) { wallRunFadeHelper.SetActive(false); } if (openButtonObj.activeSelf) { openButtonObj.SetActive(false); } } if ((Object)(object)cachedGameManager == (Object)null) { cachedGameManager = Object.FindObjectOfType(); } if ((Object)(object)cachedGameManager != (Object)null) { if (CL_GameManager.IsLoading() && !hadLoading) { hadLoading = true; loadingScreen.SetActive(true); string key = "Graffiti" + Random.Range(1, 10); if (graffitiScreens.TryGetValue(key, out var value)) { value.SetActive(true); activeGraffitiName = key; } } else if (!CL_GameManager.IsLoading() && hadLoading) { hadLoading = false; ((TMP_Text)mapLoadingText).text = ""; ((TMP_Text)seedLoadingText).text = ""; ((TMP_Text)idLoadingText).text = ""; loadingScreen.SetActive(false); if (!string.IsNullOrEmpty(activeGraffitiName)) { if (graffitiScreens.TryGetValue(activeGraffitiName, out var value2)) { value2.SetActive(false); } activeGraffitiName = null; } } } if ((Object)(object)cachedGameManager != (Object)null && CL_GameManager.IsLoading()) { M_Level val = Object.FindAnyObjectByType(); if ((Object)(object)val != (Object)null) { string levelName = val.levelName; int levelSeed = val.GetLevelSeed(); int instanceID = ((Object)val).GetInstanceID(); ((TMP_Text)mapLoadingText).text = levelName; ((TMP_Text)seedLoadingText).text = levelSeed.ToString(); ((TMP_Text)idLoadingText).text = instanceID.ToString(); } } if (Plugin.isUIVisible && !isAnimatingBranch) { ApplyProceduralWobble(); } if (Plugin.isUIVisible && (Object)(object)perkIconHolderObj != (Object)null && perkIconHolderObj.activeSelf) { float num4 = Time.time * 2.5f; if ((Object)(object)cachedPerkIconRect == (Object)null) { cachedPerkIconRect = perkIconHolderObj.GetComponent(); } float num5 = Mathf.Sin(num4) * 4f; float num6 = Mathf.Cos(num4 * 0.8f) * 4f; if ((Object)(object)cachedPerkIconRect != (Object)null) { cachedPerkIconRect.anchoredPosition = new Vector2(num5, num6); } } } private void ApplyProceduralWobble() { //IL_00ae: Unknown result type (might be due to invalid IL or missing references) //IL_00b5: Unknown result type (might be due to invalid IL or missing references) //IL_00ba: Unknown result type (might be due to invalid IL or missing references) //IL_00a3: Unknown result type (might be due to invalid IL or missing references) //IL_00a8: Unknown result type (might be due to invalid IL or missing references) //IL_0204: Unknown result type (might be due to invalid IL or missing references) //IL_018b: Unknown result type (might be due to invalid IL or missing references) //IL_0190: Unknown result type (might be due to invalid IL or missing references) //IL_0192: Unknown result type (might be due to invalid IL or missing references) //IL_019b: Unknown result type (might be due to invalid IL or missing references) //IL_01b5: Unknown result type (might be due to invalid IL or missing references) //IL_01bc: Unknown result type (might be due to invalid IL or missing references) //IL_01dc: 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_01f1: Unknown result type (might be due to invalid IL or missing references) //IL_01f3: 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_00c6: Unknown result type (might be due to invalid IL or missing references) //IL_00e0: Unknown result type (might be due to invalid IL or missing references) //IL_00e7: Unknown result type (might be due to invalid IL or missing references) //IL_0107: Unknown result type (might be due to invalid IL or missing references) //IL_0111: Unknown result type (might be due to invalid IL or missing references) //IL_0116: Unknown result type (might be due to invalid IL or missing references) //IL_011a: Unknown result type (might be due to invalid IL or missing references) //IL_011c: Unknown result type (might be due to invalid IL or missing references) //IL_011e: Unknown result type (might be due to invalid IL or missing references) float num = Time.time * 2.5f; foreach (KeyValuePair skillButton in skillButtons) { string key = skillButton.Key; Button value = skillButton.Value; if (!activeButtonCoroutines.TryGetValue(key, out var value2) || value2 == null) { RectTransform component = ((Component)value).GetComponent(); if ((Object)(object)component != (Object)null && nodeOriginPositions.TryGetValue(key, out var value3)) { Vector2 val = ((!IsConnectedToRoot(key) && !AreDependenciesMet(key)) ? (value3 * 0.005f) : Vector2.zero); float num2 = Mathf.PerlinNoise(val.x + num, val.y) * 2f - 1f; float num3 = Mathf.PerlinNoise(val.x, val.y + num) * 2f - 1f; Vector2 val2 = new Vector2(num2, num3) * 4f; component.anchoredPosition = value3 + val2; } } if (!skillLines.TryGetValue(key, out var value4)) { continue; } RectTransform component2 = ((Component)value4).GetComponent(); if ((Object)(object)component2 != (Object)null && lineOriginPositions.TryGetValue(key, out var value5)) { if (IsConnectedToRoot(key) || AreDependenciesMet(key)) { Vector2 zero = Vector2.zero; float num4 = Mathf.PerlinNoise(zero.x + num, zero.y) * 2f - 1f; float num5 = Mathf.PerlinNoise(zero.x, zero.y + num) * 2f - 1f; Vector2 val3 = new Vector2(num4, num5) * 4f; component2.anchoredPosition = value5 + val3; } else { component2.anchoredPosition = value5; } } } } private bool IsConnectedToRoot(string configKey) { if (configKey == "QuickTurning") { if (Plugin.SkillConfigs.TryGetValue("QuickTurning", out var value)) { return ((ConfigEntry)(object)value).Value; } return false; } if (Plugin.SkillConfigs.TryGetValue(configKey, out var value2) && !((ConfigEntry)(object)value2).Value) { return false; } if (skillDependencies.TryGetValue(configKey, out var value3)) { string[] array = value3; foreach (string configKey2 in array) { if (IsConnectedToRoot(configKey2)) { return true; } } } return false; } private void LoadAndBuildUI() { //IL_0131: Unknown result type (might be due to invalid IL or missing references) //IL_06b1: Unknown result type (might be due to invalid IL or missing references) //IL_06aa: Unknown result type (might be due to invalid IL or missing references) //IL_076a: Unknown result type (might be due to invalid IL or missing references) //IL_0763: Unknown result type (might be due to invalid IL or missing references) //IL_07ff: Unknown result type (might be due to invalid IL or missing references) //IL_0806: Expected O, but got Unknown //IL_0407: Unknown result type (might be due to invalid IL or missing references) //IL_0411: Expected O, but got Unknown //IL_0af4: Unknown result type (might be due to invalid IL or missing references) //IL_0afb: Expected O, but got Unknown //IL_0449: Unknown result type (might be due to invalid IL or missing references) //IL_0453: Expected O, but got Unknown string directoryName = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); string text = Path.Combine(directoryName, "Assets", "parkourui"); if (!File.Exists(text)) { CleanUpFailedInit(); return; } AssetBundle val = AssetBundle.LoadFromFile(text); if ((Object)(object)val == (Object)null) { CleanUpFailedInit(); return; } GameObject val2 = null; string[] allAssetNames = val.GetAllAssetNames(); if (allAssetNames.Length != 0) { val2 = val.LoadAsset(allAssetNames[0]); } if ((Object)(object)val2 == (Object)null) { val.Unload(false); CleanUpFailedInit(); return; } uiInstance = Object.Instantiate(val2); Object.DontDestroyOnLoad((Object)(object)uiInstance); val.Unload(false); Canvas component = uiInstance.GetComponent(); if ((Object)(object)component != (Object)null) { component.renderMode = (RenderMode)0; component.worldCamera = null; component.sortingOrder = 32767; } CanvasScaler component2 = uiInstance.GetComponent(); if ((Object)(object)component2 != (Object)null) { component2.uiScaleMode = (ScaleMode)1; component2.referenceResolution = new Vector2(1920f, 1080f); component2.screenMatchMode = (ScreenMatchMode)0; component2.matchWidthOrHeight = 0.5f; } Transform obj = uiInstance.transform.Find("OpenSTButton"); openButtonObj = ((obj != null) ? ((Component)obj).gameObject : null); Transform obj2 = uiInstance.transform.Find("STMainBorder"); skillTreePanel = ((obj2 != null) ? ((Component)obj2).gameObject : null); Transform obj3 = uiInstance.transform.Find("CurrencyIcon"); currencyIconObj = ((obj3 != null) ? ((Component)obj3).gameObject : null); Transform obj4 = uiInstance.transform.Find("CurrencyAdd"); currencyAddObj = ((obj4 != null) ? ((Component)obj4).gameObject : null); Transform obj5 = uiInstance.transform.Find("AbilityTimes"); abilityTimesContainer = ((obj5 != null) ? ((Component)obj5).gameObject : null); Transform obj6 = uiInstance.transform.Find("LoadingScreen"); loadingScreen = ((obj6 != null) ? ((Component)obj6).gameObject : null); Transform obj7 = uiInstance.transform.Find("WallRunHelper"); wallRunFadeHelper = ((obj7 != null) ? ((Component)obj7).gameObject : null); if ((Object)(object)skillTreePanel != (Object)null) { Transform obj8 = skillTreePanel.transform.Find("CloseSTButton"); closeButtonObj = ((obj8 != null) ? ((Component)obj8).gameObject : null); contentTransform = skillTreePanel.transform.Find("PerkContent"); if ((Object)(object)contentTransform == (Object)null) { contentTransform = skillTreePanel.transform.Find("Content"); } Transform obj9 = skillTreePanel.transform.Find("OptionsContent"); optionsContentObj = ((obj9 != null) ? ((Component)obj9).gameObject : null); Transform obj10 = skillTreePanel.transform.Find("PerkDescription"); descriptionPanelObj = ((obj10 != null) ? ((Component)obj10).gameObject : null); Transform obj11 = skillTreePanel.transform.Find("ResetConfirmBox"); resetConfirmBox = ((obj11 != null) ? ((Component)obj11).gameObject : null); if ((Object)(object)resetConfirmBox != (Object)null) { resetConfirmBox.SetActive(false); Transform obj12 = resetConfirmBox.transform.Find("ConfirmButton"); confirmButton = ((obj12 != null) ? ((Component)obj12).GetComponent