using System; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Threading; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Hooking; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Common.Math; using Microsoft.Extensions.Logging; using Questionable.Data; namespace Questionable.Controller; internal sealed class InterruptHandler : IDisposable { private unsafe delegate void ProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos, EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail); [StructLayout(LayoutKind.Explicit)] private struct EffectEntry { [FieldOffset(0)] public EActionEffectType Type; [FieldOffset(1)] public byte Param0; [FieldOffset(2)] public byte Param1; [FieldOffset(3)] public byte Param2; [FieldOffset(4)] public byte Mult; [FieldOffset(5)] public byte Flags; [FieldOffset(6)] public ushort Value; public byte AttackType { get { byte param = Param1; int num = 15; int num2 = param; return (byte)(num2 + num - (num2 | num)); } } [MethodImpl(MethodImplOptions.NoInlining)] public override string ToString() { DefaultInterpolatedStringHandler defaultInterpolatedStringHandler = new DefaultInterpolatedStringHandler(73, 11); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-725035009)); defaultInterpolatedStringHandler.AppendFormatted(Type); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202D_206D_206A_206E_202C_202B_200C_206C_200E_206A_206D_200E_206A_202A_200C_202E_206E_202C_206F_200B_206D_206F_200C_202C_200B_202B_200F_200B_206A_206F_200F_202E_206B_200E_202B_202A_200F_200B_202A_200E_202E(-496390848)); defaultInterpolatedStringHandler.AppendFormatted(Param0, global::_003CModule_003E._206C_202A_206D_206A_206E_202A_202B_206F_206D_200F_202D_200F_202D_206A_202C_202B_206D_206A_200E_200E_202D_202D_200D_200C_200D_200D_206D_206E_202A_200F_206E_206C_206D_206A_206D_202B_200F_200D_206E_200C_202E(609308249)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202A_206B_206D_200C_206B_200E_200E_202A_200B_202E_206A_206F_206A_206B_200E_200D_200F_206D_206E_206A_206F_200C_206C_202C_202A_206E_202C_200B_206E_202A_206E_202B_206B_202E_202E_206A_206D_206D_202C_200F_202E(877514922)); defaultInterpolatedStringHandler.AppendFormatted(Param1, global::_003CModule_003E._202A_206B_206D_200C_206B_200E_200E_202A_200B_202E_206A_206F_206A_206B_200E_200D_200F_206D_206E_206A_206F_200C_206C_202C_202A_206E_202C_200B_206E_202A_206E_202B_206B_202E_202E_206A_206D_206D_202C_200F_202E(1055630216)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._200B_206B_206B_200E_200B_206A_206D_206B_206E_200F_206A_206F_206E_202B_200F_206C_202B_206D_206E_200F_200C_200E_206F_200D_200F_200B_202B_202B_202B_202B_206D_202C_206A_206D_200B_206E_200D_206A_206F_200F_202E(25938555)); defaultInterpolatedStringHandler.AppendFormatted(Param2, global::_003CModule_003E._206C_202A_206D_206A_206E_202A_202B_206F_206D_200F_202D_200F_202D_206A_202C_202B_206D_206A_200E_200E_202D_202D_200D_200C_200D_200D_206D_206E_202A_200F_206E_206C_206D_206A_206D_202B_200F_200D_206E_200C_202E(609308249)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-845350805)); defaultInterpolatedStringHandler.AppendFormatted(Param2, global::_003CModule_003E._200B_206B_206B_200E_200B_206A_206D_206B_206E_200F_206A_206F_206E_202B_200F_206C_202B_206D_206E_200F_200C_200E_206F_200D_200F_200B_202B_202B_202B_202B_206D_202C_206A_206D_200B_206E_200D_206A_206F_200F_202E(-1875656278)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-1021698688)); defaultInterpolatedStringHandler.AppendFormatted(_202B_202B_200B_202E_206A_206E_202A_202A_202E_206D_202E_200B_206A_206D_200B_200C_200F_200B_202B_202C_206A_200F_200D_200D_202C_200C_206B_202D_202C_202C_202B_206B_202E_206F_200F_206D_200B_200E_200E_206B_202E(_202E_200D_200B_206B_200C_206D_200D_202E_206B_206E_202C_206B_202A_206A_202A_206B_202A_206E_202D_200C_206A_200E_200F_202C_206F_206B_200C_200F_202C_202E_206E_200F_206E_206C_200D_206A_200C_202E_206C_202E_202E(Param2, 2), 8, '0')); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._206C_202A_206D_206A_206E_202A_202B_206F_206D_200F_202D_200F_202D_206A_202C_202B_206D_206A_200E_200E_202D_202D_200D_200C_200D_200D_206D_206E_202A_200F_206E_206C_206D_206A_206D_202B_200F_200D_206E_200C_202E(-884985363)); defaultInterpolatedStringHandler.AppendFormatted(Mult, global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-645152765)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-1045548845)); defaultInterpolatedStringHandler.AppendFormatted(Flags, global::_003CModule_003E._202E_206C_200F_206B_206A_202A_202C_206F_200C_206C_202B_206B_206D_206D_206D_202D_206E_202E_206C_206E_206D_202C_206F_200D_202D_202E_206A_206D_202A_206A_202B_200D_200C_206D_202B_200B_200D_200C_206E_206B_202E(-645152765)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202D_206D_206A_206E_202C_202B_200C_206C_200E_206A_206D_200E_206A_202A_200C_202E_206E_202C_206F_200B_206D_206F_200C_202C_200B_202B_200F_200B_206A_206F_200F_202E_206B_200E_202B_202A_200F_200B_202A_200E_202E(594831569)); defaultInterpolatedStringHandler.AppendFormatted(_202B_202B_200B_202E_206A_206E_202A_202A_202E_206D_202E_200B_206A_206D_200B_200C_200F_200B_202B_202C_206A_200F_200D_200D_202C_200C_206B_202D_202C_202C_202B_206B_202E_206F_200F_206D_200B_200E_200E_206B_202E(_202E_200D_200B_206B_200C_206D_200D_202E_206B_206E_202C_206B_202A_206A_202A_206B_202A_206E_202D_200C_206A_200E_200F_202C_206F_206B_200C_200F_202C_202E_206E_200F_206E_206C_200D_206A_200C_202E_206C_202E_202E(Flags, 2), 8, '0')); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._200B_206B_206B_200E_200B_206A_206D_206B_206E_200F_206A_206F_206E_202B_200F_206C_202B_206D_206E_200F_200C_200E_206F_200D_200F_200B_202B_202B_202B_202B_206D_202C_206A_206D_200B_206E_200D_206A_206F_200F_202E(1435755758)); defaultInterpolatedStringHandler.AppendFormatted(Value, global::_003CModule_003E._202D_206D_206A_206E_202C_202B_200C_206C_200E_206A_206D_200E_206A_202A_200C_202E_206E_202C_206F_200B_206D_206F_200C_202C_200B_202B_200F_200B_206A_206F_200F_202E_206B_200E_202B_202A_200F_200B_202A_200E_202E(123427143)); defaultInterpolatedStringHandler.AppendLiteral(global::_003CModule_003E._202A_206B_206D_200C_206B_200E_200E_202A_200B_202E_206A_206F_206A_206B_200E_200D_200F_206D_206E_206A_206F_200C_206C_202C_202A_206E_202C_200B_206E_202A_206E_202B_206B_202E_202E_206A_206D_206D_202C_200F_202E(739800108)); defaultInterpolatedStringHandler.AppendFormatted(AttackType); return defaultInterpolatedStringHandler.ToStringAndClear(); } static string _202E_200D_200B_206B_200C_206D_200D_202E_206B_206E_202C_206B_202A_206A_202A_206B_202A_206E_202D_200C_206A_200E_200F_202C_206F_206B_200C_200F_202C_202E_206E_200F_206E_206C_200D_206A_200C_202E_206C_202E_202E(byte P_0, int P_1) { return Convert.ToString(P_0, P_1); } static string _202B_202B_200B_202E_206A_206E_202A_202A_202E_206D_202E_200B_206A_206D_200B_200C_200F_200B_202B_202C_206A_200F_200D_200D_202C_200C_206B_202D_202C_202C_202B_206B_202E_206F_200F_206D_200B_200E_200E_206B_202E(string P_0, int P_1, char P_2) { return P_0.PadLeft(P_1, P_2); } } [StructLayout(LayoutKind.Explicit)] private struct EffectHeader { [FieldOffset(0)] public ulong AnimationTargetId; [FieldOffset(8)] public uint ActionID; [FieldOffset(12)] public uint GlobalEffectCounter; [FieldOffset(16)] public float AnimationLockTime; [FieldOffset(20)] public uint SomeTargetID; [FieldOffset(24)] public ushort SourceSequence; [FieldOffset(26)] public ushort Rotation; [FieldOffset(28)] public ushort AnimationId; [FieldOffset(30)] public byte Variation; [FieldOffset(31)] public ActionType ActionType; [FieldOffset(33)] public byte TargetCount; } private enum EActionEffectType : byte { None = 0, Miss = 1, FullResist = 2, Damage = 3, Heal = 4, BlockedDamage = 5, ParriedDamage = 6, Invulnerable = 7, NoEffectText = 8, Unknown0 = 9, MpLoss = 10, MpGain = 11, TpLoss = 12, TpGain = 13, ApplyStatusEffectTarget = 14, ApplyStatusEffectSource = 15, RecoveredFromStatusEffect = 16, LoseStatusEffectTarget = 17, LoseStatusEffectSource = 18, StatusNoEffect = 20, ThreatPosition = 24, EnmityAmountUp = 25, EnmityAmountDown = 26, StartActionCombo = 27, ComboSucceed = 28, Retaliation = 29, Knockback = 32, Attract1 = 33, Attract2 = 34, Mount = 40, FullResistStatus = 52, FullResistStatus2 = 55, VFX = 59, Gauge = 60, JobGauge = 61, SetModelState = 72, SetHP = 73, PartialInvulnerable = 74, Interrupt = 75 } private readonly Hook? _processActionEffectHook; private readonly IClientState _clientState; private readonly IObjectTable _objectTable; private readonly TerritoryData _territoryData; private readonly ILogger _logger; [CompilerGenerated] private EventHandler? m_Interrupted; public event EventHandler? Interrupted { [CompilerGenerated] add { EventHandler eventHandler = this.m_Interrupted; int num = -1990188142; while (true) { int num2 = num; int num3 = -1990188141; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 0: num = -1990188142; break; case 2: return; case 1: { EventHandler eventHandler2 = eventHandler; EventHandler value2 = (EventHandler)_200D_200C_206C_200D_202D_202E_206A_202A_206E_202A_200C_202C_200E_200C_200D_206C_202C_200E_200B_206D_200D_200C_206B_206B_200E_206B_202B_200B_206A_200F_206E_200B_200B_206E_202A_206A_206D_202D_206B_202A_202E((Delegate)eventHandler2, (Delegate)value); eventHandler = Interlocked.CompareExchange(ref this.m_Interrupted, value2, eventHandler2); num = (((object)eventHandler != eventHandler2) ? (-1990188142) : (-1990188143)); break; } } } } [CompilerGenerated] remove { EventHandler eventHandler = this.m_Interrupted; int num = -2074209311; while (true) { int num2 = num; int num3 = -2074209312; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 2: num = -2074209311; break; case 0: return; case 1: { EventHandler eventHandler2 = eventHandler; EventHandler value2 = (EventHandler)_202C_200E_200C_202C_200E_202C_206F_202C_206A_206E_206E_206F_202E_200C_206F_200C_200F_202C_202D_206A_200F_202A_200F_202C_202A_202D_200B_206A_206B_202D_200B_200D_206F_200B_202B_200E_202A_200F_206B_202E_202E((Delegate)eventHandler2, (Delegate)value); eventHandler = Interlocked.CompareExchange(ref this.m_Interrupted, value2, eventHandler2); num = (((object)eventHandler != eventHandler2) ? (-2074209311) : (-2074209312)); break; } } } } } [MethodImpl(MethodImplOptions.NoInlining)] public unsafe InterruptHandler(IGameInteropProvider gameInteropProvider, IClientState clientState, IObjectTable objectTable, TerritoryData territoryData, ILogger logger) { _clientState = clientState; _objectTable = objectTable; _territoryData = territoryData; _logger = logger; try { _processActionEffectHook = gameInteropProvider.HookFromAddress(ActionEffectHandler.Addresses.Receive.Value, HandleProcessActionEffect); _processActionEffectHook.Enable(); } catch (Exception ex) { _202C_200C_206A_202B_206A_202E_206E_206A_202D_206C_200D_200E_206E_200C_200E_206F_200D_200B_200C_206B_206D_206C_202E_202B_206C_206F_202A_206D_202B_206F_200E_200D_200D_202A_206E_200E_202E_206A_206F_202E_202E((ILogger)_logger, ex, global::_003CModule_003E._202A_206B_206D_200C_206B_200E_200E_202A_200B_202E_206A_206F_206A_206B_200E_200D_200F_206D_206E_206A_206F_200C_206C_202C_202A_206E_202C_200B_206E_202A_206E_202B_206B_202E_202E_206A_206D_206D_202C_200F_202E(-1192049200), Array.Empty()); _processActionEffectHook = null; } } [MethodImpl(MethodImplOptions.NoInlining)] private unsafe void HandleProcessActionEffect(uint sourceId, Character* sourceCharacter, Vector3* pos, EffectHeader* effectHeader, EffectEntry* effectArray, ulong* effectTail) { try { int num = (_territoryData.IsDutyInstance(_200C_206D_206C_206B_206C_206E_202D_206F_202A_200B_206E_206C_202D_202D_202C_202B_202E_202B_200C_206B_202D_200D_200E_206A_200F_206F_206C_206D_206D_202E_202C_206D_202D_206C_200D_206D_202B_200F_206F_200C_202E(_clientState)) ? (-1304675561) : (-1304675555)); EActionEffectType type = default(EActionEffectType); bool flag = default(bool); bool flag2 = default(bool); int num8 = default(int); EffectEntry* ptr = default(EffectEntry*); IPlayerCharacter playerCharacter = default(IPlayerCharacter); while (true) { int num2 = num; int num3 = -1304675562; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 9: num = ((type - 5 > EActionEffectType.Miss) ? (-1304675562) : (-1304675567)); break; case 4: flag = flag2; num = -1304675556; break; case 5: { int num11 = (int)(effectTail[num8] & 0xFFFFFFFFu); ptr = effectArray + 8 * num8; flag = (uint)num11 == ((playerCharacter != null) ? new ulong?(_206C_202B_200E_206A_206E_200C_202D_200F_202E_206C_206F_202D_200F_202A_200B_202E_202D_200B_206B_206A_200F_202A_200E_202C_200D_206C_202E_206C_200B_200F_202E_206E_206F_202A_202E_200E_206E_206B_206D_202A_202E((IGameObject)playerCharacter)) : ((ulong?)null)); num = ((!flag) ? (-1304675556) : (-1304675564)); break; } case 8: num = -1304675555; break; case 3: { _202A_202E_206C_206E_200D_202E_202E_206F_206B_202E_200C_200D_202A_200B_206E_206A_202D_200F_200D_202D_200B_200D_200D_206C_202B_206C_202A_202A_200E_202D_206A_206A_202C_200F_206B_202A_202E_202E_202E_200E_202E((ILogger)_logger, global::_003CModule_003E._206C_202A_206D_206A_206E_202A_202B_206F_206D_200F_202D_200F_202D_206A_202C_202B_206D_206A_200E_200E_202D_202D_200D_200C_200D_200D_206D_206E_202A_200F_206E_206C_206D_206A_206D_202B_200F_200D_206E_200C_202E(1232681813), new object[2] { sourceId, ptr->Type }); EventHandler? eventHandler = this.Interrupted; if (eventHandler == null) { return; } eventHandler(this, EventArgs.Empty); num = -1304675561; break; } case 12: num = ((num8 < effectHeader->TargetCount) ? (-1304675565) : (-1304675561)); break; case 2: type = ptr->Type; num = ((type == EActionEffectType.Damage) ? (-1304675567) : (-1304675553)); break; case 7: flag2 = true; num = -1304675566; break; case 0: flag2 = false; num = -1304675566; break; case 10: num = ((!flag) ? (-1304675568) : (-1304675563)); break; case 11: playerCharacter = _202E_200F_202B_200C_202B_202C_202D_200F_206B_200F_206E_200C_202E_200F_202E_202D_206E_200C_206E_206F_206D_206A_202D_200E_206A_200E_202B_206B_202A_202D_202C_200F_200E_200C_202C_200E_206E_206D_202B_202E_202E(_objectTable); num8 = 0; num = -1304675558; break; case 6: { int num7 = num8; num3 = 1; num4 = num7; int num9 = num4 ^ num3; int num10 = num4 & num3; num8 = num9 + (num10 + num10); num = -1304675558; break; } case 1: return; } } } catch (Exception ex) { _200D_200E_202A_206E_200C_200D_202E_200D_202C_206E_200F_200D_206F_202E_200C_200C_200E_202E_202E_206B_206A_206E_206B_202B_200C_200C_206E_206B_200C_202D_202C_202B_200E_202B_202A_206E_200B_202C_206A_206F_202E((ILogger)_logger, ex, global::_003CModule_003E._200B_206B_206B_200E_200B_206A_206D_206B_206E_200F_206A_206F_206E_202B_200F_206C_202B_206D_206E_200F_200C_200E_206F_200D_200F_200B_202B_202B_202B_202B_206D_202C_206A_206D_200B_206E_200D_206A_206F_200F_202E(-1383878648), Array.Empty()); } finally { _processActionEffectHook.Original(sourceId, sourceCharacter, pos, effectHeader, effectArray, effectTail); } } public void Dispose() { int num = ((_processActionEffectHook == null) ? (-1959940168) : (-1959940165)); while (true) { int num2 = num; int num3 = -1959940166; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 0: num = -1959940165; break; case 1: _processActionEffectHook.Disable(); _processActionEffectHook.Dispose(); num = -1959940168; break; case 2: return; } } } void IDisposable.Dispose() { //ILSpy generated this explicit interface implementation from .override directive in Dispose this.Dispose(); } static void _202C_200C_206A_202B_206A_202E_206E_206A_202D_206C_200D_200E_206E_200C_200E_206F_200D_200B_200C_206B_206D_206C_202E_202B_206C_206F_202A_206D_202B_206F_200E_200D_200D_202A_206E_200E_202E_206A_206F_202E_202E(ILogger P_0, Exception P_1, string P_2, object[] P_3) { P_0.LogError(P_1, P_2, P_3); } static Delegate _200D_200C_206C_200D_202D_202E_206A_202A_206E_202A_200C_202C_200E_200C_200D_206C_202C_200E_200B_206D_200D_200C_206B_206B_200E_206B_202B_200B_206A_200F_206E_200B_200B_206E_202A_206A_206D_202D_206B_202A_202E(Delegate P_0, Delegate P_1) { return Delegate.Combine(P_0, P_1); } static Delegate _202C_200E_200C_202C_200E_202C_206F_202C_206A_206E_206E_206F_202E_200C_206F_200C_200F_202C_202D_206A_200F_202A_200F_202C_202A_202D_200B_206A_206B_202D_200B_200D_206F_200B_202B_200E_202A_200F_206B_202E_202E(Delegate P_0, Delegate P_1) { return Delegate.Remove(P_0, P_1); } static uint _200C_206D_206C_206B_206C_206E_202D_206F_202A_200B_206E_206C_202D_202D_202C_202B_202E_202B_200C_206B_202D_200D_200E_206A_200F_206F_206C_206D_206D_202E_202C_206D_202D_206C_200D_206D_202B_200F_206F_200C_202E(IClientState P_0) { return P_0.TerritoryType; } static IPlayerCharacter _202E_200F_202B_200C_202B_202C_202D_200F_206B_200F_206E_200C_202E_200F_202E_202D_206E_200C_206E_206F_206D_206A_202D_200E_206A_200E_202B_206B_202A_202D_202C_200F_200E_200C_202C_200E_206E_206D_202B_202E_202E(IObjectTable P_0) { return P_0.LocalPlayer; } static ulong _206C_202B_200E_206A_206E_200C_202D_200F_202E_206C_206F_202D_200F_202A_200B_202E_202D_200B_206B_206A_200F_202A_200E_202C_200D_206C_202E_206C_200B_200F_202E_206E_206F_202A_202E_200E_206E_206B_206D_202A_202E(IGameObject P_0) { return P_0.GameObjectId; } static void _202A_202E_206C_206E_200D_202E_202E_206F_206B_202E_200C_200D_202A_200B_206E_206A_202D_200F_200D_202D_200B_200D_200D_206C_202B_206C_202A_202A_200E_202D_206A_206A_202C_200F_206B_202A_202E_202E_202E_200E_202E(ILogger P_0, string P_1, object[] P_2) { P_0.LogTrace(P_1, P_2); } static void _200D_200E_202A_206E_200C_200D_202E_200D_202C_206E_200F_200D_206F_202E_200C_200C_200E_202E_202E_206B_206A_206E_206B_202B_200C_200C_206E_206B_200C_202D_202C_202B_200E_202B_202A_206E_200B_202C_206A_206F_202E(ILogger P_0, Exception P_1, string P_2, object[] P_3) { P_0.LogWarning(P_1, P_2, P_3); } }