diff --git a/include/game/game_handler.hpp b/include/game/game_handler.hpp index d98af042..e3b297a7 100644 --- a/include/game/game_handler.hpp +++ b/include/game/game_handler.hpp @@ -1016,6 +1016,10 @@ public: }; const std::unordered_map& getTaxiNodes() const { return taxiNodes_; } uint32_t getTaxiCostTo(uint32_t destNodeId) const; + bool taxiNpcHasRoutes(uint64_t guid) const { + auto it = taxiNpcHasRoutes_.find(guid); + return it != taxiNpcHasRoutes_.end() && it->second; + } // Vendor void openVendor(uint64_t npcGuid); @@ -1878,6 +1882,7 @@ private: } // Taxi / Flight Paths + std::unordered_map taxiNpcHasRoutes_; // guid -> has new/available routes std::unordered_map taxiNodes_; std::vector taxiPathEdges_; std::unordered_map> taxiPathNodes_; // pathId -> ordered waypoints diff --git a/src/game/game_handler.cpp b/src/game/game_handler.cpp index 610048eb..bf90d0d9 100644 --- a/src/game/game_handler.cpp +++ b/src/game/game_handler.cpp @@ -4282,10 +4282,15 @@ void GameHandler::handlePacket(network::Packet& packet) { case Opcode::SMSG_SET_EXTRA_AURA_INFO_NEED_UPDATE: packet.setReadPos(packet.getSize()); break; - case Opcode::SMSG_TAXINODE_STATUS: - // Node status cache not implemented yet. - packet.setReadPos(packet.getSize()); + case Opcode::SMSG_TAXINODE_STATUS: { + // guid(8) + status(1): status 1 = NPC has available/new routes for this player + if (packet.getSize() - packet.getReadPos() >= 9) { + uint64_t npcGuid = packet.readUInt64(); + uint8_t status = packet.readUInt8(); + taxiNpcHasRoutes_[npcGuid] = (status != 0); + } break; + } case Opcode::SMSG_INIT_EXTRA_AURA_INFO_OBSOLETE: case Opcode::SMSG_SET_EXTRA_AURA_INFO_OBSOLETE: // Extra aura metadata (icons/durations) not yet consumed by aura UI.