From b17b3240e0d0f5b011607ff49dded431bc95b614 Mon Sep 17 00:00:00 2001 From: Denis Date: Sun, 30 Aug 2026 22:17:51 +0400 Subject: [PATCH] fix(eff_ob): the packet names an entity and switches an effect on or off The modern client's handler reads four fields: the first character of field 0 as the entity kind, field 1 as its id, field 2 as a switch (1 attaches the effect, 0 detaches it, anything else does nothing), field 3 as the effect. It never reads a map coordinate. Verified on screen: `eff_ob 1 2 1 4430` draws the ring of magenta arcs around the player and `eff_ob 1 2 0 4430` removes it. Co-Authored-By: Claude Opus 5 --- .../ServerPackets/Map/EffObPacket.cs | 11 +++++------ ...alizerOutputIsPinnedForEveryPacket.verified.txt | 4 ++-- test/NosCore.Packets.Tests/SerializerTest.cs | 14 ++++++++------ 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/src/NosCore.Packets/ServerPackets/Map/EffObPacket.cs b/src/NosCore.Packets/ServerPackets/Map/EffObPacket.cs index d1264289..41c48277 100644 --- a/src/NosCore.Packets/ServerPackets/Map/EffObPacket.cs +++ b/src/NosCore.Packets/ServerPackets/Map/EffObPacket.cs @@ -1,24 +1,23 @@ using NosCore.Packets.Attributes; using NosCore.Packets.Enumerations; +using NosCore.Shared.Enumerations; namespace NosCore.Packets.ServerPackets.Map { [PacketHeader("eff_ob", Scope.InGame)] public class EffObPacket : PacketBase { + // The client reads only the FIRST CHARACTER of this field. [PacketIndex(0)] - public string ExtraSpace { get; set; } = string.Empty; + public VisualType VisualType { get; set; } [PacketIndex(1)] - public short MapX { get; set; } + public long VisualId { get; set; } [PacketIndex(2)] - public short MapY { get; set; } + public bool IsVisible { get; set; } [PacketIndex(3)] - public byte Unknown { get; set; } //TODO to find - - [PacketIndex(4)] public int EffectId { get; set; } } } diff --git a/test/NosCore.Packets.Tests/SerializerCorpusTests.ExpressionTreeSerializerOutputIsPinnedForEveryPacket.verified.txt b/test/NosCore.Packets.Tests/SerializerCorpusTests.ExpressionTreeSerializerOutputIsPinnedForEveryPacket.verified.txt index a1671443..3f04ddb7 100644 --- a/test/NosCore.Packets.Tests/SerializerCorpusTests.ExpressionTreeSerializerOutputIsPinnedForEveryPacket.verified.txt +++ b/test/NosCore.Packets.Tests/SerializerCorpusTests.ExpressionTreeSerializerOutputIsPinnedForEveryPacket.verified.txt @@ -518,8 +518,8 @@ Bgm2Packet#1 => bgm2 21 Bgm2Packet#7 => bgm2 74 BgmPacket#1 => bgm 21 BgmPacket#7 => bgm 74 -EffObPacket#1 => eff_ob s15521 44 83 53 21 -EffObPacket#7 => eff_ob s15674 75 77 8 43 +EffObPacket#1 => eff_ob 1 44 0 53 +EffObPacket#7 => eff_ob 9 75 0 8 EffTPacket#1 => eff_t 1 44 83 53 21 EffTPacket#7 => eff_t 9 75 77 8 43 GroundEffectPacket#1 => eff_g s15521 44 s12383 53 21 1 diff --git a/test/NosCore.Packets.Tests/SerializerTest.cs b/test/NosCore.Packets.Tests/SerializerTest.cs index 805efb77..b9f05035 100644 --- a/test/NosCore.Packets.Tests/SerializerTest.cs +++ b/test/NosCore.Packets.Tests/SerializerTest.cs @@ -1054,13 +1054,15 @@ public void SerializeEffObPacketMatchesTrace() { var p = new EffObPacket { - ExtraSpace = string.Empty, - MapX = -1, - MapY = -1, - Unknown = 0, - EffectId = 4269 + VisualType = VisualType.Player, + VisualId = 2, + IsVisible = true, + EffectId = 4430 }; - Assert.AreEqual("eff_ob -1 -1 0 4269", Serializer.Serialize(p)); + Assert.AreEqual("eff_ob 1 2 1 4430", Serializer.Serialize(p)); + + p.IsVisible = false; + Assert.AreEqual("eff_ob 1 2 0 4430", Serializer.Serialize(p)); } [TestMethod]