diff options
-rw-r--r-- | sql/updates/world/3.3.5/2018_02_13_04_world.sql | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 5 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 2 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.cpp | 61 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScriptMgr.h | 4 |
5 files changed, 67 insertions, 7 deletions
diff --git a/sql/updates/world/3.3.5/2018_02_13_04_world.sql b/sql/updates/world/3.3.5/2018_02_13_04_world.sql new file mode 100644 index 00000000000..2a99ff63b5a --- /dev/null +++ b/sql/updates/world/3.3.5/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 c17464e03e2..a2a5d6dfa57 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -820,7 +820,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); @@ -830,7 +831,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 6434b772a3f..cf9d2100832 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -2874,7 +2874,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 e90c696d777..0eb7d8835e8 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.cpp @@ -410,6 +410,54 @@ 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: + return true; + default: + return false; + } +} + bool SmartAIMgr::IsTargetValid(SmartScriptHolder const& e) { if (std::abs(e.target.o) > 2 * float(M_PI)) @@ -463,6 +511,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 %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()); + // allow this to load for now + // return false; + } + break; case SMART_TARGET_PLAYER_RANGE: case SMART_TARGET_SELF: case SMART_TARGET_VICTIM: @@ -470,11 +528,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 7a82840c8d4..15ca8f11f7f 100644 --- a/src/server/game/AI/SmartScripts/SmartScriptMgr.h +++ b/src/server/game/AI/SmartScripts/SmartScriptMgr.h @@ -1158,7 +1158,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 @@ -1576,6 +1576,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); |