fix(wire): write SetStatusImmunity flags in the client's order

WIRE FIX. The 1.10.64 client writes and reads the immunity flags in
alphabetical order after the u32 state (GameMessage::SetStatusImmunity::
Serialize @ 0x00d8f140; the field offsets are named by the Flash export
at 0x00d8f410): BasicAttack, DOT, ImaginationGain, ImaginationLoss,
Interrupt, Knockback, PullToPoint, QuickbuildInterrupt, Speed. DLU wrote
them in declaration order, so e.g. a knockback immunity reached the
client as an imagination-gain immunity.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Aaron Kimbrell
2026-09-27 08:21:22 -05:00
parent e3a75a689e
commit 7fb1e404f0
4 changed files with 47 additions and 14 deletions

View File

@@ -273,29 +273,30 @@ namespace GameMessages {
}
void SetStatusImmunity::Serialize(RakNet::BitStream& bitStream) const {
// The client's order (0x00d8f140): alphabetical.
bitStream.Write(StateChangeType);
bitStream.Write(bImmuneToBasicAttack);
bitStream.Write(bImmuneToDOT);
bitStream.Write(bImmuneToKnockback);
bitStream.Write(bImmuneToInterrupt);
bitStream.Write(bImmuneToSpeed);
bitStream.Write(bImmuneToImaginationGain);
bitStream.Write(bImmuneToImaginationLoss);
bitStream.Write(bImmuneToQuickbuildInterrupt);
bitStream.Write(bImmuneToInterrupt);
bitStream.Write(bImmuneToKnockback);
bitStream.Write(bImmuneToPullToPoint);
bitStream.Write(bImmuneToQuickbuildInterrupt);
bitStream.Write(bImmuneToSpeed);
}
bool SetStatusImmunity::Deserialize(RakNet::BitStream& bitStream) {
VALIDATE_READ(bitStream.Read(StateChangeType));
VALIDATE_READ(bitStream.Read(bImmuneToBasicAttack));
VALIDATE_READ(bitStream.Read(bImmuneToDOT));
VALIDATE_READ(bitStream.Read(bImmuneToKnockback));
VALIDATE_READ(bitStream.Read(bImmuneToInterrupt));
VALIDATE_READ(bitStream.Read(bImmuneToSpeed));
VALIDATE_READ(bitStream.Read(bImmuneToImaginationGain));
VALIDATE_READ(bitStream.Read(bImmuneToImaginationLoss));
VALIDATE_READ(bitStream.Read(bImmuneToQuickbuildInterrupt));
VALIDATE_READ(bitStream.Read(bImmuneToInterrupt));
VALIDATE_READ(bitStream.Read(bImmuneToKnockback));
VALIDATE_READ(bitStream.Read(bImmuneToPullToPoint));
VALIDATE_READ(bitStream.Read(bImmuneToQuickbuildInterrupt));
VALIDATE_READ(bitStream.Read(bImmuneToSpeed));
return true;
}

View File

@@ -173,8 +173,9 @@ namespace GameMessages {
};
// Server -> client.
// NOTE: DLU writes the flags in this order; the client reads them in alphabetical order
// (GameMessage::SetStatusImmunity::Serialize @ 00d8f140 in 1.10.64). Kept as DLU sent it in this conversion.
// WIRE FIX: the flags go on the wire in alphabetical order, as the client's Serialize writes them
// (GameMessage::SetStatusImmunity::Serialize @ 00d8f140 in 1.10.64; field offsets named by its Flash export
// @ 00d8f410). DLU used to write them in the declaration order below.
struct SetStatusImmunity : public NetGameMsg {
SetStatusImmunity() : NetGameMsg(MessageType::Game::SET_STATUS_IMMUNITY) {}
void Serialize(RakNet::BitStream& bitStream) const override;