From 8a2f07158281afbfb0d77a4d2914e6fc816c1118 Mon Sep 17 00:00:00 2001 From: Liza Carvelli Date: Fri, 3 Feb 2023 03:50:55 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Mark=20traps=20that=20explode=20wit?= =?UTF-8?q?hout=20pomander=20of=20sight=20as=20seen?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Pal.Client/Pal.Client.csproj | 2 +- Pal.Client/Plugin.cs | 31 ++++++++++++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) diff --git a/Pal.Client/Pal.Client.csproj b/Pal.Client/Pal.Client.csproj index b5fd1f1..e02eb36 100644 --- a/Pal.Client/Pal.Client.csproj +++ b/Pal.Client/Pal.Client.csproj @@ -3,7 +3,7 @@ net7.0-windows 11.0 - 2.1 + 2.2 enable diff --git a/Pal.Client/Plugin.cs b/Pal.Client/Plugin.cs index a7ec563..8385f7b 100644 --- a/Pal.Client/Plugin.cs +++ b/Pal.Client/Plugin.cs @@ -14,7 +14,6 @@ using ECommons.SplatoonAPI; using Grpc.Core; using ImGuiNET; using Lumina.Excel.GeneratedSheets; -using Pal.Client.Net; using Pal.Client.Scheduled; using Pal.Client.Windows; using Pal.Common; @@ -613,7 +612,7 @@ namespace Pal.Client private IList GetRelevantGameObjects() { List result = new(); - for (int i = 246; i < Service.ObjectTable.Length; i++) + for (int i = 0; i < Service.ObjectTable.Length; i++) { GameObject? obj = Service.ObjectTable[i]; if (obj == null) @@ -621,6 +620,7 @@ namespace Pal.Client switch ((uint)Marshal.ReadInt32(obj.Address + 128)) { + // traps as seen through pomander of sight case 2007182: case 2007183: case 2007184: @@ -628,16 +628,37 @@ namespace Pal.Client case 2007186: case 2009504: result.Add(new Marker(Marker.EType.Trap, obj.Position) { Seen = true }); - break; + continue; + // hoard coffer, one is through pomander of intuition, the other as visible coffer case 2007542: case 2007543: result.Add(new Marker(Marker.EType.Hoard, obj.Position) { Seen = true }); - break; + continue; + // silver coffer, visible case 2007357: result.Add(new Marker(Marker.EType.SilverCoffer, obj.Position) { Seen = true }); - break; + continue; + } + + // Even with a pomander of sight, the BattleChara's position for the trap remains at {0, 0, 0} until it is activated. + // Upon exploding, the trap's position is moved to the exact location that the pomander of sight would have revealed. + // + // That exact position appears to be used for VFX playing when you walk into it - even if you barely walk into the + // outer ring of an otter/luring/impeding/landmine trap, the VFX plays at the exact center and not at your character's + // location. + // + // Especially at higher floors, you're more likely to walk into an undiscovered trap compared to e.g. 51-60, + // and you probably don't want to/can't use sight on every floor - yet the trap location is still useful information. + // + // For reasons unknown, you typically have more BattleChara for traps than actual traps on the floor, + // this may be traps in inaccessible rooms. + if (obj is BattleChara bc && (bc.NameId == /* potd */ 5042 || bc.NameId == /* hoh */ 7395) && obj.Position.Length() > 0.1) + { + var m = new Marker(Marker.EType.Trap, obj.Position) { Seen = true }; + if (!result.Contains(m)) + result.Add(m); } }