Fix stale opcode mappings and handler wiring across expansions

This commit is contained in:
Kelsi 2026-02-20 01:13:01 -08:00
parent 70e579157d
commit d8ab69f9c3
9 changed files with 190 additions and 23 deletions

View file

@ -1229,9 +1229,9 @@ void GameHandler::handlePacket(network::Packet& packet) {
handleRandomRoll(packet);
}
break;
case Opcode::CMSG_DUEL_PROPOSED:
// Some servers reuse this wire value for an outbound server packet variant.
// Consume safely until we have a concrete parser.
case Opcode::SMSG_ITEM_PUSH_RESULT:
// Item received notification (new item in bags, loot, quest reward, etc.)
// TODO: parse and show "item received" UI notification
packet.setReadPos(packet.getSize());
break;
@ -2247,9 +2247,13 @@ void GameHandler::handlePacket(network::Packet& packet) {
handleShowTaxiNodes(packet);
break;
case Opcode::SMSG_ACTIVATETAXIREPLY:
case Opcode::SMSG_ACTIVATETAXIREPLY_ALT:
handleActivateTaxiReply(packet);
break;
case Opcode::SMSG_STANDSTATE_UPDATE:
// Server confirms stand state change (sit/stand/sleep/kneel)
// TODO: parse uint8 standState and update player entity
packet.setReadPos(packet.getSize());
break;
case Opcode::SMSG_NEW_TAXI_PATH:
// Empty packet - server signals a new flight path was learned
// The actual node details come in the next SMSG_SHOWTAXINODES

View file

@ -119,7 +119,7 @@ static const OpcodeNameEntry kOpcodeNames[] = {
{"SMSG_GUILD_COMMAND_RESULT", LogicalOpcode::SMSG_GUILD_COMMAND_RESULT},
{"MSG_RAID_READY_CHECK", LogicalOpcode::MSG_RAID_READY_CHECK},
{"MSG_RAID_READY_CHECK_CONFIRM", LogicalOpcode::MSG_RAID_READY_CHECK_CONFIRM},
{"CMSG_DUEL_PROPOSED", LogicalOpcode::CMSG_DUEL_PROPOSED},
{"SMSG_ITEM_PUSH_RESULT", LogicalOpcode::SMSG_ITEM_PUSH_RESULT},
{"CMSG_DUEL_ACCEPTED", LogicalOpcode::CMSG_DUEL_ACCEPTED},
{"CMSG_DUEL_CANCELLED", LogicalOpcode::CMSG_DUEL_CANCELLED},
{"SMSG_DUEL_REQUESTED", LogicalOpcode::SMSG_DUEL_REQUESTED},
@ -264,7 +264,7 @@ static const OpcodeNameEntry kOpcodeNames[] = {
{"CMSG_CANCEL_MOUNT_AURA", LogicalOpcode::CMSG_CANCEL_MOUNT_AURA},
{"SMSG_SHOWTAXINODES", LogicalOpcode::SMSG_SHOWTAXINODES},
{"SMSG_ACTIVATETAXIREPLY", LogicalOpcode::SMSG_ACTIVATETAXIREPLY},
{"SMSG_ACTIVATETAXIREPLY_ALT", LogicalOpcode::SMSG_ACTIVATETAXIREPLY_ALT},
{"SMSG_STANDSTATE_UPDATE", LogicalOpcode::SMSG_STANDSTATE_UPDATE},
{"SMSG_NEW_TAXI_PATH", LogicalOpcode::SMSG_NEW_TAXI_PATH},
{"CMSG_ACTIVATETAXIEXPRESS", LogicalOpcode::CMSG_ACTIVATETAXIEXPRESS},
{"SMSG_BATTLEFIELD_PORT_DENIED", LogicalOpcode::SMSG_BATTLEFIELD_PORT_DENIED},

View file

@ -1885,9 +1885,11 @@ network::Packet RequestRaidInfoPacket::build() {
// ============================================================
network::Packet DuelProposedPacket::build(uint64_t targetGuid) {
network::Packet packet(wireOpcode(Opcode::CMSG_DUEL_PROPOSED));
packet.writeUInt64(targetGuid);
LOG_DEBUG("Built CMSG_DUEL_PROPOSED for target: 0x", std::hex, targetGuid, std::dec);
// TODO: Duels are initiated via CMSG_CAST_SPELL with spell 7266,
// not a dedicated CMSG_DUEL_PROPOSED opcode (which doesn't exist in WoW).
// For now, build a cast spell packet targeting the opponent.
auto packet = CastSpellPacket::build(7266, targetGuid, 0);
LOG_DEBUG("Built duel request (spell 7266) for target: 0x", std::hex, targetGuid, std::dec);
return packet;
}