diff options
Diffstat (limited to 'src/server/game/AI/SmartScripts')
| -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 | 
4 files changed, 65 insertions, 7 deletions
| 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); | 
