From df4b621527ed905e4c7007d7c94741cc23f45280 Mon Sep 17 00:00:00 2001 From: IntelligentQuantum Date: Thu, 13 Jan 2022 14:16:25 +0330 Subject: [PATCH] feat(Scripts/SmartAI): SMART_TARGET_INVOKER (#9802) --- .../rev_1642054240860129732.sql | 22 +++++++ src/server/game/AI/SmartScripts/SmartAI.cpp | 5 +- .../game/AI/SmartScripts/SmartScript.cpp | 2 +- .../game/AI/SmartScripts/SmartScriptMgr.cpp | 60 ++++++++++++++++++- .../game/AI/SmartScripts/SmartScriptMgr.h | 4 +- 5 files changed, 86 insertions(+), 7 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1642054240860129732.sql diff --git a/data/sql/updates/pending_db_world/rev_1642054240860129732.sql b/data/sql/updates/pending_db_world/rev_1642054240860129732.sql new file mode 100644 index 000000000..bfa74531e --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1642054240860129732.sql @@ -0,0 +1,22 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1642054240860129732'); + +UPDATE `smart_scripts` SET `target_type`=0 WHERE `action_type`=25; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(27715, 27716, 27717, 27718, 27727) AND `action_type`=6; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(16769, 16977, 25321, 25322, 27615, 32495) AND `action_type`=22; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(27615, 16769) AND `action_type`=21; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(25416, 25418) AND `action_type`=85; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(30162, 30180, 28752, 28754, 28756) AND `action_type`=33; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(1140, 8538, 8539) AND `action_type`=39; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(1494, 12818, 30007, 14821, 15420, 15420, 18069, 18400, 18417, 18471, 19283, 19480, 20774) AND `action_type`=1; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(7207, 17853, 19720) AND `action_type`=15; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(8538, 30081, 30086, 30154) AND `action_type`=2; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(9520, 12818) AND `action_type`=53; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=28444 AND `action_type`=4; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=18471 AND `action_type`=26; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=22423 AND `action_type`=83; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=25401 AND `action_type`=64; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=29050 AND `action_type`=66; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(33519, 30081, 30086) AND `action_type`=33; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid`=37158 AND `action_type`=34; +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(11350, 11352, 11355, 11359); +UPDATE `smart_scripts` SET `target_type`=0 WHERE `entryorguid` IN(29861, 30475, 30829, 30830, 30838, 30839, 30840, 32357, 32400, 33306, 33382, 33383, 33384, 33519, 33558, 33559, 33561, 33562, 33564, 27220, 27238, 21926) AND `action_type`=11; diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index eaf177f6e..977966529 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -1054,7 +1054,8 @@ void SmartAI::StopFollow(bool complete) if (!complete) return; - if (Player* player = ObjectAccessor::GetPlayer(*me, mFollowGuid)) + Player* player = ObjectAccessor::GetPlayer(*me, mFollowGuid); + if (player) { if (!mFollowCreditType) player->RewardPlayerAndGroupAtEvent(mFollowCredit, me); @@ -1065,7 +1066,7 @@ void SmartAI::StopFollow(bool complete) SetDespawnTime(5000); StartDespawn(); - GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED); + GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED, player); } void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index fe9c12311..00c92b88e 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -4148,7 +4148,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui uint32 count = me->GetVictim()->GetAuraCount(e.event.aura.spell); if (count < e.event.aura.count) return; - ProcessTimedAction(e, e.event.aura.repeatMin, e.event.aura.repeatMax); + ProcessTimedAction(e, e.event.aura.repeatMin, e.event.aura.repeatMax, me->GetVictim()); break; } //no params diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp index 0feda4f8c..98c6d46c6 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -300,6 +300,54 @@ void SmartAIMgr::LoadSmartAIFromDB() LOG_INFO("server.loading", " "); } +/*static*/ bool SmartAIMgr::EventHasInvoker(SMART_EVENT event) +{ + switch (event) + { // white list of events that actually have an invoker passed to them + case SMART_EVENT_AGGRO: + case SMART_EVENT_DEATH: + case SMART_EVENT_KILL: + case SMART_EVENT_SUMMONED_UNIT: + case SMART_EVENT_SPELLHIT: + case SMART_EVENT_SPELLHIT_TARGET: + case SMART_EVENT_DAMAGED: + case SMART_EVENT_RECEIVE_HEAL: + case SMART_EVENT_RECEIVE_EMOTE: + case SMART_EVENT_JUST_SUMMONED: + case SMART_EVENT_DAMAGED_TARGET: + case SMART_EVENT_SUMMON_DESPAWNED: + case SMART_EVENT_PASSENGER_BOARDED: + case SMART_EVENT_PASSENGER_REMOVED: + case SMART_EVENT_GOSSIP_HELLO: + case SMART_EVENT_GOSSIP_SELECT: + case SMART_EVENT_ACCEPTED_QUEST: + case SMART_EVENT_REWARD_QUEST: + case SMART_EVENT_FOLLOW_COMPLETED: + case SMART_EVENT_ON_SPELLCLICK: + case SMART_EVENT_GO_STATE_CHANGED: + case SMART_EVENT_AREATRIGGER_ONTRIGGER: + case SMART_EVENT_IC_LOS: + case SMART_EVENT_OOC_LOS: + case SMART_EVENT_DISTANCE_CREATURE: + case SMART_EVENT_FRIENDLY_HEALTH: + case SMART_EVENT_FRIENDLY_HEALTH_PCT: + case SMART_EVENT_FRIENDLY_IS_CC: + case SMART_EVENT_FRIENDLY_MISSING_BUFF: + case SMART_EVENT_ACTION_DONE: + case SMART_EVENT_TARGET_HEALTH_PCT: + case SMART_EVENT_TARGET_MANA_PCT: + case SMART_EVENT_RANGE: + case SMART_EVENT_VICTIM_CASTING: + case SMART_EVENT_TARGET_BUFFED: + case SMART_EVENT_IS_BEHIND_TARGET: + case SMART_EVENT_INSTANCE_PLAYER_ENTER: + case SMART_EVENT_TRANSPORT_ADDCREATURE: + return true; + default: + return false; + } +} + bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) { if (e.GetActionType() == SMART_ACTION_INSTALL_AI_TEMPLATE) @@ -348,6 +396,15 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) } break; } + case SMART_TARGET_ACTION_INVOKER: + case SMART_TARGET_ACTION_INVOKER_VEHICLE: + case SMART_TARGET_INVOKER_PARTY: + if (e.GetScriptType() != SMART_SCRIPT_TYPE_TIMED_ACTIONLIST && e.GetEventType() != SMART_EVENT_LINK && !EventHasInvoker(e.event.type)) + { + LOG_ERROR("sql.sql", "SmartAIMgr: Entry %d SourceType %u Event %u Action %u has invoker target, but action does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType()); + return false; + } + break; case SMART_TARGET_HOSTILE_SECOND_AGGRO: case SMART_TARGET_HOSTILE_LAST_AGGRO: case SMART_TARGET_HOSTILE_RANDOM: @@ -371,9 +428,6 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) case SMART_TARGET_OWNER_OR_SUMMONER: AC_SAI_IS_BOOLEAN_VALID(e, e.target.owner.useCharmerOrOwner); break; - case SMART_TARGET_ACTION_INVOKER: - case SMART_TARGET_INVOKER_PARTY: - case SMART_TARGET_ACTION_INVOKER_VEHICLE: case SMART_TARGET_STORED: case SMART_TARGET_PLAYER_WITH_AURA: case SMART_TARGET_RANDOM_POINT: diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h index d9c2cc457..94314f471 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1344,7 +1344,7 @@ enum SMARTAI_TEMPLATE enum SMARTAI_TARGETS { - SMART_TARGET_NONE = 0, // NONE, defaulting to invoket + SMART_TARGET_NONE = 0, // NONE SMART_TARGET_SELF = 1, // Self cast SMART_TARGET_VICTIM = 2, // Our current target (ie: highest aggro) SMART_TARGET_HOSTILE_SECOND_AGGRO = 3, // Second highest aggro, maxdist, playerOnly, powerType + 1 @@ -1885,6 +1885,8 @@ private: //event stores SmartAIEventMap mEventMap[SMART_SCRIPT_TYPE_MAX]; + static bool EventHasInvoker(SMART_EVENT event); + bool IsEventValid(SmartScriptHolder& e); bool IsTargetValid(SmartScriptHolder const& e);