using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Resources;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using System.Security;
using System.Security.Permissions;
using Beetle_Utils;
using Il2Cpp;
using Il2CppInterop.Runtime.InteropTypes.Arrays;
using MelonLoader;
using MelonLoader.Preferences;
using Microsoft.CodeAnalysis;
using SpeedMeterModDemo;
using UnityEngine;
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: MelonInfo(typeof(Core), "SpeedMeterModDemo", "0.3.0", "pablops", null)]
[assembly: MelonGame("Bugfight Studio", "Beetleball")]
[assembly: MelonAdditionalDependencies(new string[] { "BeetleUtils" })]
[assembly: MelonAdditionalCredits("Spike")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("SpeedMeterModDemo")]
[assembly: AssemblyConfiguration("Debug")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0")]
[assembly: AssemblyProduct("SpeedMeterModDemo")]
[assembly: AssemblyTitle("SpeedMeterModDemo")]
[assembly: NeutralResourcesLanguage("en-US")]
[assembly: SecurityPermission(SecurityAction.RequestMinimum, SkipVerification = true)]
[assembly: AssemblyVersion("1.0.0.0")]
[module: UnverifiableCode]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
internal sealed class EmbeddedAttribute : Attribute
{
}
}
namespace System.Runtime.CompilerServices
{
[CompilerGenerated]
[Microsoft.CodeAnalysis.Embedded]
[AttributeUsage(AttributeTargets.Module, AllowMultiple = false, Inherited = false)]
internal sealed class RefSafetyRulesAttribute : Attribute
{
public readonly int Version;
public RefSafetyRulesAttribute(int P_0)
{
Version = P_0;
}
}
}
namespace SpeedMeterModDemo
{
public class Core : MelonMod
{
private MelonPreferences_Entry<bool> showSpeedMeter;
private MelonPreferences_Entry<bool> showSpeedPeaks;
private MelonPreferences_Entry<bool> showActualSpeed;
private MelonPreferences_Entry<float> needleSmooth;
private MelonPreferences_Entry<float> maxSpeed;
private MelonPreferences_Entry<float> funnySpeedMultiplier;
private MelonPreferences_Entry<float> speedPeakResetTimer;
public static Core Instance;
private BeetleActor localBeetle;
private float speedPeak = 0f;
private float actualSpeed = 0f;
private float timeSinceLastPeak = 0f;
private RawImage speedmeterImage;
private RawImage needleImage;
private GameObject speedmeterGO;
private GameObject needleGO;
private float currentAngle;
private const float MIN_ANGLE = 120f;
private const float MAX_ANGLE = -120f;
public bool onMainMenu = true;
public Transform hudRoot;
public override void OnInitializeMelon()
{
MelonPreferences_Category val = MelonPreferences.CreateCategory("SpeedMeterMod");
showSpeedMeter = val.CreateEntry<bool>("ShowSpeedMeterOnStartup", true, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
showSpeedPeaks = val.CreateEntry<bool>("ShowSpeedPeaks", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
showActualSpeed = val.CreateEntry<bool>("ShowActualSpeed", false, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
needleSmooth = val.CreateEntry<float>("NeedleSmooth", 5f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
maxSpeed = val.CreateEntry<float>("MaxSpeed", 240f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
funnySpeedMultiplier = val.CreateEntry<float>("FunnySpeedMultiplier", 1f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
speedPeakResetTimer = val.CreateEntry<float>("SpeedPeakResetTimer", 3000f, (string)null, (string)null, false, false, (ValueValidator)null, (string)null);
((MelonBase)this).LoggerInstance.Msg("To be completly honest idk what speed measure this game uses so im jus gonna bump it up to make it more hype");
((MelonBase)this).LoggerInstance.Msg("SpeedMeterModDemo Initialized.");
}
public override void OnUpdate()
{
UpdateLocalBeetle();
TrackSpeed();
HandleInput();
UpdateSpeedometer();
}
private void HandleInput()
{
if (Input.GetKeyDown((KeyCode)285))
{
ToggleSpeedometer();
}
}
private void ToggleSpeedometer()
{
if ((Object)(object)speedmeterGO == (Object)null)
{
((MelonBase)this).LoggerInstance.Msg("Creating Speedometer HUD elements.");
InitializeSpeedmeter();
}
if (!showSpeedMeter.Value)
{
((MelonBase)this).LoggerInstance.Msg("Speedometer on.");
speedmeterGO.SetActive(true);
showSpeedMeter.Value = true;
}
else
{
((MelonBase)this).LoggerInstance.Msg("Speedometer off.");
speedmeterGO.SetActive(false);
showSpeedMeter.Value = false;
}
}
private void UpdateLocalBeetle()
{
BeetleActor val = BeetleUtils.GetLocalBeetle();
if ((Object)(object)val == (Object)null)
{
localBeetle = null;
}
else if ((Object)(object)localBeetle != (Object)(object)val)
{
localBeetle = val;
}
}
public void TrackSpeed()
{
//IL_007a: Unknown result type (might be due to invalid IL or missing references)
//IL_007f: Unknown result type (might be due to invalid IL or missing references)
//IL_005c: Unknown result type (might be due to invalid IL or missing references)
//IL_0061: Unknown result type (might be due to invalid IL or missing references)
if ((Object)(object)localBeetle == (Object)null)
{
return;
}
Vector3 velocity;
if (localBeetle.HasBall)
{
BallHandling ballHandling = localBeetle.BallHandling;
if (ballHandling == null)
{
return;
}
DungBall heldBall = ballHandling.HeldBall;
if ((Object)(object)heldBall == (Object)null)
{
return;
}
velocity = heldBall.Velocity;
actualSpeed = ((Vector3)(ref velocity)).magnitude;
}
else
{
velocity = localBeetle.Velocity;
actualSpeed = ((Vector3)(ref velocity)).magnitude;
}
if (showSpeedPeaks.Value)
{
if (actualSpeed > speedPeak)
{
speedPeak = actualSpeed;
timeSinceLastPeak = 0f;
}
else
{
timeSinceLastPeak += Time.fixedDeltaTime * 1000f;
}
if (actualSpeed < speedPeak && timeSinceLastPeak > speedPeakResetTimer.Value)
{
speedPeak = 0f;
}
}
}
private void InitializeSpeedmeter()
{
FindHudRoot();
CreateSpeedmeterInHud();
CreateNeedleInHud(speedmeterGO.transform);
}
private void CreateSpeedmeterInHud()
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_0070: 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_0089: Unknown result type (might be due to invalid IL or missing references)
//IL_009f: 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)
speedmeterGO = new GameObject("Speedometer");
speedmeterGO.transform.SetParent(hudRoot, false);
speedmeterImage = speedmeterGO.AddComponent<RawImage>();
speedmeterImage.texture = (Texture)(object)LoadTexture("speedmeter.png");
RectTransform rectTransform = ((Graphic)speedmeterImage).rectTransform;
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor(0f, 1f);
rectTransform.anchorMax = val;
rectTransform.anchorMin = val;
rectTransform.pivot = new Vector2(0f, 1f);
rectTransform.sizeDelta = new Vector2(200f, 165f);
rectTransform.anchoredPosition = new Vector2(20f, -20f);
}
private void CreateNeedleInHud(Transform speedmeter)
{
//IL_0007: Unknown result type (might be due to invalid IL or missing references)
//IL_0011: Expected O, but got Unknown
//IL_006b: Unknown result type (might be due to invalid IL or missing references)
//IL_0072: Unknown result type (might be due to invalid IL or missing references)
//IL_0084: Unknown result type (might be due to invalid IL or missing references)
//IL_009a: Unknown result type (might be due to invalid IL or missing references)
//IL_00ac: 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_00d8: Unknown result type (might be due to invalid IL or missing references)
needleGO = new GameObject("Needle");
needleGO.transform.SetParent(speedmeter, false);
needleImage = needleGO.AddComponent<RawImage>();
needleImage.texture = (Texture)(object)LoadTexture("needle.png");
RectTransform rectTransform = ((Graphic)needleImage).rectTransform;
Vector2 val = default(Vector2);
((Vector2)(ref val))..ctor(0.5f, 0.5f);
rectTransform.anchorMax = val;
rectTransform.anchorMin = val;
rectTransform.pivot = new Vector2(0.5f, 0f);
rectTransform.sizeDelta = new Vector2(10f, 90f);
rectTransform.anchoredPosition = new Vector2(0f, (0f - rectTransform.sizeDelta.y) * 0.2f);
((Transform)rectTransform).localEulerAngles = new Vector3(0f, 0f, 120f);
((Transform)rectTransform).SetAsLastSibling();
}
private void UpdateNeedle()
{
//IL_0097: Unknown result type (might be due to invalid IL or missing references)
float num = Mathf.InverseLerp(0f, maxSpeed.Value, actualSpeed * funnySpeedMultiplier.Value);
float num2 = Mathf.Lerp(120f, -120f, num);
if (needleSmooth.Value == 0f)
{
currentAngle = num2;
}
else
{
currentAngle = Mathf.Lerp(currentAngle, num2, Time.deltaTime * needleSmooth.Value);
}
((Transform)((Graphic)needleImage).rectTransform).localEulerAngles = new Vector3(0f, 0f, currentAngle);
}
private void UpdateSpeedometer()
{
if (!((Object)(object)localBeetle == (Object)null))
{
if ((Object)(object)speedmeterGO == (Object)null && showSpeedMeter.Value)
{
InitializeSpeedmeter();
}
UpdateNeedle();
}
}
public override void OnGUI()
{
//IL_0012: Unknown result type (might be due to invalid IL or missing references)
//IL_0018: Expected O, but got Unknown
//IL_0027: Unknown result type (might be due to invalid IL or missing references)
//IL_0056: 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)
if (!onMainMenu)
{
GUIStyle val = new GUIStyle();
val.fontSize = 24;
val.normal.textColor = Color.white;
if (showSpeedPeaks.Value)
{
GUI.Label(new Rect(20f, 200f, 300f, 30f), $"Speed Peak: {speedPeak:F1}", val);
}
if (showActualSpeed.Value)
{
GUI.Label(new Rect(20f, 230f, 300f, 30f), $"Speed: {actualSpeed:F1}", val);
}
}
}
public override void OnSceneWasLoaded(int buildIndex, string sceneName)
{
if (0 <= buildIndex && buildIndex <= 2)
{
onMainMenu = true;
}
else
{
onMainMenu = false;
}
}
private Texture2D LoadTexture(string fileName)
{
//IL_004c: Unknown result type (might be due to invalid IL or missing references)
//IL_0052: Expected O, but got Unknown
string path = BeetleUtils.ModFolder();
path = Path.Combine(path, "Assets");
string text = Path.Combine(path, fileName);
if (!File.Exists(text))
{
MelonLogger.Error("Texture not found: " + text);
return null;
}
byte[] array = File.ReadAllBytes(text);
Texture2D val = new Texture2D(2, 2, (TextureFormat)4, false);
ImageConversion.LoadImage(val, Il2CppStructArray<byte>.op_Implicit(array));
return val;
}
private void FindHudRoot()
{
Il2CppArrayBase<Canvas> val = Object.FindObjectsOfType<Canvas>();
foreach (Canvas item in val)
{
if (!(((Object)item).name == "Canvas") && !(((Object)item).name == "Canvas_CustomLobby"))
{
continue;
}
Transform val2 = ((Component)item).transform.Find("PlayerHUD");
if ((Object)(object)val2 != (Object)null)
{
hudRoot = val2.Find("Root");
if ((Object)(object)hudRoot != (Object)null)
{
break;
}
}
}
}
}
}