diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Entities/Unit/Unit.cpp | 74 | ||||
-rw-r--r-- | src/server/game/Entities/Unit/Unit.h | 12 |
2 files changed, 72 insertions, 14 deletions
diff --git a/src/server/game/Entities/Unit/Unit.cpp b/src/server/game/Entities/Unit/Unit.cpp index c37c7ea82fe..7e7c184ddf2 100644 --- a/src/server/game/Entities/Unit/Unit.cpp +++ b/src/server/game/Entities/Unit/Unit.cpp @@ -4413,26 +4413,73 @@ AuraEffect* Unit::GetAuraEffect(AuraType type, SpellFamilyNames family, flag128 AuraApplication * Unit::GetAuraApplication(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask, AuraApplication * except) const { - AuraApplicationMapBounds range = m_appliedAuras.equal_range(spellId); - for (; range.first != range.second; ++range.first) + return GetAuraApplication(spellId, [&](AuraApplication const* app) { - AuraApplication* app = range.first->second; Aura const* aura = app->GetBase(); if (((aura->GetEffectMask() & reqEffMask) == reqEffMask) - && (!casterGUID || aura->GetCasterGUID() == casterGUID) - && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID) - && (!except || except != app)) + && (!casterGUID || aura->GetCasterGUID() == casterGUID) + && (!itemCasterGUID || aura->GetCastItemGUID() == itemCasterGUID) + && (!except || except != app)) { - return app; + return true; } - } + + return false; + }); +} + +AuraApplication* Unit::GetAuraApplication(uint32 spellId, std::function<bool(AuraApplication const*)> const& predicate) const +{ + for (AuraApplicationMap::value_type const& pair : Trinity::Containers::MapEqualRange(m_appliedAuras, spellId)) + if (predicate(pair.second)) + return pair.second; + + return nullptr; +} + +AuraApplication* Unit::GetAuraApplication(uint32 spellId, std::function<bool(Aura const*)> const& predicate) const +{ + for (AuraApplicationMap::value_type const& pair : Trinity::Containers::MapEqualRange(m_appliedAuras, spellId)) + if (predicate(pair.second->GetBase())) + return pair.second; + + return nullptr; +} + +AuraApplication* Unit::GetAuraApplication(std::function<bool(AuraApplication const*)> const& predicate) const +{ + for (AuraApplicationMap::value_type const& pair : m_appliedAuras) + if (predicate(pair.second)) + return pair.second; + + return nullptr; +} + +AuraApplication* Unit::GetAuraApplication(std::function<bool(Aura const*)> const& predicate) const +{ + for (AuraApplicationMap::value_type const& pair : m_appliedAuras) + if (predicate(pair.second->GetBase())) + return pair.second; + return nullptr; } Aura* Unit::GetAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask) const { - AuraApplication * aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask); + AuraApplication* aurApp = GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask); + return aurApp ? aurApp->GetBase() : nullptr; +} + +Aura* Unit::GetAura(uint32 spellId, std::function<bool(Aura const*)> const& predicate) const +{ + AuraApplication* aurApp = GetAuraApplication(spellId, predicate); + return aurApp ? aurApp->GetBase() : nullptr; +} + +Aura* Unit::GetAura(std::function<bool(Aura const*)> const& predicate) const +{ + AuraApplication* aurApp = GetAuraApplication(predicate); return aurApp ? aurApp->GetBase() : nullptr; } @@ -4524,9 +4571,12 @@ uint32 Unit::GetAuraCount(uint32 spellId) const bool Unit::HasAura(uint32 spellId, ObjectGuid casterGUID, ObjectGuid itemCasterGUID, uint32 reqEffMask) const { - if (GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask)) - return true; - return false; + return GetAuraApplication(spellId, casterGUID, itemCasterGUID, reqEffMask) != nullptr; +} + +bool Unit::HasAura(std::function<bool(Aura const*)> const& predicate) const +{ + return GetAuraApplication(predicate) != nullptr; } bool Unit::HasAuraType(AuraType auraType) const diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index d4305d044f0..dda4b56ab43 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -1408,10 +1408,17 @@ class TC_GAME_API Unit : public WorldObject AuraEffect* GetAuraEffectOfRankedSpell(uint32 spellId, uint8 effIndex, ObjectGuid casterGUID = ObjectGuid::Empty) const; AuraEffect* GetAuraEffect(AuraType type, SpellFamilyNames family, flag128 const& familyFlag, ObjectGuid casterGUID = ObjectGuid::Empty) const; - AuraApplication * GetAuraApplication(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication * except = nullptr) const; + AuraApplication* GetAuraApplication(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication* except = nullptr) const; + AuraApplication* GetAuraApplication(uint32 spellId, std::function<bool(AuraApplication const*)> const& predicate) const; + AuraApplication* GetAuraApplication(uint32 spellId, std::function<bool(Aura const*)> const& predicate) const; + AuraApplication* GetAuraApplication(std::function<bool(AuraApplication const*)> const& predicate) const; + AuraApplication* GetAuraApplication(std::function<bool(Aura const*)> const& predicate) const; + Aura* GetAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; + Aura* GetAura(uint32 spellId, std::function<bool(Aura const*)> const& predicate) const; + Aura* GetAura(std::function<bool(Aura const*)> const& predicate) const; - AuraApplication * GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication * except = nullptr) const; + AuraApplication* GetAuraApplicationOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0, AuraApplication* except = nullptr) const; Aura* GetAuraOfRankedSpell(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; void GetDispellableAuraList(Unit* caster, uint32 dispelMask, DispelChargesList& dispelList, bool isReflect = false) const; @@ -1419,6 +1426,7 @@ class TC_GAME_API Unit : public WorldObject bool HasAuraEffect(uint32 spellId, uint8 effIndex, ObjectGuid caster = ObjectGuid::Empty) const; uint32 GetAuraCount(uint32 spellId) const; bool HasAura(uint32 spellId, ObjectGuid casterGUID = ObjectGuid::Empty, ObjectGuid itemCasterGUID = ObjectGuid::Empty, uint32 reqEffMask = 0) const; + bool HasAura(std::function<bool(Aura const*)> const& predicate) const; bool HasAuraType(AuraType auraType) const; bool HasAuraTypeWithCaster(AuraType auratype, ObjectGuid caster) const; bool HasAuraTypeWithMiscvalue(AuraType auratype, int32 miscvalue) const; |