Add taxi system, fix WMO interior lighting, ramp collision, and /unstuck

- Implement flight path system: SMSG_SHOWTAXINODES parser, CMSG_ACTIVATETAXIEXPRESS builder, BFS multi-hop pathfinding through TaxiNodes/TaxiPath DBC, taxi destination UI, movement blocking during flight
- Fix WMO interiors too dark by boosting vertex color lighting multiplier
- Dim M2 objects inside WMO interiors (rugs, furniture) via per-instance interior detection
- Fix ramp/stair clipping by lowering wall collision normal threshold from 0.85 to 0.55
- Restore 5-sample cardinal footprint for ground detection to fix rug slipping
- Fix /unstuck command to reset player Z to WMO/terrain floor height
- Handle MSG_MOVE_TELEPORT_ACK and SMSG_TRANSFER_PENDING for hearthstone teleports
- Fix spawning under Stormwind with online-mode camera controller reset
This commit is contained in:
Kelsi 2026-02-07 16:59:20 -08:00
parent 3fa519ac96
commit e8f8426a43
15 changed files with 691 additions and 108 deletions

View file

@ -1652,6 +1652,48 @@ public:
static bool parse(network::Packet& packet, ListInventoryData& data);
};
// ============================================================
// Taxi / Flight Paths
// ============================================================
static constexpr uint32_t TLK_TAXI_MASK_SIZE = 12;
/** SMSG_SHOWTAXINODES data */
struct ShowTaxiNodesData {
uint32_t windowInfo = 0; // 1 = show window
uint64_t npcGuid = 0;
uint32_t nearestNode = 0; // Taxi node player is at
uint32_t nodeMask[TLK_TAXI_MASK_SIZE] = {};
bool isNodeKnown(uint32_t nodeId) const {
uint32_t idx = nodeId / 32;
uint32_t bit = nodeId % 32;
return idx < TLK_TAXI_MASK_SIZE && (nodeMask[idx] & (1u << bit));
}
};
/** SMSG_SHOWTAXINODES parser */
class ShowTaxiNodesParser {
public:
static bool parse(network::Packet& packet, ShowTaxiNodesData& data);
};
/** SMSG_ACTIVATETAXIREPLY data */
struct ActivateTaxiReplyData {
uint32_t result = 0; // 0 = OK
};
/** SMSG_ACTIVATETAXIREPLY parser */
class ActivateTaxiReplyParser {
public:
static bool parse(network::Packet& packet, ActivateTaxiReplyData& data);
};
/** CMSG_ACTIVATETAXIEXPRESS packet builder */
class ActivateTaxiExpressPacket {
public:
static network::Packet build(uint64_t npcGuid, const std::vector<uint32_t>& pathNodes);
};
/** CMSG_REPOP_REQUEST packet builder */
class RepopRequestPacket {
public: