Handle SMSG_GAMEOBJECT_CUSTOM_ANIM to unfreeze gameobjects on use

When the server sends a custom animation packet (e.g. chest being
opened), unfreeze the M2 instance so it plays its open animation.
This commit is contained in:
Kelsi 2026-02-23 05:39:02 -08:00
parent 58681753e5
commit 639df4815e
3 changed files with 26 additions and 0 deletions

View file

@ -1548,6 +1548,18 @@ void Application::setupUICallbacks() {
despawnOnlineGameObject(guid);
});
// GameObject custom animation callback (e.g. chest opening)
gameHandler->setGameObjectCustomAnimCallback([this](uint64_t guid, uint32_t /*animId*/) {
auto it = gameObjectInstances_.find(guid);
if (it == gameObjectInstances_.end() || !renderer) return;
auto& info = it->second;
if (!info.isWmo) {
if (auto* m2r = renderer->getM2Renderer()) {
m2r->setInstanceAnimationFrozen(info.instanceId, false);
}
}
});
// Charge callback — warrior rushes toward target
gameHandler->setChargeCallback([this](uint64_t targetGuid, float tx, float ty, float tz) {
if (!renderer || !renderer->getCameraController() || !gameHandler) return;

View file

@ -2259,6 +2259,16 @@ void GameHandler::handlePacket(network::Packet& packet) {
case Opcode::SMSG_GAMEOBJECT_PAGETEXT:
handleGameObjectPageText(packet);
break;
case Opcode::SMSG_GAMEOBJECT_CUSTOM_ANIM: {
if (packet.getSize() >= 12) {
uint64_t guid = packet.readUInt64();
uint32_t animId = packet.readUInt32();
if (gameObjectCustomAnimCallback_) {
gameObjectCustomAnimCallback_(guid, animId);
}
}
break;
}
case Opcode::SMSG_PAGE_TEXT_QUERY_RESPONSE:
handlePageTextQueryResponse(packet);
break;