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

@ -228,11 +228,23 @@ void EntitySpawner::spawnOnlinePlayer(uint64_t guid,
hairTexturePath = charSectionsDbc->getString(r, csF.texture1);
if (!hairTexturePath.empty()) foundHair = true;
} else if (baseSection == 4 && !foundUnderwear && colorIndex == skinId) {
// Verify textures exist — some DBC entries reference BLPs
// that were never shipped (e.g. Draenei skin colors 10-16).
bool allExist = true;
std::vector<std::string> candidateUW;
for (uint32_t f = csF.texture1; f <= csF.texture1 + 2; f++) {
std::string tex = charSectionsDbc->getString(r, f);
if (!tex.empty()) underwearPaths.push_back(tex);
if (!tex.empty()) {
if (assetManager_->fileExists(tex))
candidateUW.push_back(tex);
else
allExist = false;
}
}
if (allExist || !candidateUW.empty()) {
underwearPaths = std::move(candidateUW);
foundUnderwear = true;
}
foundUnderwear = true;
} else if (baseSection == 1 && !foundFaceLower &&
variationIndex == faceId && colorIndex == skinId) {
std::string tex1 = charSectionsDbc->getString(r, csF.texture1);
@ -694,14 +706,15 @@ void EntitySpawner::setOnlinePlayerEquipment(uint64_t guid,
};
if (hasDir) {
addCapeCandidate(capeName);
if (!hasExt) addCapeCandidate(capeName + ".blp");
if (hasExt) addCapeCandidate(capeName);
else addCapeCandidate(capeName + ".blp");
} else {
std::string baseObj = "Item\\ObjectComponents\\Cape\\" + capeName;
std::string baseTex = "Item\\TextureComponents\\Cape\\" + capeName;
addCapeCandidate(baseObj);
addCapeCandidate(baseTex);
if (!hasExt) {
if (hasExt) {
addCapeCandidate(baseObj);
addCapeCandidate(baseTex);
} else {
addCapeCandidate(baseObj + ".blp");
addCapeCandidate(baseTex + ".blp");
}