From 24792b9361da531ccb044bdca47630a2b06f29d4 Mon Sep 17 00:00:00 2001 From: Gangrene Date: Thu, 5 May 2016 02:33:56 +0200 Subject: [PATCH 1/3] fix flying form in no fly zones after teleport --- src/server/game/Entities/Player/Player.cpp | 19 ++++++++++++++++++- src/server/game/Handlers/MovementHandler.cpp | 4 ++++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index c54f77eea7..b93581dad4 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24927,7 +24927,24 @@ bool Player::CanFlyInZone(uint32 mapid, uint32 zone) 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 + bool can_fly = false; + switch (v_map) + { + 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 + can_fly = true; + default: + break; + } + TC_LOG_DEBUG("network", "------Gangrene------ mapid=%u zone=%u v_map=%u result=%u",mapid,zone,v_map,can_fly); + 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..fd8798f45f 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); From 616c5ca2b340cc30d9c12648912ed1e34172f325 Mon Sep 17 00:00:00 2001 From: Gangrene Date: Thu, 5 May 2016 11:44:22 +0200 Subject: [PATCH 2/3] Remove debug line --- src/server/game/Entities/Player/Player.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index b93581dad4..786461aeda 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -24943,7 +24943,6 @@ bool Player::CanFlyInZone(uint32 mapid, uint32 zone) const default: break; } - TC_LOG_DEBUG("network", "------Gangrene------ mapid=%u zone=%u v_map=%u result=%u",mapid,zone,v_map,can_fly); return can_fly; } From 40f2ae4d07bb71218b78736ce77c50e28c95e301 Mon Sep 17 00:00:00 2001 From: Gangrene Date: Sat, 7 May 2016 01:37:07 +0200 Subject: [PATCH 3/3] 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 786461aeda..416a340dd5 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 fd8798f45f..66780e01b3 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