fix(parsing): correct UPDATE_OBJECT PackedGuid, cape textures, and missing asset guards
Some checks failed
Build / Build (arm64) (push) Has been cancelled
Build / Build (x86-64) (push) Has been cancelled
Build / Build (macOS arm64) (push) Has been cancelled
Build / Build (windows-arm64) (push) Has been cancelled
Build / Build (windows-x86-64) (push) Has been cancelled
Security / CodeQL (C/C++) (push) Has been cancelled
Security / Semgrep (push) Has been cancelled
Security / Sanitizer Build (ASan/UBSan) (push) Has been cancelled

- Fix MOVEMENT update type to use readPackedGuid() instead of readUInt64() (WotLK 3.3.5a)
- Add desync diagnostic logging to UPDATE_OBJECT parser for future debugging
- Register MSG_MOVE_SET_COLLISION_HGT (0x518) as skip handler
- Fix cape texture lookup to only try .blp extension variants (4 files)
- Add fileExists() guards for underwear textures referencing missing BLP files (4 files)
- Add spell visual impact→cast M2 path fallback
- Skip WMO doodad instance creation when model load fails
- Demote spell caster position warning to debug level
This commit is contained in:
Kelsi 2026-04-14 06:06:50 -07:00
parent 83eef878fb
commit 01fecbf3e0
9 changed files with 105 additions and 38 deletions

View file

@ -443,11 +443,11 @@ bool CharacterPreview::loadCharacter(game::Race race, game::Gender gender,
variationIndex == 0 && colorIndex == static_cast<uint32_t>(skin)) {
for (uint32_t f = csF.texture1; f <= csF.texture1 + 2; f++) {
std::string tex = charSectionsDbc->getString(r, f);
if (!tex.empty()) {
if (!tex.empty() && assetManager_->fileExists(tex)) {
underwearPaths.push_back(tex);
}
}
foundUnderwear = true;
foundUnderwear = !underwearPaths.empty();
}
}
@ -824,14 +824,15 @@ bool CharacterPreview::applyEquipment(const std::vector<game::EquipmentItem>& eq
bool hasDir = (name.find('\\') != std::string::npos);
bool hasExt = hasBlpExt(name);
if (hasDir) {
addCandidate(name);
if (!hasExt) addCandidate(name + ".blp");
if (hasExt) addCandidate(name);
else addCandidate(name + ".blp");
} else {
std::string baseObj = "Item\\ObjectComponents\\Cape\\" + name;
std::string baseTex = "Item\\TextureComponents\\Cape\\" + name;
addCandidate(baseObj);
addCandidate(baseTex);
if (!hasExt) {
if (hasExt) {
addCandidate(baseObj);
addCandidate(baseTex);
} else {
addCandidate(baseObj + ".blp");
addCandidate(baseTex + ".blp");
}

View file

@ -370,12 +370,15 @@ void SpellVisualSystem::playSpellVisual(uint32_t visualId, const glm::vec3& worl
if (!spellVisualDbcLoaded_) loadSpellVisualDbc();
// Select cast or impact path map
auto& pathMap = useImpactKit ? spellVisualImpactPath_ : spellVisualCastPath_;
auto pathIt = pathMap.find(visualId);
if (pathIt == pathMap.end()) {
LOG_WARNING("SpellVisual: no ", (useImpactKit ? "impact" : "cast"), " path for visualId=", visualId);
return;
// Select cast or impact path map; fall back to the other if missing
auto& primaryMap = useImpactKit ? spellVisualImpactPath_ : spellVisualCastPath_;
auto& fallbackMap = useImpactKit ? spellVisualCastPath_ : spellVisualImpactPath_;
auto pathIt = primaryMap.find(visualId);
if (pathIt == primaryMap.end()) {
pathIt = fallbackMap.find(visualId);
if (pathIt == fallbackMap.end()) {
return;
}
}
const std::string& modelPath = pathIt->second;

View file

@ -1055,7 +1055,12 @@ bool TerrainManager::advanceFinalization(FinalizingTile& ft) {
size_t uploaded = 0;
while (ft.wmoDoodadIndex < pending->wmoDoodads.size() && uploaded < kDoodadsPerStep) {
auto& doodad = pending->wmoDoodads[ft.wmoDoodadIndex];
if (m2Renderer->loadModel(doodad.model, doodad.modelId)) {
if (!m2Renderer->loadModel(doodad.model, doodad.modelId)) {
ft.wmoDoodadIndex++;
uploaded++;
continue;
}
{
std::lock_guard<std::mutex> lock(uploadedM2IdsMutex_);
uploadedM2Ids_.insert(doodad.modelId);
}