mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-03-23 07:40:14 +00:00
Fix creature render desync and corpse/loot state edge cases
- add per-frame nearby creature render sync from entity positions/orientation to prevent model-vs-target-circle drift - treat lootable dynflag as dead state hint for unit spawn/deferred-display paths - fire NPC death callback when a late display spawn is already dead/lootable - remove loot-response money fallback announce/SFX to stop duplicate copper messages on re-opened corpses
This commit is contained in:
parent
c00fc34bc2
commit
d3b04640f3
2 changed files with 38 additions and 22 deletions
|
|
@ -823,6 +823,35 @@ void Application::update(float deltaTime) {
|
|||
}
|
||||
}
|
||||
|
||||
// Keep creature render instances aligned with authoritative entity positions.
|
||||
// This prevents desync where target circles move with server entities but
|
||||
// creature models remain at stale spawn positions.
|
||||
if (renderer && gameHandler && renderer->getCharacterRenderer()) {
|
||||
auto* charRenderer = renderer->getCharacterRenderer();
|
||||
glm::vec3 playerPos(0.0f);
|
||||
bool havePlayerPos = false;
|
||||
if (auto playerEntity = gameHandler->getEntityManager().getEntity(gameHandler->getPlayerGuid())) {
|
||||
playerPos = glm::vec3(playerEntity->getX(), playerEntity->getY(), playerEntity->getZ());
|
||||
havePlayerPos = true;
|
||||
}
|
||||
const float syncRadiusSq = 320.0f * 320.0f;
|
||||
for (const auto& [guid, instanceId] : creatureInstances_) {
|
||||
auto entity = gameHandler->getEntityManager().getEntity(guid);
|
||||
if (!entity || entity->getType() != game::ObjectType::UNIT) continue;
|
||||
|
||||
glm::vec3 canonical(entity->getX(), entity->getY(), entity->getZ());
|
||||
if (havePlayerPos) {
|
||||
glm::vec3 d = canonical - playerPos;
|
||||
if (glm::dot(d, d) > syncRadiusSq) continue;
|
||||
}
|
||||
|
||||
glm::vec3 renderPos = core::coords::canonicalToRender(canonical);
|
||||
charRenderer->setInstancePosition(instanceId, renderPos);
|
||||
float renderYaw = entity->getOrientation() + glm::radians(90.0f);
|
||||
charRenderer->setInstanceRotation(instanceId, glm::vec3(0.0f, 0.0f, renderYaw));
|
||||
}
|
||||
}
|
||||
|
||||
// Movement heartbeat is sent from GameHandler::update() to avoid
|
||||
// duplicate packets from multiple update loops.
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue