mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-04-17 09:33:51 +00:00
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:
parent
58681753e5
commit
639df4815e
3 changed files with 26 additions and 0 deletions
|
|
@ -593,6 +593,9 @@ public:
|
|||
using GameObjectDespawnCallback = std::function<void(uint64_t guid)>;
|
||||
void setGameObjectDespawnCallback(GameObjectDespawnCallback cb) { gameObjectDespawnCallback_ = std::move(cb); }
|
||||
|
||||
using GameObjectCustomAnimCallback = std::function<void(uint64_t guid, uint32_t animId)>;
|
||||
void setGameObjectCustomAnimCallback(GameObjectCustomAnimCallback cb) { gameObjectCustomAnimCallback_ = std::move(cb); }
|
||||
|
||||
// Faction hostility map (populated from FactionTemplate.dbc by Application)
|
||||
void setFactionHostileMap(std::unordered_map<uint32_t, bool> map) { factionHostileMap_ = std::move(map); }
|
||||
|
||||
|
|
@ -1401,6 +1404,7 @@ private:
|
|||
GameObjectSpawnCallback gameObjectSpawnCallback_;
|
||||
GameObjectMoveCallback gameObjectMoveCallback_;
|
||||
GameObjectDespawnCallback gameObjectDespawnCallback_;
|
||||
GameObjectCustomAnimCallback gameObjectCustomAnimCallback_;
|
||||
|
||||
// Transport tracking
|
||||
struct TransportAttachment {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue