From 496f98ad1d29c464a264d0c56d645b2022a5b24b Mon Sep 17 00:00:00 2001 From: NetStyx Date: Fri, 2 Oct 2026 19:03:28 +0200 Subject: [PATCH] Added more values for movecontroller flags; Added ObjectSceneFlags --- .../Client/Game/Control/MoveControl/MoveController.cs | 3 +++ FFXIVClientStructs/FFXIV/Client/Game/Object/GameObject.cs | 7 +++++++ 2 files changed, 10 insertions(+) diff --git a/FFXIVClientStructs/FFXIV/Client/Game/Control/MoveControl/MoveController.cs b/FFXIVClientStructs/FFXIV/Client/Game/Control/MoveControl/MoveController.cs index 2f1a73fed9..401fd83c9b 100644 --- a/FFXIVClientStructs/FFXIV/Client/Game/Control/MoveControl/MoveController.cs +++ b/FFXIVClientStructs/FFXIV/Client/Game/Control/MoveControl/MoveController.cs @@ -9,7 +9,10 @@ public unsafe partial struct MoveController { [FieldOffset(0x3E0)] public BattleChara* OwnerObject; [FieldOffset(0x410)] public MovementStateOptions MovementState; + [BitField(nameof(IsSurfacePlacementComplete), 0)] // when not set, the game tries to place the owner on the nearest collision below its position on each frame. gets set when succeeded, skipped or disabled. + [BitField(nameof(IsSurfacePlacementDisabled), 2)] // skips surface placement on objects which are supposed to be kept at a fixed height (mounts, hovering minions, preview characters, some event NPCs) [BitField(nameof(IsSwimming), 5)] // found in Client::Game::Event::EventSceneModuleUsualImpl.IsSwimming + [BitField(nameof(IsSurfacePlacementPending), 7)] // queues a placement attempt which is delayed by a few frames. placement has to be completed and not disabled for this to work. [FieldOffset(0x438)] private byte Flags438; [MemberFunction("E8 ?? ?? ?? ?? 38 05")] diff --git a/FFXIVClientStructs/FFXIV/Client/Game/Object/GameObject.cs b/FFXIVClientStructs/FFXIV/Client/Game/Object/GameObject.cs index f68aca5678..4fd79df294 100644 --- a/FFXIVClientStructs/FFXIV/Client/Game/Object/GameObject.cs +++ b/FFXIVClientStructs/FFXIV/Client/Game/Object/GameObject.cs @@ -45,6 +45,7 @@ public unsafe partial struct GameObject { [FieldOffset(0x97)] public byte Visibility; [FieldOffset(0x9A)] public ObjectTargetableFlags TargetableStatus; // Determines whether the game object can be targeted by the user [FieldOffset(0x9B)] public ObjectUpdateFlags UpdateFlags; + [FieldOffset(0x9C)] public ObjectSceneFlags SceneFlags; [FieldOffset(0xB0)] public Vector3 Position; [FieldOffset(0xC0)] public float Rotation; [FieldOffset(0xC4)] public float Scale; @@ -430,6 +431,12 @@ public enum VisibilityFlags : ulong { Nameplate = 1ul << 11 } +[Flags] +public enum ObjectSceneFlags : byte { + VisualsLoaded = 1 << 4, // found in Client::Game::Object::GameObject.Update; set once drawing is enabled, DrawObject.LoadState reaches 3 and vf57 (object type based checks) agrees, cleared by EnableDraw and DisableDraw + CountsForPresenceChecks = 1 << 6, // found in Client::LayoutEngine::Group::SGDoorActionController; a local client object with this flag active can actuate doors +} + [Flags] public enum ObjectUpdateFlags : byte { /// Seen when Name is modified.