aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Combat/ThreatManager.cpp
diff options
context:
space:
mode:
authorTraesh <Traesh@users.noreply.github.com>2018-04-08 20:35:33 +0200
committerShauren <shauren.trinity@gmail.com>2018-04-08 21:35:33 +0300
commitb7bb5e6a98119512702519adecf559ecedc20743 (patch)
tree5bb6ece03e2048f50162341bb80869ef6b4cc203 /src/server/game/Combat/ThreatManager.cpp
parent66c559f15b574843bd3c2d5d2eb865018371f127 (diff)
Core/Spells: Implemented personal summons (#19231)
* By default determined by summon property flag SUMMON_PROP_FLAG_PERSONAL_SPAWN Closes #18254
Diffstat (limited to 'src/server/game/Combat/ThreatManager.cpp')
-rw-r--r--src/server/game/Combat/ThreatManager.cpp20
1 files changed, 19 insertions, 1 deletions
diff --git a/src/server/game/Combat/ThreatManager.cpp b/src/server/game/Combat/ThreatManager.cpp
index d9d86aa24b3..e3a8cd7bcb3 100644
--- a/src/server/game/Combat/ThreatManager.cpp
+++ b/src/server/game/Combat/ThreatManager.cpp
@@ -25,6 +25,7 @@
#include "UnitEvents.h"
#include "SpellAuras.h"
#include "SpellMgr.h"
+#include "TemporarySummon.h"
//==============================================================
//================= ThreatCalcHelper ===========================
@@ -415,11 +416,28 @@ void ThreatManager::addThreat(Unit* victim, float threat, SpellSchoolMask school
void ThreatManager::doAddThreat(Unit* victim, float threat)
{
uint32 redirectThreadPct = victim->GetRedirectThreatPercent();
+ Unit* redirectTarget = victim->GetRedirectThreatTarget();
+
+ // If victim is personnal spawn, redirect all aggro to summoner
+ if (TempSummon* tempSummonVictim = victim->ToTempSummon())
+ {
+ if (tempSummonVictim->IsVisibleBySummonerOnly())
+ {
+ // Personnal Spawns from same summoner can aggro each other
+ if (!GetOwner()->ToTempSummon() ||
+ !GetOwner()->ToTempSummon()->IsVisibleBySummonerOnly() ||
+ tempSummonVictim->GetSummonerGUID() != GetOwner()->ToTempSummon()->GetSummonerGUID())
+ {
+ redirectThreadPct = 100;
+ redirectTarget = tempSummonVictim->GetSummoner();
+ }
+ }
+ }
// must check > 0.0f, otherwise dead loop
if (threat > 0.0f && redirectThreadPct)
{
- if (Unit* redirectTarget = victim->GetRedirectThreatTarget())
+ if (redirectTarget)
{
float redirectThreat = CalculatePct(threat, redirectThreadPct);
threat -= redirectThreat;