mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-14 08:23:52 +00:00
fix(parsing): bail on suspicious maskBlockCount in CREATE_OBJECT blocks
When spline parsing consumes the wrong number of bytes, the subsequent blockCount read lands on garbage data (e.g. 71 instead of ~5 for UNIT). Previously the parser logged a warning but continued, reading garbage mask/field data until hitting truncation. Now it returns false for CREATE_OBJECT blocks with suspicious counts, letting the block loop skip cleanly to the next entity. Also downgrade ~44 diagnostic LOG_WARNING messages to LOG_DEBUG across 17 files (equipment, transport, DBC, heartbeat, chat, GO raypick, etc.) to reduce log noise and make real warnings visible.
This commit is contained in:
parent
e32f4fbff9
commit
069dd36698
18 changed files with 46 additions and 43 deletions
|
|
@ -41,7 +41,7 @@ void EntitySpawnCallbackHandler::setupCallbacks() {
|
|||
uint32_t appearanceBytes,
|
||||
uint8_t facialFeatures,
|
||||
float x, float y, float z, float orientation) {
|
||||
LOG_WARNING("playerSpawnCallback: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("playerSpawnCallback: guid=0x", std::hex, guid, std::dec,
|
||||
" race=", static_cast<int>(raceId), " gender=", static_cast<int>(genderId),
|
||||
" pos=(", x, ",", y, ",", z, ")");
|
||||
// Skip local player — already spawned as the main character
|
||||
|
|
|
|||
|
|
@ -544,7 +544,7 @@ void EntitySpawner::buildCreatureDisplayLookups() {
|
|||
if (!extra.bakeName.empty()) withBakeName++;
|
||||
humanoidExtraMap_[cdie->getUInt32(i, cdieL ? (*cdieL)["ID"] : 0)] = extra;
|
||||
}
|
||||
LOG_WARNING("Loaded ", humanoidExtraMap_.size(), " humanoid display extra entries (",
|
||||
LOG_DEBUG("Loaded ", humanoidExtraMap_.size(), " humanoid display extra entries (",
|
||||
withBakeName, " with baked textures, ", numEquipSlots, " equip slots, ",
|
||||
dbcFieldCount, " DBC fields, bakeField=", bakeField, ")");
|
||||
}
|
||||
|
|
|
|||
|
|
@ -340,14 +340,14 @@ void EntitySpawner::setOnlinePlayerEquipment(uint64_t guid,
|
|||
if (st.instanceId == 0 || st.modelId == 0) return;
|
||||
|
||||
if (st.bodySkinPath.empty()) {
|
||||
LOG_WARNING("setOnlinePlayerEquipment: bodySkinPath empty for guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("setOnlinePlayerEquipment: bodySkinPath empty for guid=0x", std::hex, guid, std::dec,
|
||||
" instanceId=", st.instanceId, " — skipping equipment");
|
||||
return;
|
||||
}
|
||||
|
||||
int nonZeroDisplay = 0;
|
||||
for (uint32_t d : displayInfoIds) if (d != 0) nonZeroDisplay++;
|
||||
LOG_WARNING("setOnlinePlayerEquipment: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("setOnlinePlayerEquipment: guid=0x", std::hex, guid, std::dec,
|
||||
" instanceId=", st.instanceId, " nonZeroDisplayIds=", nonZeroDisplay,
|
||||
" head=", displayInfoIds[0], " chest=", displayInfoIds[4],
|
||||
" legs=", displayInfoIds[6], " mainhand=", displayInfoIds[15]);
|
||||
|
|
@ -1099,7 +1099,7 @@ void EntitySpawner::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_
|
|||
// (e.g. elevators/lifts). If the server marks it as a transport, always
|
||||
// notify so TransportManager can animate/carry passengers.
|
||||
bool isTG = gameHandler_ && gameHandler_->isTransportGuid(guid);
|
||||
LOG_WARNING("WMO GO spawned: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("WMO GO spawned: guid=0x", std::hex, guid, std::dec,
|
||||
" entry=", entry, " displayId=", displayId,
|
||||
" isTransport=", isTG,
|
||||
" pos=(", x, ", ", y, ", ", z, ")");
|
||||
|
|
@ -1215,7 +1215,7 @@ void EntitySpawner::spawnOnlineGameObject(uint64_t guid, uint32_t entry, uint32_
|
|||
|
||||
// Notify transport system for M2 transports (e.g. Deeprun Tram cars)
|
||||
if (gameHandler_ && gameHandler_->isTransportGuid(guid)) {
|
||||
LOG_WARNING("M2 transport spawned: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("M2 transport spawned: guid=0x", std::hex, guid, std::dec,
|
||||
" entry=", entry, " displayId=", displayId,
|
||||
" instanceId=", instanceId);
|
||||
gameHandler_->notifyTransportSpawned(guid, entry, displayId, x, y, z, orientation);
|
||||
|
|
|
|||
|
|
@ -722,7 +722,7 @@ void EntitySpawner::processDeferredEquipmentQueue() {
|
|||
setOnlinePlayerEquipment(guid, equipData.first, equipData.second);
|
||||
return;
|
||||
}
|
||||
LOG_WARNING("Equipment async pre-decode for guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("Equipment async pre-decode for guid=0x", std::hex, guid, std::dec,
|
||||
" textures=", texturePaths.size());
|
||||
|
||||
// Launch background BLP pre-decode
|
||||
|
|
@ -991,7 +991,7 @@ void EntitySpawner::processPendingTransportRegistrations() {
|
|||
}
|
||||
|
||||
const uint32_t wmoInstanceId = goIt->second.instanceId;
|
||||
LOG_WARNING("Registering server transport: GUID=0x", std::hex, pending.guid, std::dec,
|
||||
LOG_DEBUG("Registering server transport: GUID=0x", std::hex, pending.guid, std::dec,
|
||||
" entry=", pending.entry, " displayId=", pending.displayId, " wmoInstance=", wmoInstanceId,
|
||||
" pos=(", pending.x, ", ", pending.y, ", ", pending.z, ")");
|
||||
|
||||
|
|
@ -1015,17 +1015,17 @@ void EntitySpawner::processPendingTransportRegistrations() {
|
|||
hasUsablePath = transportManager->hasUsableMovingPathForEntry(pending.entry, 25.0f);
|
||||
}
|
||||
|
||||
LOG_WARNING("Transport path check: entry=", pending.entry, " hasUsablePath=", hasUsablePath,
|
||||
LOG_DEBUG("Transport path check: entry=", pending.entry, " hasUsablePath=", hasUsablePath,
|
||||
" preferServerData=", preferServerData, " shipOrZepDisplay=", shipOrZeppelinDisplay);
|
||||
|
||||
if (preferServerData) {
|
||||
if (!hasUsablePath) {
|
||||
std::vector<glm::vec3> path = { canonicalSpawnPos };
|
||||
transportManager->loadPathFromNodes(pathId, path, false, 0.0f);
|
||||
LOG_WARNING("Server-first strict registration: stationary fallback for GUID 0x",
|
||||
LOG_DEBUG("Server-first strict registration: stationary fallback for GUID 0x",
|
||||
std::hex, pending.guid, std::dec, " entry=", pending.entry);
|
||||
} else {
|
||||
LOG_WARNING("Server-first transport registration: using entry DBC path for entry ", pending.entry);
|
||||
LOG_DEBUG("Server-first transport registration: using entry DBC path for entry ", pending.entry);
|
||||
}
|
||||
} else if (!hasUsablePath) {
|
||||
bool allowZOnly = (pending.displayId == 455 || pending.displayId == 462);
|
||||
|
|
@ -1087,7 +1087,7 @@ void EntitySpawner::processPendingTransportRegistrations() {
|
|||
}
|
||||
|
||||
if (auto* tr = transportManager->getTransport(pending.guid); tr) {
|
||||
LOG_WARNING("Transport registered: guid=0x", std::hex, pending.guid, std::dec,
|
||||
LOG_DEBUG("Transport registered: guid=0x", std::hex, pending.guid, std::dec,
|
||||
" entry=", pending.entry, " displayId=", pending.displayId,
|
||||
" pathId=", tr->pathId,
|
||||
" mode=", (tr->useClientAnimation ? "client" : "server"),
|
||||
|
|
|
|||
|
|
@ -228,7 +228,7 @@ void WorldEntryCallbackHandler::setupCallbacks() {
|
|||
// drives `gameHandler->update()` during warmup. Queue the load here so
|
||||
// it runs after the current packet handler returns instead of recursing
|
||||
// from `SMSG_LOGIN_VERIFY_WORLD` / `SMSG_NEW_WORLD`.
|
||||
LOG_WARNING("Queued world entry: map ", mapId, " pos=(", x, ", ", y, ", ", z, ")");
|
||||
LOG_DEBUG("Queued world entry: map ", mapId, " pos=(", x, ", ", y, ", ", z, ")");
|
||||
if (worldLoader_) worldLoader_->setPendingEntry(mapId, x, y, z);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -174,7 +174,7 @@ void WorldLoader::processPendingEntry() {
|
|||
if (!pendingWorldEntry_ || loadingWorld_) return;
|
||||
auto entry = *pendingWorldEntry_;
|
||||
pendingWorldEntry_.reset();
|
||||
LOG_WARNING("Processing deferred world entry: map ", entry.mapId);
|
||||
LOG_DEBUG("Processing deferred world entry: map ", entry.mapId);
|
||||
if (app_.worldEntryCallbacks_) {
|
||||
app_.worldEntryCallbacks_->setWorldEntryMovementGraceTimer(2.0f);
|
||||
app_.worldEntryCallbacks_->setTaxiLandingClampTimer(0.0f);
|
||||
|
|
@ -250,7 +250,7 @@ void WorldLoader::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
|
||||
// --- Clean up previous map's state on map change ---
|
||||
// (Same cleanup as logout, but preserves player identity and renderer objects.)
|
||||
LOG_WARNING("loadOnlineWorldTerrain: mapId=", mapId, " loadedMapId_=", loadedMapId_);
|
||||
LOG_DEBUG("loadOnlineWorldTerrain: mapId=", mapId, " loadedMapId_=", loadedMapId_);
|
||||
bool hasRendererData = renderer_ && (renderer_->getWMORenderer() || renderer_->getM2Renderer());
|
||||
if (loadedMapId_ != 0xFFFFFFFF || hasRendererData) {
|
||||
LOG_WARNING("Map change: cleaning up old map ", loadedMapId_, " before loading map ", mapId);
|
||||
|
|
@ -448,12 +448,12 @@ void WorldLoader::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
pipeline::WDTInfo wdtInfo;
|
||||
{
|
||||
std::string wdtPath = "World\\Maps\\" + mapName + "\\" + mapName + ".wdt";
|
||||
LOG_WARNING("Reading WDT: ", wdtPath);
|
||||
LOG_DEBUG("Reading WDT: ", wdtPath);
|
||||
std::vector<uint8_t> wdtData = assetManager_->readFile(wdtPath);
|
||||
if (!wdtData.empty()) {
|
||||
wdtInfo = pipeline::parseWDT(wdtData);
|
||||
isWMOOnlyMap = wdtInfo.isWMOOnly() && !wdtInfo.rootWMOPath.empty();
|
||||
LOG_WARNING("WDT result: isWMOOnly=", isWMOOnlyMap, " rootWMO='", wdtInfo.rootWMOPath, "'");
|
||||
LOG_DEBUG("WDT result: isWMOOnly=", isWMOOnlyMap, " rootWMO='", wdtInfo.rootWMOPath, "'");
|
||||
} else {
|
||||
LOG_WARNING("No WDT file found at ", wdtPath);
|
||||
}
|
||||
|
|
@ -954,7 +954,7 @@ void WorldLoader::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
// If a new world entry was deferred during packet processing,
|
||||
// stop warming up this map — we'll load the new one after cleanup.
|
||||
if (pendingWorldEntry_) {
|
||||
LOG_WARNING("loadOnlineWorldTerrain(map ", mapId,
|
||||
LOG_DEBUG("loadOnlineWorldTerrain(map ", mapId,
|
||||
") — deferred world entry pending, stopping warmup");
|
||||
break;
|
||||
}
|
||||
|
|
@ -1021,7 +1021,7 @@ void WorldLoader::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
if (auto* tm = renderer_->getTerrainManager()) {
|
||||
if (tm->getLoadedTileCount() >= 4) {
|
||||
groundReady = true;
|
||||
LOG_WARNING("Warmup: using tile-count fallback (", tm->getLoadedTileCount(), " tiles) after ", elapsed, "s");
|
||||
LOG_DEBUG("Warmup: using tile-count fallback (", tm->getLoadedTileCount(), " tiles) after ", elapsed, "s");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -1078,7 +1078,7 @@ void WorldLoader::loadOnlineWorldTerrain(uint32_t mapId, float x, float y, float
|
|||
if (pendingWorldEntry_) {
|
||||
auto entry = *pendingWorldEntry_;
|
||||
pendingWorldEntry_.reset();
|
||||
LOG_WARNING("Processing deferred world entry: map ", entry.mapId);
|
||||
LOG_DEBUG("Processing deferred world entry: map ", entry.mapId);
|
||||
if (app_.worldEntryCallbacks_) {
|
||||
app_.worldEntryCallbacks_->setWorldEntryMovementGraceTimer(2.0f);
|
||||
app_.worldEntryCallbacks_->setTaxiLandingClampTimer(0.0f);
|
||||
|
|
|
|||
|
|
@ -191,7 +191,7 @@ void ChatHandler::handleMessageChat(network::Packet& packet) {
|
|||
LOG_WARNING("Failed to parse SMSG_MESSAGECHAT, size=", packet.getSize());
|
||||
return;
|
||||
}
|
||||
LOG_WARNING("INCOMING CHAT: type=", static_cast<int>(data.type),
|
||||
LOG_DEBUG("INCOMING CHAT: type=", static_cast<int>(data.type),
|
||||
" (", getChatTypeString(data.type), ") sender=0x", std::hex, data.senderGuid, std::dec,
|
||||
" '", data.senderName, "' msg='", data.message.substr(0, 60), "'");
|
||||
|
||||
|
|
|
|||
|
|
@ -985,7 +985,7 @@ bool EntityController::applyPlayerStatFields(const std::map<uint16_t, uint32_t>&
|
|||
// 0 = not resting, 1 = REST_TYPE_IN_TAVERN, 2 = REST_TYPE_IN_CITY
|
||||
uint8_t restStateByte = static_cast<uint8_t>((val >> 24) & 0xFF);
|
||||
if (isCreate) {
|
||||
LOG_WARNING("PLAYER_BYTES_2 (CREATE): raw=0x", std::hex, val, std::dec,
|
||||
LOG_DEBUG("PLAYER_BYTES_2 (CREATE): raw=0x", std::hex, val, std::dec,
|
||||
" bankBagSlots=", static_cast<int>(bankBagSlots));
|
||||
bool wasResting = owner_.isRestingRef();
|
||||
owner_.isRestingRef() = (restStateByte != 0);
|
||||
|
|
|
|||
|
|
@ -133,7 +133,7 @@ void GameHandler::sendAuthSession() {
|
|||
}
|
||||
|
||||
void GameHandler::handleAuthResponse(network::Packet& packet) {
|
||||
LOG_WARNING("Handling SMSG_AUTH_RESPONSE, size=", packet.getSize());
|
||||
LOG_DEBUG("Handling SMSG_AUTH_RESPONSE, size=", packet.getSize());
|
||||
|
||||
AuthResponseData response;
|
||||
if (!AuthResponseParser::parse(packet, response)) {
|
||||
|
|
@ -1940,12 +1940,12 @@ void GameHandler::interactWithNpc(uint64_t guid) {
|
|||
}
|
||||
|
||||
void GameHandler::interactWithGameObject(uint64_t guid) {
|
||||
LOG_WARNING("[GO-DIAG] interactWithGameObject called: guid=0x", std::hex, guid, std::dec);
|
||||
if (guid == 0) { LOG_WARNING("[GO-DIAG] BLOCKED: guid==0"); return; }
|
||||
if (!isInWorld()) { LOG_WARNING("[GO-DIAG] BLOCKED: not in world"); return; }
|
||||
LOG_DEBUG("[GO-DIAG] interactWithGameObject called: guid=0x", std::hex, guid, std::dec);
|
||||
if (guid == 0) { LOG_DEBUG("[GO-DIAG] BLOCKED: guid==0"); return; }
|
||||
if (!isInWorld()) { LOG_DEBUG("[GO-DIAG] BLOCKED: not in world"); return; }
|
||||
// Do not overlap an actual spell cast.
|
||||
if (spellHandler_ && spellHandler_->isCasting() && spellHandler_->getCurrentCastSpellId() != 0) {
|
||||
LOG_WARNING("[GO-DIAG] BLOCKED: already casting spellId=", spellHandler_->getCurrentCastSpellId());
|
||||
LOG_DEBUG("[GO-DIAG] BLOCKED: already casting spellId=", spellHandler_->getCurrentCastSpellId());
|
||||
return;
|
||||
}
|
||||
// Always clear melee intent before GO interactions.
|
||||
|
|
|
|||
|
|
@ -2775,7 +2775,7 @@ void GameHandler::handlePacket(network::Packet& packet) {
|
|||
++wardenPacketsAfterGate_;
|
||||
}
|
||||
if (preLogicalOp && isAuthCharPipelineOpcode(*preLogicalOp)) {
|
||||
LOG_WARNING("AUTH/CHAR RX opcode=0x", std::hex, opcode, std::dec,
|
||||
LOG_DEBUG("AUTH/CHAR RX opcode=0x", std::hex, opcode, std::dec,
|
||||
" logical=", static_cast<uint32_t>(*preLogicalOp),
|
||||
" state=", worldStateName(state),
|
||||
" size=", packet.getSize());
|
||||
|
|
|
|||
|
|
@ -2483,7 +2483,7 @@ void InventoryHandler::handleItemQueryResponse(network::Packet& packet) {
|
|||
}
|
||||
}
|
||||
if (reemitCount > 0) {
|
||||
LOG_WARNING("Re-emitted equipment for ", reemitCount, " players after resolving entry=", resolvedEntry);
|
||||
LOG_DEBUG("Re-emitted equipment for ", reemitCount, " players after resolving entry=", resolvedEntry);
|
||||
}
|
||||
// Same for inspect-based entries
|
||||
if (owner_.playerEquipmentCallbackRef()) {
|
||||
|
|
@ -3117,11 +3117,11 @@ void InventoryHandler::updateOtherPlayerVisibleItems(uint64_t guid, const std::m
|
|||
dump += buf;
|
||||
}
|
||||
}
|
||||
LOG_WARNING("RAW FIELDS 270-340:", dump);
|
||||
LOG_DEBUG("RAW FIELDS 270-340:", dump);
|
||||
}
|
||||
|
||||
if (nonZero > 0) {
|
||||
LOG_WARNING("updateOtherPlayerVisibleItems: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("updateOtherPlayerVisibleItems: guid=0x", std::hex, guid, std::dec,
|
||||
" nonZero=", nonZero, " base=", base, " stride=", stride,
|
||||
" head=", newEntries[0], " shoulders=", newEntries[2],
|
||||
" chest=", newEntries[4], " legs=", newEntries[6],
|
||||
|
|
@ -3182,7 +3182,7 @@ void InventoryHandler::emitOtherPlayerEquipment(uint64_t guid) {
|
|||
resolved++;
|
||||
}
|
||||
|
||||
LOG_WARNING("emitOtherPlayerEquipment: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("emitOtherPlayerEquipment: guid=0x", std::hex, guid, std::dec,
|
||||
" entries=", (anyEntry ? "yes" : "none"),
|
||||
" resolved=", resolved, " unresolved=", unresolved,
|
||||
" head=", displayIds[0], " shoulders=", displayIds[2],
|
||||
|
|
@ -3192,7 +3192,7 @@ void InventoryHandler::emitOtherPlayerEquipment(uint64_t guid) {
|
|||
// Don't emit all-zero displayIds — that strips existing equipment for no reason.
|
||||
// Wait until at least one item resolves before applying.
|
||||
if (anyEntry && resolved == 0) {
|
||||
LOG_WARNING("emitOtherPlayerEquipment: skipping all-zero emit (waiting for item queries)");
|
||||
LOG_DEBUG("emitOtherPlayerEquipment: skipping all-zero emit (waiting for item queries)");
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -632,7 +632,7 @@ void MovementHandler::sendMovement(Opcode opcode) {
|
|||
|
||||
// Periodic position audit — log every ~60 heartbeats (~30s) to trace position drift.
|
||||
if (opcode == Opcode::MSG_MOVE_HEARTBEAT && ++heartbeatLogCount_ % 60 == 0) {
|
||||
LOG_WARNING("HEARTBEAT #", heartbeatLogCount_, " canonical=(",
|
||||
LOG_DEBUG("HEARTBEAT #", heartbeatLogCount_, " canonical=(",
|
||||
movementInfo.x, ",", movementInfo.y, ",", movementInfo.z,
|
||||
") server=(", wireInfo.x, ",", wireInfo.y, ",", wireInfo.z,
|
||||
") flags=0x", std::hex, movementInfo.flags, std::dec);
|
||||
|
|
@ -2551,7 +2551,7 @@ void MovementHandler::loadAreaTriggerDbc() {
|
|||
owner_.areaTriggersRef().push_back(at);
|
||||
}
|
||||
|
||||
LOG_WARNING("Loaded ", owner_.areaTriggersRef().size(), " area triggers from AreaTrigger.dbc");
|
||||
LOG_DEBUG("Loaded ", owner_.areaTriggersRef().size(), " area triggers from AreaTrigger.dbc");
|
||||
}
|
||||
|
||||
void MovementHandler::checkAreaTriggers() {
|
||||
|
|
|
|||
|
|
@ -979,7 +979,7 @@ void SpellHandler::handleSpellGo(network::Packet& packet) {
|
|||
}
|
||||
}
|
||||
|
||||
LOG_WARNING("[GO-DIAG] SPELL_GO: spellId=", data.spellId,
|
||||
LOG_DEBUG("[GO-DIAG] SPELL_GO: spellId=", data.spellId,
|
||||
" casting=", casting_, " currentCast=", currentCastSpellId_,
|
||||
" wasInTimedCast=", wasInTimedCast,
|
||||
" lastGoGuid=0x", std::hex, owner_.lastInteractedGoGuidRef(),
|
||||
|
|
@ -992,7 +992,7 @@ void SpellHandler::handleSpellGo(network::Packet& packet) {
|
|||
|
||||
// Gather node looting: re-send CMSG_LOOT now that the cast completed.
|
||||
if (wasInTimedCast && owner_.lastInteractedGoGuidRef() != 0) {
|
||||
LOG_WARNING("[GO-DIAG] Sending CMSG_LOOT for GO 0x", std::hex,
|
||||
LOG_DEBUG("[GO-DIAG] Sending CMSG_LOOT for GO 0x", std::hex,
|
||||
owner_.lastInteractedGoGuidRef(), std::dec);
|
||||
owner_.lootTarget(owner_.lastInteractedGoGuidRef());
|
||||
owner_.lastInteractedGoGuidRef() = 0;
|
||||
|
|
|
|||
|
|
@ -887,7 +887,7 @@ bool TransportManager::loadTransportAnimationDBC(pipeline::AssetManager* assetMg
|
|||
if (transportEntry >= 176080 && transportEntry <= 176085) {
|
||||
size_t mid = sortedWaypoints.size() / 4; // ~quarter through
|
||||
size_t mid2 = sortedWaypoints.size() / 2; // ~halfway
|
||||
LOG_WARNING("DBC path entry=", transportEntry, " nPts=", sortedWaypoints.size(),
|
||||
LOG_DEBUG("DBC path entry=", transportEntry, " nPts=", sortedWaypoints.size(),
|
||||
" [0] t=", sortedWaypoints[0].first, " raw=(", sortedWaypoints[0].second.x, ",", sortedWaypoints[0].second.y, ",", sortedWaypoints[0].second.z, ")",
|
||||
" [", mid, "] t=", sortedWaypoints[mid].first, " raw=(", sortedWaypoints[mid].second.x, ",", sortedWaypoints[mid].second.y, ",", sortedWaypoints[mid].second.z, ")",
|
||||
" [", mid2, "] t=", sortedWaypoints[mid2].first, " raw=(", sortedWaypoints[mid2].second.x, ",", sortedWaypoints[mid2].second.y, ",", sortedWaypoints[mid2].second.z, ")");
|
||||
|
|
|
|||
|
|
@ -1201,6 +1201,9 @@ bool UpdateObjectParser::parseUpdateFields(network::Packet& packet, UpdateBlock&
|
|||
" updateFlags=0x", std::hex, block.updateFlags, std::dec,
|
||||
" moveFlags=0x", std::hex, block.moveFlags, std::dec,
|
||||
" readPos=", packet.getReadPos(), " size=", packet.getSize());
|
||||
// Movement data likely consumed wrong number of bytes, causing blockCount
|
||||
// to be read from a misaligned position. Bail out rather than reading garbage.
|
||||
if (isCreateBlock) return false;
|
||||
}
|
||||
|
||||
uint32_t fieldsCapacity = blockCount * 32;
|
||||
|
|
|
|||
|
|
@ -101,7 +101,7 @@ WDTInfo parseWDT(const std::vector<uint8_t>& data) {
|
|||
offset += 8 + chunkSize;
|
||||
}
|
||||
|
||||
LOG_WARNING("WDT parse result: mphdFlags=0x", std::hex, info.mphdFlags, std::dec,
|
||||
LOG_DEBUG("WDT parse result: mphdFlags=0x", std::hex, info.mphdFlags, std::dec,
|
||||
" isWMOOnly=", info.isWMOOnly(),
|
||||
" rootWMO='", info.rootWMOPath, "'");
|
||||
|
||||
|
|
|
|||
|
|
@ -2368,7 +2368,7 @@ void CharacterRenderer::render(VkCommandBuffer cmd, VkDescriptorSet perFrameSet,
|
|||
uint16_t bg = static_cast<uint16_t>(b.submeshId / 100);
|
||||
bool active = instance.activeGeosets.empty() ||
|
||||
instance.activeGeosets.count(b.submeshId);
|
||||
LOG_WARNING("BATCH DIAG: submesh=", b.submeshId, " group=", bg,
|
||||
LOG_DEBUG("BATCH DIAG: submesh=", b.submeshId, " group=", bg,
|
||||
" blend=", bm, " matFlags=0x", std::hex, mf, std::dec,
|
||||
" texIdx=", b.textureIndex, " matIdx=", b.materialIndex,
|
||||
" active=", active);
|
||||
|
|
|
|||
|
|
@ -1243,7 +1243,7 @@ void GameScreen::processTargetInput(game::GameHandler& gameHandler) {
|
|||
if (gameHandler.hasTarget()) {
|
||||
auto target = gameHandler.getTarget();
|
||||
if (target && target->getType() == game::ObjectType::GAMEOBJECT) {
|
||||
LOG_WARNING("[GO-DIAG] Right-click: re-interacting with targeted GO 0x",
|
||||
LOG_DEBUG("[GO-DIAG] Right-click: re-interacting with targeted GO 0x",
|
||||
std::hex, target->getGuid(), std::dec);
|
||||
gameHandler.setTarget(target->getGuid());
|
||||
gameHandler.interactWithGameObject(target->getGuid());
|
||||
|
|
@ -1322,7 +1322,7 @@ void GameScreen::processTargetInput(game::GameHandler& gameHandler) {
|
|||
static std::unordered_set<uint64_t> goPickLog;
|
||||
if (goPickLog.insert(guid).second) {
|
||||
auto go = std::static_pointer_cast<game::GameObject>(entity);
|
||||
LOG_WARNING("[GO-DIAG] Raypick GO: guid=0x", std::hex, guid, std::dec,
|
||||
LOG_DEBUG("[GO-DIAG] Raypick GO: guid=0x", std::hex, guid, std::dec,
|
||||
" entry=", go->getEntry(), " name='", go->getName(),
|
||||
"' pos=(", entity->getX(), ",", entity->getY(), ",", entity->getZ(),
|
||||
") center=(", hitCenter.x, ",", hitCenter.y, ",", hitCenter.z,
|
||||
|
|
@ -1389,7 +1389,7 @@ void GameScreen::processTargetInput(game::GameHandler& gameHandler) {
|
|||
|
||||
if (closestGuid != 0) {
|
||||
if (closestType == game::ObjectType::GAMEOBJECT) {
|
||||
LOG_WARNING("[GO-DIAG] Right-click: raypick hit GO 0x",
|
||||
LOG_DEBUG("[GO-DIAG] Right-click: raypick hit GO 0x",
|
||||
std::hex, closestGuid, std::dec);
|
||||
gameHandler.setTarget(closestGuid);
|
||||
gameHandler.interactWithGameObject(closestGuid);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue