feat: make gamedata optional in datawindow

This commit is contained in:
goat 2020-12-08 15:01:07 +01:00
parent 5b77aa87b0
commit bd57865868

View file

@ -34,6 +34,8 @@ namespace Dalamud.Interface
private int inputAddonIndex; private int inputAddonIndex;
private Addon resultAddon; private Addon resultAddon;
private bool resolveGameData = false;
public DalamudDataWindow(Dalamud dalamud) { public DalamudDataWindow(Dalamud dalamud) {
this.dalamud = dalamud; this.dalamud = dalamud;
@ -66,6 +68,7 @@ namespace Dalamud.Interface
ImGui.SameLine(); 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"}, ImGui.Combo("Data kind", ref this.currentKind, new[] {"ServerOpCode", "Address", "Actor Table", "Font Test", "Party List", "Plugin IPC", "Condition", "Gauge", "Command", "Client UI"},
10); 10);
ImGui.Checkbox("Resolve GameData", ref this.resolveGameData);
ImGui.BeginChild("scrolling", new Vector2(0, 0), false, ImGuiWindowFlags.HorizontalScrollbar); 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)); ImGui.PushStyleVar(ImGuiStyleVar.ItemSpacing, new Vector2(0, 0));
if (this.wasReady) try {
switch (this.currentKind) { if (this.wasReady)
case 0: switch (this.currentKind) {
ImGui.TextUnformatted(this.serverOpString); case 0:
break; ImGui.TextUnformatted(this.serverOpString);
case 1: break;
case 1:
foreach (var debugScannedValue in BaseAddressResolver.DebugScannedValues) { foreach (var debugScannedValue in BaseAddressResolver.DebugScannedValues) {
ImGui.TextUnformatted($"{debugScannedValue.Key}"); ImGui.TextUnformatted($"{debugScannedValue.Key}");
foreach (var valueTuple in debugScannedValue.Value) { foreach (var valueTuple in debugScannedValue.Value) {
ImGui.TextUnformatted($" {valueTuple.Item1} - 0x{valueTuple.Item2.ToInt64():x}"); ImGui.TextUnformatted(
ImGui.SameLine(); $" {valueTuple.Item1} - 0x{valueTuple.Item2.ToInt64():x}");
ImGui.SameLine();
if (ImGui.Button("C")) { if (ImGui.Button("C")) {
ImGui.SetClipboardText(valueTuple.Item2.ToInt64().ToString("x")); ImGui.SetClipboardText(valueTuple.Item2.ToInt64().ToString("x"));
}
} }
} }
}
break; 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;
// 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 += 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 += $"ActorTableLen: {this.dalamud.ClientState.Actors.Length}\n";
stateString += $" DataId: {npc.DataId} NameId:{npc.NameId}\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) ImGui.TextUnformatted(stateString);
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";
if (actor is PlayerCharacter pc) ImGui.Checkbox("Draw actors on screen", ref this.drawActors);
stateString += ImGui.SliderFloat("Draw Distance", ref this.maxActorDrawDistance, 2f, 40f);
$" HomeWorld: {pc.HomeWorld.GameData.Name} CurrentWorld: {pc.CurrentWorld.GameData.Name} FC: {pc.CompanyTag}\n";
if (this.drawActors && this.dalamud.Framework.Gui.WorldToScreen(actor.Position, out var screenCoords)) { for (var i = 0; i < this.dalamud.ClientState.Actors.Length; i++) {
ImGui.PushID("ActorWindow" + i); var actor = this.dalamud.ClientState.Actors[i];
ImGui.SetNextWindowPos(new Vector2(screenCoords.X, screenCoords.Y));
if (actor.YalmDistanceX > this.maxActorDrawDistance) if (actor == null)
continue; continue;
ImGui.SetNextWindowBgAlpha(Math.Max(1f - (actor.YalmDistanceX / this.maxActorDrawDistance), 0.2f)); var actorString =
if (ImGui.Begin("Actor" + i, $"{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";
ImGuiWindowFlags.NoDecoration | ImGuiWindowFlags.AlwaysAutoResize |
ImGuiWindowFlags.NoSavedSettings | ImGuiWindowFlags.NoMove | ImGuiWindowFlags.NoMouseInputs | if (actor is Npc npc)
ImGuiWindowFlags.NoFocusOnAppearing | ImGuiWindowFlags.NoNav)) { actorString += $" DataId: {npc.DataId} NameId:{npc.NameId}\n";
ImGui.Text($"{actor.Address.ToInt64():X}:{actor.ActorId:X}[{i}] - {actor.ObjectKind} - {actor.Name}");
ImGui.End(); 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); // Font
} case 3:
break; var specialChars = string.Empty;
for (var i = 0xE020; i <= 0xE0DB; i++) {
specialChars += $"0x{i:X} - {(SeIconChar) i} - {(char) i}\n";
}
// Font ImGui.TextUnformatted(specialChars);
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); foreach (var fontAwesomeIcon in Enum.GetValues(typeof(FontAwesomeIcon))
.Cast<FontAwesomeIcon>()) {
ImGui.Text(((int) fontAwesomeIcon.ToIconChar()).ToString("X") + " - ");
ImGui.SameLine();
foreach (var fontAwesomeIcon in Enum.GetValues(typeof(FontAwesomeIcon)).Cast<FontAwesomeIcon>()) { ImGui.PushFont(InterfaceManager.IconFont);
ImGui.Text(((int) fontAwesomeIcon.ToIconChar()).ToString("X") + " - "); ImGui.Text(fontAwesomeIcon.ToIconString());
ImGui.SameLine(); ImGui.PopFont();
}
ImGui.PushFont(InterfaceManager.IconFont); break;
ImGui.Text(fontAwesomeIcon.ToIconString());
ImGui.PopFont();
}
break;
// Party // Party
case 4: case 4:
var partyString = string.Empty; var partyString = string.Empty;
if (this.dalamud.ClientState.PartyList.Length == 0) { if (this.dalamud.ClientState.PartyList.Length == 0) {
ImGui.TextUnformatted("Data not ready."); ImGui.TextUnformatted("Data not ready.");
} else { } 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 += 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; continue;
} }
partyString += didAny = true;
$"[{i}] {member.CharacterName} - {member.ObjectKind} - {member.Actor.ActorId}\n";
ImGui.Text($"ID: {i} Enum: {typedCondition}");
} }
ImGui.TextUnformatted(partyString); if (!didAny) {
} ImGui.Text("None. Talk to a shop NPC or visit a market board to find out more!!!!!!!");
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;
} }
didAny = true; break;
ImGui.Text($"ID: {i} Enum: {typedCondition}"); case 7:
} var gauge = this.dalamud.ClientState.JobGauges.Get<ASTGauge>();
ImGui.Text($"Moon: {gauge.ContainsSeal(SealType.MOON)} Drawn: {gauge.DrawnCard()}");
if (!didAny) break;
{
ImGui.Text("None. Talk to a shop NPC or visit a market board to find out more!!!!!!!");
}
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: break;
var gauge = this.dalamud.ClientState.JobGauges.Get<ASTGauge>();
ImGui.Text($"Moon: {gauge.ContainsSeal(SealType.MOON)} Drawn: {gauge.DrawnCard()}");
break; case 9:
ImGui.InputText("Addon name", ref this.inputAddonName, 256);
ImGui.InputInt("Addon Index", ref this.inputAddonIndex);
case 8: if (ImGui.Button("Get Addon")) {
foreach (var command in this.dalamud.CommandManager.Commands) { this.resultAddon =
ImGui.Text($"{command.Key}\n -> {command.Value.HelpMessage}\n -> In help: {command.Value.ShowInHelp}\n\n"); 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: if (ImGui.Button("Get Base UI object")) {
ImGui.InputText("Addon name", ref this.inputAddonName, 256); var addr = this.dalamud.Framework.Gui.GetBaseUIObject().ToInt64().ToString("x");
ImGui.InputInt("Addon Index", ref this.inputAddonIndex); Log.Information("{0}", addr);
ImGui.SetClipboardText(addr);
}
if (ImGui.Button("Get Addon")) { break;
this.resultAddon = }
this.dalamud.Framework.Gui.GetAddonByName(this.inputAddonName, this.inputAddonIndex); else
} ImGui.TextUnformatted("Data not ready.");
} catch (Exception ex) {
if (this.resultAddon != null) { ImGui.TextUnformatted(ex.ToString());
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.");
ImGui.PopStyleVar(); ImGui.PopStyleVar();