Decompiled source of AutoFire v2.2.0

AutoFire.dll

Decompiled 2 weeks ago
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 RoR2;
using UnityEngine;

[assembly: CompilationRelaxations(8)]
[assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)]
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
[assembly: AssemblyTitle("AutoFire")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("AutoFire")]
[assembly: AssemblyCopyright("Copyright ©  2026")]
[assembly: AssemblyTrademark("")]
[assembly: ComVisible(false)]
[assembly: Guid("a1328614-8f9d-44fa-999d-08f1d7357d4a")]
[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 RoR2AutoFire;

public enum TargetPriority
{
	Closest,
	HighestHealth,
	LowestHealth
}
[BepInPlugin("com.geminimod.autofire", "AutoFire", "2.2.0")]
public class AutoFireMod : BaseUnityPlugin
{
	public static CharacterBody currentTarget;

	private ConfigEntry<float> maxTargetingRange;

	private ConfigEntry<bool> requireLineOfSight;

	private ConfigEntry<bool> pauseOnSprint;

	private ConfigEntry<bool> enableAutoAim;

	public static ConfigEntry<bool> enableTargetUI;

	public static ConfigEntry<int> uiColorR;

	public static ConfigEntry<int> uiColorG;

	public static ConfigEntry<int> uiColorB;

	private ConfigEntry<TargetPriority> targetPriority;

	private ConfigEntry<bool> attackPrimary;

	private ConfigEntry<bool> attackSecondary;

	private ConfigEntry<bool> attackUtility;

	private ConfigEntry<bool> attackSpecial;

	private ConfigEntry<bool> enablePrimaryDelay;

	private ConfigEntry<bool> enableSecondaryDelay;

	private ConfigEntry<bool> enableUtilityDelay;

	private ConfigEntry<bool> enableSpecialDelay;

	private ConfigEntry<float> primaryDelay;

	private ConfigEntry<float> secondaryDelay;

	private ConfigEntry<float> utilityDelay;

	private ConfigEntry<float> specialDelay;

	private float lastPrimaryTime = 0f;

	private float lastSecondaryTime = 0f;

	private float lastUtilityTime = 0f;

	private float lastSpecialTime = 0f;

	private float sprintGraceTimer = 0f;

	private readonly Dictionary<string, List<SkillSlot>> ignoredSkillsPerCharacter = new Dictionary<string, List<SkillSlot>>
	{
		{
			"COMMANDO_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"HUNTRESS_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"BANDIT2_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"LOADER_BODY_NAME",
			new List<SkillSlot>
			{
				(SkillSlot)0,
				(SkillSlot)1,
				(SkillSlot)2
			}
		},
		{
			"CAPTAIN_BODY_NAME",
			new List<SkillSlot>()
		},
		{
			"TOOLBOT_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"CROCO_BODY_NAME",
			new List<SkillSlot>
			{
				(SkillSlot)0,
				(SkillSlot)2
			}
		},
		{
			"MERC_BODY_NAME",
			new List<SkillSlot>
			{
				(SkillSlot)0,
				(SkillSlot)2
			}
		},
		{
			"VOIDSURVIVOR_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"SEEKER_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"CHEF_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)2 }
		},
		{
			"DRIFTER_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)0 }
		},
		{
			"RAILGUNNER_BODY_NAME",
			new List<SkillSlot> { (SkillSlot)1 }
		}
	};

	public void Awake()
	{
		maxTargetingRange = ((BaseUnityPlugin)this).Config.Bind<float>("Targeting", "MaxRange", 100f, "Max range to acquire targets.");
		requireLineOfSight = ((BaseUnityPlugin)this).Config.Bind<bool>("Targeting", "RequireLineOfSight", true, "Only target visible enemies.");
		targetPriority = ((BaseUnityPlugin)this).Config.Bind<TargetPriority>("Targeting", "Priority", TargetPriority.Closest, "How to prioritize targets within range.");
		enableAutoAim = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "EnableAutoAim", true, "Global toggle for all auto-aiming.");
		pauseOnSprint = ((BaseUnityPlugin)this).Config.Bind<bool>("Settings", "PauseOnSprint", true, "Pause while sprinting.");
		enableTargetUI = ((BaseUnityPlugin)this).Config.Bind<bool>("UI Settings", "EnableTargetUI", true, "Show visual indicator on targeted enemy.");
		uiColorR = ((BaseUnityPlugin)this).Config.Bind<int>("UI Settings", "ColorRed", 255, "Red value for the target UI (0-255).");
		uiColorG = ((BaseUnityPlugin)this).Config.Bind<int>("UI Settings", "ColorGreen", 0, "Green value for the target UI (0-255).");
		uiColorB = ((BaseUnityPlugin)this).Config.Bind<int>("UI Settings", "ColorBlue", 0, "Blue value for the target UI (0-255).");
		attackPrimary = ((BaseUnityPlugin)this).Config.Bind<bool>("Attack Toggles", "AttackPrimary", true, "Enable auto-attack for Primary.");
		attackSecondary = ((BaseUnityPlugin)this).Config.Bind<bool>("Attack Toggles", "AttackSecondary", true, "Enable auto-attack for Secondary.");
		attackUtility = ((BaseUnityPlugin)this).Config.Bind<bool>("Attack Toggles", "AttackUtility", true, "Enable auto-attack for Utility.");
		attackSpecial = ((BaseUnityPlugin)this).Config.Bind<bool>("Attack Toggles", "AttackSpecial", true, "Enable auto-attack for Special.");
		enablePrimaryDelay = ((BaseUnityPlugin)this).Config.Bind<bool>("Timing", "EnablePrimaryDelay", true, "Enable timing delay for Primary.");
		enableSecondaryDelay = ((BaseUnityPlugin)this).Config.Bind<bool>("Timing", "EnableSecondaryDelay", true, "Enable timing delay for Secondary.");
		enableUtilityDelay = ((BaseUnityPlugin)this).Config.Bind<bool>("Timing", "EnableUtilityDelay", true, "Enable timing delay for Utility.");
		enableSpecialDelay = ((BaseUnityPlugin)this).Config.Bind<bool>("Timing", "EnableSpecialDelay", true, "Enable timing delay for Special.");
		primaryDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Timing", "PrimaryDelay", 0.12f, "Delay between primary executions.");
		secondaryDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Timing", "SecondaryDelay", 0.12f, "Delay between secondary executions.");
		utilityDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Timing", "UtilityDelay", 0.12f, "Delay between utility executions.");
		specialDelay = ((BaseUnityPlugin)this).Config.Bind<float>("Timing", "SpecialDelay", 0.12f, "Delay between special executions.");
		((Component)this).gameObject.AddComponent<AutoFireUI>();
	}

	public void FixedUpdate()
	{
		//IL_0098: Unknown result type (might be due to invalid IL or missing references)
		//IL_009d: Unknown result type (might be due to invalid IL or missing references)
		//IL_00fb: Unknown result type (might be due to invalid IL or missing references)
		//IL_0106: Unknown result type (might be due to invalid IL or missing references)
		//IL_012c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0131: 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_0138: Unknown result type (might be due to invalid IL or missing references)
		//IL_0168: Unknown result type (might be due to invalid IL or missing references)
		//IL_016c: Unknown result type (might be due to invalid IL or missing references)
		//IL_0171: 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_0181: Unknown result type (might be due to invalid IL or missing references)
		//IL_0186: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: Unknown result type (might be due to invalid IL or missing references)
		//IL_039f: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a4: Unknown result type (might be due to invalid IL or missing references)
		//IL_03a6: Unknown result type (might be due to invalid IL or missing references)
		//IL_03ab: Unknown result type (might be due to invalid IL or missing references)
		//IL_03af: Unknown result type (might be due to invalid IL or missing references)
		if (PlayerCharacterMasterController.instances.Count == 0)
		{
			return;
		}
		CharacterMaster master = PlayerCharacterMasterController.instances[0].master;
		if ((Object)(object)master == (Object)null)
		{
			return;
		}
		CharacterBody body = master.GetBody();
		if ((Object)(object)body == (Object)null || !body.healthComponent.alive)
		{
			return;
		}
		InputBankTest component = ((Component)body).GetComponent<InputBankTest>();
		SkillLocator component2 = ((Component)body).GetComponent<SkillLocator>();
		if ((Object)(object)component == (Object)null || (Object)(object)component2 == (Object)null)
		{
			return;
		}
		CharacterBody val = null;
		Vector3 corePosition = body.corePosition;
		float num = maxTargetingRange.Value * maxTargetingRange.Value;
		float num2 = num;
		float num3 = ((targetPriority.Value == TargetPriority.HighestHealth) ? float.MinValue : float.MaxValue);
		Vector3 val2;
		RaycastHit val4 = default(RaycastHit);
		foreach (CharacterBody readOnlyInstances in CharacterBody.readOnlyInstancesList)
		{
			if (readOnlyInstances.teamComponent.teamIndex == body.teamComponent.teamIndex || !readOnlyInstances.healthComponent.alive)
			{
				continue;
			}
			val2 = readOnlyInstances.corePosition - corePosition;
			float sqrMagnitude = ((Vector3)(ref val2)).sqrMagnitude;
			if (!(sqrMagnitude <= num))
			{
				continue;
			}
			if (requireLineOfSight.Value)
			{
				Vector3 val3 = readOnlyInstances.corePosition - corePosition;
				float num4 = Mathf.Sqrt(sqrMagnitude);
				LayerIndex world = LayerIndex.world;
				if (Physics.Raycast(corePosition, val3, ref val4, num4, LayerMask.op_Implicit(((LayerIndex)(ref world)).mask)))
				{
					continue;
				}
			}
			bool flag = false;
			float health = readOnlyInstances.healthComponent.health;
			switch (targetPriority.Value)
			{
			case TargetPriority.Closest:
				if (sqrMagnitude < num2)
				{
					num2 = sqrMagnitude;
					flag = true;
				}
				break;
			case TargetPriority.HighestHealth:
				if (health > num3)
				{
					num3 = health;
					flag = true;
				}
				break;
			case TargetPriority.LowestHealth:
				if (health < num3)
				{
					num3 = health;
					flag = true;
				}
				break;
			}
			if (flag)
			{
				val = readOnlyInstances;
			}
		}
		if ((Object)(object)val != (Object)null)
		{
			currentTarget = val;
			List<SkillSlot> list = new List<SkillSlot>();
			if (ignoredSkillsPerCharacter.TryGetValue(body.baseNameToken, out var value))
			{
				list = value;
			}
			bool flag2 = false;
			bool flag3 = false;
			if (component.sprint.down)
			{
				sprintGraceTimer = 0.25f;
			}
			if (sprintGraceTimer > 0f)
			{
				sprintGraceTimer -= Time.fixedDeltaTime;
			}
			if (pauseOnSprint.Value && (body.isSprinting || sprintGraceTimer > 0f))
			{
				flag2 = true;
				flag3 = true;
			}
			if (body.baseNameToken == "RAILGUNNER_BODY_NAME" && (component.skill2.down || ((Object)(object)component2.primary.skillDef != (Object)null && (component2.primary.skillDef.skillNameToken.Contains("SNIPE") || component2.primary.skillDef.skillNameToken.Contains("RELOAD")))))
			{
				flag2 = true;
			}
			if (!flag3 && enableAutoAim.Value)
			{
				val2 = val.corePosition - corePosition;
				component.aimDirection = ((Vector3)(ref val2)).normalized;
			}
			if (!flag2)
			{
				float fixedTime = Time.fixedTime;
				if ((Object)(object)component2.primary != (Object)null && !list.Contains((SkillSlot)0) && attackPrimary.Value && (!enablePrimaryDelay.Value || fixedTime - lastPrimaryTime >= primaryDelay.Value))
				{
					component2.primary.ExecuteIfReady();
					lastPrimaryTime = fixedTime;
				}
				if ((Object)(object)component2.secondary != (Object)null && !list.Contains((SkillSlot)1) && attackSecondary.Value && (!enableSecondaryDelay.Value || fixedTime - lastSecondaryTime >= secondaryDelay.Value))
				{
					component2.secondary.ExecuteIfReady();
					lastSecondaryTime = fixedTime;
				}
				if ((Object)(object)component2.utility != (Object)null && !list.Contains((SkillSlot)2) && attackUtility.Value && (!enableUtilityDelay.Value || fixedTime - lastUtilityTime >= utilityDelay.Value))
				{
					component2.utility.ExecuteIfReady();
					lastUtilityTime = fixedTime;
				}
				if ((Object)(object)component2.special != (Object)null && !list.Contains((SkillSlot)3) && attackSpecial.Value && (!enableSpecialDelay.Value || fixedTime - lastSpecialTime >= specialDelay.Value))
				{
					component2.special.ExecuteIfReady();
					lastSpecialTime = fixedTime;
				}
			}
		}
		else
		{
			currentTarget = null;
		}
	}
}
public class AutoFireUI : MonoBehaviour
{
	private GUIStyle reticleStyle;

