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 BepInEx.Configuration;
using HarmonyLib;
using TMPro;
using UnityEngine;
using UnityEngine.SceneManagement;
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("LowTempJumpSoundEffect")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("LowTempJumpSoundEffect")]
[assembly: AssemblyCopyright("Copyright © 2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("0B7A8722-60D8-41BE-9287-0A128571B541")]
[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 LowTempJumpSoundEffect;
public enum TextAlignment
{
Top,
Bottom,
Center,
BottomLeft,
BottomRight,
CenterLeft,
CenterRight,
TopLeft,
TopRight
}
[BepInPlugin("mazknight.whiteknuckle.TemporaryJumpVisualizer", "TemporaryJumpVisualizer", "1.2.0")]
public class Plugin : BaseUnityPlugin
{
private const string pluginGuid = "mazknight.whiteknuckle.TemporaryJumpVisualizer";
private const string pluginName = "TemporaryJumpVisualizer";
public const string pluginVersion = "1.2.0";
public static ConfigEntry<float> xAnchorPosition;
public static ConfigEntry<float> yAnchorPosition;
public static ConfigEntry<TextAlignment> textAlignment;
public static ConfigEntry<Color> temporaryOnlyJumpsColor;
public static ConfigEntry<Color> regularJumpsLeftColor;
public static ConfigEntry<Color> regularJumpsColor;
public static ConfigEntry<bool> alwaysShowJumpCounter;
public static ConfigEntry<float> fontSize;
public void Awake()
{
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_000c: Expected O, but got Unknown
//IL_008b: Unknown result type (might be due to invalid IL or missing references)
//IL_00be: Unknown result type (might be due to invalid IL or missing references)
//IL_00e2: Unknown result type (might be due to invalid IL or missing references)
Harmony val = new Harmony("mazknight.whiteknuckle.TemporaryJumpVisualizer");
val.PatchAll();
xAnchorPosition = ((BaseUnityPlugin)this).Config.Bind<float>("Alignment", "xPosition", 0.5f, "The x position to have the display. 0 means very left, 1 means very left");
yAnchorPosition = ((BaseUnityPlugin)this).Config.Bind<float>("Alignment", "yPosition", 1f, "The y position to have the display. 0 means very bottom, 1 means very top");
textAlignment = ((BaseUnityPlugin)this).Config.Bind<TextAlignment>("Alignment", "textAlignment", TextAlignment.Bottom, "Where the text should be in relation to the chosen position. ");
temporaryOnlyJumpsColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Color", "temporaryJumpsColor", Color.red, "What color the number should be if you have only temporary jumps available");
regularJumpsLeftColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Color", "regularJumpsLeftColor", new Color(1f, 0.5f, 0f), "What number should the number be if there are regular mid air jumps left (go in game to see what I mean)");
regularJumpsColor = ((BaseUnityPlugin)this).Config.Bind<Color>("Color", "regularJumpsColor", Color.green, "What color the number should be if you have regular mid air jumps available");
alwaysShowJumpCounter = ((BaseUnityPlugin)this).Config.Bind<bool>("Other", "alwaysShowJumpCounter", false, "If false, will only show when you have temporary jumps. Otherwise will always show.");
fontSize = ((BaseUnityPlugin)this).Config.Bind<float>("Other", "fontSize", 40f, "Why do you need a description");
((BaseUnityPlugin)this).Config.SettingChanged += delegate
{
Patches.UpdateTextPosition();
};
}
}
[HarmonyPatch]
public static class Patches
{
public static bool HasAppeared;
public static TextMeshProUGUI FrontText;
public static TextMeshProUGUI BackText;
public static RectMask2D FrontMask2D;
public static RectMask2D BackMask2D;
internal static int MaxDoubleJumps = 0;
private static Dictionary<TextAlignment, string> attributes = new Dictionary<TextAlignment, string>
{
{
TextAlignment.Top,
"Y"
},
{
TextAlignment.TopLeft,
"Yx"
},
{
TextAlignment.TopRight,
"YX"
},
{
TextAlignment.Center,
""
},
{
TextAlignment.CenterLeft,
"x"
},
{
TextAlignment.CenterRight,
"X"
},
{
TextAlignment.Bottom,
"y"
},
{
TextAlignment.BottomLeft,
"yx"
},
{
TextAlignment.BottomRight,
"yX"
}
};
[HarmonyPostfix]
[HarmonyPatch(typeof(ENT_Player), "Update")]
public static void Update()
{
//IL_00a0: Unknown result type (might be due to invalid IL or missing references)
//IL_00a5: Unknown result type (might be due to invalid IL or missing references)
//IL_00a9: Unknown result type (might be due to invalid IL or missing references)
//IL_00cb: Unknown result type (might be due to invalid IL or missing references)
//IL_00d0: Unknown result type (might be due to invalid IL or missing references)
//IL_00d4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f4: Unknown result type (might be due to invalid IL or missing references)
//IL_00f9: Unknown result type (might be due to invalid IL or missing references)
//IL_00fd: Unknown result type (might be due to invalid IL or missing references)
//IL_0125: Unknown result type (might be due to invalid IL or missing references)
//IL_012a: Unknown result type (might be due to invalid IL or missing references)
//IL_012e: Unknown result type (might be due to invalid IL or missing references)
//IL_0152: Unknown result type (might be due to invalid IL or missing references)
//IL_0157: Unknown result type (might be due to invalid IL or missing references)
//IL_015b: Unknown result type (might be due to invalid IL or missing references)
//IL_0173: Unknown result type (might be due to invalid IL or missing references)
//IL_0188: Unknown result type (might be due to invalid IL or missing references)
//IL_0197: Unknown result type (might be due to invalid IL or missing references)
//IL_019c: Unknown result type (might be due to invalid IL or missing references)
//IL_01a0: Unknown result type (might be due to invalid IL or missing references)
//IL_01b9: Unknown result type (might be due to invalid IL or missing references)
//IL_01be: Unknown result type (might be due to invalid IL or missing references)
//IL_01dd: Unknown result type (might be due to invalid IL or missing references)
//IL_01e2: 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_01f9: Unknown result type (might be due to invalid IL or missing references)
//IL_020e: Unknown result type (might be due to invalid IL or missing references)
//IL_021d: Unknown result type (might be due to invalid IL or missing references)
//IL_0222: 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_0238: Unknown result type (might be due to invalid IL or missing references)
//IL_023d: Unknown result type (might be due to invalid IL or missing references)
//IL_0270: Unknown result type (might be due to invalid IL or missing references)
//IL_0299: Unknown result type (might be due to invalid IL or missing references)
//IL_028d: Unknown result type (might be due to invalid IL or missing references)
int num = (int)AccessTools.Field(typeof(ENT_Player), "temporaryExtraJumpsRemaining").GetValue(ENT_Player.playerObject);
if ((Object)(object)FrontText == (Object)null)
{
CreateText();
}
if (num == 0 && !Plugin.alwaysShowJumpCounter.Value)
{
((TMP_Text)FrontText).text = "";
}
else
{
((TMP_Text)FrontText).text = num.ToString();
}
((TMP_Text)BackText).text = ((TMP_Text)FrontText).text;
float percentage = GetPercentage();
RectTransform rectTransform = FrontMask2D.rectTransform;
Bounds textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform.SetSizeWithCurrentAnchors((Axis)1, ((Bounds)(ref textBounds)).size.y * percentage);
RectTransform rectTransform2 = FrontMask2D.rectTransform;
textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform2.SetSizeWithCurrentAnchors((Axis)0, ((Bounds)(ref textBounds)).size.x);
RectTransform rectTransform3 = BackMask2D.rectTransform;
textBounds = ((TMP_Text)BackText).textBounds;
rectTransform3.SetSizeWithCurrentAnchors((Axis)1, ((Bounds)(ref textBounds)).size.y * (1f - percentage));
RectTransform rectTransform4 = BackMask2D.rectTransform;
textBounds = ((TMP_Text)BackText).textBounds;
rectTransform4.SetSizeWithCurrentAnchors((Axis)0, ((Bounds)(ref textBounds)).size.x);
RectTransform rectTransform5 = ((TMP_Text)FrontText).rectTransform;
textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform5.anchoredPosition = new Vector2(0f, ((Bounds)(ref textBounds)).size.y * (1f - percentage) / 2f);
RectTransform rectTransform6 = FrontMask2D.rectTransform;
Vector2 textAlignmentVector = GetTextAlignmentVector();
textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform6.anchoredPosition = textAlignmentVector + new Vector2(0f, (0f - ((Bounds)(ref textBounds)).size.y) * (1f - percentage) / 2f);
RectTransform rectTransform7 = ((TMP_Text)BackText).rectTransform;
textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform7.anchoredPosition = new Vector2(0f, (0f - ((Bounds)(ref textBounds)).size.y) * percentage / 2f);
RectTransform rectTransform8 = BackMask2D.rectTransform;
Vector2 textAlignmentVector2 = GetTextAlignmentVector();
textBounds = ((TMP_Text)FrontText).textBounds;
rectTransform8.anchoredPosition = textAlignmentVector2 + new Vector2(0f, ((Bounds)(ref textBounds)).size.y * percentage / 2f);
if (percentage == 0f)
{
((TMP_Text)FrontText).text = "";
}
((Graphic)FrontText).color = Plugin.regularJumpsColor.Value;
((Graphic)BackText).color = ((percentage > 0f) ? Plugin.regularJumpsLeftColor.Value : Plugin.temporaryOnlyJumpsColor.Value);
}
[HarmonyPrefix]
[HarmonyPatch(typeof(CL_GameManager), "Awake")]
public static void ResetJumpCounter()
{
if (!((Object)(object)CL_GameManager.gamemode == (Object)null))
{
MaxDoubleJumps = 0;
}
}
public static float GetPercentage()
{
int num = (int)AccessTools.Field(typeof(ENT_Player), "extraJumpsRemaining").GetValue(ENT_Player.playerObject);
if (MaxDoubleJumps < num)
{
MaxDoubleJumps = num;
}
if (MaxDoubleJumps == 0)
{
return 0f;
}
return (float)num / (float)MaxDoubleJumps;
}
private static void CreateText()
{
//IL_0001: Unknown result type (might be due to invalid IL or missing references)
//IL_0006: Unknown result type (might be due to invalid IL or missing references)
//IL_007e: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Expected O, but got Unknown
//IL_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_008f: Expected O, but got Unknown
//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
//IL_00f1: Expected O, but got Unknown
//IL_0115: Unknown result type (might be due to invalid IL or missing references)
//IL_011c: Expected O, but got Unknown
//IL_0198: Unknown result type (might be due to invalid IL or missing references)
//IL_01b7: Unknown result type (might be due to invalid IL or missing references)
//IL_01cc: Unknown result type (might be due to invalid IL or missing references)
//IL_0225: Unknown result type (might be due to invalid IL or missing references)
//IL_0244: Unknown result type (might be due to invalid IL or missing references)
//IL_0259: Unknown result type (might be due to invalid IL or missing references)
Scene activeScene = SceneManager.GetActiveScene();
GameObject[] rootGameObjects = ((Scene)(ref activeScene)).GetRootGameObjects();
Transform val = null;
GameObject[] array = rootGameObjects;
foreach (GameObject val2 in array)
{
if (!(((Object)val2).name != "GameManager"))
{
val = val2.transform.Find("Canvas").Find("Game UI");
}
}
if (!((Object)(object)val == (Object)null))
{
GameObject val3 = new GameObject("ExtraJumpDisplay");
GameObject val4 = new GameObject("BackText");
FrontText = val3.AddComponent<TextMeshProUGUI>();
((TMP_Text)FrontText).text = "0";
BackText = val4.AddComponent<TextMeshProUGUI>();
((TMP_Text)BackText).text = "0";
((TMP_Text)FrontText).alignment = (TextAlignmentOptions)514;
((TMP_Text)BackText).alignment = (TextAlignmentOptions)514;
GameObject val5 = new GameObject("FrontMask");
FrontMask2D = val5.AddComponent<RectMask2D>();
val5.transform.SetParent(((Component)val).transform);
GameObject val6 = new GameObject("BackMask");
BackMask2D = val6.AddComponent<RectMask2D>();
val6.transform.SetParent(((Component)val).transform);
TMP_FontAsset font = ((TMP_Text)((Component)val.parent.Find("Progression_Session_Unlock_Window").Find("Game Over Title Text")).gameObject.GetComponent<TextMeshProUGUI>()).font;
UpdateTextPosition();
((TMP_Text)FrontText).transform.SetParent(val5.transform, false);
((TMP_Text)FrontText).rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
((TMP_Text)FrontText).rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
((TMP_Text)FrontText).rectTransform.anchoredPosition = Vector2.zero;
((TMP_Text)FrontText).font = font;
((TMP_Text)FrontText).fontSize = Plugin.fontSize.Value;
((TMP_Text)BackText).transform.SetParent(val6.transform, false);
((TMP_Text)BackText).rectTransform.anchorMax = new Vector2(0.5f, 0.5f);
((TMP_Text)BackText).rectTransform.anchorMin = new Vector2(0.5f, 0.5f);
((TMP_Text)BackText).rectTransform.anchoredPosition = Vector2.zero;
((TMP_Text)BackText).font = font;
((TMP_Text)BackText).fontSize = Plugin.fontSize.Value;
}
}
internal static void UpdateTextPosition()
{
//IL_001f: Unknown result type (might be due to invalid IL or missing references)
//IL_0048: Unknown result type (might be due to invalid IL or missing references)
//IL_005d: Unknown result type (might be due to invalid IL or missing references)
//IL_0086: Unknown result type (might be due to invalid IL or missing references)
//IL_00af: Unknown result type (might be due to invalid IL or missing references)
//IL_00c4: Unknown result type (might be due to invalid IL or missing references)
FrontMask2D.rectTransform.anchorMin = new Vector2(Plugin.xAnchorPosition.Value, Plugin.yAnchorPosition.Value);
FrontMask2D.rectTransform.anchorMax = new Vector2(Plugin.xAnchorPosition.Value, Plugin.yAnchorPosition.Value);
FrontMask2D.rectTransform.anchoredPosition = GetTextAlignmentVector();
BackMask2D.rectTransform.anchorMin = new Vector2(Plugin.xAnchorPosition.Value, Plugin.yAnchorPosition.Value);
BackMask2D.rectTransform.anchorMax = new Vector2(Plugin.xAnchorPosition.Value, Plugin.yAnchorPosition.Value);
BackMask2D.rectTransform.anchoredPosition = GetTextAlignmentVector();
((TMP_Text)FrontText).fontSize = Plugin.fontSize.Value;
((TMP_Text)BackText).fontSize = Plugin.fontSize.Value;
}
private static Vector2 GetTextAlignmentVector()
{
//IL_001c: Unknown result type (might be due to invalid IL or missing references)
//IL_0037: Unknown result type (might be due to invalid IL or missing references)
//IL_011d: 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)
//IL_0122: Unknown result type (might be due to invalid IL or missing references)
Vector2 result = default(Vector2);
((Vector2)(ref result))..ctor(0f, 0f);
float num = ((TMP_Text)FrontText).rectTransform.sizeDelta.y / 2f;
float num2 = ((TMP_Text)FrontText).rectTransform.sizeDelta.x / 2f;
string text = attributes[Plugin.textAlignment.Value];
for (int i = 0; i < text.Length; i++)
{
char c = text[i];
if (c.Equals("y".ToCharArray()[0]))
{
result.y -= num;
}
else if (c.Equals("Y".ToCharArray()[0]))
{
result.y += num;
}
if (c.Equals("x".ToCharArray()[0]))
{
result.x -= num2;
}
else if (c.Equals("X".ToCharArray()[0]))
{
result.x += num2;
}
}
return result;
}
}