Decompiled source of SpeedMeter v0.3.4

mods/SpeedMeterModDemo.dll

Decompiled a day ago
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 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 static bool showSpeedMeter = true;

		private static BeetleActor localBeetle;

		public static bool toggleNoCooldownAbility = false;

		public static bool toggleDebug = false;

		private RawImage speedmeterImage;

		private RawImage needleImage;

		private RawImage goldenImage;

		private GameObject speedmeterGO;

		private GameObject needleGO;

		private GameObject goldenGO;

		private float currentAngle;

		private float needleSmooth = 5f;

		private const float MIN_ANGLE = 120f;

		private const float MAX_ANGLE = -120f;

		private const float MAX_SPEED = 240f;

		private const float funnySpeedMultiplier = 2f;

		public Transform hudRoot;

		public override void OnInitializeMelon()
		{
			((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();
			HandleInput();
			UpdateSpeedometer();
		}

		public override void OnGUI()
		{
		}

		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)
			{
				((MelonBase)this).LoggerInstance.Msg("Speedometer on.");
				speedmeterGO.SetActive(true);
				showSpeedMeter = true;
			}
			else
			{
				((MelonBase)this).LoggerInstance.Msg("Speedometer off.");
				speedmeterGO.SetActive(false);
				showSpeedMeter = false;
			}
		}

		private void UpdateLocalBeetle()
		{
			BeetleActor val = BeetleUtils.GetLocalBeetle();
			if ((Object)(object)val != (Object)null)
			{
				localBeetle = val;
			}
			else
			{
				localBeetle = null;
			}
		}

		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_0006: Unknown result type (might be due to invalid IL or missing references)
			//IL_000b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0076: Unknown result type (might be due to invalid IL or missing references)
			Vector3 velocity = localBeetle.Velocity;
			float num = ((Vector3)(ref velocity)).magnitude;
			float num2 = Mathf.InverseLerp(0f, 240f, num * 2f);
			float num3 = Mathf.Lerp(120f, -120f, num2);
			currentAngle = Mathf.Lerp(currentAngle, num3, Time.deltaTime * needleSmooth);
			((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)
				{
					InitializeSpeedmeter();
				}
				UpdateNeedle();
			}
		}

		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;
					}
				}
			}
		}

		private void DumpTransform(Transform t, int depth)
		{
			string text = new string(' ', depth * 2);
			MelonLogger.Msg(text + "- " + ((Object)t).name);
			int childCount = t.childCount;
			for (int i = 0; i < childCount; i++)
			{
				Transform child = t.GetChild(i);
				DumpTransform(child, depth + 1);
			}
		}
	}
}