diff options
| author | ccrs <ccrs@users.noreply.github.com> | 2025-10-10 17:42:31 +0200 |
|---|---|---|
| committer | ccrs <ccrs@users.noreply.github.com> | 2025-10-10 17:43:04 +0200 |
| commit | a4cea2186acdfa09c99a095420092a042ac35cfb (patch) | |
| tree | cf642cfa8f6db55747de96bb7c332d07a0c84654 /src/server | |
| parent | bc68d013da92f70c20a1dbed16e5c6b8bcba48ae (diff) | |
Core/Game: implement combat args in the new SetAggresiveStateEvent
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.cpp | 11 | ||||
| -rw-r--r-- | src/server/game/AI/ScriptedAI/ScriptedCreature.h | 5 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/CommonHelpers.cpp | 24 | ||||
| -rw-r--r-- | src/server/game/Miscellaneous/CommonHelpers.h | 17 |
4 files changed, 45 insertions, 12 deletions
diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp index ae53c97a496..a0b48a3b2f8 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.cpp @@ -490,11 +490,18 @@ void ScriptedAI::SetCombatMovement(bool allowMovement) _isCombatMovementAllowed = allowMovement; } -void ScriptedAI::SetAggressiveStateAfter(Milliseconds timer, Creature* who/* = nullptr*/, bool startCombat/* = true*/, Creature* summoner/* = nullptr*/) +void ScriptedAI::SetAggressiveStateAfter(Milliseconds timer, Creature* who/* = nullptr*/, bool startCombat/* = true*/, Creature* summoner/* = nullptr*/, StartCombatArgs const& combatArgs/* = { }*/) { if (!who) who = me; - who->m_Events.AddEvent(new Trinity::Helpers::Events::SetAggresiveStateEvent(who, startCombat, summoner->GetGUID()), who->m_Events.CalculateTime(timer)); + who->m_Events.AddEvent(new Trinity::Helpers::Events::SetAggresiveStateEvent(who, startCombat, summoner->GetGUID(), combatArgs), who->m_Events.CalculateTime(timer)); +} + +void ScriptedAI::DoAddEvent(Milliseconds timer, BasicEvent* event, WorldObject* who/* = nullptr*/) +{ + if (!who) + who = me; + who->m_Events.AddEvent(event, who->m_Events.CalculateTime(timer)); } // BossAI - for instanced bosses diff --git a/src/server/game/AI/ScriptedAI/ScriptedCreature.h b/src/server/game/AI/ScriptedAI/ScriptedCreature.h index 83858b784af..1175a09d0e9 100644 --- a/src/server/game/AI/ScriptedAI/ScriptedCreature.h +++ b/src/server/game/AI/ScriptedAI/ScriptedCreature.h @@ -18,6 +18,7 @@ #ifndef TRINITY_SCRIPTEDCREATURE_H #define TRINITY_SCRIPTEDCREATURE_H +#include "CommonHelpers.h" #include "Creature.h" // convenience include for scripts, all uses of ScriptedCreature also need Creature (except ScriptedCreature itself doesn't need Creature) #include "CreatureAI.h" #include "DBCEnums.h" @@ -246,7 +247,9 @@ struct TC_GAME_API ScriptedAI : public CreatureAI // return true for 25 man or 25 man heroic mode bool Is25ManRaid() const { return _difficulty & RAID_DIFFICULTY_MASK_25MAN; } - void SetAggressiveStateAfter(Milliseconds timer, Creature* who = nullptr, bool startCombat = true, Creature* summoner = nullptr); + void SetAggressiveStateAfter(Milliseconds timer, Creature* who = nullptr, bool startCombat = true, Creature* summoner = nullptr, StartCombatArgs const& combatArgs = { }); + + void DoAddEvent(Milliseconds timer, BasicEvent* event, WorldObject* who = nullptr); template <class T> inline T const& DUNGEON_MODE(T const& normal5, T const& heroic10) const diff --git a/src/server/game/Miscellaneous/CommonHelpers.cpp b/src/server/game/Miscellaneous/CommonHelpers.cpp index 77b2f32ef41..c00d4dc65f4 100644 --- a/src/server/game/Miscellaneous/CommonHelpers.cpp +++ b/src/server/game/Miscellaneous/CommonHelpers.cpp @@ -327,7 +327,7 @@ bool Trinity::Helpers::Entity::IsPlayerRangedAttacker(Player const* who) } } -Trinity::Helpers::Events::SetAggresiveStateEvent::SetAggresiveStateEvent(Creature* owner, bool startCombat/* = true*/, ObjectGuid summonerGUID/* = ObjectGuid::Empty*/) : _owner(owner), _startCombat(startCombat), _summonerGUID(summonerGUID) +Trinity::Helpers::Events::SetAggresiveStateEvent::SetAggresiveStateEvent(Creature* owner, bool startCombat/* = true*/, ObjectGuid summonerGUID/* = ObjectGuid::Empty*/, StartCombatArgs const& combatArgs/* = { }*/) : _owner(owner), _startCombat(startCombat), _summonerGUID(summonerGUID), _combatArgs(combatArgs) { } @@ -336,16 +336,26 @@ bool Trinity::Helpers::Events::SetAggresiveStateEvent::Execute(uint64 /*time*/, _owner->SetReactState(REACT_AGGRESSIVE); if (_startCombat) { - if (Unit* currentVictim = _owner->SelectVictim()) + if (!_summonerGUID.IsEmpty()) + { + if (Creature* summoner = ObjectAccessor::GetCreature(*_owner, _summonerGUID)) + if (summoner->IsEngaged() && summoner->IsAIEnabled() && _owner->IsAIEnabled()) + if (_combatArgs.AvoidTargetVictim) + { + if (Unit* target = summoner->AI()->SelectTarget(SelectTargetMethod::Random, 0, NonTankTargetSelector(summoner, _combatArgs.TargetPlayers))) + _owner->AI()->AttackStart(target); + } + else + { + if (Unit* target = summoner->AI()->SelectTarget(SelectTargetMethod::Random, 0, _combatArgs.Distance, _combatArgs.TargetPlayers)) + _owner->AI()->AttackStart(target); + } + } + else if (Unit* currentVictim = _owner->SelectVictim()) { if (_owner->IsAIEnabled()) _owner->AI()->AttackStart(currentVictim); } - else if (!_summonerGUID.IsEmpty()) - if (Creature* summoner = ObjectAccessor::GetCreature(*_owner, _summonerGUID)) - if (summoner->IsEngaged() && summoner->IsAIEnabled() && _owner->IsAIEnabled()) - if (Unit* target = summoner->AI()->SelectTarget(SelectTargetMethod::Random, 0, 0.0f, true)) - _owner->AI()->AttackStart(target); } return true; } diff --git a/src/server/game/Miscellaneous/CommonHelpers.h b/src/server/game/Miscellaneous/CommonHelpers.h index 228484fbc3d..d6cf1c870cd 100644 --- a/src/server/game/Miscellaneous/CommonHelpers.h +++ b/src/server/game/Miscellaneous/CommonHelpers.h @@ -25,6 +25,18 @@ class Creature; class Player; +struct TC_GAME_API StartCombatArgs +{ + StartCombatArgs() {} + StartCombatArgs& SetAvoidTargetVictim(bool value) { AvoidTargetVictim = value; return *this; } + StartCombatArgs& SetTargetPlayers(bool value) { TargetPlayers = value; return *this; } + StartCombatArgs& SetDistance(float value) { Distance = value; return *this; } + + bool AvoidTargetVictim = false; + bool TargetPlayers = true; + float Distance = 0.f; +}; + namespace Trinity { namespace Helpers @@ -38,10 +50,10 @@ namespace Trinity } namespace Events { - class SetAggresiveStateEvent : public BasicEvent + class TC_GAME_API SetAggresiveStateEvent : public BasicEvent { public: - SetAggresiveStateEvent(Creature* owner, bool startCombat = true, ObjectGuid summonerGUID = ObjectGuid::Empty); + SetAggresiveStateEvent(Creature* owner, bool startCombat = true, ObjectGuid summonerGUID = ObjectGuid::Empty, StartCombatArgs const& combatArgs = { }); bool Execute(uint64 /*time*/, uint32 /*diff*/) override; @@ -49,6 +61,7 @@ namespace Trinity Creature* _owner; bool const _startCombat; ObjectGuid const _summonerGUID; + StartCombatArgs const _combatArgs; }; } } |
