mirror of
https://github.com/mangosfour/server.git
synced 2025-12-14 16:37:01 +00:00
[8308] More generic code for new continent spell casting including fly form/mounts.
* Check new continent requirement by SPELL_ATTR_EX4_CAST_ONLY_IN_OUTLAND in SpellMgr::GetSpellAllowedInLocationError. * Also in this function let ignore any area requirement in GM-mode (except client side checks ofc if use spellbook/item) * For fly form/mount auras check only speciaal reqirement like special fly skill and ignore it for dead state. * Drop explicit fly auras drop at zone update, now this part GetSpellAllowedInLocationError functionality. * Allow in `spell_area` have data deepndent from ghost auras This all allow implement apply spells 55173/55164 to player ghost wiht DB support in `spell_area`
This commit is contained in:
parent
49b88a14a9
commit
3c47e6117a
5 changed files with 43 additions and 34 deletions
|
|
@ -18981,13 +18981,6 @@ void Player::SetClientControl(Unit* target, uint8 allowMove)
|
||||||
|
|
||||||
void Player::UpdateZoneDependentAuras( uint32 newZone )
|
void Player::UpdateZoneDependentAuras( uint32 newZone )
|
||||||
{
|
{
|
||||||
// remove new continent flight forms
|
|
||||||
if( !IsAllowUseFlyMountsHere() )
|
|
||||||
{
|
|
||||||
RemoveSpellsCausingAura(SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED);
|
|
||||||
RemoveSpellsCausingAura(SPELL_AURA_FLY);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Some spells applied at enter into zone (with subzones), aura removed in UpdateAreaDependentAuras that called always at zone->area update
|
// Some spells applied at enter into zone (with subzones), aura removed in UpdateAreaDependentAuras that called always at zone->area update
|
||||||
SpellAreaForAreaMapBounds saBounds = spellmgr.GetSpellAreaForAreaMapBounds(newZone);
|
SpellAreaForAreaMapBounds saBounds = spellmgr.GetSpellAreaForAreaMapBounds(newZone);
|
||||||
for(SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
|
for(SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
|
||||||
|
|
@ -19560,13 +19553,11 @@ uint32 Player::CalculateTalentsPoints() const
|
||||||
return uint32(talentPointsForLevel * sWorld.getRate(RATE_TALENT));
|
return uint32(talentPointsForLevel * sWorld.getRate(RATE_TALENT));
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::IsAllowUseFlyMountsHere() const
|
bool Player::IsKnowHowFlyIn(uint32 mapid, uint32 zone) const
|
||||||
{
|
{
|
||||||
if (isGameMaster())
|
// continent checked in SpellMgr::GetSpellAllowedInLocationError at cast and area update
|
||||||
return true;
|
uint32 v_map = GetVirtualMapForMapAndZone(mapid, zone);
|
||||||
|
return v_map != 571 || HasSpell(54197); // Cold Weather Flying
|
||||||
uint32 v_map = GetVirtualMapForMapAndZone(GetMapId(), GetZoneId());
|
|
||||||
return v_map == 530 || v_map == 571 && HasSpell(54197);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
struct DoPlayerLearnSpell
|
struct DoPlayerLearnSpell
|
||||||
|
|
|
||||||
|
|
@ -2044,7 +2044,7 @@ class MANGOS_DLL_SPEC Player : public Unit
|
||||||
|
|
||||||
bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
|
bool CanFly() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_CAN_FLY); }
|
||||||
bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
|
bool IsFlying() const { return m_movementInfo.HasMovementFlag(MOVEMENTFLAG_FLYING); }
|
||||||
bool IsAllowUseFlyMountsHere() const;
|
bool IsKnowHowFlyIn(uint32 mapid, uint32 zone) const;
|
||||||
|
|
||||||
void SetClientControl(Unit* target, uint8 allowMove);
|
void SetClientControl(Unit* target, uint8 allowMove);
|
||||||
void SetMover(Unit* target) { m_mover = target ? target : this; }
|
void SetMover(Unit* target) { m_mover = target ? target : this; }
|
||||||
|
|
|
||||||
|
|
@ -4555,16 +4555,16 @@ SpellCastResult Spell::CheckCast(bool strict)
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED:
|
|
||||||
case SPELL_AURA_FLY:
|
case SPELL_AURA_FLY:
|
||||||
|
case SPELL_AURA_MOD_INCREASE_FLIGHT_SPEED:
|
||||||
{
|
{
|
||||||
// not allow cast fly spells at old maps by players (all spells is self target)
|
// not allow cast fly spells if not have req. skills (all spells is self target)
|
||||||
if(m_caster->GetTypeId() == TYPEID_PLAYER)
|
// allow always ghost flight spells
|
||||||
|
if (m_caster->GetTypeId() == TYPEID_PLAYER && m_caster->isAlive())
|
||||||
{
|
{
|
||||||
if( !((Player*)m_caster)->IsAllowUseFlyMountsHere() )
|
if (!((Player*)m_caster)->IsKnowHowFlyIn(m_caster->GetMapId(),zone))
|
||||||
return SPELL_FAILED_NOT_HERE;
|
return m_IsTriggeredSpell ? SPELL_FAILED_DONT_REPORT : SPELL_FAILED_NOT_HERE;
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SPELL_AURA_PERIODIC_MANA_LEECH:
|
case SPELL_AURA_PERIODIC_MANA_LEECH:
|
||||||
|
|
|
||||||
|
|
@ -2552,9 +2552,14 @@ void SpellMgr::LoadSpellAreas()
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(spellInfo->EffectApplyAuraName[0]!=SPELL_AURA_DUMMY && spellInfo->EffectApplyAuraName[0]!=SPELL_AURA_PHASE)
|
switch(spellInfo->EffectApplyAuraName[0])
|
||||||
{
|
{
|
||||||
sLog.outErrorDb("Spell %u listed in `spell_area` have aura spell requirement (%u) without dummy/phase aura in effect 0", spell,abs(spellArea.auraSpell));
|
case SPELL_AURA_DUMMY:
|
||||||
|
case SPELL_AURA_PHASE:
|
||||||
|
case SPELL_AURA_GHOST:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
sLog.outErrorDb("Spell %u listed in `spell_area` have aura spell requirement (%u) without dummy/phase/ghost aura in effect 0", spell,abs(spellArea.auraSpell));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2648,6 +2653,10 @@ void SpellMgr::LoadSpellAreas()
|
||||||
|
|
||||||
SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spellInfo, uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player)
|
SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spellInfo, uint32 map_id, uint32 zone_id, uint32 area_id, Player const* player)
|
||||||
{
|
{
|
||||||
|
// allow in GM-mode
|
||||||
|
if (player && player->isGameMaster())
|
||||||
|
return SPELL_CAST_OK;
|
||||||
|
|
||||||
// normal case
|
// normal case
|
||||||
if (spellInfo->AreaGroupId > 0)
|
if (spellInfo->AreaGroupId > 0)
|
||||||
{
|
{
|
||||||
|
|
@ -2668,6 +2677,15 @@ SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spell
|
||||||
return SPELL_FAILED_INCORRECT_AREA;
|
return SPELL_FAILED_INCORRECT_AREA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// continent limitation (virtual continent)
|
||||||
|
if (spellInfo->AttributesEx4 & SPELL_ATTR_EX4_CAST_ONLY_IN_OUTLAND)
|
||||||
|
{
|
||||||
|
uint32 v_map = GetVirtualMapForMapAndZone(map_id, zone_id);
|
||||||
|
MapEntry const* mapEntry = sMapStore.LookupEntry(v_map);
|
||||||
|
if(!mapEntry || mapEntry->addon < 1 || !mapEntry->IsContinent())
|
||||||
|
return SPELL_FAILED_INCORRECT_AREA;
|
||||||
|
}
|
||||||
|
|
||||||
// DB base check (if non empty then must fit at least single for allow)
|
// DB base check (if non empty then must fit at least single for allow)
|
||||||
SpellAreaMapBounds saBounds = spellmgr.GetSpellAreaMapBounds(spellInfo->Id);
|
SpellAreaMapBounds saBounds = spellmgr.GetSpellAreaMapBounds(spellInfo->Id);
|
||||||
if (saBounds.first != saBounds.second)
|
if (saBounds.first != saBounds.second)
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,4 @@
|
||||||
#ifndef __REVISION_NR_H__
|
#ifndef __REVISION_NR_H__
|
||||||
#define __REVISION_NR_H__
|
#define __REVISION_NR_H__
|
||||||
#define REVISION_NR "8307"
|
#define REVISION_NR "8308"
|
||||||
#endif // __REVISION_NR_H__
|
#endif // __REVISION_NR_H__
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue