diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 95942bd10d..eb798f2527 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -595,22 +595,19 @@ bool SmartAI::AssistPlayerInCombatAgainst(Unit* who) return false; } -void SmartAI::InitializeAI() +void SmartAI::JustAppeared() { - GetScript()->OnInitialize(me); - mDespawnTime = 0; mDespawnState = 0; _escortState = SMART_ESCORT_NONE; me->SetVisible(true); - if (!me->isDead()) - { - GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); - GetScript()->OnReset(); - } + if (me->GetFaction() != me->GetCreatureTemplate()->faction) + me->RestoreFaction(); + GetScript()->OnReset(); + GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); mFollowGuid.Clear(); // do not reset follower on Reset(), we need it after combat evade mFollowDist = 0; mFollowAngle = 0; @@ -742,6 +739,17 @@ void SmartAI::PassengerBoarded(Unit* who, int8 seatId, bool apply) GetScript()->ProcessEventsFor(apply ? SMART_EVENT_PASSENGER_BOARDED : SMART_EVENT_PASSENGER_REMOVED, who, uint32(seatId), 0, apply); } +void SmartAI::InitializeAI() +{ + GetScript()->OnInitialize(me); + + if (!me->isDead()) + { + GetScript()->OnReset(); + GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); + } +} + void SmartAI::OnCharmed(bool apply) { if (apply) // do this before we change charmed state, as charmed state might prevent these things from processing @@ -921,9 +929,11 @@ void SmartAI::StopFollow(bool complete) GetScript()->ProcessEventsFor(SMART_EVENT_FOLLOW_COMPLETED, player); } -void SmartAI::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker) +void SmartAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) { - GetScript()->SetTimedActionList(e, entry, invoker); + if (invoker) + GetScript()->mLastInvoker = invoker->GetGUID(); + GetScript()->SetScript9(e, entry); } void SmartAI::OnGameEvent(bool start, uint16 eventId) @@ -985,6 +995,9 @@ void SmartGameObjectAI::InitializeAI() void SmartGameObjectAI::Reset() { + // call respawn event on reset + GetScript()->ProcessEventsFor(SMART_EVENT_RESPAWN); + GetScript()->OnReset(); } @@ -1040,9 +1053,11 @@ void SmartGameObjectAI::SetData(uint32 id, uint32 value, Unit* invoker) GetScript()->ProcessEventsFor(SMART_EVENT_DATA_SET, invoker, id, value); } -void SmartGameObjectAI::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker) +void SmartGameObjectAI::SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker) { - GetScript()->SetTimedActionList(e, entry, invoker); + if (invoker) + GetScript()->mLastInvoker = invoker->GetGUID(); + GetScript()->SetScript9(e, entry); } void SmartGameObjectAI::OnGameEvent(bool start, uint16 eventId) diff --git a/src/server/game/AI/SmartScripts/SmartAI.h b/src/server/game/AI/SmartScripts/SmartAI.h index 2468f87eaf..1cc44fe16c 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.h +++ b/src/server/game/AI/SmartScripts/SmartAI.h @@ -73,9 +73,12 @@ class TC_GAME_API SmartAI : public CreatureAI void WaypointReached(uint32 nodeId, uint32 pathId) override; void WaypointPathEnded(uint32 nodeId, uint32 pathId) override; - void SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker); + void SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); SmartScript* GetScript() { return &mScript; } + // Called when creature is spawned or respawned + void JustAppeared() override; + // Called at reaching home after evade, InitializeAI(), EnterEvadeMode() for resetting variables void JustReachedHome() override; @@ -264,7 +267,7 @@ class TC_GAME_API SmartGameObjectAI : public GameObjectAI void Destroyed(Player* player, uint32 eventId) 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 SetScript9(SmartScriptHolder& e, uint32 entry, Unit* invoker); void OnGameEvent(bool start, uint16 eventId) override; void OnLootStateChanged(uint32 state, Unit* unit) override; void EventInform(uint32 eventId) override; diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index 40cfdd1533..f8d5600bdd 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -235,7 +235,7 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (!roll_chance_i(e.event.event_chance)) return; } - e.runOnce = true; //used for repeat check + e.runOnce = true;//used for repeat check if (unit) mLastInvoker = unit->GetGUID(); @@ -1688,12 +1688,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* creature = target->ToCreature()) { if (IsSmart(creature)) - ENSURE_AI(SmartAI, creature->AI())->SetTimedActionList(e, e.action.timedActionList.id, GetLastInvoker()); + ENSURE_AI(SmartAI, creature->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } else if (GameObject* goTarget = target->ToGameObject()) { if (IsSmart(goTarget)) - ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, e.action.timedActionList.id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, e.action.timedActionList.id, GetLastInvoker()); } } break; @@ -1778,12 +1778,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* creature = target->ToCreature()) { if (IsSmart(creature)) - ENSURE_AI(SmartAI, creature->AI())->SetTimedActionList(e, id, GetLastInvoker()); + ENSURE_AI(SmartAI, creature->AI())->SetScript9(e, id, GetLastInvoker()); } else if (GameObject* goTarget = target->ToGameObject()) { if (IsSmart(goTarget)) - ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } } break; @@ -1802,12 +1802,12 @@ void SmartScript::ProcessAction(SmartScriptHolder& e, Unit* unit, uint32 var0, u if (Creature* creature = target->ToCreature()) { if (IsSmart(creature)) - ENSURE_AI(SmartAI, creature->AI())->SetTimedActionList(e, id, GetLastInvoker()); + ENSURE_AI(SmartAI, creature->AI())->SetScript9(e, id, GetLastInvoker()); } else if (GameObject* goTarget = target->ToGameObject()) { if (IsSmart(goTarget)) - ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetTimedActionList(e, id, GetLastInvoker()); + ENSURE_AI(SmartGameObjectAI, goTarget->AI())->SetScript9(e, id, GetLastInvoker()); } } break; @@ -3533,12 +3533,9 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) case SMART_EVENT_DISTANCE_CREATURE: case SMART_EVENT_DISTANCE_GAMEOBJECT: { + ProcessEvent(e); if (e.GetScriptType() == SMART_SCRIPT_TYPE_TIMED_ACTIONLIST) { - Unit* invoker = nullptr; - if (me && mTimedActionListInvoker) - invoker = ObjectAccessor::GetUnit(*me, mTimedActionListInvoker); - ProcessEvent(e, invoker); e.enableTimed = false;//disable event if it is in an ActionList and was processed once for (SmartAIEventList::iterator i = mTimedActionList.begin(); i != mTimedActionList.end(); ++i) { @@ -3550,8 +3547,6 @@ void SmartScript::UpdateTimer(SmartScriptHolder& e, uint32 const diff) } } } - else - ProcessEvent(e); break; } } @@ -3845,7 +3840,7 @@ Unit* SmartScript::DoFindClosestFriendlyInRange(float range, bool playerOnly) return unit; } -void SmartScript::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker) +void SmartScript::SetScript9(SmartScriptHolder& e, uint32 entry) { //do NOT clear mTimedActionList if it's being iterated because it will invalidate the iterator and delete // any SmartScriptHolder contained like the "e" parameter passed to this function @@ -3859,7 +3854,6 @@ void SmartScript::SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* i mTimedActionList = sSmartScriptMgr->GetScript(entry, SMART_SCRIPT_TYPE_TIMED_ACTIONLIST); if (mTimedActionList.empty()) return; - mTimedActionListInvoker = invoker ? invoker->GetGUID() : ObjectGuid::Empty; for (SmartAIEventList::iterator i = mTimedActionList.begin(); i != mTimedActionList.end(); ++i) { i->enableTimed = i == mTimedActionList.begin();//enable processing only for the first action diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 1ab73b76c0..2e07c576a8 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -86,7 +86,8 @@ class TC_GAME_API SmartScript void OnReset(); void ResetBaseObject(); - void SetTimedActionList(SmartScriptHolder& e, uint32 entry, Unit* invoker); + //TIMED_ACTIONLIST (script type 9 aka script9) + void SetScript9(SmartScriptHolder& e, uint32 entry); Unit* GetLastInvoker(Unit* invoker = nullptr); ObjectGuid mLastInvoker; typedef std::unordered_map CounterMap; @@ -102,7 +103,6 @@ class TC_GAME_API SmartScript SmartAIEventList mEvents; SmartAIEventList mInstallEvents; SmartAIEventList mTimedActionList; - ObjectGuid mTimedActionListInvoker; bool isProcessingTimedActionList; Creature* me; ObjectGuid meOrigGUID;