using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Runtime.CompilerServices; using Dalamud.Game.ClientState.Conditions; using Dalamud.Game.ClientState.Objects.SubKinds; using Dalamud.Game.ClientState.Objects.Types; using Dalamud.Plugin.Services; using FFXIVClientStructs.FFXIV.Client.Game; using FFXIVClientStructs.FFXIV.Client.Game.Character; using FFXIVClientStructs.FFXIV.Component.GUI; using LLib.GameUI; using Lumina.Excel.Sheets; using Microsoft.Extensions.Logging; namespace LLib.GameData; public sealed class GameStateHelper { private readonly IDataManager _dataManager; private readonly IClientState _clientState; private readonly ICondition _condition; private readonly IObjectTable _objectTable; private readonly IGameGui _gameGui; private readonly ILogger _logger; private readonly ReadOnlyDictionary _territoryToAetherCurrentCompFlgSet; public GameStateHelper(IDataManager dataManager, IClientState clientState, ICondition condition, IObjectTable objectTable, IGameGui gameGui, ILogger logger) { _dataManager = dataManager; _clientState = clientState; _condition = condition; _objectTable = objectTable; _gameGui = gameGui; _logger = logger; _territoryToAetherCurrentCompFlgSet = (from x in dataManager.GetExcelSheet() where x.RowId != 0 where x.AetherCurrentCompFlgSet.RowId != 0 select x).ToDictionary((TerritoryType x) => x.RowId, (TerritoryType x) => x.AetherCurrentCompFlgSet.RowId).AsReadOnly(); } public bool IsFlyingUnlocked(uint territoryId) { uint value; int num = ((!_territoryToAetherCurrentCompFlgSet.TryGetValue(territoryId, out value)) ? 403824667 : 403824666); while (true) { int num2 = num; int num3 = 403824667; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 2: goto IL_004e; case 0: return false; case 1: return PlayerStateHelper.IsAetherCurrentZoneComplete(value); } continue; IL_004e: num = 403824666; } } public bool IsFlyingUnlockedInCurrentZone() { return IsFlyingUnlocked(_206E_200D_200F_206A_202B_200B_206B_206B_200E_200D_202A_206A_200D_206F_200E_200E_200E_206D_202A_206E_206C_200F_200D_206A_200D_200F_200E_206D_206E_206B_200E_200F_202E_200E_202C_200C_202A_206E_200F_206E_202E(_clientState)); } public unsafe ushort? GetMountId() { IPlayerCharacter playerCharacter = _200F_206D_206D_202B_202B_200E_200D_200F_200C_202C_200E_202A_200E_202A_206D_202D_206D_200E_202B_200E_202C_202A_200D_206D_202E_202E_202A_202D_206D_206B_206A_202D_202D_200D_202C_206C_206B_200F_202B_202B_202E(_objectTable); int num = ((playerCharacter != null) ? 1199000575 : 1199000574); BattleChara* ptr = default(BattleChara*); while (true) { int num2 = num; int num3 = 1199000570; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 1: num = ((ptr->Mount.MountId != 0) ? 1199000568 : 1199000569); break; case 4: return null; case 5: ptr = (BattleChara*)_202B_206A_206C_202B_206B_202C_202C_206B_206F_206E_206D_206F_202E_200B_206D_202E_206A_206A_206A_200C_206E_200B_206C_200C_200D_206D_202C_206E_206D_202E_200B_202B_206C_202A_202E_206A_202E_206B_202E_202B_202E((IGameObject)playerCharacter); num = ((ptr == null) ? 1199000569 : 1199000571); break; case 3: return null; case 2: return ptr->Mount.MountId; case 0: num = 1199000574; break; } } } public unsafe bool HasStatusPreventingMount() { int num = ((!_202D_206E_206A_206C_206E_202D_200B_200D_200B_202E_200B_206E_200E_200D_200B_200E_202C_206F_206A_206C_202C_202B_200D_206E_202A_202D_202C_202D_200B_200F_200E_206E_200F_206E_206C_202A_206A_202D_202C_202E(_condition, ConditionFlag.Swimming)) ? (-1891317293) : (-1891317282)); IPlayerCharacter playerCharacter = default(IPlayerCharacter); StatusManager* statusManager = default(StatusManager*); while (true) { int num2 = num; int num3 = -1891317286; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 8: return false; case 4: num = (IsFlyingUnlockedInCurrentZone() ? (-1891317293) : (-1891317288)); break; case 7: { BattleChara* ptr = (BattleChara*)_202B_206A_206C_202B_206B_202C_202C_206B_206F_206E_206D_206F_202E_200B_206D_202E_206A_206A_206A_200C_206E_200B_206C_200C_200D_206D_202C_206E_206D_202E_200B_202B_206C_202A_202E_206A_202E_206B_202E_202B_202E((IGameObject)playerCharacter); statusManager = ptr->GetStatusManager(); num = (statusManager->HasStatus(1151u) ? (-1891317287) : (-1891317296)); break; } case 5: num = -1891317282; break; case 9: num = (PlayerStateHelper.IsAnyMountUnlocked() ? (-1891317286) : (-1891317285)); break; case 10: num = ((!statusManager->HasStatus(1945u)) ? (-1891317284) : (-1891317287)); break; case 6: return HasStatusPreventingMountOrSprint(); case 3: return true; case 1: return true; case 0: playerCharacter = _200F_206D_206D_202B_202B_200E_200D_200F_200C_202C_200E_202A_200E_202A_206D_202D_206D_200E_202B_200E_202C_202A_200D_206D_202E_202E_202A_202D_206D_206B_206A_202D_202D_200D_202C_206C_206B_200F_202B_202B_202E(_objectTable); num = ((playerCharacter != null) ? (-1891317283) : (-1891317294)); break; case 2: return true; } } } public bool HasStatusPreventingSprint() { return HasStatusPreventingMountOrSprint(); } [MethodImpl(MethodImplOptions.NoInlining)] public unsafe bool Mount(uint preferredMountId = 0u) { int num = ((!_202D_206E_206A_206C_206E_202D_200B_200D_200B_202E_200B_206E_200E_200D_200B_200E_202C_206F_206A_206C_202C_202B_200D_206E_202A_202D_202C_202D_200B_200F_200E_206E_200F_206E_206C_202A_206A_202D_202C_202E(_condition, ConditionFlag.Mounted)) ? (-2056897107) : (-2056897108)); while (true) { int num2 = num; int num3 = -2056897114; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 13: num = -2056897108; break; case 9: num = ((ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 9u, 3758096384uL, checkRecastActive: true, checkCastingActive: true, null) != 0) ? (-2056897118) : (-2056897113)); break; case 3: return false; case 8: num = ((!PlayerStateHelper.IsMountUnlocked(preferredMountId)) ? (-2056897105) : (-2056897116)); break; case 4: return false; case 7: _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E((ILogger)_logger, global::_003CModule_003E._206E_202B_206C_202A_202A_200E_202B_202B_206D_200B_200C_206B_200B_206D_202E_202D_206C_202B_200B_206A_202D_206C_202A_200F_202D_200C_200B_200B_200B_200D_202C_206E_206D_202E_200C_206B_206A_206D_202D_202C_202E(-1476715702), new object[1] { preferredMountId }); num = ((!ActionManager.Instance()->UseAction(ActionType.Mount, preferredMountId, 3758096384uL, 0u, ActionManager.UseActionMode.None, 0u, null)) ? (-2056897115) : (-2056897117)); break; case 6: _200B_206F_202B_202C_200E_206D_206A_202A_202C_200B_202B_206D_206F_200D_206D_206A_206A_202E_200F_202C_200E_202E_200C_202E_206D_202C_200D_206E_200B_200E_206B_202C_200B_200E_206F_202E_202D_206C_202D_202E((ILogger)_logger, global::_003CModule_003E._202E_202C_206D_206B_202B_202D_206D_202E_206F_202E_202A_206A_206A_202B_206A_202D_202C_206C_206B_202C_206E_202B_200E_206E_206A_206C_200D_200D_200F_200B_202C_200B_200E_206F_202C_200F_202D_202A_206E_202B_202E(1773045698), Array.Empty()); return true; case 10: return true; case 1: _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E((ILogger)_logger, global::_003CModule_003E._206A_206D_202C_206E_206D_206E_202A_200F_200D_206A_200F_206C_202C_202D_206D_206A_200D_200F_206A_206C_202C_206D_206E_200F_200F_200C_206B_200B_206B_206E_202B_206B_200E_200E_200B_206F_200F_202E_200C_200C_202E(-1930041306), Array.Empty()); num = ((!ActionManager.Instance()->UseAction(ActionType.GeneralAction, 9u, 3758096384uL, 0u, ActionManager.UseActionMode.None, 0u, null)) ? (-2056897118) : (-2056897120)); break; case 2: num = ((ActionManager.Instance()->GetActionStatus(ActionType.Mount, preferredMountId, 3758096384uL, checkRecastActive: true, checkCastingActive: true, null) != 0) ? (-2056897115) : (-2056897119)); break; case 5: _200B_206F_202B_202C_200E_206D_206A_202A_202C_200B_202B_206D_206F_200D_206D_206A_206A_202E_200F_202C_200E_202E_200C_202E_206D_202C_200D_206E_200B_200E_206B_202C_200B_200E_206F_202E_202D_206C_202D_202E((ILogger)_logger, global::_003CModule_003E._202E_202C_206D_206B_202B_202D_206D_202E_206F_202E_202A_206A_206A_202B_206A_202D_202C_206C_206B_202C_206E_202B_200E_206E_206A_206C_200D_200D_200F_200B_202C_200B_200E_206F_202C_200F_202D_202A_206E_202B_202E(-297265243), new object[1] { preferredMountId }); return true; case 11: num = ((!HasStatusPreventingMount()) ? (-2056897114) : (-2056897110)); break; case 0: num = ((preferredMountId == 0) ? (-2056897105) : (-2056897106)); break; case 12: _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E((ILogger)_logger, global::_003CModule_003E._206A_202C_200C_206F_202A_200C_200F_206F_202B_202B_200D_206F_206D_200E_206A_206B_202A_200F_200B_206C_202B_202A_202B_206C_200F_206C_202C_202C_200C_206C_206F_200C_200B_202D_200E_202A_202A_206B_206B_200F_202E(-1799024315), Array.Empty()); return false; } } } [MethodImpl(MethodImplOptions.NoInlining)] public unsafe bool Unmount() { int num = (_202D_206E_206A_206C_206E_202D_200B_200D_200B_202E_200B_206E_200E_200D_200B_200E_202C_206F_206A_206C_202C_202B_200D_206E_202A_202D_202C_202D_200B_200F_200E_206E_200F_206E_206C_202A_206A_202D_202C_202E(_condition, ConditionFlag.Mounted) ? (-837931161) : (-837931166)); while (true) { int num2 = num; int num3 = -837931167; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 2: num = -837931166; break; case 3: return true; case 1: _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E((ILogger)_logger, global::_003CModule_003E._206A_206D_202C_206E_206D_206E_202A_200F_200D_206A_200F_206C_202C_202D_206D_206A_200D_200F_206A_206C_202C_206D_206E_200F_200F_200C_206B_200B_206B_206E_202B_206B_200E_200E_200B_206F_200F_202E_200C_200C_202E(-714588632), Array.Empty()); return false; case 0: _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E((ILogger)_logger, global::_003CModule_003E._206A_206D_202C_206E_206D_206E_202A_200F_200D_206A_200F_206C_202C_202D_206D_206A_200D_200F_206A_206C_202C_206D_206E_200F_200F_200C_206B_200B_206B_206E_202B_206B_200E_200E_200B_206F_200F_202E_200C_200C_202E(-1741093506), Array.Empty()); num = ((!ActionManager.Instance()->UseAction(ActionType.GeneralAction, 23u, 3758096384uL, 0u, ActionManager.UseActionMode.None, 0u, null)) ? (-837931163) : (-837931164)); break; case 6: num = ((ActionManager.Instance()->GetActionStatus(ActionType.GeneralAction, 23u, 3758096384uL, checkRecastActive: true, checkCastingActive: true, null) == 0) ? (-837931167) : (-837931168)); break; case 5: _200B_206F_202B_202C_200E_206D_206A_202A_202C_200B_202B_206D_206F_200D_206D_206A_206A_202E_200F_202C_200E_202E_200C_202E_206D_202C_200D_206E_200B_200E_206B_202C_200B_200E_206F_202E_202D_206C_202D_202E((ILogger)_logger, global::_003CModule_003E._202E_202C_206D_206B_202B_202D_206D_202E_206F_202E_202A_206A_206A_202B_206A_202D_202C_206C_206B_202C_206E_202B_200E_206E_206A_206C_200D_200D_200F_200B_202C_200B_200E_206F_202C_200F_202D_202A_206E_202B_202E(-97506348), Array.Empty()); return true; case 4: return false; } } } public unsafe int? GetFreeInventorySlots() { InventoryManager* ptr = InventoryManager.Instance(); int num = ((ptr != null) ? (-1831709052) : (-1831709042)); int num7 = default(int); int num8 = default(int); InventoryType inventoryType = default(InventoryType); InventoryContainer* inventoryContainer = default(InventoryContainer*); InventoryItem* inventorySlot = default(InventoryItem*); while (true) { int num2 = num; int num3 = -1831709050; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 1: { int num10 = num7; num3 = 1; num4 = num10; int num11 = num4 ^ num3; int num12 = num4 & num3; num7 = num11 + (num12 + num12); num = -1831709055; break; } case 7: { int num9 = num8; num3 = 1; num4 = num9; num8 = (num4 | num3) + (num4 & num3); num = -1831709054; break; } case 12: num = ((inventoryType <= InventoryType.Inventory4) ? (-1831709053) : (-1831709050)); break; case 11: num8 = 0; num = -1831709054; break; case 8: return null; case 0: return num7; case 13: num = -1831709042; break; case 3: return null; case 5: inventoryContainer = ptr->GetInventoryContainer(inventoryType); num = ((inventoryContainer != null) ? (-1831709043) : (-1831709051)); break; case 10: num = ((inventorySlot->ItemId != 0) ? (-1831709055) : (-1831709049)); break; case 4: num = ((num8 < inventoryContainer->Size) ? (-1831709056) : (-1831709041)); break; case 6: inventorySlot = inventoryContainer->GetInventorySlot(num8); num = ((inventorySlot == null) ? (-1831709049) : (-1831709044)); break; case 2: num7 = 0; inventoryType = InventoryType.Inventory1; num = -1831709046; break; case 9: inventoryType++; num = -1831709046; break; } } } public uint GetItemLevel(uint itemId) { return _dataManager.GetExcelSheet().GetRowOrDefault(itemId)?.LevelItem.RowId ?? 0; } [MethodImpl(MethodImplOptions.NoInlining)] public unsafe bool IsLoadingScreenVisible() { AtkUnitBase* addonPtr; int num = ((!_gameGui.TryGetAddonByName(global::_003CModule_003E._200E_206F_206C_206C_200E_202A_206D_206B_200B_202D_202B_200F_200F_206B_206C_206F_202D_206F_206A_202D_206A_200B_200B_202B_202D_202C_200F_200D_202E_200E_200D_202A_202B_206F_202E_200E_200B_206B_200E_202E_202E(108265439), out addonPtr)) ? (-1210184014) : (-1210184015)); while (true) { int num2 = num; int num3 = -1210184006; int num4 = num2; switch ((num4 | num3) - (num4 & num3)) { case 10: return true; case 4: num = ((!LAddon.IsAddonReady(addonPtr)) ? (-1210184004) : (-1210184003)); break; case 0: num = ((!LAddon.IsAddonReady(addonPtr)) ? (-1210184008) : (-1210184013)); break; case 6: return false; case 5: return true; case 3: num = -1210184015; break; case 8: num = ((!_gameGui.TryGetAddonByName(global::_003CModule_003E._202E_202C_206D_206B_202B_202D_206D_202E_206F_202E_202A_206A_206A_202B_206A_202D_202C_206C_206B_202C_206E_202B_200E_206E_206A_206C_200D_200D_200F_200B_202C_200B_200E_206F_202C_200F_202D_202A_206E_202B_202E(-342678724), out addonPtr)) ? (-1210184008) : (-1210184006)); break; case 9: num = ((!addonPtr->IsVisible) ? (-1210184008) : (-1210184016)); break; case 2: num = ((!_gameGui.TryGetAddonByName(global::_003CModule_003E._206A_202C_200C_206F_202A_200C_200F_206F_202B_202B_200D_206F_206D_200E_206A_206B_202A_200F_200B_206C_202B_202A_202B_206C_200F_206C_202C_202C_200C_206C_206F_200C_200B_202D_200E_202A_202A_206B_206B_200F_202E(190562947), out addonPtr)) ? (-1210184004) : (-1210184002)); break; case 11: num = ((!LAddon.IsAddonReady(addonPtr)) ? (-1210184014) : (-1210184005)); break; case 7: num = ((!addonPtr->IsVisible) ? (-1210184004) : (-1210184010)); break; case 12: return true; case 1: num = ((!addonPtr->IsVisible) ? (-1210184014) : (-1210184001)); break; } } } private unsafe bool HasStatusPreventingMountOrSprint() { IPlayerCharacter playerCharacter = _200F_206D_206D_202B_202B_200E_200D_200F_200C_202C_200E_202A_200E_202A_206D_202D_206D_200E_202B_200E_202C_202A_200D_206D_202E_202E_202A_202D_206D_206B_206A_202D_202D_200D_202C_206C_206B_200F_202B_202B_202E(_objectTable); int num = ((playerCharacter != null) ? 509350324 : 509350327); StatusManager* statusManager = default(StatusManager*); while (true) { int num2 = num; int num3 = 509350321; int num4 = num2; int num5 = num4 + num3; int num6 = num4 & num3; switch (num5 - (num6 + num6)) { case 0: num = (statusManager->HasStatus(404u) ? 509350322 : 509350323); break; case 1: return statusManager->HasStatus(2730u); case 7: num = (statusManager->HasStatus(2729u) ? 509350322 : 509350320); break; case 4: num = 509350327; break; case 6: return false; case 2: num = (statusManager->HasStatus(416u) ? 509350322 : 509350326); break; case 5: { BattleChara* ptr = (BattleChara*)_202B_206A_206C_202B_206B_202C_202C_206B_206F_206E_206D_206F_202E_200B_206D_202E_206A_206A_206A_200C_206E_200B_206C_200C_200D_206D_202C_206E_206D_202E_200B_202B_206C_202A_202E_206A_202E_206B_202E_202B_202E((IGameObject)playerCharacter); statusManager = ptr->GetStatusManager(); num = (statusManager->HasStatus(565u) ? 509350322 : 509350321); break; } case 3: return true; } } } static uint _206E_200D_200F_206A_202B_200B_206B_206B_200E_200D_202A_206A_200D_206F_200E_200E_200E_206D_202A_206E_206C_200F_200D_206A_200D_200F_200E_206D_206E_206B_200E_200F_202E_200E_202C_200C_202A_206E_200F_206E_202E(IClientState P_0) { return P_0.TerritoryType; } static IPlayerCharacter _200F_206D_206D_202B_202B_200E_200D_200F_200C_202C_200E_202A_200E_202A_206D_202D_206D_200E_202B_200E_202C_202A_200D_206D_202E_202E_202A_202D_206D_206B_206A_202D_202D_200D_202C_206C_206B_200F_202B_202B_202E(IObjectTable P_0) { return P_0.LocalPlayer; } static nint _202B_206A_206C_202B_206B_202C_202C_206B_206F_206E_206D_206F_202E_200B_206D_202E_206A_206A_206A_200C_206E_200B_206C_200C_200D_206D_202C_206E_206D_202E_200B_202B_206C_202A_202E_206A_202E_206B_202E_202B_202E(IGameObject P_0) { return P_0.Address; } static bool _202D_206E_206A_206C_206E_202D_200B_200D_200B_202E_200B_206E_200E_200D_200B_200E_202C_206F_206A_206C_202C_202B_200D_206E_202A_202D_202C_202D_200B_200F_200E_206E_200F_206E_206C_202A_206A_202D_202C_202E(ICondition P_0, ConditionFlag P_1) { return P_0[P_1]; } static void _202D_202E_206F_202A_206D_206A_206B_200C_202A_200D_206B_202C_202C_202C_206E_202E_206F_202E_200B_206C_206E_202A_206A_202D_200F_206B_200D_202D_206D_200F_202D_202C_206E_206D_200D_202B_202B_200C_202D_206A_202E(ILogger P_0, string P_1, object[] P_2) { P_0.LogDebug(P_1, P_2); } static void _200B_206F_202B_202C_200E_206D_206A_202A_202C_200B_202B_206D_206F_200D_206D_206A_206A_202E_200F_202C_200E_202E_200C_202E_206D_202C_200D_206E_200B_200E_206B_202C_200B_200E_206F_202E_202D_206C_202D_202E(ILogger P_0, string P_1, object[] P_2) { P_0.LogInformation(P_1, P_2); } }