diff options
author | Treeston <treeston.mmoc@gmail.com> | 2018-02-15 11:44:37 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2021-06-21 00:06:41 +0200 |
commit | 37298ca99cce901bd358c536b34aee879f72f900 (patch) | |
tree | 9131e74802ff5994c0903dd1fe33be0fb6d6819f | |
parent | 17004c4121051359ba9bae491e3d73851d869820 (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.cpp | 8 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.h | 6 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 72 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 23 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 1 |
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: |