From 79131084342ed054e814a0755dd670b6d605b7d5 Mon Sep 17 00:00:00 2001 From: Caraxi Date: Sat, 29 Aug 2020 14:42:35 +0930 Subject: [PATCH 1/6] Add EventObj MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ¯\_(ツ)_/¯ --- Dalamud/Game/ClientState/Actors/ActorTable.cs | 1 + .../Actors/Types/NonPlayer/EventObj.cs | 21 +++++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 Dalamud/Game/ClientState/Actors/Types/NonPlayer/EventObj.cs diff --git a/Dalamud/Game/ClientState/Actors/ActorTable.cs b/Dalamud/Game/ClientState/Actors/ActorTable.cs index 9dd372ea1..048259ada 100644 --- a/Dalamud/Game/ClientState/Actors/ActorTable.cs +++ b/Dalamud/Game/ClientState/Actors/ActorTable.cs @@ -92,6 +92,7 @@ namespace Dalamud.Game.ClientState.Actors { return actorStruct.ObjectKind switch { ObjectKind.Player => new PlayerCharacter(offset, actorStruct, this.dalamud), ObjectKind.BattleNpc => new BattleNpc(offset, actorStruct, this.dalamud), + ObjectKind.EventObj => new EventObj(offset, actorStruct, this.dalamud), _ => new Actor(offset, actorStruct, this.dalamud) }; } diff --git a/Dalamud/Game/ClientState/Actors/Types/NonPlayer/EventObj.cs b/Dalamud/Game/ClientState/Actors/Types/NonPlayer/EventObj.cs new file mode 100644 index 000000000..265e80151 --- /dev/null +++ b/Dalamud/Game/ClientState/Actors/Types/NonPlayer/EventObj.cs @@ -0,0 +1,21 @@ +using System; + +namespace Dalamud.Game.ClientState.Actors.Types.NonPlayer { + /// + /// This class represents an EventObj. + /// + public class EventObj : Actor { + /// + /// Set up a new EventObj with the provided memory representation. + /// + /// The memory representation of the base actor. + /// A dalamud reference needed to access game data in Resolvers. + /// The address of this actor in memory. + public EventObj(IntPtr address, Structs.Actor actorStruct, Dalamud dalamud) : base(address, actorStruct, dalamud) { } + + /// + /// The data ID of the NPC linking to their respective game data. + /// + public int DataId => this.actorStruct.DataId; + } +} From b59d96d9139f9c1ae40244c70b31a2525af9bab3 Mon Sep 17 00:00:00 2001 From: Caraxi Date: Sun, 30 Aug 2020 10:43:35 +0930 Subject: [PATCH 2/6] Fix Search Size to avoid search box going out of bounds. --- Dalamud/Plugin/PluginInstallerWindow.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Dalamud/Plugin/PluginInstallerWindow.cs b/Dalamud/Plugin/PluginInstallerWindow.cs index e7d67f7e4..30068b3fc 100644 --- a/Dalamud/Plugin/PluginInstallerWindow.cs +++ b/Dalamud/Plugin/PluginInstallerWindow.cs @@ -57,7 +57,8 @@ namespace Dalamud.Plugin ImGuiWindowFlags.NoCollapse | ImGuiWindowFlags.NoResize | ImGuiWindowFlags.NoScrollbar); ImGui.Text(Loc.Localize("InstallerHint", "This window allows you install and remove in-game plugins.\nThey are made by third-party developers.")); - ImGui.SameLine(); + ImGui.SameLine(ImGui.GetWindowWidth() - 250); + ImGui.SetNextItemWidth(240); ImGui.InputTextWithHint("###XPlPluginInstaller_Search", Loc.Localize("InstallerSearch", "Search"), ref this.searchText, 100); ImGui.Separator(); From 3d02e2438b0110e63ab04210ede7f376a91cfeeb Mon Sep 17 00:00:00 2001 From: ms2mml <> Date: Mon, 7 Sep 2020 01:25:51 -0700 Subject: [PATCH 3/6] Add json attributes to Payload/SeString types to allow for serialization/deserialization --- .../SeStringHandling/Payloads/AutoTranslatePayload.cs | 4 ++++ .../Game/Chat/SeStringHandling/Payloads/ItemPayload.cs | 3 +++ .../Chat/SeStringHandling/Payloads/MapLinkPayload.cs | 10 ++++++++++ .../Chat/SeStringHandling/Payloads/PlayerPayload.cs | 6 ++++++ .../Game/Chat/SeStringHandling/Payloads/RawPayload.cs | 5 +++++ .../Chat/SeStringHandling/Payloads/StatusPayload.cs | 3 +++ .../Game/Chat/SeStringHandling/Payloads/TextPayload.cs | 3 +++ .../SeStringHandling/Payloads/UIForegroundPayload.cs | 5 +++++ .../Chat/SeStringHandling/Payloads/UIGlowPayload.cs | 5 +++++ Dalamud/Game/Chat/SeStringHandling/SeString.cs | 2 ++ 10 files changed, 46 insertions(+) diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/AutoTranslatePayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/AutoTranslatePayload.cs index c01ed0ee2..98c7ff6b8 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/AutoTranslatePayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/AutoTranslatePayload.cs @@ -6,6 +6,7 @@ using System.IO; using System.Linq; using Dalamud.Data; using Dalamud.Data.TransientSheet; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -34,7 +35,10 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads } } + [JsonProperty] private uint group; + + [JsonProperty] private uint key; internal AutoTranslatePayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs index 265b8d088..d2a609fd8 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs @@ -5,6 +5,7 @@ using System.Linq; using System.Text; using Dalamud.Data; using Lumina.Excel.GeneratedSheets; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -22,6 +23,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public Item Item { get @@ -59,6 +61,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// public bool IsHQ { get; private set; } = false; + [JsonProperty] private uint itemId; internal ItemPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/MapLinkPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/MapLinkPayload.cs index 768d95716..ce547691d 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/MapLinkPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/MapLinkPayload.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using Dalamud.Data; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -20,6 +21,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public Map Map { get @@ -36,6 +38,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public TerritoryType TerritoryType { get @@ -70,6 +73,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The readable y-coordinate position for this map link. This value is approximate and unrounded. /// + [JsonIgnore] public float YCoord { get @@ -82,6 +86,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// The printable map coordinates for this link. This value tries to match the in-game printable text as closely as possible /// but is an approximation and may be slightly off for some positions. /// + [JsonIgnore] public string CoordinateString { get @@ -102,6 +107,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The region name for this map link. This corresponds to the upper zone name found in the actual in-game map UI. eg, "La Noscea" /// + [JsonIgnore] public string PlaceNameRegion { get @@ -115,6 +121,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The place name for this map link. This corresponds to the lower zone name found in the actual in-game map UI. eg, "Limsa Lominsa Upper Decks" /// + [JsonIgnore] public string PlaceName { get @@ -129,7 +136,10 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// public string DataString => $"m:{TerritoryType.RowId},{Map.RowId},{RawX},{RawY}"; + [JsonProperty] private uint territoryTypeId; + + [JsonProperty] private uint mapId; // there is no Z; it's purely in the text payload where applicable diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/PlayerPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/PlayerPayload.cs index 64ddcb374..1cfe9bfa8 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/PlayerPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/PlayerPayload.cs @@ -4,6 +4,7 @@ using System.Collections.Generic; using System.IO; using System.Text; using Dalamud.Data; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -14,10 +15,12 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads { public override PayloadType Type => PayloadType.Player; + [JsonProperty] private string playerName; /// /// The player's displayed name. This does not contain the server name. /// + [JsonIgnore] public string PlayerName { get { return this.playerName; } @@ -35,6 +38,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public World World { get @@ -48,8 +52,10 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// A text representation of this player link matching how it might appear in-game. /// The world name will always be present. /// + [JsonIgnore] public string DisplayedName => $"{PlayerName}{(char)SeIconChar.CrossWorld}{World.Name}"; + [JsonProperty] private uint serverId; internal PlayerPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs index 301bde07e..a2438d32a 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/RawPayload.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; @@ -20,6 +21,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads public override PayloadType Type => PayloadType.Unknown; + [JsonProperty] private byte[] data; // this is a bit different from the underlying data // We need to store just the chunk data for decode to behave nicely, but when reading data out @@ -28,6 +30,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// The entire payload byte sequence for this payload. /// The returned data is a clone and modifications will not be persisted. /// + [JsonIgnore] public byte[] Data { get @@ -38,8 +41,10 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads } } + [JsonProperty] private byte chunkType; + [JsonConstructor] internal RawPayload(byte chunkType) { this.chunkType = chunkType; diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/StatusPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/StatusPayload.cs index a82438fc0..11e90c3e3 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/StatusPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/StatusPayload.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using Dalamud.Data; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -20,6 +21,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public Status Status { get @@ -29,6 +31,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads } } + [JsonProperty] private uint statusId; internal StatusPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs index be2f5c13e..6c5ec22cc 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/TextPayload.cs @@ -1,3 +1,4 @@ +using Newtonsoft.Json; using System; using System.Collections.Generic; using System.IO; @@ -13,11 +14,13 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads public override PayloadType Type => PayloadType.RawText; // allow modifying the text of existing payloads on the fly + [JsonProperty] private string text; /// /// The text contained in this payload. /// This may contain SE's special unicode characters. /// + [JsonIgnore] public string Text { get { return this.text; } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/UIForegroundPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/UIForegroundPayload.cs index 2fede7f94..d25c0e033 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/UIForegroundPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/UIForegroundPayload.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using Dalamud.Data; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -31,6 +32,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public UIColor UIColor { get @@ -43,6 +45,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The color key used as a lookup in the UIColor table for this foreground color. /// + [JsonIgnore] public ushort ColorKey { get { return this.colorKey; } @@ -57,6 +60,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The Red/Green/Blue values for this foreground color, encoded as a typical hex color. /// + [JsonIgnore] public uint RGB { get @@ -65,6 +69,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads } } + [JsonProperty] private ushort colorKey; internal UIForegroundPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/UIGlowPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/UIGlowPayload.cs index d82d249f3..655e3c01e 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/UIGlowPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/UIGlowPayload.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; using System.IO; using Dalamud.Data; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling.Payloads { @@ -31,6 +32,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Value is evaluated lazily and cached. /// + [JsonIgnore] public UIColor UIColor { get @@ -43,6 +45,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The color key used as a lookup in the UIColor table for this glow color. /// + [JsonIgnore] public ushort ColorKey { get { return this.colorKey; } @@ -57,6 +60,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// The Red/Green/Blue values for this glow color, encoded as a typical hex color. /// + [JsonIgnore] public uint RGB { get @@ -65,6 +69,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads } } + [JsonProperty] private ushort colorKey; internal UIGlowPayload() { } diff --git a/Dalamud/Game/Chat/SeStringHandling/SeString.cs b/Dalamud/Game/Chat/SeStringHandling/SeString.cs index a7c954fab..8aa94726a 100644 --- a/Dalamud/Game/Chat/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Chat/SeStringHandling/SeString.cs @@ -4,6 +4,7 @@ using System.IO; using System.Linq; using System.Text; using Dalamud.Game.Chat.SeStringHandling.Payloads; +using Newtonsoft.Json; namespace Dalamud.Game.Chat.SeStringHandling { @@ -38,6 +39,7 @@ namespace Dalamud.Game.Chat.SeStringHandling /// Creates a new SeString from an ordered list of payloads. /// /// The Payload objects to make up this string. + [JsonConstructor] public SeString(List payloads) { Payloads = payloads; From a4ae5f0ad29cfa1f138f9add8c67a28e4f3c5eaf Mon Sep 17 00:00:00 2001 From: ms2mml <> Date: Mon, 7 Sep 2020 17:40:26 -0700 Subject: [PATCH 4/6] Add json attribute to IsHQ --- Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs index d2a609fd8..6815e6d0d 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payloads/ItemPayload.cs @@ -59,6 +59,7 @@ namespace Dalamud.Game.Chat.SeStringHandling.Payloads /// /// Whether or not this item link is for a high-quality version of the item. /// + [JsonProperty] public bool IsHQ { get; private set; } = false; [JsonProperty] From 7661c4fe2db2cb2cc407ab2c90dd87693c2d107f Mon Sep 17 00:00:00 2001 From: ms2mml <> Date: Mon, 7 Sep 2020 23:00:37 -0700 Subject: [PATCH 5/6] Add serialize/deserialize helper functions to SeString --- .../Game/Chat/SeStringHandling/SeString.cs | 39 +++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/Dalamud/Game/Chat/SeStringHandling/SeString.cs b/Dalamud/Game/Chat/SeStringHandling/SeString.cs index 8aa94726a..a3cfa0fd1 100644 --- a/Dalamud/Game/Chat/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Chat/SeStringHandling/SeString.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; +using Dalamud.Data; using Dalamud.Game.Chat.SeStringHandling.Payloads; using Newtonsoft.Json; @@ -102,5 +103,43 @@ namespace Dalamud.Game.Chat.SeStringHandling return messageBytes.ToArray(); } + + /// + /// Serializes the SeString to json + /// + /// An json representation of this object + public string ToJson() + { + return JsonConvert.SerializeObject(this, Formatting.Indented, new JsonSerializerSettings() + { + PreserveReferencesHandling = PreserveReferencesHandling.Objects, + ReferenceLoopHandling = ReferenceLoopHandling.Ignore, + TypeNameHandling = TypeNameHandling.Auto + }); + } + + /// + /// Creates a SeString from a json. (For testing - not recommended for production use.) + /// + /// A serialized SeString produced by ToJson() + /// An initialized instance of DataManager for Lumina queries. + /// A SeString initialized with values from the json + public static SeString FromJson(string json, DataManager dataManager) + { + var s = JsonConvert.DeserializeObject(json, new JsonSerializerSettings + { + PreserveReferencesHandling = PreserveReferencesHandling.Objects, + TypeNameHandling = TypeNameHandling.Auto, + ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor + }); + + foreach(var payload in s.Payloads) + { + var dataResolver = payload.GetType().GetField("DataResolver", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + dataResolver.SetValue(payload, dataManager); + } + + return s; + } } } From c9daf12822b9b196766379823458b7da86898834 Mon Sep 17 00:00:00 2001 From: ms2mml <> Date: Tue, 8 Sep 2020 14:40:02 -0700 Subject: [PATCH 6/6] Change dataResolver to public --- Dalamud/Game/Chat/SeStringHandling/Payload.cs | 2 +- Dalamud/Game/Chat/SeStringHandling/SeString.cs | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Dalamud/Game/Chat/SeStringHandling/Payload.cs b/Dalamud/Game/Chat/SeStringHandling/Payload.cs index 89f6c8bd4..8a37e3138 100644 --- a/Dalamud/Game/Chat/SeStringHandling/Payload.cs +++ b/Dalamud/Game/Chat/SeStringHandling/Payload.cs @@ -51,7 +51,7 @@ namespace Dalamud.Game.Chat.SeStringHandling /// /// The Lumina instance to use for any necessary data lookups. /// - protected DataManager DataResolver; + public DataManager DataResolver; // private for now, since subclasses shouldn't interact with this // To force-invalidate it, Dirty can be set to true diff --git a/Dalamud/Game/Chat/SeStringHandling/SeString.cs b/Dalamud/Game/Chat/SeStringHandling/SeString.cs index a3cfa0fd1..847e296e9 100644 --- a/Dalamud/Game/Chat/SeStringHandling/SeString.cs +++ b/Dalamud/Game/Chat/SeStringHandling/SeString.cs @@ -135,8 +135,7 @@ namespace Dalamud.Game.Chat.SeStringHandling foreach(var payload in s.Payloads) { - var dataResolver = payload.GetType().GetField("DataResolver", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); - dataResolver.SetValue(payload, dataManager); + payload.DataResolver = dataManager; } return s;