public static void DrawArrayDataTable(NumberArrayData *array)
    {
        if (ImGui.BeginTable("numbersTable", 6, ImGuiTableFlags.Borders | ImGuiTableFlags.RowBg))
        {
            ImGui.TableSetupColumn("#", ImGuiTableColumnFlags.WidthFixed, 50);
            ImGui.TableSetupColumn("Integer");
            ImGui.TableSetupColumn("Shorts");
            ImGui.TableSetupColumn("Bytes");
            ImGui.TableSetupColumn("Hex");
            ImGui.TableSetupColumn("Float");
            ImGui.TableHeadersRow();

            for (var i = 0; i < array->AtkArrayData.Size; i++)
            {
                ImGui.TableNextColumn();
                DebugManager.ClickToCopyText($"{i.ToString().PadLeft(array->AtkArrayData.Size.ToString().Length, '0')}", $"{(ulong)&array->IntArray[i]:X}");
                ImGui.TableNextColumn();
                ImGui.Text($"{array->IntArray[i]}");
                ImGui.TableNextColumn();

                {
                    var a  = (short *)&array->IntArray[i];
                    var w  = ImGui.GetContentRegionAvail().X;
                    var bX = ImGui.GetCursorPosX();
                    for (var bi = 0; bi < 2; bi++)
                    {
                        ImGui.SetCursorPosX(bX + (w / 2) * bi);
                        ImGui.Text(ImGui.GetIO().KeyShift ? $"{a[bi]:X4}" : $"{a[bi]}");
                        if (bi != 1)
                        {
                            ImGui.SameLine();
                        }
                    }
                }


                ImGui.TableNextColumn();

                {
                    var a  = (byte *)&array->IntArray[i];
                    var w  = ImGui.GetContentRegionAvail().X;
                    var bX = ImGui.GetCursorPosX();
                    for (var bi = 0; bi < 4; bi++)
                    {
                        ImGui.SetCursorPosX(bX + (w / 4) * bi);
                        ImGui.Text(ImGui.GetIO().KeyShift ? $"{a[bi]:X2}" : $"{a[bi]}");
                        if (bi != 3)
                        {
                            ImGui.SameLine();
                        }
                    }
                }


                ImGui.TableNextColumn();

                var hexText = $"{array->IntArray[i]:X}";
                ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, Vector2.Zero);
                ImGui.TextDisabled("00000000"[..(8 - hexText.Length)]);
Exemplo n.º 2
0
    public override void Draw()
    {
        DebugManager.ClickToCopyText($"{Common.InventoryManagerAddress.ToInt64():X}");
        if (ImGui.BeginTabBar("inventoryDebuggingTabs"))
        {
            if (ImGui.BeginTabItem("Container/Slot"))
            {
                ImGui.PushItemWidth(200);
                if (ImGui.BeginCombo("###containerSelect", $"{inventoryType} [{(int)inventoryType}]"))
                {
                    foreach (var i in (InventoryType[])Enum.GetValues(typeof(InventoryType)))
                    {
                        if (ImGui.Selectable($"{i} [{(int) i}]##inventoryTypeSelect", i == inventoryType))
                        {
                            inventoryType = i;
                        }
                    }
                    ImGui.EndCombo();
                }

                var container = Common.GetContainer(inventoryType);

                ImGui.PopItemWidth();


                if (container != null)
                {
                    ImGui.Text($"Container Address:");
                    ImGui.SameLine();
                    DebugManager.ClickToCopyText($"{(ulong)container:X}");

                    ImGui.SameLine();
                    DebugManager.PrintOutObject(*container, (ulong)container, new List <string>());

                    if (ImGui.TreeNode("Items##containerItems"))
                    {
                        for (var i = 0; i < container->SlotCount; i++)
                        {
                            var item     = container->Items[i];
                            var itemAddr = ((ulong)container->Items) + (ulong)sizeof(InventoryItem) * (ulong)i;
                            DebugManager.ClickToCopyText($"{itemAddr:X}");
                            ImGui.SameLine();
                            DebugManager.PrintOutObject(item, (ulong)&item, new List <string> {
                                $"Items[{i}]"
                            }, false, $"[{i:00}] {item.Item?.Name ?? "<Not Found>"}");
                        }
                        ImGui.TreePop();
                    }
                }
                else
                {
                    ImGui.Text("Container not found.");
                }
                ImGui.EndTabItem();
            }

            ImGui.EndTabBar();
        }
    }
    public override void Draw()
    {
        var framework  = Framework.Instance();
        var serverTime = Framework.GetServerTime();

        ImGui.Text($"Server Time: {serverTime}");
        DebugManager.ClickToCopyText($"{(ulong)framework:X}");
        ImGui.SameLine();
        DebugManager.PrintOutObject(framework);
    }
Exemplo n.º 4
0
    public override void Draw()
    {
        if (groupManager == null)
        {
            groupManager = (GroupManager *)Service.SigScanner.GetStaticAddressFromSig("48 8D 0D ?? ?? ?? ?? 44 8B E7");
        }

        DebugManager.ClickToCopyText($"{(ulong) groupManager:X}"); ImGui.SameLine();

        DebugManager.PrintOutObject(*groupManager, (ulong)groupManager, new List <string>());


        if (groupManager->MemberCount < 1)
        {
            ImGui.Text("Not in a party");
        }
        else
        {
            ImGui.Text($"Party Member Count: {groupManager->MemberCount}");

            var partyMembers = (PartyMember *)groupManager->PartyMembers;

            for (var i = 0; i < 8 && i < groupManager->MemberCount; i++)
            {
                var partyMember = partyMembers[i];
                var name        = Marshal.PtrToStringAnsi(new IntPtr(partyMember.Name));
                ImGui.Text($"[{(ulong)&partyMember:X}] Lv {partyMember.Level}, {partyMember.ObjectID:X}, {name}");

                PlayerCharacter chara = null;

                for (var a = 0; a < Service.Objects.Length; a += 2)
                {
                    var actor = Service.Objects[a];
                    if (actor == null)
                    {
                        continue;
                    }
                    if ((uint)actor.ObjectId == partyMember.ObjectID && actor is PlayerCharacter pc)
                    {
                        chara = pc;
                    }
                }

                if (chara != null)
                {
                    DebugManager.PrintOutObject(chara, (ulong)chara.Address.ToInt64(), new List <string>());
                }
            }
        }
    }
    public override void Draw()
    {
        var retainerManager = RetainerManager.Instance();

        ImGui.Text("Retainer Manager: ");
        ImGui.SameLine();
        DebugManager.ClickToCopyText($"{(ulong)retainerManager:X}");

        if (retainerManager == null)
        {
            return;
        }

        ImGui.Separator();

        for (var i = 0; i < 10; i++)
        {
            ImGui.Text($"{retainerManager->DisplayOrder[i]}");
        }

        ImGui.Separator();
        DebugManager.PrintOutObject(retainerManager);
    }
    private void DrawHotbar(RaptureHotbarModule *hotbarModule, HotBar *hotbar)
    {
        ImGui.Columns(8);
        ImGuiExt.SetColumnWidths(35);

        ImGui.Text($"##");
        ImGui.NextColumn();
        ImGui.Text("Command");
        ImGui.NextColumn();
        ImGui.Text("Icon");
        ImGui.NextColumn();
        ImGui.Text("Name");
        ImGui.NextColumn();
        ImGui.Text("Cooldown");
        ImGui.NextColumn();


        ImGuiExt.NextRow();
        ImGui.Separator();
        ImGui.Separator();


        for (var i = 0; i < 16; i++)
        {
            var slot = hotbar->Slot[i];
            if (slot == null)
            {
                break;
            }
            if (slot->CommandType == HotbarSlotType.Empty)
            {
                ImGui.PushStyleColor(ImGuiCol.Text, slot->CommandType == HotbarSlotType.Empty ? 0x99999999 : 0xFFFFFFFF);
                DebugManager.ClickToCopyText($"{i+1:00}", $"{(ulong)slot:X}");
                ImGui.NextColumn();
                ImGui.Text("Empty");
                ImGui.PopStyleColor();
                ImGuiExt.NextRow();
                ImGui.Separator();
                continue;
            }

            var adjustedId = slot->CommandType == HotbarSlotType.Action ? ActionManager.Instance()->GetAdjustedActionId(slot->CommandId) : slot->CommandId;

            DebugManager.ClickToCopyText($"{i+1:00}", $"{(ulong)slot:X}");

            ImGui.NextColumn();

            ImGui.Text($"{slot->CommandType} : {slot->CommandId}");
            if (slot->CommandType == HotbarSlotType.Action)
            {
                ImGui.Text($"Adjusted: {adjustedId}");
            }
            ImGui.NextColumn();

            var iconGood = false;
            if (slot->Icon >= 0)
            {
                var icon = Plugin.IconManager.GetIconTexture(slot->Icon % 1000000, slot->Icon >= 1000000);
                if (icon != null)
                {
                    ImGui.Image(icon.ImGuiHandle, new Vector2(32));
                    iconGood = true;
                }
            }
            if (!iconGood)
            {
                ImGui.GetWindowDrawList().AddRect(ImGui.GetCursorScreenPos(), ImGui.GetCursorScreenPos() + new Vector2(32), 0xFF0000FF, 4);
                ImGui.GetWindowDrawList().AddText(ImGui.GetCursorScreenPos(), 0xFFFFFFFF, $"{slot->Icon}");

                ImGui.Dummy(new Vector2(32));
            }
            ImGui.SameLine();

            ImGui.Text($"{slot->IconTypeA} : {slot->IconA}\n{slot->IconTypeB} : {slot->IconB}");

            ImGui.NextColumn();
            switch (slot->CommandType)
            {
            case HotbarSlotType.Empty: { break; }

            case HotbarSlotType.Action: {
                var action = Service.Data.Excel.GetSheet <Action>().GetRow(slot->CommandId);
                if (action == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{action.Name}");
                }
                break;
            }

            case HotbarSlotType.Item: {
                var item = Service.Data.GetExcelSheet <Item>().GetRow(slot->CommandId % 500000);
                if (item == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{item.Name}");
                }
                break;
            }

            case HotbarSlotType.CraftAction: {
                var action = Service.Data.GetExcelSheet <CraftAction>().GetRow(slot->CommandId);
                if (action == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{action.Name}");
                }
                break;
            }

            case HotbarSlotType.GeneralAction: {
                var action = Service.Data.GetExcelSheet <GeneralAction>().GetRow(slot->CommandId);
                if (action == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{action.Name}");
                }
                break;
            }

            case HotbarSlotType.MainCommand: {
                var action = Service.Data.GetExcelSheet <MainCommand>().GetRow(slot->CommandId);
                if (action == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{action.Name}");
                }
                break;
            }

            case HotbarSlotType.ExtraCommand: {
                var rawSheet = Service.Data.Excel.GetSheetRaw("ExtraCommand");
                var parser   = rawSheet.GetRowParser(slot->CommandId);
                var name     = parser.ReadColumn <SeString>(0);
                ImGui.Text($"{name}");
                break;
            }

            case HotbarSlotType.GearSet: {
                var gearsetModule = RaptureGearsetModule.Instance();
                var gearset       = gearsetModule->Gearset[(int)slot->CommandId];
                ImGui.Text($"{Encoding.UTF8.GetString(gearset->Name, 0x2F)}");
                break;
            }

            case HotbarSlotType.Macro: {
                ImGui.Text($"{(slot->CommandId >= 256 ? "Shared" : "Individual")} #{slot->CommandId%256}");
                break;
            }

            case HotbarSlotType.Emote: {
                ImGui.Text($"{Service.Data.Excel.GetSheet<Emote>().GetRow(slot->CommandId)?.Name ?? "Invalid"}");
                break;
            }

            case HotbarSlotType.EventItem: {
                var item = Service.Data.GetExcelSheet <EventItem>().GetRow(slot->CommandId);
                if (item == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{item.Name}");
                }
                break;
            }

            case HotbarSlotType.Mount: {
                var m = Service.Data.Excel.GetSheet <Mount>().GetRow(slot->CommandId);
                if (m == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{m.Singular}");
                }

                break;
            }

            case HotbarSlotType.Minion: {
                var m = Service.Data.Excel.GetSheet <Companion>().GetRow(slot->CommandId);
                if (m == null)
                {
                    ImGui.TextDisabled("Not Found");
                }
                else
                {
                    ImGui.TextWrapped($"{m.Singular}");
                }

                break;
            }

            default: {
                ImGui.TextDisabled("Name Not Supprorted");
                break;
            }
            }

            ImGui.NextColumn();

            var cooldownGroup = -1;

            switch (slot->CommandType)
            {
            case HotbarSlotType.Action: {
                var action = Service.Data.Excel.GetSheet <Action>().GetRow((uint)adjustedId);
                if (action == null)
                {
                    ImGui.TextDisabled("Not Found");
                    break;
                }
                cooldownGroup = action.CooldownGroup;
                break;
            }

            case HotbarSlotType.Item: {
                var item = Service.Data.Excel.GetSheet <Item>().GetRow(slot->CommandId);
                if (item == null)
                {
                    ImGui.TextDisabled("Not Found");
                    break;
                }

                var cdg = ActionManager.Instance()->GetRecastGroup(2, slot->CommandId);
                if (cdg < 81)
                {
                    cooldownGroup = (int)(cdg + 1);
                }

                break;
            }

            case HotbarSlotType.GeneralAction: {
                var action = Service.Data.Excel.GetSheet <GeneralAction>().GetRow(slot->CommandId);
                if (action?.Action == null)
                {
                    ImGui.TextDisabled("Not Found");
                    break;
                }

                cooldownGroup = ActionManager.Instance()->GetRecastGroup(5, slot->CommandId);
                break;
            }
            }

            if (cooldownGroup > 0)
            {
                ImGui.Text($"Cooldown Group: {cooldownGroup}");

                var cooldown = ActionManager.Instance()->GetRecastGroupDetail(cooldownGroup);
                DebugManager.ClickToCopyText($"{(ulong)cooldown:X}");
                if (cooldown != null)
                {
                    ImGui.Text($"{cooldown->IsActive} / {cooldown->Elapsed} / {cooldown->Total}");
                }
                else
                {
                    ImGui.Text("Failed");
                }
            }

            ImGuiExt.NextRow();
            ImGui.Separator();
        }
        ImGui.Columns();
    }
    public override void Draw()
    {
        ImGui.Text($"{Name} Debug");
        ImGui.Separator();

        var raptureHotbarModule = Framework.Instance()->GetUiModule()->GetRaptureHotbarModule();

        ImGui.Text("RaptureHotbarModule:");
        ImGui.SameLine();
        DebugManager.ClickToCopyText($"{(ulong)raptureHotbarModule:X}");
        ImGui.SameLine();
        ImGui.Text("ActionManager:");
        ImGui.SameLine();
        DebugManager.ClickToCopyText($"{(ulong)ActionManager.Instance():X}");

        ImGui.Separator();


        if (ImGui.BeginTabBar("##hotbarDebugDisplay"))
        {
            if (ImGui.BeginTabItem("Current Bars"))
            {
                if (ImGui.BeginTabBar($"###{GetType().Name}_debug_tabs"))
                {
                    if (ImGui.BeginTabItem("Normal"))
                    {
                        DrawHotbarType(raptureHotbarModule, HotBarType.Normal);
                        ImGui.EndTabItem();
                    }

                    if (ImGui.BeginTabItem("Cross"))
                    {
                        DrawHotbarType(raptureHotbarModule, HotBarType.Cross);
                        ImGui.EndTabItem();
                    }

                    if (ImGui.BeginTabItem("Pet"))
                    {
                        DrawHotbarType(raptureHotbarModule, HotBarType.Pet, "Normal Pet", "Cross Pet");
                    }

                    ImGui.EndTabBar();
                }
                ImGui.EndTabItem();
            }

            if (ImGui.BeginTabItem("Saved Bars"))
            {
                if (ImGui.BeginChild("savedBarsIndexSelect", new Vector2(150, -1) * ImGui.GetIO().FontGlobalScale, true))
                {
                    for (byte i = 0; i < 61; i++)
                    {
                        var cj = Service.Data.Excel.GetSheet <ClassJob>()?.GetRow(i)?.Abbreviation?.RawString;

                        if (i > 41)
                        {
                            cj = Service.Data.Excel.GetSheet <ClassJob>()?.Where(j => j.IsLimitedJob == false && j.JobIndex > 0).Skip(i - 42).FirstOrDefault()?.Abbreviation?.RawString;
                        }

                        if (ImGui.Selectable((i > 40 ? "[PVP] " : "") + (i is 0 or 41 ? "Shared" : cj ?? $"{i}"), selectedSavedIndex == i))
                        {
                            selectedSavedIndex = i;
                        }
                    }
                }
                ImGui.EndChild();
                ImGui.SameLine();
                ImGui.BeginGroup();
                var savedBarClassJob = raptureHotbarModule->SavedClassJob[selectedSavedIndex];
                if (savedBarClassJob != null && ImGui.BeginTabBar("savedClassJobBarSelectType"))
                {
                    void ShowBar(int b)
                    {
                        var savedBar = savedBarClassJob->Bar[b];

                        if (savedBar == null)
                        {
                            ImGui.Text("Bar is Null");
                            return;
                        }

                        if (ImGui.BeginTable("savedClassJobBarSlots", 3))
                        {
                            ImGui.TableSetupColumn("Slot", ImGuiTableColumnFlags.WidthFixed, 50);
                            ImGui.TableSetupColumn("Type", ImGuiTableColumnFlags.WidthFixed, 80);
                            ImGui.TableSetupColumn("ID", ImGuiTableColumnFlags.WidthFixed, 100);

                            ImGui.TableHeadersRow();

                            for (var i = 0; i < 16; i++)
                            {
                                ImGui.TableNextColumn();
                                ImGui.Text($"{i:00}");
                                ImGui.TableNextColumn();
                                var slot = savedBar->Slot[i];
                                if (slot == null)
                                {
                                    ImGui.TableNextRow();
                                    continue;
                                }
                                ImGui.Text($"{slot->Type}");
                                ImGui.TableNextColumn();
                                ImGui.Text($"{slot->ID}");
                            }

                            ImGui.EndTable();
                        }
                    }

                    if (ImGui.BeginTabItem("Normal"))
                    {
                        if (ImGui.BeginTabBar("savecClassJobBarSelectCross"))
                        {
                            for (var i = 0; i < 10; i++)
                            {
                                if (ImGui.BeginTabItem($"{i + 1:00}"))
                                {
                                    ShowBar(i);
                                    ImGui.EndTabItem();
                                }
                            }
                            ImGui.EndTabBar();
                        }

                        ImGui.EndTabItem();
                    }

                    if (ImGui.BeginTabItem("Cross"))
                    {
                        if (ImGui.BeginTabBar("savecClassJobBarSelectCross"))
                        {
                            for (var i = 10; i < 18; i++)
                            {
                                if (ImGui.BeginTabItem($"{i-9:00}"))
                                {
                                    ShowBar(i);
                                    ImGui.EndTabItem();
                                }
                            }
                            ImGui.EndTabBar();
                        }

                        ImGui.EndTabItem();
                    }

                    ImGui.EndTabBar();
                }


                ImGui.EndGroup();

                ImGui.EndTabItem();
            }

            ImGui.EndTabBar();
        }
    }
    public override void Draw()
    {
        var config = Framework.Instance()->GetUiModule()->GetConfigModule();

        ImGui.Text("ConfigModule:");
        ImGui.SameLine();
        DebugManager.ClickToCopyText($"{(ulong) config:X}");

        DebugManager.PrintOutObject(config);


        ImGui.Separator();

        if (ImGui.BeginTabBar("ConfigDebugTabs"))
        {
            if (ImGui.BeginTabItem("View"))
            {
                ImGui.InputText("Search Option", ref searchString, 50);

                if (ImGui.BeginTable("configViewTable", 5))
                {
                    ImGui.TableSetupColumn("ID", ImGuiTableColumnFlags.WidthFixed, 50);
                    ImGui.TableSetupColumn("Option Name", ImGuiTableColumnFlags.WidthFixed);
                    ImGui.TableSetupColumn("Type", ImGuiTableColumnFlags.WidthFixed, 120);
                    ImGui.TableSetupColumn("Value", ImGuiTableColumnFlags.WidthFixed, 120);
                    ImGui.TableSetupColumn("Value2", ImGuiTableColumnFlags.WidthFixed, 120);
                    ImGui.TableHeadersRow();

                    for (short i = 0; i < 2000; i++)
                    {
                        var c = config->GetOptionById(i);
                        if (c == null)
                        {
                            continue;
                        }

                        if (!string.IsNullOrWhiteSpace(searchString))
                        {
                            if (!$"{c->OptionID}".Contains(searchString, StringComparison.OrdinalIgnoreCase))
                            {
                                continue;
                            }
                        }

                        var v = config->GetValue(c->OptionID);
                        ImGui.TableNextColumn();
                        ImGui.Text($"#{i}");
                        ImGui.TableNextColumn();
                        ImGui.Text($"{c->OptionID}");
                        ImGui.TableNextColumn();
                        ImGui.Text($"{v->Type}");
                        ImGui.TableNextColumn();

                        void PrintValue(AtkValue *atkValue)
                        {
                            switch (atkValue->Type)
                            {
                            case ValueType.Int:
                                ImGui.Text($"{atkValue->Int}");
                                break;

                            case ValueType.Bool:
                                ImGui.Text($"{atkValue->Byte == 1}");
                                break;

                            case ValueType.UInt:
                                ImGui.Text($"{atkValue->UInt}");
                                break;

                            case ValueType.Float:
                                ImGui.Text($"{atkValue->Float}");
                                break;

                            case ValueType.AllocatedString:
                            case ValueType.String:
                                var str = MemoryHelper.ReadStringNullTerminated(new IntPtr(atkValue->String));
                                ImGui.Text($"{str}");
                                break;

                            case ValueType.AllocatedVector:
                            case ValueType.Vector:
                                var vec = atkValue->Vector;
                                foreach (var vecValue in vec->Span)
                                {
                                    PrintValue(&vecValue);
                                }
                                break;

                            default:
                                ImGui.Text($"Unknown Value Type: {atkValue->Type}");
                                break;
                            }
                        }

                        PrintValue(v);

                        ImGui.TableNextColumn();
                        var intVal = config->GetIntValue(c->OptionID);
                        ImGui.Text($"{intVal}");
                    }

                    ImGui.EndTable();
                }

                ImGui.EndTabItem();
            }

            if (ImGui.BeginTabItem("Changes"))
            {
                var e = setOptionHook is { IsEnabled : true };

                if (ImGui.Checkbox("Enable Config Change Logging", ref e))
                {
                    if (e)
                    {
                        setOptionHook ??= Common.Hook <SetOption>("E8 ?? ?? ?? ?? C6 47 4D 00", SetOptionDetour);
                        setOptionHook?.Enable();
                    }
                    else
                    {
                        setOptionHook?.Disable();
                    }
                }
                ImGui.Separator();

                foreach (var change in changes)
                {
                    ImGui.Text($"[#{change.Index}] {change.Option} ({(short)change.Option}) => {change.Value}  [{change.a4}, {change.a5}, {change.a6}]");
                }

                ImGui.EndTabItem();
            }



            ImGui.EndTabBar();
        }
    }
    public override void Draw()
    {
        var raptureGearsetModule = RaptureGearsetModule.Instance();

        ImGui.Text("RaptureGearsetModule:");
        ImGui.SameLine();
        DebugManager.ClickToCopyText($"{(ulong)raptureGearsetModule:X}");
        ImGui.SameLine();
        ImGui.Text($"{Encoding.ASCII.GetString(raptureGearsetModule->ModuleName, 15)}");

        ImGui.Columns(6);
        ImGui.Text($"##");
        ImGuiExt.SetColumnWidths(35f, 120);
        ImGui.NextColumn();
        ImGui.Text("Address");
        ImGui.NextColumn();
        ImGui.Text("Name");
        ImGui.NextColumn();
        ImGui.Text("Items");
        ImGui.NextColumn();
        ImGui.Text("Flags");
        ImGuiExt.NextRow();
        ImGuiExt.NextRow();
        ImGui.Separator();
        ImGui.Separator();


        for (var i = 0; i < 101; i++)
        {
            var gearset = raptureGearsetModule->Gearset[i];
            if (gearset->ID != i)
            {
                break;
            }
            if (!gearset->Flags.HasFlag(RaptureGearsetModule.GearsetFlag.Exists))
            {
                continue;
            }

            ImGui.Text($"{gearset->ID:00}");
            ImGui.NextColumn();
            DebugManager.ClickToCopyText($"{(ulong) gearset:X}");
            ImGui.NextColumn();
            ImGui.Text(Encoding.UTF8.GetString(gearset->Name, 0x2F));
            ImGui.NextColumn();

            ImGui.Text("MainHand"); ImGui.SameLine(); ImGui.Text($"[{gearset->MainHand.ItemID}]");
            ImGui.Text("OffHand"); ImGui.SameLine(); ImGui.Text($"[{gearset->OffHand.ItemID}]");
            ImGui.Text("Head"); ImGui.SameLine(); ImGui.Text($"[{gearset->Head.ItemID}]");
            ImGui.Text("Body"); ImGui.SameLine(); ImGui.Text($"[{gearset->Body.ItemID}]");
            ImGui.Text("Hands"); ImGui.SameLine(); ImGui.Text($"[{gearset->Hands.ItemID}]");
            ImGui.Text("Belt"); ImGui.SameLine(); ImGui.Text($"[{gearset->Belt.ItemID}]");
            ImGui.Text("Legs"); ImGui.SameLine(); ImGui.Text($"[{gearset->Legs.ItemID}]");
            ImGui.Text("Feet"); ImGui.SameLine(); ImGui.Text($"[{gearset->Feet.ItemID}]");
            ImGui.Text("Ears"); ImGui.SameLine(); ImGui.Text($"[{gearset->Ears.ItemID}]");
            ImGui.Text("Neck"); ImGui.SameLine(); ImGui.Text($"[{gearset->Neck.ItemID}]");
            ImGui.Text("Wrists"); ImGui.SameLine(); ImGui.Text($"[{gearset->Wrists.ItemID}]");
            ImGui.Text("RingRight"); ImGui.SameLine(); ImGui.Text($"[{gearset->RingRight.ItemID}]");
            ImGui.Text("SoulStone"); ImGui.SameLine(); ImGui.Text($"[{gearset->SoulStone.ItemID}]");
            ImGui.NextColumn();

            foreach (RaptureGearsetModule.GearsetFlag r in Enum.GetValues(typeof(RaptureGearsetModule.GearsetFlag)))
            {
                if (gearset->Flags.HasFlag(r))
                {
                    ImGui.Text(r.ToString());
                }
            }

            ImGuiExt.NextRow();
            ImGuiExt.NextRow();
            ImGui.Separator();
        }

        ImGui.Columns();
    }