diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index fb3df4df28..71a2d39b4d 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -25012,11 +25012,30 @@ 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); - return v_map != 571 || HasSpell(54197); // 54197 = Cold Weather Flying + AreaTableEntry const* area = sAreaTableStore.LookupEntry(areaid); + bool can_fly = false; + switch (mapid) + { + case 0: // Eastern Kingdoms + case 1: // Kalimdor + case 646: // Deepholm + can_fly = HasSpell(90267); // Flight Master's License + break; + case 571: // Northrend + can_fly = HasSpell(54197); // Cold Weather Flying + break; + case 530: // Outland + // 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; + } + return can_fly; } void Player::LearnSpellHighestRank(uint32 spellid) diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp index 989723f838..66780e01b3 100644 --- a/src/server/game/Handlers/MovementHandler.cpp +++ b/src/server/game/Handlers/MovementHandler.cpp @@ -185,6 +185,10 @@ void WorldSession::HandleMoveWorldportAckOpcode() GetPlayer()->GetZoneAndAreaId(newzone, newarea); GetPlayer()->UpdateZone(newzone, newarea); + // can fly check + if (!_player->CanFlyInZone(newMap->GetId(), newarea)) + _player->RemoveAurasByType(SPELL_AURA_FLY); + // honorless target if (GetPlayer()->pvpInfo.IsHostile) GetPlayer()->CastSpell(GetPlayer(), 2479, true); @@ -259,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