acdream/tests/AcDream.Core.Net.Tests/Messages
Erik 7e95c45ece fix(net): ranged speech carries a range float our parser was eating
HearSpeech decoded 0x02BB and 0x02BC with one layout. They do not share one.
ACE's GameMessageHearRangedSpeech writes senderID, range, chatMessageType
where GameMessageHearSpeech writes only senderID, chatMessageType, and
holtburger's HearRangedSpeechData declares the same range: f32 that
HearSpeechData lacks. Two oracles, no ambiguity.

The consequence was quiet rather than loud. The tail is twelve bytes, our
guard demanded eight, so nothing ever failed to parse. We read the guid
correctly, then read range's float bits as the chat type and discarded the
real one. A shout at range 60.0f arrived with a chat type of 0x42700000
instead of 0x0B. Nothing downstream consumes ChatType for local speech today,
which is why this survived, but the record is public and any future consumer
would have inherited garbage.

TryParse now branches its tail size on the opcode and Parsed gains Range,
which stays zero for local speech because there is no such field on that
wire. The existing ChatTests ranged case was itself built on the misreading,
constructing a local-shaped tail; it is corrected to the oracle layout and
now asserts both range and chat type rather than only the ranged flag.

New golden tests drive both opcodes through AceWireWriter in ACE's write
order, covering empty strings, string lengths one through four so every
residue of the four-byte padding rule is exercised, CP1252 accented names,
and a regression pin asserting the chat type is not the range float's bits.
A ranged body four bytes short is now rejected instead of silently decoded.

Core.Net tests go 617 to 630, all green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 01:51:34 +02:00
..
AceWireWriter.cs test(net): generate wire fixtures from ACE's own writer, not hand-typed hex 2026-07-29 01:49:15 +02:00
AllegianceRequestsTests.cs feat(allegiance): Phase H.2 AllegianceRequests + AllegianceTree model 2026-04-18 17:17:45 +02:00
AppraiseInfoParserTests.cs fix #234: port retail appraisal floaty and inscriptions 2026-07-23 12:12:57 +02:00
AppraiseTests.cs fix(gameplay): reconcile wield ownership and target facing 2026-07-15 08:19:23 +02:00
AutonomousPositionTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
CastSpellTests.cs feat: port retail magic lifecycle and retained spell UI 2026-07-15 10:55:22 +02:00
CharacterActionsTests.cs fix(net): Phase L.1c conform combat wire events 2026-04-28 10:54:50 +02:00
CharacterEnterWorldTests.cs perf(net): frame recurring sends in place 2026-07-25 06:02:52 +02:00
CharacterListTests.cs fix(net): conform character entry and session shutdown 2026-07-21 10:33:03 +02:00
CharacterLogOffTests.cs fix(net): conform character entry and session shutdown 2026-07-21 10:33:03 +02:00
ChatTests.cs fix(net): ranged speech carries a range float our parser was eating 2026-07-29 01:51:34 +02:00
ClientCommandRequestsTests.cs feat(ui): port retail spellbook interactions 2026-07-15 16:26:30 +02:00
CombatEventTests.cs fix(net): Phase L.1c conform combat wire events 2026-04-28 10:54:50 +02:00
CreateObjectTests.cs fix(ui): preserve retail item titles and spacing 2026-07-24 05:21:01 +02:00
DeleteObjectTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
EmoteTextTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
GameActionLoginCompleteTests.cs feat(net): Phase 4.8 — send GameAction.LoginComplete after EnterWorld 2026-04-11 23:36:19 +02:00
GameEventDispatcherTests.cs refactor(net): own session wiring subscriptions 2026-07-21 10:45:15 +02:00
GameEventsInventoryTests.cs fix(net): D.2b-B B-Wire — ParseInventoryServerSaveFailed reads weenieError 2026-06-21 18:55:56 +02:00
HearSpeechGoldenTests.cs fix(net): ranged speech carries a range float our parser was eating 2026-07-29 01:51:34 +02:00
InteractRequestsTests.cs test(B.5): exercise i32 sign-correctness for BuildPickUp.placement 2026-05-14 15:05:07 +02:00
InventoryActionsTests.cs fix #234: port retail appraisal floaty and inscriptions 2026-07-23 12:12:57 +02:00
InventoryRemoveObjectTests.cs feat(net): D.2b-B B-Wire — InventoryRemoveObject (0x0024) parser 2026-06-21 18:52:21 +02:00
JumpActionTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
MoveToStateGoldenTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
MoveToStateTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
ObjDescEventTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
ParentEventTests.cs feat(combat): port retail held weapon parenting 2026-07-11 13:02:26 +02:00
PickupEventTests.cs fix(B.5): handle PickupEvent 0xF74A so picked-up items despawn locally 2026-05-14 16:13:16 +02:00
PlayerKilledTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
PlayScriptGoldenTests.cs test(net): generate wire fixtures from ACE's own writer, not hand-typed hex 2026-07-29 01:49:15 +02:00
PositionPackTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
PrivateUpdatePropertyInt64Tests.cs fix(ui): port live experience quality updates (#217) 2026-07-13 20:43:48 +02:00
PrivateUpdatePropertyIntTests.cs feat(net): D.2b-B B-Wire — PrivateUpdatePropertyInt (0x02CD) parser 2026-06-21 18:50:56 +02:00
ProjectileVfxPacketFixtures.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
PublicUpdatePropertyIntTests.cs feat(D.5.2): PublicUpdatePropertyInt (0x02CE) parser 2026-06-17 18:29:23 +02:00
RawMotionStatePackTests.cs feat(L.2b): outbound movement wire parity — RawMotionState default-difference, JumpPack, contact byte 2026-06-30 22:30:01 +02:00
ServerMessageTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
SetStackSizeTests.cs feat(net): D.2b-B B-Wire — SetStackSize (0x0197) parser 2026-06-21 18:51:42 +02:00
SetStateTests.cs feat(phys L.2g slice 1): inbound SetState (0xF74B) parser 2026-05-12 22:15:31 +02:00
SetTurbineChatChannelsTests.cs feat(net+chat): #19 TurbineChat (0xF7DE) codec + ChatChannelInfo + SetTurbineChatChannels parser 2026-04-25 19:44:56 +02:00
SocialActionsTests.cs feat(ui): share indicator detail panels 2026-07-17 10:27:41 +02:00
SocialStateMessagesTests.cs feat(chat): port retail client command families 2026-07-13 14:50:15 +02:00
SoulEmoteTests.cs feat(net): #18 holtburger inbound chat parity - EmoteText, SoulEmote, ServerMessage, PlayerKilled, WeenieError + Windows-1252 codec 2026-04-25 19:06:01 +02:00
TurbineChatTests.cs feat(net+chat): #19 TurbineChat (0xF7DE) codec + ChatChannelInfo + SetTurbineChatChannels parser 2026-04-25 19:44:56 +02:00
UpdateMotionTests.cs feat(R4-V3): wire completion - mt 8/9 parsing + full params exposure + the mt-0 sticky trailer (closes M7, M13, M14-wire-note) 2026-07-03 11:53:53 +02:00
UpdatePositionTests.cs feat(net): port retail physics spawn and event timestamps 2026-07-14 00:22:17 +02:00
VectorUpdateGoldenTests.cs test(net): generate wire fixtures from ACE's own writer, not hand-typed hex 2026-07-29 01:49:15 +02:00