Decompiled source of AutoNudge v1.0.3

AutoNudge.dll

Decompiled 7 hours ago
using System;
using System.Diagnostics;
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.Versioning;
using AutoNudge;
using BTD_Mod_Helper;
using BTD_Mod_Helper.Api;
using BTD_Mod_Helper.Api.ModOptions;
using BTD_Mod_Helper.Extensions;
using Il2Cpp;
using Il2CppAssets.Scripts.Unity.Bridge;
using Il2CppAssets.Scripts.Unity.UI_New.InGame;
using Il2CppGeom;
using MelonLoader;
using Microsoft.CodeAnalysis;
using UnityEngine;
using UnityEngine.InputSystem;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: MelonInfo(typeof(AutoNudgeMod), "Auto Nudge", "1.0.3", "doombubbles", null)]
[assembly: MelonGame("Ninja Kiwi", "BloonsTD6")]
[assembly: MelonGame("Ninja Kiwi", "BloonsTD6-Epic")]
[assembly: TargetFramework(".NETCoreApp,Version=v6.0", FrameworkDisplayName = ".NET 6.0")]
[assembly: AssemblyCompany("AutoNudge")]
[assembly: AssemblyConfiguration("Release")]
[assembly: AssemblyFileVersion("1.0.0.0")]
[assembly: AssemblyInformationalVersion("1.0.0+fb2b10c85d5926d78d406239e909381010e30de3")]
[assembly: AssemblyProduct("AutoNudge")]
[assembly: AssemblyTitle("AutoNudge")]
[assembly: AssemblyVersion("1.0.0.0")]
[module: RefSafetyRules(11)]
namespace Microsoft.CodeAnalysis
{
	[CompilerGenerated]
	[Embedded]
	internal sealed class EmbeddedAttribute : Attribute
	{
	}
}
namespace System.Runtime.CompilerServices
{
	[CompilerGenerated]
	[Embedded]
	[AttributeUsage(AttributeTargets.Class | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Parameter | AttributeTargets.ReturnValue | AttributeTargets.GenericParameter, AllowMultiple = false, Inherited = false)]
	internal sealed class NullableAttribute : Attribute
	{
		public readonly byte[] NullableFlags;

		public NullableAttribute(byte P_0)
		{
			NullableFlags = new byte[1] { P_0 };
		}