	private GUIStyle arrowStyle;

	private void SetupStyles()
	{
		//IL_0010: Unknown result type (might be due to invalid IL or missing references)
		//IL_001a: Expected O, but got Unknown
		//IL_0043: Unknown result type (might be due to invalid IL or missing references)
		//IL_004d: Expected O, but got Unknown
		if (reticleStyle == null)
		{
			reticleStyle = new GUIStyle();
			reticleStyle.fontSize = 20;
			reticleStyle.alignment = (TextAnchor)4;
			reticleStyle.fontStyle = (FontStyle)1;
			arrowStyle = new GUIStyle();
			arrowStyle.fontSize = 32;
			arrowStyle.alignment = (TextAnchor)4;
		}
	}

	private Color GetConfigColor()
	{
		//IL_005b: Unknown result type (might be due to invalid IL or missing references)
		//IL_0060: Unknown result type (might be due to invalid IL or missing references)
		//IL_0063: Unknown result type (might be due to invalid IL or missing references)
		float num = (float)Mathf.Clamp(AutoFireMod.uiColorR.Value, 0, 255) / 255f;
		float num2 = (float)Mathf.Clamp(AutoFireMod.uiColorG.Value, 0, 255) / 255f;
		float num3 = (float)Mathf.Clamp(AutoFireMod.uiColorB.Value, 0, 255) / 255f;
		return new Color(num, num2, num3);
	}

