diff --git a/PostNamazu/PostNamazu.cs b/PostNamazu/PostNamazu.cs index ccef62c..18b1793 100644 --- a/PostNamazu/PostNamazu.cs +++ b/PostNamazu/PostNamazu.cs @@ -32,6 +32,7 @@ public PostNamazu() { private IntPtr _entrancePtr; private Offsets Offsets; + private WayMarks tempMarks; public void InitPlugin(TabPage pluginScreenSpace, Label pluginStatusText) { @@ -187,6 +188,10 @@ private void DoTextCommand(object _, string command) { DoTextCommand(command); } + /// + /// 在游戏进程中进行场地标点 + /// + /// 标点合集对象 private void DoWaymarks(WayMarks waymarks) { WriteWaymark(waymarks.A, 0); WriteWaymark(waymarks.B, 1); @@ -197,16 +202,33 @@ private void DoWaymarks(WayMarks waymarks) { WriteWaymark(waymarks.Three, 6); WriteWaymark(waymarks.Four, 7); } - + /// + /// 在游戏进程中进行场地标点 + /// + /// 标点合集序列化Json字符串 private void DoWaymarks(string waymarksStr) { if (FFXIV == null) { PluginUI.Log("执行错误:接收到指令,但是没有对应的游戏进程"); throw new Exception("没有对应的游戏进程"); } - var waymarks = JsonConvert.DeserializeObject(waymarksStr); - PluginUI.Log(waymarksStr); - PluginUI.Log("开始标记"); - DoWaymarks(waymarks); + + switch (waymarksStr.ToLower()) + { + case "save": + case "backup": + SaveWaymark(); + break; + case "load": + case "restore": + LoadWaymark(); + break; + default: + var waymarks = JsonConvert.DeserializeObject(waymarksStr); + PluginUI.Log(waymarksStr); + PluginUI.Log("开始标记"); + DoWaymarks(waymarks); + break; + } } private void DoWaymarks(object _, string command) { @@ -214,6 +236,52 @@ private void DoWaymarks(object _, string command) { DoWaymarks(command); } + /// + /// 暂存当前标点 + /// + public void SaveWaymark() + { + tempMarks = new WayMarks(); + + Waymark ReadWaymark(IntPtr addr, WaymarkID id) => new Waymark + { + X = Memory.Read(addr), + Y = Memory.Read(addr + 0x4), + Z = Memory.Read(addr + 0x8), + Active = Memory.Read(addr + 0x1C) == 1, + ID = id + }; + + try + { + tempMarks.A = ReadWaymark(Offsets.Waymarks + 0x00, WaymarkID.A); + tempMarks.B = ReadWaymark(Offsets.Waymarks + 0x20, WaymarkID.B); + tempMarks.C = ReadWaymark(Offsets.Waymarks + 0x40, WaymarkID.C); + tempMarks.D = ReadWaymark(Offsets.Waymarks + 0x60, WaymarkID.D); + tempMarks.One = ReadWaymark(Offsets.Waymarks + 0x80, WaymarkID.One); + tempMarks.Two = ReadWaymark(Offsets.Waymarks + 0xA0, WaymarkID.Two); + tempMarks.Three = ReadWaymark(Offsets.Waymarks + 0xC0, WaymarkID.Three); + tempMarks.Four = ReadWaymark(Offsets.Waymarks + 0xE0, WaymarkID.Four); + PluginUI.Log("暂存当前标点"); + } + catch (Exception ex) + { + PluginUI.Log("保存标记错误:"+ex.Message); + } + + } + + /// + /// 恢复暂存标点 + /// + public void LoadWaymark() + { + if (tempMarks == null) + return; + DoWaymarks(tempMarks); + PluginUI.Log("恢复暂存标点"); + } + /// /// 写入指定标点 ///