diff options
| author | ariel- <ariel-@users.noreply.github.com> | 2017-06-02 03:24:27 -0300 |
|---|---|---|
| committer | ariel- <ariel-@users.noreply.github.com> | 2017-06-02 04:17:29 -0300 |
| commit | d56a28afee19741c582ed8e16dbf8e30311f68ea (patch) | |
| tree | 3a39aab962551199f30c89fe347870ed13f80d74 /src/server/game/AI | |
| parent | 0c6829f7f22f32e602ea6ed440d50f2f596ba998 (diff) | |
Core/Globals: add more AIName and MovementType checks to ObjectMgr
- Ninja fix AI factories (restores prev behaviour of not selecting stuff with PERMIT_BASE_NO)
Closes #19831
Diffstat (limited to 'src/server/game/AI')
| -rw-r--r-- | src/server/game/AI/CreatureAISelector.cpp | 21 |
1 files changed, 12 insertions, 9 deletions
diff --git a/src/server/game/AI/CreatureAISelector.cpp b/src/server/game/AI/CreatureAISelector.cpp index bec6f7a2de3..30b606b49c7 100644 --- a/src/server/game/AI/CreatureAISelector.cpp +++ b/src/server/game/AI/CreatureAISelector.cpp @@ -29,6 +29,13 @@ namespace FactorySelector { + template <class T, class Value> + inline int32 GetPermitFor(T const* obj, Value const& value) + { + Permissible<T> const* const p = ASSERT_NOTNULL(dynamic_cast<Permissible<T> const*>(value.second.get())); + return p->Permit(obj); + } + template <class T> struct PermissibleOrderPred { @@ -38,10 +45,7 @@ namespace FactorySelector template <class Value> bool operator()(Value const& left, Value const& right) const { - Permissible<T> const* leftPermit = ASSERT_NOTNULL(dynamic_cast<Permissible<T> const*>(left.second.get())); - Permissible<T> const* rightPermit = ASSERT_NOTNULL(dynamic_cast<Permissible<T> const*>(right.second.get())); - - return leftPermit->Permit(_obj) < rightPermit->Permit(_obj); + return GetPermitFor(_obj, left) < GetPermitFor(_obj, right); } private: @@ -53,9 +57,8 @@ namespace FactorySelector CreatureAICreator const* ai_factory = nullptr; // scriptname in db - if (!ai_factory) - if (CreatureAI* scriptedAI = sScriptMgr->GetCreatureAI(creature)) - return scriptedAI; + if (CreatureAI* scriptedAI = sScriptMgr->GetCreatureAI(creature)) + return scriptedAI; // AIname in db std::string const& aiName = creature->GetAIName(); @@ -67,7 +70,7 @@ namespace FactorySelector { CreatureAIRegistry::RegistryMapType const& items = sCreatureAIRegistry->GetRegisteredItems(); auto itr = std::max_element(items.begin(), items.end(), PermissibleOrderPred<Creature>(creature)); - if (itr != items.end()) + if (itr != items.end() && GetPermitFor(creature, *itr) >= 0) ai_factory = itr->second.get(); } @@ -105,7 +108,7 @@ namespace FactorySelector { GameObjectAIRegistry::RegistryMapType const& items = sGameObjectAIRegistry->GetRegisteredItems(); auto itr = std::max_element(items.begin(), items.end(), PermissibleOrderPred<GameObject>(go)); - if (itr != items.end()) + if (itr != items.end() && GetPermitFor(go, *itr) >= 0) ai_factory = itr->second.get(); } |
