diff options
author | Engilas <shorks@ya.ru> | 2021-02-14 16:38:06 +0300 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2022-03-06 21:40:42 +0100 |
commit | 8a4d731d55af63210e660727dc0aea68c8ecce05 (patch) | |
tree | 5a2c94666a46613c710e951066b987f31e12347d /src | |
parent | 3fe47c167ff3d69a7f8a736301af0403e7325407 (diff) |
Core/SmartAI: AI change on charmed (#26065)
* Fix AI refresh on charmed
* Remove unnecessary refresh
* Check SMART_EVENT_FLAG_WHILE_CHARMED flag
(cherry picked from commit f6e52f6b3df92a837787f63514417a7d240144cd)
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartAI.cpp | 5 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.cpp | 53 | ||||
-rw-r--r-- | src/server/game/AI/SmartScripts/SmartScript.h | 2 |
3 files changed, 33 insertions, 27 deletions
diff --git a/src/server/game/AI/SmartScripts/SmartAI.cpp b/src/server/game/AI/SmartScripts/SmartAI.cpp index 4cf9a93c434..94c3f160288 100644 --- a/src/server/game/AI/SmartScripts/SmartAI.cpp +++ b/src/server/game/AI/SmartScripts/SmartAI.cpp @@ -671,7 +671,7 @@ 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::OnCharmed(bool /*isNew*/) +void SmartAI::OnCharmed(bool isNew) { bool const charmed = me->IsCharmed(); if (charmed) // do this before we change charmed state, as charmed state might prevent these things from processing @@ -705,6 +705,9 @@ void SmartAI::OnCharmed(bool /*isNew*/) } GetScript()->ProcessEventsFor(SMART_EVENT_CHARMED, nullptr, 0, 0, charmed); + + if (!GetScript()->HasAnyEventWithFlag(SMART_EVENT_FLAG_WHILE_CHARMED)) // we can change AI if there are no events with this flag + UnitAI::OnCharmed(isNew); } void SmartAI::DoAction(int32 param) diff --git a/src/server/game/AI/SmartScripts/SmartScript.cpp b/src/server/game/AI/SmartScripts/SmartScript.cpp index c557febba10..e55f545deab 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.cpp +++ b/src/server/game/AI/SmartScripts/SmartScript.cpp @@ -62,6 +62,7 @@ SmartScript::SmartScript() mCurrentPriority = 0; mEventSortingRequired = false; mNestedEventsCounter = 0; + mAllEventFlags = 0; } SmartScript::~SmartScript() @@ -4133,35 +4134,35 @@ void SmartScript::FillScript(SmartAIEventList e, WorldObject* obj, AreaTriggerEn if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_ALL)//if has instance flag add only if in it { - if (obj && obj->GetMap()->IsDungeon()) + if (!(obj && obj->GetMap()->IsDungeon())) + continue; + + // TODO: fix it for new maps and difficulties + switch (obj->GetMap()->GetDifficultyID()) { - // TODO: fix it for new maps and difficulties - switch (obj->GetMap()->GetDifficultyID()) - { - case DIFFICULTY_NORMAL: - case DIFFICULTY_10_N: - if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_0) - mEvents.emplace_back(std::move(scriptholder)); - break; - case DIFFICULTY_HEROIC: - case DIFFICULTY_25_N: - if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_1) - mEvents.emplace_back(std::move(scriptholder)); - break; - case DIFFICULTY_10_HC: - if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_2) - mEvents.emplace_back(std::move(scriptholder)); - break; - case DIFFICULTY_25_HC: - if (scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_3) - mEvents.emplace_back(std::move(scriptholder)); - break; - default: - break; - } + case DIFFICULTY_NORMAL: + case DIFFICULTY_10_N: + if (!(scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_0)) + continue; + break; + case DIFFICULTY_HEROIC: + case DIFFICULTY_25_N: + if (!(scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_1)) + continue; + break; + case DIFFICULTY_10_HC: + if (!(scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_2)) + continue; + break; + case DIFFICULTY_25_HC: + if (!(scriptholder.event.event_flags & SMART_EVENT_FLAG_DIFFICULTY_3)) + continue; + break; + default: + break; } - continue; } + mAllEventFlags |= scriptholder.event.event_flags; mEvents.push_back(scriptholder);//NOTE: 'world(0)' events still get processed in ANY instance mode } } diff --git a/src/server/game/AI/SmartScripts/SmartScript.h b/src/server/game/AI/SmartScripts/SmartScript.h index 10c7da17af4..c46a6b94421 100644 --- a/src/server/game/AI/SmartScripts/SmartScript.h +++ b/src/server/game/AI/SmartScripts/SmartScript.h @@ -60,6 +60,7 @@ class TC_GAME_API SmartScript WorldObject* GetBaseObject() const; WorldObject* GetBaseObjectOrUnit(Unit* unit); WorldObject* GetBaseObjectOrPlayerTrigger() const; + bool HasAnyEventWithFlag(uint32 flag) const { return mAllEventFlags & flag; } static bool IsUnit(WorldObject* obj); static bool IsPlayer(WorldObject* obj); static bool IsCreature(WorldObject* obj); @@ -138,6 +139,7 @@ class TC_GAME_API SmartScript uint32 mCurrentPriority; bool mEventSortingRequired; uint32 mNestedEventsCounter; + uint32 mAllEventFlags; // Max number of nested ProcessEventsFor() calls to avoid infinite loops static constexpr uint32 MAX_NESTED_EVENTS = 10; |