Please disclose if your mod was created primarily using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
Decompiled source of AttackCancleCounter v1.2.0
Attack Cancel.dll
Decompiled 5 months agousing 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 UnityEngine; [assembly: CompilationRelaxations(8)] [assembly: RuntimeCompatibility(WrapNonExceptionThrows = true)] [assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default | DebuggableAttribute.DebuggingModes.DisableOptimizations | DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints | DebuggableAttribute.DebuggingModes.EnableEditAndContinue)] [assembly: AssemblyTitle("Attack Cancel")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("Attack Cancel")] [assembly: AssemblyCopyright("Copyright © 2025")] [assembly: AssemblyTrademark("")] [assembly: ComVisible(false)] [assembly: Guid("3d58bf75-76f5-4be7-822d-1f245bc096e3")] [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 AttackCancel; [BepInPlugin("IDRdh7", "Attack Cancel/Counter", "1.2.0")] public class AttackCancel : BaseUnityPlugin { private static ConfigEntry<KeyCode> cancelKeyParry; private static ConfigEntry<KeyCode> cancelKeyDodge; private static ConfigEntry<bool> modEnabled; private static ConfigEntry<bool> debugMessages; private void Awake() { cancelKeyParry = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "Cancel Key Parry", (KeyCode)324, "Key used to cancel the attack with a parry or block."); cancelKeyDodge = ((BaseUnityPlugin)this).Config.Bind<KeyCode>("General", "Cancel Key Dodge", (KeyCode)308, "Key used to cancel the attack with a dodge."); modEnabled = ((BaseUnityPlugin)this).Config.Bind<bool>("General", "Mod Enabled", true, "Enable or disable the Attack Cancel mod."); debugMessages = ((BaseUnityPlugin)this).Config.Bind<bool>("Debug", "Debug Messages", true, "Enable debug log messages."); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Attack Cancel/Counter] Loaded — Legacy input active"); Harmony.CreateAndPatchAll(typeof(AttackCancel), (string)null); } private void Update() { //IL_002c: Unknown result type (might be due to invalid IL or missing references) //IL_003d: Unknown result type (might be due to invalid IL or missing references) if (modEnabled.Value) { Player localPlayer = Player.m_localPlayer; if (!((Object)(object)localPlayer == (Object)null) && (Input.GetKeyDown(cancelKeyParry.Value) || Input.GetKeyDown(cancelKeyDodge.Value))) { TryCancelAttack(localPlayer); } } } private void TryCancelAttack(Player player) { //IL_0175: Unknown result type (might be due to invalid IL or missing references) FieldInfo field = typeof(Humanoid).GetField("m_currentAttack", BindingFlags.Instance | BindingFlags.NonPublic); if (field == null) { if (debugMessages.Value) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[Attack Cancel/Counter] m_currentAttack field not found"); } return; } object? value = field.GetValue(player); Attack val = (Attack)((value is Attack) ? value : null); if (val == null) { if (debugMessages.Value) { ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Attack Cancel/Counter] No currentAttack detected"); } return; } FieldInfo field2 = typeof(Character).GetField("m_zanim", BindingFlags.Instance | BindingFlags.NonPublic); if (field2 != null) { object value2 = field2.GetValue(player); if (value2 != null) { MethodInfo method = value2.GetType().GetMethod("SetTrigger", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (method != null) { method.Invoke(value2, new object[1] { "block" }); } else if (debugMessages.Value) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[Attack Cancel/Counter] SetTrigger method not found"); } } } else if (debugMessages.Value) { ((BaseUnityPlugin)this).Logger.LogWarning((object)"[Attack Cancel/Counter] m_zanim field not found"); } Humanoid component = ((Component)player).GetComponent<Humanoid>(); ZSyncAnimation component2 = ((Component)player).GetComponent<ZSyncAnimation>(); field.SetValue(player, null); ((Character)component).ForceJump(new Vector3(0f, -20f, 0f), true); if (debugMessages.Value) { ((Character)player).Message((MessageType)2, "Attack Canceled!", 0, (Sprite)null); ((BaseUnityPlugin)this).Logger.LogInfo((object)"[Attack Cancel/Counter] Attack canceled via reflection and block trigger"); } } }