aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTreeston <treeston.mmoc@gmail.com>2018-02-15 11:44:37 +0100
committerShauren <shauren.trinity@gmail.com>2021-06-21 00:06:41 +0200
commit37298ca99cce901bd358c536b34aee879f72f900 (patch)
tree9131e74802ff5994c0903dd1fe33be0fb6d6819f
parent17004c4121051359ba9bae491e3d73851d869820 (diff)
Scripts/SmartAI: SetData now has an invoker (if the setting is done by something using SmartAI).
Also, some refactors. SMARTAI IS SUCH A FUCKING CLUSTERFUCK I SWEAR. (cherry picked from commit cfc77fd84355d28737f3f85f2ba318be5caacdea)
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp8
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.h6
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp72
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h23
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp1
5 files changed, 71 insertions, 39 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index c617fc6b315..2536d364845 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -694,9 +694,9 @@ uint32 SmartAI::GetData(uint32 /*id*/) const
return 0;
}
-void SmartAI::SetData(uint32 id, uint32 value)
+void SmartAI::SetData(uint32 id, uint32 value, Unit* invoker)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, nullptr, id, value);
+ GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, invoker, id, value);
}
void SmartAI::SetGUID(ObjectGuid const& /*guid*/, int32 /*id*/) { }
@@ -1030,9 +1030,9 @@ void SmartGameObjectAI::Destroyed(Player* player, uint32 eventId)
GetScript()->ProcessEventsFor(SMART_EVENT_DEATH, player, eventId, 0, false, nullptr, me);
}
-void SmartGameObjectAI::SetData(uint32 id, uint32 value)
+void SmartGameObjectAI::SetData(uint32 id, uint32 value, Unit* invoker)
{
- GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, nullptr, id, value);
+ GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, invoker, id, value);
}
void SmartGameObjectAI::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker)
diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h
index 4871c0ff0ce..614c727e724 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.h
+++ b/src/server/game/AI/SmartScripts/SmartAI.h
@@ -150,7 +150,8 @@ class TC_GAME_API SmartAI : public CreatureAI
uint32 GetData(uint32 id = 0) const override;
// Used in scripts to share variables
- void SetData(uint32 id, uint32 value) override;
+ void SetData(uint32 id, uint32 value) override { SetData(id, value, nullptr); }
+ void SetData(uint32 id, uint32 value, Unit* invoker);
// Used in scripts to share variables
void SetGUID(ObjectGuid const& guid, int32 id = 0) override;
@@ -262,7 +263,8 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI
void QuestAccept(Player* player, Quest const* quest) override;
void QuestReward(Player* player, Quest const* quest, LootItemType type, uint32 opt) override;
void Destroyed(Player* player, uint32 eventId) override;
- void SetData(uint32 id, uint32 value) override;
+ void SetData(uint32 id, uint32 value, Unit* invoker);
+ void SetData(uint32 id, uint32 value) override { SetData(id, value, nullptr); }
void SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker);
void OnGameEvent(bool start, uint16 eventId) override;
void OnLootStateChanged(uint32 state, Unit* unit) override;
diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp
index 87de7423f74..39c46ef3b7c 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -66,35 +66,63 @@ SmartScript::~SmartScript()
{
}
-bool SmartScript::IsSmart(Creature* c /*= nullptr*/)
+// @todo this is an utter clusterfuck in terms of design - why in the world does this thing side effect?
+// seriously, WHO WRITES THIS SHIT
+bool SmartScript::IsSmart(Creature* c, bool silent)
{
+ if (!c)
+ return false;
+
bool smart = true;
if (c && c->GetAIName() != "SmartAI")
smart = false;
- if (!me || me->GetAIName() != "SmartAI")
- smart = false;
-
- if (!smart)
+ if (!smart && !silent)
TC_LOG_ERROR("sql.sql", "SmartScript: Action target Creature (GUID: " UI64FMTD " Entry: %u) is not using SmartAI, action called by Creature (GUID: " UI64FMTD " Entry: %u) skipped to prevent crash.", uint64(c ? c->GetSpawnId() : UI64LIT(0)), c ? c->GetEntry() : 0, uint64(me ? me->GetSpawnId() : UI64LIT(0)), me ? me->GetEntry() : 0);
return smart;
}
-bool SmartScript::IsSmartGO(GameObject* g /*= nullptr*/)
+// @todo this, too
+bool SmartScript::IsSmart(GameObject* g, bool silent)
{
+ if (!g)
+ return false;
+
bool smart = true;
if (g && g->GetAIName() != "SmartGameObjectAI")
smart = false;
- if (!go || go->GetAIName() != "SmartGameObjectAI")
- smart = false;
- if (!smart)
+ if (!smart && !silent)
TC_LOG_ERROR("sql.sql", "SmartScript: Action target GameObject (GUID: " UI64FMTD " Entry: %u) is not using SmartGameObjectAI, action called by GameObject (GUID: " UI64FMTD " Entry: %u) skipped to prevent crash.", uint64(g ? g->GetSpawnId() : UI64LIT(0)), g ? g->GetEntry() : 0, uint64(go ? go->GetSpawnId() : UI64LIT(0)), go ? go->GetEntry() : 0);
return smart;
}
+bool SmartScript::IsSmart(bool silent)
+{
+ if (me)
+ return IsSmart(me, silent);
+ if (go)
+ return IsSmart(go, silent);
+ return false;
+}
+
+void SmartScript::StoreTargetList(ObjectVector const& targets, uint32 id)
+{
+ // insert or replace
+ _storedTargets.erase(id);
+ _storedTargets.emplace(id, ObjectGuidVector(targets));
+}
+
+ObjectVector const* SmartScript::GetStoredTargetVector(uint32 id, WorldObject const& ref) const
+{
+ auto itr = _storedTargets.find(id);
+ if (itr != _storedTargets.end())
+ return itr->second.GetObjectVector(ref);
+ return nullptr;
+}
+
void SmartScript::StoreCounter(uint32 id, uint32 value, uint32 reset)
{
CounterMap::iterator itr = mCounterList.find(id);
@@ -1124,10 +1152,22 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
{
for (WorldObject* target : targets)
{
- if (IsCreature(target))
- target->ToCreature()->AI()->SetData(e.action.setData.field, e.action.setData.data);
- else if (IsGameObject(target))
- target->ToGameObject()->AI()->SetData(e.action.setData.field, e.action.setData.data);
+ if (Creature* cTarget = target->ToCreature())
+ {
+ CreatureAI* ai = cTarget->AI();
+ if (IsSmart(cTarget))
+ ENSURE_AI(SmartAI, ai)->SetData(e.action.setData.field, e.action.setData.data, me);
+ else
+ ai->SetData(e.action.setData.field, e.action.setData.data);
+ }
+ else if (GameObject* oTarget = target->ToGameObject())
+ {
+ GameObjectAI* ai = oTarget->AI();
+ if (IsSmart(oTarget))
+ ENSURE_AI(SmartGameObjectAI, ai)->SetData(e.action.setData.field, e.action.setData.data, me);
+ else
+ ai->SetData(e.action.setData.field, e.action.setData.data);
+ }
}
break;
}
@@ -1623,7 +1663,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
else if (GameObject* goTarget = target->ToGameObject())
{
- if (IsSmartGO(goTarget))
+ if (IsSmart(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, e.action.timedActionList.id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
@@ -1713,7 +1753,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
else if (GameObject* goTarget = target->ToGameObject())
{
- if (IsSmartGO(goTarget))
+ if (IsSmart(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
@@ -1740,7 +1780,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u
}
else if (GameObject* goTarget = target->ToGameObject())
{
- if (IsSmartGO(goTarget))
+ if (IsSmart(goTarget))
ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, id, GetLastInvoker());
}
else if (AreaTrigger* areaTriggerTarget = target->ToAreaTrigger())
diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h
index 49c51e1e450..96312cc592d 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.h
+++ b/src/server/game/AI/SmartScripts/SmartScript.h
@@ -73,23 +73,12 @@ class TC_GAME_API SmartScript
void DoFindFriendlyMissingBuff(std::vector<Creature*>& creatures, float range, uint32 spellid) const;
Unit* DoFindClosestFriendlyInRange(float range, bool playerOnly) const;
- bool IsSmart(Creature* c = nullptr);
- bool IsSmartGO(GameObject* g = nullptr);
-
- void StoreTargetList(ObjectVector const& targets, uint32 id)
- {
- // insert or replace
- _storedTargets.erase(id);
- _storedTargets.emplace(id, ObjectGuidVector(targets));
- }
-
- ObjectVector const* GetStoredTargetVector(uint32 id, WorldObject const& ref) const
- {
- auto itr = _storedTargets.find(id);
- if (itr != _storedTargets.end())
- return itr->second.GetObjectVector(ref);
- return nullptr;
- }
+ bool IsSmart(Creature* c, bool silent = false);
+ bool IsSmart(GameObject* g, bool silent = false);
+ bool IsSmart(bool silent = false);
+
+ void StoreTargetList(ObjectVector const& targets, uint32 id);
+ ObjectVector const* GetStoredTargetVector(uint32 id, WorldObject const& ref) const;
void StoreCounter(uint32 id, uint32 value, uint32 reset);
uint32 GetCounterValue(uint32 id) const;
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index c2ee797d909..6ccd6d2d6d6 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -494,6 +494,7 @@ SmartScriptHolder& SmartAIMgr::FindLinkedEvent(SmartAIEventList& list, uint32 li
case SMART_EVENT_IS_BEHIND_TARGET:
case SMART_EVENT_INSTANCE_PLAYER_ENTER:
case SMART_EVENT_TRANSPORT_ADDCREATURE:
+ case SMART_EVENT_DATA_SET:
case SMART_EVENT_QUEST_ACCEPTED:
case SMART_EVENT_QUEST_OBJ_COPLETETION:
case SMART_EVENT_QUEST_COMPLETION: