aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/CombatManager.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2022-09-04 21:34:47 +0200
committerShauren <shauren.trinity@gmail.com>2022-09-05 22:23:02 +0200
commit9bfc29f4aff01cd7f366faffcda0a84071970d6a (patch)
treee227cc2ee422b88d50b7560096be40d31ed4b5c7 /src/server/game/Combat/CombatManager.cpp
parentff99952dfb7d2b532de2d1aedc825fb96038f4c2 (diff)
Core/Combat: Allow PvE combat references to become suppressed, just like PvP ones
(cherry picked from commit e8dfd8c25c69247b17bc9359dfbe3a1d96ef98bf)
Diffstat (limited to 'src/server/game/Combat/CombatManager.cpp')
-rw-r--r--src/server/game/Combat/CombatManager.cpp65
1 files changed, 39 insertions, 26 deletions
diff --git a/src/server/game/Combat/CombatManager.cpp b/src/server/game/Combat/CombatManager.cpp
index 96508afa938..6367c7f5f5e 100644
--- a/src/server/game/Combat/CombatManager.cpp
+++ b/src/server/game/Combat/CombatManager.cpp
@@ -84,18 +84,8 @@ void CombatReference::EndCombat()
delete this;
}
-bool PvPCombatReference::Update(uint32 tdiff)
+void CombatReference::Refresh()
{
- if (_combatTimer <= tdiff)
- return false;
- _combatTimer -= tdiff;
- return true;
-}
-
-void PvPCombatReference::Refresh()
-{
- _combatTimer = PVP_COMBAT_TIMEOUT;
-
bool needFirstAI = false, needSecondAI = false;
if (_suppressFirst)
{
@@ -114,7 +104,7 @@ void PvPCombatReference::Refresh()
CombatManager::NotifyAICombat(second, first);
}
-void PvPCombatReference::SuppressFor(Unit* who)
+void CombatReference::SuppressFor(Unit* who)
{
Suppress(who);
if (who->GetCombatManager().UpdateOwnerCombatState())
@@ -122,6 +112,19 @@ void PvPCombatReference::SuppressFor(Unit* who)
ai->JustExitedCombat();
}
+bool PvPCombatReference::Update(uint32 tdiff)
+{
+ if (_combatTimer <= tdiff)
+ return false;
+ _combatTimer -= tdiff;
+ return true;
+}
+
+void PvPCombatReference::RefreshTimer()
+{
+ _combatTimer = PVP_COMBAT_TIMEOUT;
+}
+
CombatManager::~CombatManager()
{
ASSERT(_pveRefs.empty(), "CombatManager::~CombatManager - %s: we still have %zu PvE combat references, one of them is with %s", _owner->GetGUID().ToString().c_str(), _pveRefs.size(), _pveRefs.begin()->first.ToString().c_str());
@@ -144,10 +147,18 @@ void CombatManager::Update(uint32 tdiff)
}
}
+bool CombatManager::HasPvECombat() const
+{
+ for (auto const& [guid, ref] : _pveRefs)
+ if (!ref->IsSuppressedFor(_owner))
+ return true;
+ return false;
+}
+
bool CombatManager::HasPvECombatWithPlayers() const
{
for (std::pair<ObjectGuid const, CombatReference*> const& reference : _pveRefs)
- if (reference.second->GetOther(_owner)->GetTypeId() == TYPEID_PLAYER)
+ if (!reference.second->IsSuppressedFor(_owner) && reference.second->GetOther(_owner)->GetTypeId() == TYPEID_PLAYER)
return true;
return false;
@@ -163,25 +174,29 @@ bool CombatManager::HasPvPCombat() const
Unit* CombatManager::GetAnyTarget() const
{
- if (!_pveRefs.empty())
- return _pveRefs.begin()->second->GetOther(_owner);
+ for (auto const& pair : _pveRefs)
+ if (!pair.second->IsSuppressedFor(_owner))
+ return pair.second->GetOther(_owner);
for (auto const& pair : _pvpRefs)
if (!pair.second->IsSuppressedFor(_owner))
return pair.second->GetOther(_owner);
return nullptr;
}
-bool CombatManager::SetInCombatWith(Unit* who, bool suppressPvpSecond)
+bool CombatManager::SetInCombatWith(Unit* who, bool addSecondUnitSuppressed)
{
// Are we already in combat? If yes, refresh pvp combat
- auto it = _pvpRefs.find(who->GetGUID());
- if (it != _pvpRefs.end())
+ if (PvPCombatReference* existingPvpRef = Trinity::Containers::MapGetValuePtr(_pvpRefs, who->GetGUID()))
{
- it->second->Refresh();
+ existingPvpRef->RefreshTimer();
+ existingPvpRef->Refresh();
return true;
}
- else if (_pveRefs.find(who->GetGUID()) != _pveRefs.end())
+ if (CombatReference* existingPveRef = Trinity::Containers::MapGetValuePtr(_pveRefs, who->GetGUID()))
+ {
+ existingPveRef->Refresh();
return true;
+ }
// Otherwise, check validity...
if (!CombatManager::CanBeginCombat(_owner, who))
@@ -190,15 +205,13 @@ bool CombatManager::SetInCombatWith(Unit* who, bool suppressPvpSecond)
// ...then create new reference
CombatReference* ref;
if (_owner->IsControlledByPlayer() && who->IsControlledByPlayer())
- {
- PvPCombatReference* refPvp = new PvPCombatReference(_owner, who);
- if (suppressPvpSecond)
- refPvp->SuppressFor(who);
- ref = refPvp;
- }
+ ref = new PvPCombatReference(_owner, who);
else
ref = new CombatReference(_owner, who);
+ if (addSecondUnitSuppressed)
+ ref->Suppress(who);
+
// ...and insert it into both managers
PutReference(who->GetGUID(), ref);
who->GetCombatManager().PutReference(_owner->GetGUID(), ref);