diff options
-rw-r--r-- | sql/updates/world/master/2018_01_28_00_world.sql | 2 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 8 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.cpp | 12 | ||||
-rw-r--r-- | src/server/game/Spells/SpellMgr.h | 8 |
5 files changed, 21 insertions, 13 deletions
diff --git a/sql/updates/world/master/2018_01_28_00_world.sql b/sql/updates/world/master/2018_01_28_00_world.sql new file mode 100644 index 00000000000..db16731ab7f --- /dev/null +++ b/sql/updates/world/master/2018_01_28_00_world.sql @@ -0,0 +1,2 @@ +ALTER TABLE `spell_area` CHANGE `autocast` `flags` TINYINT(3) UNSIGNED NOT NULL DEFAULT '3' AFTER `gender`; +UPDATE `spell_area` SET `flags`=`flags`|2; diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 4de17ffb8c4..2925d78661a 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -16056,9 +16056,9 @@ void Player::SendQuestUpdate(uint32 questId) { for (SpellAreaForQuestAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) { - if (!itr->second->IsFitToRequirements(this, zone, area)) + if (itr->second->flags & SPELL_AREA_FLAG_AUTOREMOVE && !itr->second->IsFitToRequirements(this, zone, area)) RemoveAurasDueToSpell(itr->second->spellId); - else if (itr->second->autocast) + else if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST) if (!HasAura(itr->second->spellId)) CastSpell(this, itr->second->spellId, true); } @@ -24887,7 +24887,7 @@ void Player::UpdateZoneDependentAuras(uint32 newZone) // Some spells applied at enter into zone (with subzones), aura removed in UpdateAreaDependentAuras that called always at zone->area update SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(newZone); for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) - if (itr->second->autocast && itr->second->IsFitToRequirements(this, newZone, 0)) + if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST && itr->second->IsFitToRequirements(this, newZone, 0)) if (!HasAura(itr->second->spellId)) CastSpell(this, itr->second->spellId, true); } @@ -24907,7 +24907,7 @@ void Player::UpdateAreaDependentAuras(uint32 newArea) // some auras applied at subzone enter SpellAreaForAreaMapBounds saBounds = sSpellMgr->GetSpellAreaForAreaMapBounds(newArea); for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) - if (itr->second->autocast && itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea)) + if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST && itr->second->IsFitToRequirements(this, m_zoneUpdateId, newArea)) if (!HasAura(itr->second->spellId)) CastSpell(this, itr->second->spellId, true); } diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index 58873b89232..022d2c821f0 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -1212,10 +1212,10 @@ void Aura::HandleAuraSpecificMods(AuraApplication const* aurApp, Unit* caster, b for (SpellAreaForAreaMap::const_iterator itr = saBounds.first; itr != saBounds.second; ++itr) { // some auras remove at aura remove - if (!itr->second->IsFitToRequirements(target->ToPlayer(), zone, area)) + if (itr->second->flags & SPELL_AREA_FLAG_AUTOREMOVE && !itr->second->IsFitToRequirements(target->ToPlayer(), zone, area)) target->RemoveAurasDueToSpell(itr->second->spellId); // some auras applied at aura apply - else if (itr->second->autocast) + else if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST) { if (!target->HasAura(itr->second->spellId)) target->CastSpell(target, itr->second->spellId, true); diff --git a/src/server/game/Spells/SpellMgr.cpp b/src/server/game/Spells/SpellMgr.cpp index 52f3630b815..33f1fdbc66a 100644 --- a/src/server/game/Spells/SpellMgr.cpp +++ b/src/server/game/Spells/SpellMgr.cpp @@ -2008,7 +2008,7 @@ void SpellMgr::LoadSpellAreas() mSpellAreaForAuraMap.clear(); // 0 1 2 3 4 5 6 7 8 9 - QueryResult result = WorldDatabase.Query("SELECT spell, area, quest_start, quest_start_status, quest_end_status, quest_end, aura_spell, racemask, gender, autocast FROM spell_area"); + QueryResult result = WorldDatabase.Query("SELECT spell, area, quest_start, quest_start_status, quest_end_status, quest_end, aura_spell, racemask, gender, flags FROM spell_area"); if (!result) { TC_LOG_INFO("server.loading", ">> Loaded 0 spell area requirements. DB table `spell_area` is empty."); @@ -2032,11 +2032,11 @@ void SpellMgr::LoadSpellAreas() spellArea.auraSpell = fields[6].GetInt32(); spellArea.raceMask = fields[7].GetUInt32(); spellArea.gender = Gender(fields[8].GetUInt8()); - spellArea.autocast = fields[9].GetBool(); + spellArea.flags = fields[9].GetUInt8(); if (SpellInfo const* spellInfo = GetSpellInfo(spell)) { - if (spellArea.autocast) + if (spellArea.flags & SPELL_AREA_FLAG_AUTOCAST) const_cast<SpellInfo*>(spellInfo)->Attributes |= SPELL_ATTR0_CANT_CANCEL; } else @@ -2112,13 +2112,13 @@ void SpellMgr::LoadSpellAreas() } // not allow autocast chains by auraSpell field (but allow use as alternative if not present) - if (spellArea.autocast && spellArea.auraSpell > 0) + if (spellArea.flags & SPELL_AREA_FLAG_AUTOCAST && spellArea.auraSpell > 0) { bool chain = false; SpellAreaForAuraMapBounds saBound = GetSpellAreaForAuraMapBounds(spellArea.spellId); for (SpellAreaForAuraMap::const_iterator itr = saBound.first; itr != saBound.second; ++itr) { - if (itr->second->autocast && itr->second->auraSpell > 0) + if (itr->second->flags & SPELL_AREA_FLAG_AUTOCAST && itr->second->auraSpell > 0) { chain = true; break; @@ -2134,7 +2134,7 @@ void SpellMgr::LoadSpellAreas() SpellAreaMapBounds saBound2 = GetSpellAreaMapBounds(spellArea.auraSpell); for (SpellAreaMap::const_iterator itr2 = saBound2.first; itr2 != saBound2.second; ++itr2) { - if (itr2->second.autocast && itr2->second.auraSpell > 0) + if (itr2->second.flags & SPELL_AREA_FLAG_AUTOCAST && itr2->second.auraSpell > 0) { chain = true; break; diff --git a/src/server/game/Spells/SpellMgr.h b/src/server/game/Spells/SpellMgr.h index c1462dc1e4d..d2ac51be311 100644 --- a/src/server/game/Spells/SpellMgr.h +++ b/src/server/game/Spells/SpellMgr.h @@ -450,6 +450,12 @@ class TC_GAME_API PetAura }; typedef std::map<uint32, PetAura> SpellPetAuraMap; +enum SpellAreaFlag +{ + SPELL_AREA_FLAG_AUTOCAST = 0x1, // if has autocast, spell is applied on enter + SPELL_AREA_FLAG_AUTOREMOVE = 0x2, // if has autoremove, spell is remove automatically inside zone/area (allways removed on leaving area or zone) +}; + struct TC_GAME_API SpellArea { uint32 spellId; @@ -461,7 +467,7 @@ struct TC_GAME_API SpellArea Gender gender; // can be applied only to gender uint32 questStartStatus; // QuestStatus that quest_start must have in order to keep the spell uint32 questEndStatus; // QuestStatus that the quest_end must have in order to keep the spell (if the quest_end's status is different than this, the spell will be dropped) - bool autocast; // if true then auto applied at area enter, in other case just allowed to cast + uint8 flags; // if SPELL_AREA_FLAG_AUTOCAST then auto applied at area enter, in other case just allowed to cast || if SPELL_AREA_FLAG_AUTOREMOVE then auto removed inside area (will allways be removed on leaved even without flag) // helpers bool IsFitToRequirements(Player const* player, uint32 newZone, uint32 newArea) const; |