aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/AI
diff options
context:
space:
mode:
authorariel- <ariel-@users.noreply.github.com>2017-06-02 03:24:27 -0300
committerariel- <ariel-@users.noreply.github.com>2017-06-02 04:17:29 -0300
commitd56a28afee19741c582ed8e16dbf8e30311f68ea (patch)
tree3a39aab962551199f30c89fe347870ed13f80d74 /src/server/game/AI
parent0c6829f7f22f32e602ea6ed440d50f2f596ba998 (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.cpp21
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();
}