diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index ad993511..d0364020 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -593,6 +593,9 @@ public: using GameObjectDespawnCallback = std::function; void setGameObjectDespawnCallback(GameObjectDespawnCallback cb) { gameObjectDespawnCallback_ = std::move(cb); } + using GameObjectCustomAnimCallback = std::function; + void setGameObjectCustomAnimCallback(GameObjectCustomAnimCallback cb) { gameObjectCustomAnimCallback_ = std::move(cb); } + // Faction hostility map (populated from FactionTemplate.dbc by Application) void setFactionHostileMap(std::unordered_map map) { factionHostileMap_ = std::move(map); } @@ -1401,6 +1404,7 @@ private: GameObjectSpawnCallback gameObjectSpawnCallback_; GameObjectMoveCallback gameObjectMoveCallback_; GameObjectDespawnCallback gameObjectDespawnCallback_; + GameObjectCustomAnimCallback gameObjectCustomAnimCallback_; // Transport tracking struct TransportAttachment { diff --git a/src/core/application.cpp b/src/core/application.cpp index f3e7d517..d40cc6b6 100644 --- a/src/core/application.cpp +++ b/src/core/application.cpp @@ -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; diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index ea17fb3f..03ad0679 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -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;