		public NullableAttribute(byte[] P_0)
		{
			NullableFlags = P_0;
		}
	}
	[CompilerGenerated]
	[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 AutoNudge
{
	public class AutoNudgeMod : BloonsTD6Mod
	{
		public static readonly ModSettingHotkey AutoNudgeHotkey = new ModSettingHotkey((KeyCode)9, (HotkeyModifier)0)
		{
			description = "HotKey that will automatically nudge towers to the closest valid spot while placing them.",
			icon = ModContent.GetTextureGUID<AutoNudgeMod>("Icon")
		};

		public static readonly ModSettingHotkey NudgeLeft = new ModSettingHotkey((KeyCode)276, (HotkeyModifier)0)
		{
			icon = "Gamepad[PS4_Dpad_Left]"
		};

		public static readonly ModSettingHotkey NudgeRight = new ModSettingHotkey((KeyCode)275, (HotkeyModifier)0)
		{
			icon = "Gamepad[PS4_Dpad_Right]"
		};

		public static readonly ModSettingHotkey NudgeUp = new ModSettingHotkey((KeyCode)273, (HotkeyModifier)0)
		{
			icon = "Gamepad[PS4_Dpad_Up]"
		};

		public static readonly ModSettingHotkey NudgeDown = new ModSettingHotkey((KeyCode)274, (HotkeyModifier)0)
		{
			icon = "Gamepad[PS4_Dpad_Down]"
		};

		public static readonly ModSettingHotkey ConfirmPlacement = new ModSettingHotkey((KeyCode)13, (HotkeyModifier)0)
		{
			icon = "Ui[SelectedTick]"
		};

		public static Instance MelonLogger => Melon<AutoNudgeMod>.Logger;

		public override void OnUpdate()
		{
			AutoNudgeUtility.Update();
		}
	}
	public class AutoNudgeUtility
	{
		private static ModSettingHotkey NudgeToClosest => AutoNudgeMod.AutoNudgeHotkey;

		public static void Update()
		{
			//IL_00a4: 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_00bb: Unknown result type (might be due to invalid IL or missing references)
			//IL_00c7: Unknown result type (might be due to invalid IL or missing references)
			//IL_00cc: Unknown result type (might be due to invalid IL or missing references)
			//IL_00d1: Unknown result type (might be due to invalid IL or missing references)
			//IL_00e3: Unknown result type (might be due to invalid IL or missing references)
			//IL_00ef: 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_010b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0117: 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_0121: Unknown result type (might be due to invalid IL or missing references)
			//IL_014b: Unknown result type (might be due to invalid IL or missing references)
			//IL_014d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0133: Unknown result type (might be due to invalid IL or missing references)
			//IL_013f: Unknown result type (might be due to invalid IL or missing references)
			//IL_0144: Unknown result type (might be due to invalid IL or missing references)
			//IL_0149: Unknown result type (might be due to invalid IL or missing references)
			//IL_015e: Unknown result type (might be due to invalid IL or missing references)
			if (!Object.op_Implicit((Object)(object)InGame.instance) || InGame.Bridge == null || InGame.instance.ReviewMapMode || InGame.Bridge.IsSpectatorMode)
			{
				return;
			}
			InputManager inputManager = InGameExt[InGame.instance];
			if (!inputManager.IsInPlacementMode)
			{
				return;
			}
			if (NudgeToClosest.JustPressed())
			{
				NudgeClosest();
				if (AutoNudgeMod.ConfirmPlacement.IsPressed())
				{
					TaskScheduler.ScheduleTask((Action)delegate
					{
						inputManager.TryPlace();
					}, (Func<bool>)null);
				}
			}
			else
			{
				Vector2 val = Vector2.zero;
				if (AutoNudgeMod.NudgeLeft.IsPressed())
				{
					val += new Vector2(-1f, 0f);
				}
				if (AutoNudgeMod.NudgeRight.IsPressed())
				{
					val += new Vector2(1f, 0f);
				}
				if (AutoNudgeMod.NudgeUp.IsPressed())
				{
					val += new Vector2(0f, 1f);
				}
				if (AutoNudgeMod.NudgeDown.IsPressed())
				{
					val += new Vector2(0f, -1f);
				}
				if (val != Vector2.zero)
				{
					NudgeDirection(val);
				}
			}
			if (AutoNudgeMod.ConfirmPlacement.JustPressed())
			{
				inputManager.TryPlace();
			}
		}

		private static void NudgeClosest()
		{
			//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_0072: Unknown result type (might be due to invalid IL or missing references)
			//IL_000c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0011: Unknown result type (might be due to invalid IL or missing references)
			//IL_001b: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_002c: Unknown result type (might be due to invalid IL or missing references)
			//IL_0031: Unknown result type (might be due to invalid IL or missing references)
			//IL_0036: Unknown result type (might be due to invalid IL or missing references)
			//IL_0039: Unknown result type (might be due to invalid IL or missing references)
			//IL_0041: Unknown result type (might be due to invalid IL or missing references)
			//IL_0084: Unknown result type (might be due to invalid IL or missing references)
			Vector2 val = InputSystemController.MousePosition;
			int num = 0;
			while (!CanPlace(val))
			{
				val = InputSystemController.MousePosition + GeomExtensions.Rotate(Vector2.up, (float)(num * 10)) * (float)num / 10f;
				((Vector2)(ref val))..ctor((float)(int)val.x, (float)(int)val.y);
				if (num++ > 20000)
				{
					AutoNudgeMod.MelonLogger.Msg("No spot found");
					return;
				}
			}
			Mouse.current.WarpCursorPosition(val);
		}

		private static bool CanPlace(Vector2 realCursorPos)
		{
			//IL_001c: Unknown result type (might be due to invalid IL or missing references)
			//IL_001d: Unknown result type (might be due to invalid IL or missing references)
			//IL_0022: Unknown result type (might be due to invalid IL or missing references)
			//IL_0024: Unknown result type (might be due to invalid IL or missing references)
			//IL_0032: Unknown result type (might be due to invalid IL or missing references)
			InputManager val = InGameExt[InGame.instance];
			UnityToSimulation bridge = InGame.instance.bridge;
			Vector2 worldFromPointer = InGame.instance.GetWorldFromPointer(realCursorPos);
			return bridge.CanPlaceTowerAt(worldFromPointer, val.placementModel, bridge.MyPlayerNumber, val.placementEntityId);
		}

		private static void NudgeDirection(Vector2 dir)
		{
			//IL_0045: Unknown result type (might be due to invalid IL or missing references)
			//IL_004a: Unknown result type (might be due to invalid IL or missing references)
			//IL_0051: Unknown result type (might be due to invalid IL or missing references)
			//IL_0053: Unknown result type (might be due to invalid IL or missing references)
			//IL_0056: Unknown result type (might be due to invalid IL or missing references)
			//IL_005b: Unknown result type (might be due to invalid IL or missing references)
			int width = Screen.width;
			float num = (float)width / 1000f;
			if (Input.GetKey((KeyCode)306))
			{
				num *= 5f;
			}
			int num2 = ((Random.Shared.NextSingle() < num - (float)(int)num) ? 1 : 0);
			int num3 = (int)num + num2;
			Vector2 mousePosition = InputSystemController.MousePosition;
			Mouse.current.WarpCursorPosition(mousePosition + dir * (float)num3);
		}
	}
	public static class ModHelperData
	{
		public const string WorksOnVersion = "52.0";

		public const string Version = "1.0.3";

		public const string Name = "Auto Nudge";

		public const string Description = "When placing a tower, you can press the Auto Nudge hotkey (default Tab) to automatically move your mouse / the tower to the closest valid spot for placement.\n\nFor best results, make sure you've got Nudge Mode Disabled in the default game's settings.";

		public const string RepoOwner = "doombubbles";

		public const string PrevRepoName = "auto-nudge";

		public const string RepoName = "AutoNudge";
	}
}