	public void OnGUI()
	{
		//IL_007f: 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_0090: Unknown result type (might be due to invalid IL or missing references)
		//IL_00a2: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ae: Unknown result type (might be due to invalid IL or missing references)
		//IL_00b3: 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_00b6: 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_00c4: 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_00dd: Unknown result type (might be due to invalid IL or missing references)
		//IL_00ea: Unknown result type (might be due to invalid IL or missing references)
		//IL_0184: Unknown result type (might be due to invalid IL or missing references)
		//IL_018a: 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_0198: Unknown result type (might be due to invalid IL or missing references)
		//IL_01a5: Unknown result type (might be due to invalid IL or missing references)
		//IL_0124: Unknown result type (might be due to invalid IL or missing references)
		//IL_0130: Unknown result type (might be due to invalid IL or missing references)
		//IL_0146: Unknown result type (might be due to invalid IL or missing references)
		//IL_00f8: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e3: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01e9: Unknown result type (might be due to invalid IL or missing references)
		//IL_01ee: 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_01f5: Unknown result type (might be due to invalid IL or missing references)
		//IL_01fc: Unknown result type (might be due to invalid IL or missing references)
		//IL_0210: Unknown result type (might be due to invalid IL or missing references)
		//IL_0215: Unknown result type (might be due to invalid IL or missing references)
		//IL_0219: Unknown result type (might be due to invalid IL or missing references)
		//IL_0221: Unknown result type (might be due to invalid IL or missing references)
		//IL_022e: Unknown result type (might be due to invalid IL or missing references)
		//IL_0245: Unknown result type (might be due to invalid IL or missing references)
		//IL_025b: 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_01bb: Unknown result type (might be due to invalid IL or missing references)
		//IL_01c0: Unknown result type (might be due to invalid IL or missing references)
		//IL_0105: Unknown result type (might be due to invalid IL or missing references)
		if (AutoFireMod.enableTargetUI == null || !AutoFireMod.enableTargetUI.Value || (Object)(object)AutoFireMod.currentTarget == (Object)null)
		{
			return;
		}
		Camera val = Camera.main;
		if ((Object)(object)val == (Object)null && CameraRigController.readOnlyInstancesList.Count > 0)
		{
			val = CameraRigController.readOnlyInstancesList[0].sceneCam;
		}
		if ((Object)(object)val == (Object)null)
		{
			return;
		}
		SetupStyles();
		Color configColor = GetConfigColor();
		reticleStyle.normal.textColor = configColor;
		arrowStyle.normal.textColor = configColor;
		Vector3 corePosition = AutoFireMod.currentTarget.corePosition;
		Vector3 val2 = val.WorldToScreenPoint(corePosition);
		val2.y = (float)Screen.height - val2.y;
		if (!(val2.z < 0f) && !(val2.x < 0f) && !(val2.x > (float)Screen.width) && !(val2.y < 0f) && !(val2.y > (float)Screen.height))
		{
			GUI.Label(new Rect(val2.x - 50f, val2.y - 50f, 100f, 100f), "[     ]", reticleStyle);
			return;
		}
		Vector2 val3 = default(Vector2);
		((Vector2)(ref val3))..ctor((float)Screen.width / 2f, (float)Screen.height / 2f);
		Vector2 val4 = default(Vector2);
		((Vector2)(ref val4))..ctor(val2.x - val3.x, val2.y - val3.y);
		if (val2.z < 0f)
		{
			val4 = -val4;
		}
		((Vector2)(ref val4)).Normalize();
		float num = (float)Mathf.Min(Screen.width, Screen.height) * 0.4f;
		Vector2 val5 = val3 + val4 * num;
		float num2 = Mathf.Atan2(val4.y, val4.x) * 57.29578f;
		Matrix4x4 matrix = GUI.matrix;
		GUIUtility.RotateAroundPivot(num2, val5);
		GUI.Label(new Rect(val5.x - 20f, val5.y - 20f, 40f, 40f), "►", arrowStyle);
		GUI.matrix = matrix;
	}
}