From 40f2ae4d07bb71218b78736ce77c50e28c95e301 Mon Sep 17 00:00:00 2001 From: Gangrene Date: Sat, 7 May 2016 01:37:07 +0200 Subject: [PATCH] fix teleport to draenei/blood elves areas with flying aura --- src/server/game/Entities/Player/Player.cpp | 11 +++++++---- src/server/game/Handlers/MovementHandler.cpp | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 786461aeda3..416a340dd54 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24923,12 +24923,12 @@ uint32 Player::CalculateTalentsPoints() const return uint32(talentPointsForLevel * sWorld->getRate(RATE_TALENT)); } -bool Player::CanFlyInZone(uint32 mapid, uint32 zone) const +bool Player::CanFlyInZone(uint32 mapid, uint32 areaid) const { // continent checked in SpellInfo::CheckLocation at cast and area update - uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone); + AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaid); bool can_fly = false; - switch (v_map) + switch (mapid) { case 0: // Eastern Kingdoms case 1: // Kalimdor @@ -24939,7 +24939,10 @@ bool Player::CanFlyInZone(uint32 mapid, uint32 zone) const can_fly = HasSpell(54197); // Cold Weather Flying break; case 530: // Outland - can_fly = true; + // Draenei and blood elves starting zones belong to Outland map, but are not flyable + // These zones don't have flag AREA_FLAG_OUTLAND2 + if (sAreaTableStore.LookupEntry(areaid)->flags & AREA_FLAG_OUTLAND2) + can_fly = true; default: break; } diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index fd8798f45fe..66780e01b36 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -263,6 +263,10 @@ void WorldSession::HandleMoveTeleportAck(WorldPacket& recvPacket) // in friendly area else if (plMover->IsPvP() && !plMover->HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_IN_PVP)) plMover->UpdatePvP(false, false); + + // can fly check + if (!plMover->CanFlyInZone(plMover->GetMapId(), newzone)) + plMover->RemoveAurasByType(SPELL_AURA_FLY); } // resummon pet