aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorccrs <ccrs@users.noreply.github.com>2025-10-10 17:42:31 +0200
committerccrs <ccrs@users.noreply.github.com>2025-10-10 17:43:04 +0200
commita4cea2186acdfa09c99a095420092a042ac35cfb (patch)
treecf642cfa8f6db55747de96bb7c332d07a0c84654 /src
parentbc68d013da92f70c20a1dbed16e5c6b8bcba48ae (diff)
Core/Game: implement combat args in the new SetAggresiveStateEvent
Diffstat (limited to 'src')
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.cpp11
-rw-r--r--src/server/game/AI/ScriptedAI/ScriptedCreature.h5
-rw-r--r--src/server/game/Miscellaneous/CommonHelpers.cpp24
-rw-r--r--src/server/game/Miscellaneous/CommonHelpers.h17
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;
};
}
}