diff --git a/Dalamud/Interface/DalamudDataWindow.cs b/Dalamud/Interface/DalamudDataWindow.cs index a76ac5ec9..a88f1c218 100644 --- a/Dalamud/Interface/DalamudDataWindow.cs +++ b/Dalamud/Interface/DalamudDataWindow.cs @@ -34,6 +34,8 @@ namespace Dalamud.Interface private int inputAddonIndex; private Addon resultAddon; + private bool resolveGameData = false; + public DalamudDataWindow(Dalamud dalamud) { this.dalamud = dalamud; @@ -66,6 +68,7 @@ namespace Dalamud.Interface ImGui.SameLine(); ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "Address", "Actor Table", "Font Test", "Party List", "Plugin IPC", "Condition", "Gauge", "Command", "Client UI"}, 10); + ImGui.Checkbox("Resolve GameData", ref this.resolveGameData); ImGui.BeginChild("scrolling", new Vector2(0, 0), false, ImGuiWindowFlags.HorizontalScrollbar); @@ -74,246 +77,275 @@ namespace Dalamud.Interface ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(0, 0)); - if (this.wasReady) - switch (this.currentKind) { - case 0: - ImGui.TextUnformatted(this.serverOpString); - break; - case 1: + try { + if (this.wasReady) + switch (this.currentKind) { + case 0: + ImGui.TextUnformatted(this.serverOpString); + break; + case 1: - foreach (var debugScannedValue in BaseAddressResolver.DebugScannedValues) { - ImGui.TextUnformatted($"{debugScannedValue.Key}"); - foreach (var valueTuple in debugScannedValue.Value) { - ImGui.TextUnformatted($" {valueTuple.Item1} - 0x{valueTuple.Item2.ToInt64():x}"); - ImGui.SameLine(); + foreach (var debugScannedValue in BaseAddressResolver.DebugScannedValues) { + ImGui.TextUnformatted($"{debugScannedValue.Key}"); + foreach (var valueTuple in debugScannedValue.Value) { + ImGui.TextUnformatted( + $" {valueTuple.Item1} - 0x{valueTuple.Item2.ToInt64():x}"); + ImGui.SameLine(); - if (ImGui.Button("C")) { - ImGui.SetClipboardText(valueTuple.Item2.ToInt64().ToString("x")); + if (ImGui.Button("C")) { + ImGui.SetClipboardText(valueTuple.Item2.ToInt64().ToString("x")); + } } } - } - break; - - // AT - case 2: { - var stateString = string.Empty; - // LocalPlayer is null in a number of situations (at least with the current visible-actors list) - // which would crash here. - if (this.dalamud.ClientState.Actors.Length == 0) { - ImGui.TextUnformatted("Data not ready."); - } else if (this.dalamud.ClientState.LocalPlayer == null) { - ImGui.TextUnformatted("LocalPlayer null."); - } else { - stateString += $"FrameworkBase: {this.dalamud.Framework.Address.BaseAddress.ToInt64():X}\n"; - - stateString += $"ActorTableLen: {this.dalamud.ClientState.Actors.Length}\n"; - stateString += $"LocalPlayerName: {this.dalamud.ClientState.LocalPlayer.Name}\n"; - stateString += $"CurrentWorldName: {this.dalamud.ClientState.LocalPlayer.CurrentWorld.GameData.Name}\n"; - stateString += $"HomeWorldName: {this.dalamud.ClientState.LocalPlayer.HomeWorld.GameData.Name}\n"; - stateString += $"LocalCID: {this.dalamud.ClientState.LocalContentId:X}\n"; - stateString += $"LastLinkedItem: {this.dalamud.Framework.Gui.Chat.LastLinkedItemId.ToString()}\n"; - stateString += $"TerritoryType: {this.dalamud.ClientState.TerritoryType}\n\n"; - - ImGui.Checkbox("Draw actors on screen", ref this.drawActors); - ImGui.SliderFloat("Draw Distance", ref this.maxActorDrawDistance, 2f, 40f); - - for (var i = 0; i < this.dalamud.ClientState.Actors.Length; i++) { - var actor = this.dalamud.ClientState.Actors[i]; - - if (actor == null) - continue; + break; + // AT + case 2: { + var stateString = string.Empty; + // LocalPlayer is null in a number of situations (at least with the current visible-actors list) + // which would crash here. + if (this.dalamud.ClientState.Actors.Length == 0) { + ImGui.TextUnformatted("Data not ready."); + } else if (this.dalamud.ClientState.LocalPlayer == null) { + ImGui.TextUnformatted("LocalPlayer null."); + } else { stateString += - $"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name} - X{actor.Position.X} Y{actor.Position.Y} Z{actor.Position.Z} D{actor.YalmDistanceX} R{actor.Rotation} - Target: {actor.TargetActorID:X}\n"; + $"FrameworkBase: {this.dalamud.Framework.Address.BaseAddress.ToInt64():X}\n"; - if (actor is Npc npc) - stateString += $" DataId: {npc.DataId} NameId:{npc.NameId}\n"; + stateString += $"ActorTableLen: {this.dalamud.ClientState.Actors.Length}\n"; + stateString += $"LocalPlayerName: {this.dalamud.ClientState.LocalPlayer.Name}\n"; + stateString += + $"CurrentWorldName: {(this.resolveGameData ? this.dalamud.ClientState.LocalPlayer.CurrentWorld.GameData.Name : this.dalamud.ClientState.LocalPlayer.CurrentWorld.Id.ToString())}\n"; + stateString += + $"HomeWorldName: {(this.resolveGameData ? this.dalamud.ClientState.LocalPlayer.HomeWorld.GameData.Name : this.dalamud.ClientState.LocalPlayer.HomeWorld.Id.ToString())}\n"; + stateString += $"LocalCID: {this.dalamud.ClientState.LocalContentId:X}\n"; + stateString += + $"LastLinkedItem: {this.dalamud.Framework.Gui.Chat.LastLinkedItemId.ToString()}\n"; + stateString += $"TerritoryType: {this.dalamud.ClientState.TerritoryType}\n\n"; - if (actor is Chara chara) - stateString += - $" Level: {chara.Level} ClassJob: {chara.ClassJob.GameData.Name} CHP: {chara.CurrentHp} MHP: {chara.MaxHp} CMP: {chara.CurrentMp} MMP: {chara.MaxMp}\n Customize: {BitConverter.ToString(chara.Customize).Replace("-", " ")}\n"; + ImGui.TextUnformatted(stateString); - if (actor is PlayerCharacter pc) - stateString += - $" HomeWorld: {pc.HomeWorld.GameData.Name} CurrentWorld: {pc.CurrentWorld.GameData.Name} FC: {pc.CompanyTag}\n"; + ImGui.Checkbox("Draw actors on screen", ref this.drawActors); + ImGui.SliderFloat("Draw Distance", ref this.maxActorDrawDistance, 2f, 40f); - if (this.drawActors && this.dalamud.Framework.Gui.WorldToScreen(actor.Position, out var screenCoords)) { - ImGui.PushID("ActorWindow" + i); - ImGui.SetNextWindowPos(new Vector2(screenCoords.X, screenCoords.Y)); + for (var i = 0; i < this.dalamud.ClientState.Actors.Length; i++) { + var actor = this.dalamud.ClientState.Actors[i]; - if (actor.YalmDistanceX > this.maxActorDrawDistance) + if (actor == null) continue; - ImGui.SetNextWindowBgAlpha(Math.Max(1f - (actor.YalmDistanceX / this.maxActorDrawDistance), 0.2f)); - if (ImGui.Begin("Actor" + i, - ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.AlwaysAutoResize | - ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoMouseInputs | - ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNav)) { - ImGui.Text($"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name}"); - ImGui.End(); + var actorString = + $"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name} - X{actor.Position.X} Y{actor.Position.Y} Z{actor.Position.Z} D{actor.YalmDistanceX} R{actor.Rotation} - Target: {actor.TargetActorID:X}\n"; + + if (actor is Npc npc) + actorString += $" DataId: {npc.DataId} NameId:{npc.NameId}\n"; + + if (actor is Chara chara) + actorString += + $" Level: {chara.Level} ClassJob: {(this.resolveGameData ? chara.ClassJob.GameData.Name : chara.ClassJob.Id.ToString())} CHP: {chara.CurrentHp} MHP: {chara.MaxHp} CMP: {chara.CurrentMp} MMP: {chara.MaxMp}\n Customize: {BitConverter.ToString(chara.Customize).Replace("-", " ")}\n"; + + if (actor is PlayerCharacter pc) + actorString += + $" HomeWorld: {(this.resolveGameData ? pc.HomeWorld.GameData.Name : pc.HomeWorld.Id.ToString())} CurrentWorld: {(this.resolveGameData ? pc.CurrentWorld.GameData.Name : pc.CurrentWorld.Id.ToString())} FC: {pc.CompanyTag}\n"; + + + ImGui.TextUnformatted(actorString); + ImGui.SameLine(); + if (ImGui.Button("C")) { + ImGui.SetClipboardText(actor.Address.ToInt64().ToString("X")); + } + + if (this.drawActors && + this.dalamud.Framework.Gui.WorldToScreen(actor.Position, out var screenCoords) + ) { + ImGui.PushID("ActorWindow" + i); + ImGui.SetNextWindowPos(new Vector2(screenCoords.X, screenCoords.Y)); + + if (actor.YalmDistanceX > this.maxActorDrawDistance) + continue; + + ImGui.SetNextWindowBgAlpha( + Math.Max(1f - (actor.YalmDistanceX / this.maxActorDrawDistance), 0.2f)); + if (ImGui.Begin("Actor" + i, + ImGuiWindowFlags.NoDecoration | + ImGuiWindowFlags.AlwaysAutoResize | + ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoMove | + ImGuiWindowFlags.NoMouseInputs | + ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNav)) { + ImGui.Text( + $"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name}"); + ImGui.End(); + } + + ImGui.PopID(); } - ImGui.PopID(); } } } + break; - ImGui.TextUnformatted(stateString); - } - break; + // Font + case 3: + var specialChars = string.Empty; + for (var i = 0xE020; i <= 0xE0DB; i++) { + specialChars += $"0x{i:X} - {(SeIconChar) i} - {(char) i}\n"; + } - // Font - case 3: - var specialChars = string.Empty; - for (var i = 0xE020; i <= 0xE0DB; i++) { - specialChars += $"0x{i:X} - {(SeIconChar) i} - {(char) i}\n"; - } + ImGui.TextUnformatted(specialChars); - ImGui.TextUnformatted(specialChars); + foreach (var fontAwesomeIcon in Enum.GetValues(typeof(FontAwesomeIcon)) + .Cast()) { + ImGui.Text(((int) fontAwesomeIcon.ToIconChar()).ToString("X") + " - "); + ImGui.SameLine(); - foreach (var fontAwesomeIcon in Enum.GetValues(typeof(FontAwesomeIcon)).Cast()) { - ImGui.Text(((int) fontAwesomeIcon.ToIconChar()).ToString("X") + " - "); - ImGui.SameLine(); + ImGui.PushFont(InterfaceManager.IconFont); + ImGui.Text(fontAwesomeIcon.ToIconString()); + ImGui.PopFont(); + } - ImGui.PushFont(InterfaceManager.IconFont); - ImGui.Text(fontAwesomeIcon.ToIconString()); - ImGui.PopFont(); - } - break; + break; - // Party - case 4: - var partyString = string.Empty; + // Party + case 4: + var partyString = string.Empty; - if (this.dalamud.ClientState.PartyList.Length == 0) { - ImGui.TextUnformatted("Data not ready."); - } else { + if (this.dalamud.ClientState.PartyList.Length == 0) { + ImGui.TextUnformatted("Data not ready."); + } else { + + partyString += $"{this.dalamud.ClientState.PartyList.Count} Members\n"; + for (var i = 0; i < this.dalamud.ClientState.PartyList.Count; i++) { + var member = this.dalamud.ClientState.PartyList[i]; + if (member == null) { + partyString += + $"[{i}] was null\n"; + continue; + } - partyString += $"{this.dalamud.ClientState.PartyList.Count} Members\n"; - for (var i = 0; i < this.dalamud.ClientState.PartyList.Count; i++) { - var member = this.dalamud.ClientState.PartyList[i]; - if (member == null) { partyString += - $"[{i}] was null\n"; + $"[{i}] {member.CharacterName} - {member.ObjectKind} - {member.Actor.ActorId}\n"; + } + + ImGui.TextUnformatted(partyString); + } + + break; + + // Subscriptions + case 5: + var i1 = new DalamudPluginInterface(this.dalamud, "DalamudTestSub", null, + PluginLoadReason.Boot); + var i2 = new DalamudPluginInterface(this.dalamud, "DalamudTestPub", null, + PluginLoadReason.Boot); + + if (ImGui.Button("Add test sub")) + i1.Subscribe("DalamudTestPub", o => { + dynamic msg = o; + Log.Debug(msg.Expand); + }); + + if (ImGui.Button("Add test sub any")) + i1.SubscribeAny((o, a) => { + dynamic msg = a; + Log.Debug($"From {o}: {msg.Expand}"); + }); + + if (ImGui.Button("Remove test sub")) i1.Unsubscribe("DalamudTestPub"); + + if (ImGui.Button("Remove test sub any")) i1.UnsubscribeAny(); + + if (ImGui.Button("Send test message")) { + dynamic testMsg = new ExpandoObject(); + testMsg.Expand = "dong"; + i2.SendMessage(testMsg); + } + + // This doesn't actually work, so don't mind it - impl relies on plugins being registered in PluginManager + if (ImGui.Button("Send test message any")) { + dynamic testMsg = new ExpandoObject(); + testMsg.Expand = "dong"; + i2.SendMessage("DalamudTestSub", testMsg); + } + + foreach (var sub in this.dalamud.PluginManager.IpcSubscriptions) { + ImGui.Text($"Source:{sub.SourcePluginName} Sub:{sub.SubPluginName}"); + } + + break; + + // Condition + case 6: +#if DEBUG + ImGui.Text($"ptr: {this.dalamud.ClientState.Condition.conditionArrayBase.ToString("X16")}"); +#endif + + ImGui.Text("Current Conditions:"); + ImGui.Separator(); + + var didAny = false; + + for (var i = 0; i < Condition.MaxConditionEntries; i++) { + var typedCondition = (ConditionFlag) i; + var cond = this.dalamud.ClientState.Condition[typedCondition]; + + if (!cond) { continue; } - partyString += - $"[{i}] {member.CharacterName} - {member.ObjectKind} - {member.Actor.ActorId}\n"; + didAny = true; + + ImGui.Text($"ID: {i} Enum: {typedCondition}"); } - ImGui.TextUnformatted(partyString); - } - - break; - - // Subscriptions - case 5: - var i1 = new DalamudPluginInterface(this.dalamud, "DalamudTestSub", null, PluginLoadReason.Boot); - var i2 = new DalamudPluginInterface(this.dalamud, "DalamudTestPub", null, PluginLoadReason.Boot); - - if (ImGui.Button("Add test sub")) i1.Subscribe("DalamudTestPub", o => { - dynamic msg = o; - Log.Debug(msg.Expand); - }); - - if (ImGui.Button("Add test sub any")) i1.SubscribeAny((o, a) => { - dynamic msg = a; - Log.Debug($"From {o}: {msg.Expand}"); - }); - - if (ImGui.Button("Remove test sub")) i1.Unsubscribe("DalamudTestPub"); - - if (ImGui.Button("Remove test sub any")) i1.UnsubscribeAny(); - - if (ImGui.Button("Send test message")) { - dynamic testMsg = new ExpandoObject(); - testMsg.Expand = "dong"; - i2.SendMessage(testMsg); - } - - // This doesn't actually work, so don't mind it - impl relies on plugins being registered in PluginManager - if (ImGui.Button("Send test message any")) - { - dynamic testMsg = new ExpandoObject(); - testMsg.Expand = "dong"; - i2.SendMessage("DalamudTestSub", testMsg); - } - - foreach (var sub in this.dalamud.PluginManager.IpcSubscriptions) { - ImGui.Text($"Source:{sub.SourcePluginName} Sub:{sub.SubPluginName}"); - } - break; - - // Condition - case 6: -#if DEBUG - ImGui.Text($"ptr: {this.dalamud.ClientState.Condition.conditionArrayBase.ToString("X16")}"); -#endif - - ImGui.Text("Current Conditions:"); - ImGui.Separator(); - - var didAny = false; - - for (var i = 0; i < Condition.MaxConditionEntries; i++) - { - var typedCondition = (ConditionFlag)i; - var cond = this.dalamud.ClientState.Condition[typedCondition]; - - if (!cond) - { - continue; + if (!didAny) { + ImGui.Text("None. Talk to a shop NPC or visit a market board to find out more!!!!!!!"); } - didAny = true; + break; - ImGui.Text($"ID: {i} Enum: {typedCondition}"); - } + case 7: + var gauge = this.dalamud.ClientState.JobGauges.Get(); + ImGui.Text($"Moon: {gauge.ContainsSeal(SealType.MOON)} Drawn: {gauge.DrawnCard()}"); - if (!didAny) - { - ImGui.Text("None. Talk to a shop NPC or visit a market board to find out more!!!!!!!"); - } + break; - break; + case 8: + foreach (var command in this.dalamud.CommandManager.Commands) { + ImGui.Text( + $"{command.Key}\n -> {command.Value.HelpMessage}\n -> In help: {command.Value.ShowInHelp}\n\n"); + } - case 7: - var gauge = this.dalamud.ClientState.JobGauges.Get(); - ImGui.Text($"Moon: {gauge.ContainsSeal(SealType.MOON)} Drawn: {gauge.DrawnCard()}"); + break; - break; + case 9: + ImGui.InputText("Addon name", ref this.inputAddonName, 256); + ImGui.InputInt("Addon Index", ref this.inputAddonIndex); - case 8: - foreach (var command in this.dalamud.CommandManager.Commands) { - ImGui.Text($"{command.Key}\n -> {command.Value.HelpMessage}\n -> In help: {command.Value.ShowInHelp}\n\n"); - } + if (ImGui.Button("Get Addon")) { + this.resultAddon = + this.dalamud.Framework.Gui.GetAddonByName( + this.inputAddonName, this.inputAddonIndex); + } - break; + if (this.resultAddon != null) { + ImGui.TextUnformatted( + $"{this.resultAddon.Name} - 0x{this.resultAddon.Address.ToInt64():x}\n v:{this.resultAddon.Visible} x:{this.resultAddon.X} y:{this.resultAddon.Y} s:{this.resultAddon.Scale}, w:{this.resultAddon.Width}, h:{this.resultAddon.Height}"); + } - case 9: - ImGui.InputText("Addon name", ref this.inputAddonName, 256); - ImGui.InputInt("Addon Index", ref this.inputAddonIndex); + if (ImGui.Button("Get Base UI object")) { + var addr = this.dalamud.Framework.Gui.GetBaseUIObject().ToInt64().ToString("x"); + Log.Information("{0}", addr); + ImGui.SetClipboardText(addr); + } - if (ImGui.Button("Get Addon")) { - this.resultAddon = - this.dalamud.Framework.Gui.GetAddonByName(this.inputAddonName, this.inputAddonIndex); - } - - if (this.resultAddon != null) { - ImGui.TextUnformatted($"{this.resultAddon.Name} - 0x{this.resultAddon.Address.ToInt64():x}\n v:{this.resultAddon.Visible} x:{this.resultAddon.X} y:{this.resultAddon.Y} s:{this.resultAddon.Scale}, w:{this.resultAddon.Width}, h:{this.resultAddon.Height}"); - } - - if (ImGui.Button("Get Base UI object")) { - var addr = this.dalamud.Framework.Gui.GetBaseUIObject().ToInt64().ToString("x"); - Log.Information("{0}", addr); - ImGui.SetClipboardText(addr); - } - - break; - } - else - ImGui.TextUnformatted("Data not ready."); + break; + } + else + ImGui.TextUnformatted("Data not ready."); + } catch (Exception ex) { + ImGui.TextUnformatted(ex.ToString()); + } ImGui.PopStyleVar();