aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql2
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp5
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp2
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.cpp70
-rw-r--r--src/server/game/AI/SmartScripts/SmartScriptMgr.h4
5 files changed, 76 insertions, 7 deletions
diff --git a/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql b/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql
new file mode 100644
index 00000000000..2a99ff63b5a
--- /dev/null
+++ b/sql/updates/world/master/2021_06_20_05_world_2018_02_13_04_world.sql
@@ -0,0 +1,2 @@
+-- SMART_ACTION_FLEE_FOR_ASSIST (25) does not need a target
+UPDATE `smart_scripts` SET `target_type`=0 WHERE `action_type`=25;
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp
index 838057be2b5..8523dce6fab 100644
--- a/src/server/game/AI/SmartScripts/SmartAI.cpp
+++ b/src/server/game/AI/SmartScripts/SmartAI.cpp
@@ -823,7 +823,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);
@@ -833,7 +834,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 169e69edd91..553af72e229 100644
--- a/src/server/game/AI/SmartScripts/SmartScript.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScript.cpp
@@ -3038,7 +3038,7 @@ void SmartScript::ProcessEvent(SmartScriptHolder& e, Unit* unit, uint32 var0, ui
uint32 count = me->EnsureVictim()->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;
}
case SMART_EVENT_CHARMED:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
index c5201c231e0..c2ee797d909 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp
@@ -452,6 +452,63 @@ SmartScriptHolder& SmartAIMgr::FindLinkedEvent(SmartAIEventList& list, uint32 li
return SmartScriptHolderDummy;
}
+/*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_LOOT_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:
+ case SMART_EVENT_QUEST_ACCEPTED:
+ case SMART_EVENT_QUEST_OBJ_COPLETETION:
+ case SMART_EVENT_QUEST_COMPLETION:
+ case SMART_EVENT_QUEST_FAIL:
+ case SMART_EVENT_QUEST_REWARDED:
+ case SMART_EVENT_SCENE_START:
+ case SMART_EVENT_SCENE_TRIGGER:
+ case SMART_EVENT_SCENE_CANCEL:
+ case SMART_EVENT_SCENE_COMPLETE:
+ return true;
+ default:
+ return false;
+ }
+}
+
bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
{
if (std::abs(e.target.o) > 2 * float(M_PI))
@@ -505,6 +562,16 @@ 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))
+ {
+ TC_LOG_ERROR("sql.sql", "SmartAIMgr: Entry " SI64FMTD " SourceType %u Event %u Action %u has invoker target, but action does not provide any invoker!", e.entryOrGuid, e.GetScriptType(), e.GetEventType(), e.GetActionType());
+ // allow this to load for now
+ // return false;
+ }
+ break;
case SMART_TARGET_PLAYER_RANGE:
case SMART_TARGET_SELF:
case SMART_TARGET_VICTIM:
@@ -512,11 +579,8 @@ bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e)
case SMART_TARGET_HOSTILE_LAST_AGGRO:
case SMART_TARGET_HOSTILE_RANDOM:
case SMART_TARGET_HOSTILE_RANDOM_NOT_TOP:
- case SMART_TARGET_ACTION_INVOKER:
- case SMART_TARGET_INVOKER_PARTY:
case SMART_TARGET_POSITION:
case SMART_TARGET_NONE:
- case SMART_TARGET_ACTION_INVOKER_VEHICLE:
case SMART_TARGET_OWNER_OR_SUMMONER:
case SMART_TARGET_THREAT_LIST:
case SMART_TARGET_CLOSEST_GAMEOBJECT:
diff --git a/src/server/game/AI/SmartScripts/SmartScriptMgr.h b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
index 431a02f9b3f..a5166ea0463 100644
--- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h
+++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h
@@ -1230,7 +1230,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
@@ -1660,6 +1660,8 @@ class TC_GAME_API SmartAIMgr
//event stores
SmartAIEventMap mEventMap[SMART_SCRIPT_TYPE_MAX];
+ static bool EventHasInvoker(SMART_EVENT event);
+
bool IsEventValid(SmartScriptHolder& e);
bool IsTargetValid(SmartScriptHolder const& e);