mirror of
https://github.com/Kelsidavis/WoWee.git
synced 2026-05-02 15:53:51 +00:00
fix(transport): guard against untracked transport placing player at map origin
When on-transport flag is set but the transport isn't tracked by TransportManager, getPlayerWorldPosition() returns localOffset (a small relative value) as a world position. This overwrites movementInfo with near-zero coordinates, teleporting the player to map origin on Eastern Kingdoms (Alterac/Hillsbrad area). Add transport existence checks in sendMovement() and getComposedWorldPosition() before composing position.
This commit is contained in:
parent
910ba50c26
commit
fe29ccad3f
3 changed files with 17 additions and 6 deletions
|
|
@ -6587,7 +6587,11 @@ void GameHandler::mailMarkAsRead(uint32_t mailId) {
|
||||||
|
|
||||||
glm::vec3 GameHandler::getComposedWorldPosition() {
|
glm::vec3 GameHandler::getComposedWorldPosition() {
|
||||||
if (playerTransportGuid_ != 0 && transportManager_) {
|
if (playerTransportGuid_ != 0 && transportManager_) {
|
||||||
return transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_);
|
auto* tr = transportManager_->getTransport(playerTransportGuid_);
|
||||||
|
if (tr) {
|
||||||
|
return transportManager_->getPlayerWorldPosition(playerTransportGuid_, playerTransportOffset_);
|
||||||
|
}
|
||||||
|
// Transport not tracked — fall through to normal position
|
||||||
}
|
}
|
||||||
// Not on transport, return normal movement position
|
// Not on transport, return normal movement position
|
||||||
return glm::vec3(movementInfo.x, movementInfo.y, movementInfo.z);
|
return glm::vec3(movementInfo.x, movementInfo.y, movementInfo.z);
|
||||||
|
|
|
||||||
|
|
@ -516,10 +516,15 @@ void MovementHandler::sendMovement(Opcode opcode) {
|
||||||
// Add transport data if player is on a server-recognized transport
|
// Add transport data if player is on a server-recognized transport
|
||||||
if (includeTransportInWire) {
|
if (includeTransportInWire) {
|
||||||
if (owner_.transportManager_) {
|
if (owner_.transportManager_) {
|
||||||
glm::vec3 composed = owner_.transportManager_->getPlayerWorldPosition(owner_.playerTransportGuid_, owner_.playerTransportOffset_);
|
auto* tr = owner_.transportManager_->getTransport(owner_.playerTransportGuid_);
|
||||||
movementInfo.x = composed.x;
|
if (tr) {
|
||||||
movementInfo.y = composed.y;
|
glm::vec3 composed = owner_.transportManager_->getPlayerWorldPosition(owner_.playerTransportGuid_, owner_.playerTransportOffset_);
|
||||||
movementInfo.z = composed.z;
|
movementInfo.x = composed.x;
|
||||||
|
movementInfo.y = composed.y;
|
||||||
|
movementInfo.z = composed.z;
|
||||||
|
}
|
||||||
|
// If transport not found, keep current movementInfo position —
|
||||||
|
// the localOffset fallback would place us near map origin (0,0,0).
|
||||||
}
|
}
|
||||||
movementInfo.flags |= static_cast<uint32_t>(MovementFlags::ONTRANSPORT);
|
movementInfo.flags |= static_cast<uint32_t>(MovementFlags::ONTRANSPORT);
|
||||||
movementInfo.transportGuid = owner_.playerTransportGuid_;
|
movementInfo.transportGuid = owner_.playerTransportGuid_;
|
||||||
|
|
|
||||||
|
|
@ -141,7 +141,9 @@ ActiveTransport* TransportManager::getTransport(uint64_t guid) {
|
||||||
glm::vec3 TransportManager::getPlayerWorldPosition(uint64_t transportGuid, const glm::vec3& localOffset) {
|
glm::vec3 TransportManager::getPlayerWorldPosition(uint64_t transportGuid, const glm::vec3& localOffset) {
|
||||||
auto* transport = getTransport(transportGuid);
|
auto* transport = getTransport(transportGuid);
|
||||||
if (!transport) {
|
if (!transport) {
|
||||||
return localOffset; // Fallback
|
LOG_WARNING("getPlayerWorldPosition: transport 0x", std::hex, transportGuid, std::dec,
|
||||||
|
" not found — returning localOffset as-is (callers should guard)");
|
||||||
|
return localOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (transport->isM2) {
|
if (transport->isM2) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue