From f63b75c388bc57a3c49907c1e3d2e98604e4b78a Mon Sep 17 00:00:00 2001 From: Kelsi Date: Mon, 9 Mar 2026 22:39:08 -0700 Subject: [PATCH] tbc/classic: fix SMSG_RAID_INSTANCE_INFO format (uint32 resetTime, no extended) TBC 2.4.3 and Classic 1.12 send resetTime as uint32 (seconds) with no extended byte, while WotLK 3.3.5a sends uint64 timestamp + extended byte. Parse the correct field widths based on expansion to prevent corrupted instance lockout data on TBC/Classic realms. --- src/game/game_handler.cpp | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 6eced5fe..644f7f09 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -11161,23 +11161,33 @@ void GameHandler::acceptBattlefield(uint32_t queueSlot) { } void GameHandler::handleRaidInstanceInfo(network::Packet& packet) { - // SMSG_RAID_INSTANCE_INFO: uint32 count, then for each: - // mapId(u32) + difficulty(u32) + resetTime(u64) + locked(u8) + extended(u8) + // TBC 2.4.3 format: mapId(4) + difficulty(4) + resetTime(4 — uint32 seconds) + locked(1) + // WotLK 3.3.5a format: mapId(4) + difficulty(4) + resetTime(8 — uint64 timestamp) + locked(1) + extended(1) + const bool isTbc = isActiveExpansion("tbc"); + const bool isClassic = isClassicLikeExpansion(); + const bool useTbcFormat = isTbc || isClassic; + if (packet.getSize() - packet.getReadPos() < 4) return; uint32_t count = packet.readUInt32(); instanceLockouts_.clear(); instanceLockouts_.reserve(count); - constexpr size_t kEntrySize = 4 + 4 + 8 + 1 + 1; + const size_t kEntrySize = useTbcFormat ? (4 + 4 + 4 + 1) : (4 + 4 + 8 + 1 + 1); for (uint32_t i = 0; i < count; ++i) { if (packet.getSize() - packet.getReadPos() < kEntrySize) break; InstanceLockout lo; lo.mapId = packet.readUInt32(); lo.difficulty = packet.readUInt32(); - lo.resetTime = packet.readUInt64(); - lo.locked = packet.readUInt8() != 0; - lo.extended = packet.readUInt8() != 0; + if (useTbcFormat) { + lo.resetTime = packet.readUInt32(); // TBC/Classic: 4-byte seconds + lo.locked = packet.readUInt8() != 0; + lo.extended = false; + } else { + lo.resetTime = packet.readUInt64(); // WotLK: 8-byte timestamp + lo.locked = packet.readUInt8() != 0; + lo.extended = packet.readUInt8() != 0; + } instanceLockouts_.push_back(lo); LOG_INFO("Instance lockout: mapId=", lo.mapId, " diff=", lo.difficulty, " reset=", lo.resetTime, " locked=", lo.locked, " extended=", lo.extended);