using System.Runtime.InteropServices; namespace Nexus.GameOffsets.Components; /// /// An entry in the ActiveSkills vector: shared_ptr pair (0x10 bytes). /// Follow ActiveSkillPtr (first pointer) for skill details. /// [StructLayout(LayoutKind.Sequential, Pack = 1)] public struct ActorSkillEntry { public nint ActiveSkillPtr; public nint ControlBlockPtr; // shared_ptr control block, not used } /// /// Details of an active skill. The shared_ptr in the ActiveSkills vector points /// 0x10 bytes into the object (past vtable + UseStage/CastType), so we read from /// ActiveSkillPtr - 0x10 and all offsets are relative to the true object base. /// [StructLayout(LayoutKind.Explicit, Pack = 1)] public struct ActorSkillDetails { [FieldOffset(0x00)] public nint Vtable; [FieldOffset(0x08)] public int UseStage; [FieldOffset(0x0C)] public int CastType; [FieldOffset(0x20)] public uint UnknownIdAndEquipmentInfo; [FieldOffset(0x28)] public nint GrantedEffectsPerLevelDatRow; [FieldOffset(0x30)] public nint ActiveSkillsDatPtr; [FieldOffset(0x40)] public nint GrantedEffectStatSetsPerLevelDatRow; [FieldOffset(0xA8)] public int TotalUses; [FieldOffset(0xB8)] public int TotalCooldownTimeInMs; }