aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEngilas <shorks@ya.ru>2021-02-14 16:38:06 +0300
committerShauren <shauren.trinity@gmail.com>2022-03-06 21:40:42 +0100
commit8a4d731d55af63210e660727dc0aea68c8ecce05 (patch)
tree5a2c94666a46613c710e951066b987f31e12347d
parent3fe47c167ff3d69a7f8a736301af0403e7325407 (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)
-rw-r--r--src/server/game/AI/SmartScripts/SmartAI.cpp5
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.cpp53
-rw-r--r--src/server/game/AI/SmartScripts/SmartScript.h2
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;