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
|
|
@ -2552,10 +2552,15 @@ void SpellMgr::LoadSpellAreas()
|
|||
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));
|
||||
continue;
|
||||
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;
|
||||
}
|
||||
|
||||
if(abs(spellArea.auraSpell)==spellArea.spellId)
|
||||
|
|
@ -2648,8 +2653,12 @@ void SpellMgr::LoadSpellAreas()
|
|||
|
||||
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
|
||||
if( spellInfo->AreaGroupId > 0)
|
||||
if (spellInfo->AreaGroupId > 0)
|
||||
{
|
||||
bool found = false;
|
||||
AreaGroupEntry const* groupEntry = sAreaGroupStore.LookupEntry(spellInfo->AreaGroupId);
|
||||
|
|
@ -2668,9 +2677,18 @@ SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spell
|
|||
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)
|
||||
SpellAreaMapBounds saBounds = spellmgr.GetSpellAreaMapBounds(spellInfo->Id);
|
||||
if(saBounds.first != saBounds.second)
|
||||
if (saBounds.first != saBounds.second)
|
||||
{
|
||||
for(SpellAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr)
|
||||
{
|
||||
|
|
@ -2697,21 +2715,21 @@ SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spell
|
|||
case 44535: // Spirit Heal (mana)
|
||||
{
|
||||
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
|
||||
if(!mapEntry)
|
||||
if (!mapEntry)
|
||||
return SPELL_FAILED_INCORRECT_AREA;
|
||||
|
||||
return mapEntry->IsBattleGround() && player && player->InBattleGround() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
|
||||
}
|
||||
case 44521: // Preparation
|
||||
{
|
||||
if(!player)
|
||||
if (!player)
|
||||
return SPELL_FAILED_REQUIRES_AREA;
|
||||
|
||||
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
|
||||
if(!mapEntry)
|
||||
if (!mapEntry)
|
||||
return SPELL_FAILED_INCORRECT_AREA;
|
||||
|
||||
if(!mapEntry->IsBattleGround())
|
||||
if (!mapEntry->IsBattleGround())
|
||||
return SPELL_FAILED_REQUIRES_AREA;
|
||||
|
||||
BattleGround* bg = player->GetBattleGround();
|
||||
|
|
@ -2723,21 +2741,21 @@ SpellCastResult SpellMgr::GetSpellAllowedInLocationError(SpellEntry const *spell
|
|||
case 35775: // Green Team (Horde)
|
||||
{
|
||||
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
|
||||
if(!mapEntry)
|
||||
if (!mapEntry)
|
||||
return SPELL_FAILED_INCORRECT_AREA;
|
||||
|
||||
return mapEntry->IsBattleArena() && player && player->InBattleGround() ? SPELL_CAST_OK : SPELL_FAILED_REQUIRES_AREA;
|
||||
}
|
||||
case 32727: // Arena Preparation
|
||||
{
|
||||
if(!player)
|
||||
if (!player)
|
||||
return SPELL_FAILED_REQUIRES_AREA;
|
||||
|
||||
MapEntry const* mapEntry = sMapStore.LookupEntry(map_id);
|
||||
if(!mapEntry)
|
||||
if (!mapEntry)
|
||||
return SPELL_FAILED_INCORRECT_AREA;
|
||||
|
||||
if(!mapEntry->IsBattleArena())
|
||||
if (!mapEntry->IsBattleArena())
|
||||
return SPELL_FAILED_REQUIRES_AREA;
|
||||
|
||||
BattleGround* bg = player->GetBattleGround();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue