Skip to content

Commit

Permalink
Merge branch 'main' into cn
Browse files Browse the repository at this point in the history
  • Loading branch information
wozaiha committed Apr 24, 2024
2 parents 6f33a69 + 7dabba5 commit cc350f1
Show file tree
Hide file tree
Showing 94 changed files with 54,467 additions and 400,754 deletions.
1 change: 1 addition & 0 deletions .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,4 @@
*.png binary

ida/ffxiv_client_structs*.h linguist-generated=true
ida/ffxiv_structs.yml linguist-generated=true
6 changes: 2 additions & 4 deletions .github/workflows/cexporter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -56,10 +56,8 @@ jobs:
- name: Exit with error
if: steps.check_error.outputs.error == 'true'
run: exit 1
- name: Tar CExport
run: tar -czvf CExport.tar.gz ./ida/*.h
- uses: actions/upload-artifact@v4
with:
name: CExport
path: CExport.tar.gz
name: structs.yml
path: ./ida/ffxiv_structs.yml
retention-days: 7
2 changes: 1 addition & 1 deletion FFXIVClientStructs/Attributes/CExportIgnore.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace FFXIVClientStructs.Attributes;

[AttributeUsage(AttributeTargets.Field)]
[AttributeUsage(AttributeTargets.Field | AttributeTargets.Struct)]
internal class CExportIgnoreAttribute : Attribute {

}
36 changes: 36 additions & 0 deletions FFXIVClientStructs/Attributes/CExporterUnionAttribute.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
using System.Diagnostics.CodeAnalysis;

namespace FFXIVClientStructs.Attributes;
[AttributeUsage(AttributeTargets.Field)]
internal class CExporterUnionAttribute : Attribute {
public string Union { get; }
public string Struct { get; }
public bool IsStruct { get; }

/// <summary>
/// Creates a struct union with the given name and fields.
/// </summary>
/// <param name="name">The name to use for the union and sub struct</param>
public CExporterUnionAttribute(string name, bool isStruct = false) {
var n = name.Split('.');
if (n is not [{ } union, { } @struct] || n.Length > 2) throw new ArgumentException("Name must be in the format 'Union.Struct'", nameof(name));
Union = union;
Struct = @struct;
IsStruct = isStruct;
}

public bool Equals(CExporterUnionAttribute? other) => other is not null && Union == other.Union && Struct == other.Struct && IsStruct == other.IsStruct;

public override bool Equals(object? obj) => obj is CExporterUnionAttribute attr && Equals(attr);

public override int GetHashCode() => HashCode.Combine(Union, Struct, IsStruct);

public static bool operator ==(CExporterUnionAttribute? left, CExporterUnionAttribute? right) => left?.Equals(right) ?? right is null;

public static bool operator !=(CExporterUnionAttribute? left, CExporterUnionAttribute? right) => !(left == right);

public override string ToString() => $"{Union}.{Struct}";
}

[AttributeUsage(AttributeTargets.Struct)]
internal class CExporterStructUnionAttribute : Attribute { }
Original file line number Diff line number Diff line change
Expand Up @@ -72,7 +72,7 @@ public unsafe partial struct Character {
[FieldOffset(0x1BB0)] public ushort CurrentWorld;
[FieldOffset(0x1BB2)] public ushort HomeWorld;

[FieldOffset(0x1BB6)] public byte EventState; // Leave for backwards compat. See Mode.
[FieldOffset(0x1BB6), Obsolete("Use Mode")] public byte EventState; // Leave for backwards compat. See Mode.
[FieldOffset(0x1BB6)] public CharacterModes Mode;
[FieldOffset(0x1BB7)] public byte ModeParam; // Different purpose depending on mode. See CharacterModes for more info.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -122,7 +122,7 @@ public bool IsHidden {
public unsafe partial struct CustomizeData {
private const int Count = 0x1A;

[FieldOffset(0x00)] public fixed byte Data[Count];
[FieldOffset(0x00), Obsolete("Use specific fields"), CExportIgnore] public fixed byte Data[Count]; // TODO: Change to private

[FieldOffset(0x00)] public byte Race;
[FieldOffset(0x01)] public byte Sex;
Expand Down Expand Up @@ -186,7 +186,7 @@ public struct WeaponModelId {
[FieldOffset(4)] public ushort Variant;
[FieldOffset(6)] public byte Stain;

[FieldOffset(0)] public ulong Value;
[FieldOffset(0), CExportIgnore] public ulong Value;
}

[StructLayout(LayoutKind.Explicit, Size = 4)]
Expand All @@ -195,5 +195,5 @@ public struct EquipmentModelId {
[FieldOffset(2)] public byte Variant;
[FieldOffset(3)] public byte Stain;

[FieldOffset(0)] public uint Value;
[FieldOffset(0), CExportIgnore] public uint Value;
}
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ public partial struct TargetInformation {
/// Used when Type is <see cref="TargetInfoType.GameObjectID"/>.<br/>
/// Unlike other GameObjectIDs, this one appears to be set to fully 0 if the player is not looking at anything.
/// </remarks>
[FieldOffset(0x10)] public GameObjectID TargetId;
[FieldOffset(0x10), CExporterUnion("Union.Target")] public GameObjectID TargetId;

/// <remarks>
/// Used when Type is <see cref="TargetInfoType.Unk2"/> or <see cref="TargetInfoType.Unk3"/>.
/// </remarks>
[FieldOffset(0x10)] public Vector3 Unk10;
[FieldOffset(0x10), CExporterUnion("Union.Target")] public Vector3 Unk10;
[FieldOffset(0x20)] public int Unk20;

public enum TargetInfoType {
Expand Down
6 changes: 5 additions & 1 deletion FFXIVClientStructs/FFXIV/Client/Game/Event/Director.cs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
using FFXIVClientStructs.FFXIV.Client.Game.UI;
using FFXIVClientStructs.FFXIV.Client.System.String;

namespace FFXIVClientStructs.FFXIV.Client.Game.Event;
Expand All @@ -7,7 +8,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.Event;
// Client::Game::Event::EventHandler
// ctor "E8 ?? ?? ?? ?? 48 8D 05 ?? ?? ?? ?? 48 89 07 0F B7 03"
[StructLayout(LayoutKind.Explicit, Size = 0x4B8)]
public unsafe struct Director {
public unsafe partial struct Director {
[FieldOffset(0x00)] public LuaEventHandler LuaEventHandler;
[FieldOffset(0x330)] public EventHandlerInfo* EventHandlerInfo;
[FieldOffset(0x338)] public uint ContentId;
Expand All @@ -17,4 +18,7 @@ public unsafe struct Director {
[FieldOffset(0x350)] public Utf8String String0;
[FieldOffset(0x3B8)] public Utf8String String1;
[FieldOffset(0x420)] public Utf8String String2;

[VirtualFunction(267)]
public partial void PopulateMapMarkers(ushort territoryTypeId, StdVector<MapMarkerData>* markerVector);
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.Event;

// Client::Game::Event::EventGPoseController
// ctor "E8 ?? ?? ?? ?? 80 A3 ?? ?? ?? ?? ?? B8 ?? ?? ?? ?? 48 89 83"
[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x2F80)]
public unsafe partial struct EventGPoseController {
[MemberFunction("E8 ?? ?? ?? ?? E8 ?? ?? ?? ?? 80 BE 8C 00 00 00 02")]
public partial void AddCharacterToGPose(Character.Character* character, ulong a1 = 0);
Expand Down
2 changes: 1 addition & 1 deletion FFXIVClientStructs/FFXIV/Client/Game/Event/EventHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public struct EventHandlerInfo {

[StructLayout(LayoutKind.Explicit, Size = 0x04)]
public struct EventId {
[FieldOffset(0x00)] public uint Id;
[FieldOffset(0x00), CExportIgnore] public uint Id;
[FieldOffset(0x00)] public ushort EntryId;
[FieldOffset(0x02)] public EventHandlerType Type; //TODO: rename to ContentId
public static implicit operator uint(EventId id) => id.Id;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.Housing;

[StructLayout(LayoutKind.Explicit, Size = 0xAE30)]
public unsafe partial struct HousingOutdoorTerritory {
[FieldOffset(0x00)] public HousingTerritory HousingTerritory;
[FieldOffset(0x00), CExportIgnore] public HousingTerritory HousingTerritory;

/// <summary>
/// Get the Icon ID used for map icons in housing areas.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
namespace FFXIVClientStructs.FFXIV.Client.Game.Housing;

// 0xA160 for Indoor, 0xAE30 for Outdoor
[StructLayout(LayoutKind.Explicit)]
public unsafe partial struct HousingTerritory {
[StructLayout(LayoutKind.Explicit, Size = 0xA160)]
public unsafe partial struct HousingTerritory { // this should be renamed to IndoorHousingTerritory and the fields should be copied to OutdoorHousingTerritory
[FixedSizeArray<HousingFurniture>(732)]
[FieldOffset(0x10)] public fixed byte Furniture[732 * 0x30];
[FieldOffset(0x8968)] public HousingObjectManager HousingObjectManager;
Expand Down
4 changes: 2 additions & 2 deletions FFXIVClientStructs/FFXIV/Client/Game/InventoryManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,9 +102,9 @@ public unsafe partial struct InventoryItem : ICreatable {
/// <remarks> Only used if <see cref="IsSymbolic"/> is <c>false</c>. </remarks>
[FieldOffset(0x08)] public uint ItemID;
/// <remarks> Only used if <see cref="IsSymbolic"/> is <c>true</c>. </remarks>
[FieldOffset(0x08)] public ushort LinkedItemSlot;
[FieldOffset(0x08), CExportIgnore] public ushort LinkedItemSlot;
/// <remarks> Only used if <see cref="IsSymbolic"/> is <c>true</c>. </remarks>
[FieldOffset(0x0A)] public ushort LinkedInventoryType;
[FieldOffset(0x0A), CExportIgnore] public ushort LinkedInventoryType;
[FieldOffset(0x0C)] public uint Quantity;
[FieldOffset(0x10)] public ushort Spiritbond; // TODO: This field is also used for the collectability value. Not sure if it's the same data type. See also: GetSpiritbond()
[FieldOffset(0x12)] public ushort Condition;
Expand Down
50 changes: 25 additions & 25 deletions FFXIVClientStructs/FFXIV/Client/Game/JobGaugeManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,31 +6,31 @@ namespace FFXIVClientStructs.FFXIV.Client.Game;
public unsafe partial struct JobGaugeManager {
[FieldOffset(0x00)] public JobGauge* CurrentGauge;

[FieldOffset(0x08)] public JobGauge EmptyGauge;

[FieldOffset(0x08)] public WhiteMageGauge WhiteMage;
[FieldOffset(0x08)] public ScholarGauge Scholar;
[FieldOffset(0x08)] public AstrologianGauge Astrologian;
[FieldOffset(0x08)] public SageGauge Sage;

[FieldOffset(0x08)] public BardGauge Bard;
[FieldOffset(0x08)] public MachinistGauge Machinist;
[FieldOffset(0x08)] public DancerGauge Dancer;

[FieldOffset(0x08)] public BlackMageGauge BlackMage;
[FieldOffset(0x08)] public SummonerGauge Summoner;
[FieldOffset(0x08)] public RedMageGauge RedMage;

[FieldOffset(0x08)] public MonkGauge Monk;
[FieldOffset(0x08)] public DragoonGauge Dragoon;
[FieldOffset(0x08)] public NinjaGauge Ninja;
[FieldOffset(0x08)] public SamuraiGauge Samurai;
[FieldOffset(0x08)] public ReaperGauge Reaper;

[FieldOffset(0x08)] public DarkKnightGauge DarkKnight;
[FieldOffset(0x08)] public PaladinGauge Paladin;
[FieldOffset(0x08)] public WarriorGauge Warrior;
[FieldOffset(0x08)] public GunbreakerGauge Gunbreaker;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public JobGauge EmptyGauge;

[FieldOffset(0x08), CExporterUnion("Union.Guage")] public WhiteMageGauge WhiteMage;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public ScholarGauge Scholar;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public AstrologianGauge Astrologian;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public SageGauge Sage;

[FieldOffset(0x08), CExporterUnion("Union.Guage")] public BardGauge Bard;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public MachinistGauge Machinist;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public DancerGauge Dancer;

[FieldOffset(0x08), CExporterUnion("Union.Guage")] public BlackMageGauge BlackMage;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public SummonerGauge Summoner;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public RedMageGauge RedMage;

[FieldOffset(0x08), CExporterUnion("Union.Guage")] public MonkGauge Monk;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public DragoonGauge Dragoon;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public NinjaGauge Ninja;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public SamuraiGauge Samurai;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public ReaperGauge Reaper;

[FieldOffset(0x08), CExporterUnion("Union.Guage")] public DarkKnightGauge DarkKnight;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public PaladinGauge Paladin;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public WarriorGauge Warrior;
[FieldOffset(0x08), CExporterUnion("Union.Guage")] public GunbreakerGauge Gunbreaker;

[FieldOffset(0x58)] public byte ClassJobID;

Expand Down
4 changes: 2 additions & 2 deletions FFXIVClientStructs/FFXIV/Client/Game/Status.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ public struct Status {
// this contains different information depending on the type of status
// debuffs - stack count
// food/potions - ID of the food/potion in the ItemFood sheet
[FieldOffset(0x2)] public ushort Param;
[FieldOffset(0x2), CExporterUnion("Union.Param")] public ushort Param;
// remains for compatibility
[FieldOffset(0x2)] public byte StackCount;
[FieldOffset(0x2), CExporterUnion("Union.Param")] public byte StackCount;
[FieldOffset(0x4)] public float RemainingTime;
// objectID matching the entity that cast the effect - regens will be from the white mage ID etc
[FieldOffset(0x8)] public uint SourceID;
Expand Down
16 changes: 16 additions & 0 deletions FFXIVClientStructs/FFXIV/Client/Game/UI/Map.cs
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,22 @@ public unsafe partial struct MapMarkerData {

[FieldOffset(0x3C)] public ushort RecommendedLevel;
[FieldOffset(0x3E)] public ushort TerritoryTypeId;

[MemberFunction("E8 ?? ?? ?? ?? 80 7B 42 02 75 06")]
public partial MapMarkerData* SetData(
uint levelId,
Utf8String* tooltipString,
uint iconId,
float x,
float y,
float z,
uint radius,
ushort territoryTypeId,
uint mapId,
uint placeNameZoneId,
uint placeNameId,
ushort recommendedLevel,
sbyte a14 = -1);
}

/// <summary>
Expand Down
2 changes: 1 addition & 1 deletion FFXIVClientStructs/FFXIV/Client/Game/UI/RidePillon.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,5 @@ namespace FFXIVClientStructs.FFXIV.Client.Game.UI;
public unsafe partial struct RidePillon {
[FieldOffset(0)] public uint Unk0;
[FieldOffset(0x04)] public fixed uint Unk4[7]; // ObjectIDs
[FieldOffset(0x04)] public fixed uint Unk20[7]; // ObjectIDs
[FieldOffset(0x20)] public fixed uint Unk20[7]; // ObjectIDs
}
2 changes: 1 addition & 1 deletion FFXIVClientStructs/FFXIV/Client/Graphics/Kernel/Texture.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ public enum TextureFormat : uint {
// renderer texture object, contains platform specific render objects (DX9/DX11/PS3/PS4)
[StructLayout(LayoutKind.Explicit, Size = 0xC0)]
public unsafe partial struct Texture {
[FieldOffset(0x00)] public void* vtbl;
[FieldOffset(0x00), CExportIgnore] public void* vtbl;
[FieldOffset(0x20)] public Notifier Notifier;
[FieldOffset(0x38)] public uint Width;
[FieldOffset(0x3C)] public uint Height;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene;
public unsafe partial struct Demihuman {
[FieldOffset(0x0)] public CharacterBase CharacterBase;

[FieldOffset(0x928)] private nint _slotDecalBase;
[FieldOffset(0x928), CExportIgnore] private nint _slotDecalBase;
[FieldOffset(0x928)] public TextureResourceHandle* HeadDecal;
[FieldOffset(0x930)] public TextureResourceHandle* TopDecal;
[FieldOffset(0x938)] public TextureResourceHandle* ArmsDecal;
Expand Down
2 changes: 1 addition & 1 deletion FFXIVClientStructs/FFXIV/Client/Graphics/Scene/Human.cs
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ public unsafe partial struct Human {
[FieldOffset(0x93E)] public ushort TailEarId; // tXXXX/zXXXX(viera)
[FieldOffset(0x940)] public ushort FurId;

[FieldOffset(0x980)] private nint _slotDecalBase;
[FieldOffset(0x980), CExportIgnore] private nint _slotDecalBase;
[FieldOffset(0x980)] public TextureResourceHandle* HeadDecal;
[FieldOffset(0x988)] public TextureResourceHandle* TopDecal;
[FieldOffset(0x990)] public TextureResourceHandle* ArmsDecal;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

namespace FFXIVClientStructs.FFXIV.Client.Graphics.Scene;

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x20)]
public unsafe partial struct ResidentResourceManager {
[FieldOffset(0x14)]
public uint ResourceCount;
Expand Down
8 changes: 4 additions & 4 deletions FFXIVClientStructs/FFXIV/Client/LayoutEngine/LayoutManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ public unsafe partial struct LayoutManager {
[FieldOffset(0x20)] public uint TerritoryTypeId;
[FieldOffset(0x38)] public uint FestivalStatus; // SetActiveFestivals will not allow a change when not 5 or 0
[FieldOffset(0x40)] public fixed uint ActiveFestivals[4];
[FieldOffset(0x80)] public void* HousingController;
[FieldOffset(0x80), Obsolete("Use OutdoorAreaData")] public void* HousingController;
[FieldOffset(0x80)] public OutdoorAreaLayoutData* OutdoorAreaData;
[FieldOffset(0x90)] public IndoorAreaLayoutData* IndoorAreaData;

Expand All @@ -17,7 +17,7 @@ public unsafe partial struct LayoutManager {
public partial void SetActiveFestivals(uint* festivalArray); // Array of exactly 4 festivals. Use 0 for none.
}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x7080)]
public unsafe partial struct OutdoorAreaLayoutData {
[FixedSizeArray<OutdoorPlotLayoutData>(60)]
[FieldOffset(0x1F0)] public fixed byte Plot[60 * 0x1D0];
Expand Down Expand Up @@ -47,15 +47,15 @@ public struct OutdoorPlotFixtureData {
[FieldOffset(0x02)] public byte StainId;
}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x84)]
public unsafe struct IndoorAreaLayoutData {
[FieldOffset(0x28)] public IndoorFloorLayoutData Floor0;
[FieldOffset(0x3C)] public IndoorFloorLayoutData Floor1;
[FieldOffset(0x50)] public IndoorFloorLayoutData Floor2;
[FieldOffset(0x80)] public float LightLevel;
}

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x14)]
public unsafe struct IndoorFloorLayoutData {
[FieldOffset(0x00)] public int Part0;
[FieldOffset(0x04)] public int Part1;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ namespace FFXIVClientStructs.FFXIV.Client.Network;
public unsafe partial struct NetworkModuleProxy {
[FieldOffset(0x00)] public void* Vtbl;
[FieldOffset(0x08)] public NetworkModule* NetworkModule;
[FieldOffset(0x10)] public NetworkModulePacketReceiverCallback PacketReceiverCallback;
[FieldOffset(0x10), Obsolete("Wrongly defined overflows struct size")] public NetworkModulePacketReceiverCallback PacketReceiverCallback;

[MemberFunction("E8 ?? ?? ?? ?? EB ?? 49 8B 85")]
public partial bool IsInCrossWorlDuty();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
namespace FFXIVClientStructs.FFXIV.Client.Network;

[StructLayout(LayoutKind.Explicit, Size = 0x8)]
public unsafe partial struct PacketDispatcher {
[MemberFunction("48 89 5C 24 ?? 56 48 83 EC 20 4C 8B 09")]
public partial void ReceiveEvent(uint p2, void* p3);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
namespace FFXIVClientStructs.FFXIV.Client.System.Framework;

[StructLayout(LayoutKind.Explicit)]
[StructLayout(LayoutKind.Explicit, Size = 0x282)]
public unsafe struct GameWindow {
[FieldOffset(0x00)] public ulong ArgumentCount;
[FieldOffset(0x08)] public byte** Arguments; //Points to an array that points to CStr
Expand Down
2 changes: 1 addition & 1 deletion FFXIVClientStructs/FFXIV/Client/System/Framework/Task.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ namespace FFXIVClientStructs.FFXIV.Client.System.Framework;

[StructLayout(LayoutKind.Explicit, Size = 0x38)]
public unsafe partial struct Task {
[FieldOffset(0x00)] public void* vtbl;
[FieldOffset(0x00), CExportIgnore] public void* vtbl;
[FieldOffset(0x08)] public void* Runner;
[FieldOffset(0x10)] public Framework* Framework;
[FieldOffset(0x18)] public void* Func;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public ReadOnlySpan<byte> GetDataSpan() {

[StructLayout(LayoutKind.Explicit, Size = 4)]
public struct ResourceHandleType {
[FieldOffset(0x0)] public uint Value;
[FieldOffset(0x0), CExportIgnore] public uint Value;
[FieldOffset(0x0)] public HandleCategory Category;
[FieldOffset(0x2)] public byte Unknown0A;
[FieldOffset(0x3)] public byte Expansion;
Expand Down
Loading

0 comments on commit cc350f1

Please sign in to comment.