aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2021-03-28 18:20:57 +0200
committerShauren <shauren.trinity@gmail.com>2021-03-28 20:22:05 +0200
commit2398c1e23c57cf5b6ac778b09a09d28e2704fd75 (patch)
tree9ed1ea8c9ac016a64937032fec2339ca279a13c6 /src
parent46a81ea1f440b91611bc7b849ac09d523a041878 (diff)
Core/Spells: Implemented SUMMON_PROP_FLAG_PERSONAL_GROUP_SPAWN
Diffstat (limited to 'src')
-rw-r--r--src/server/game/DataStores/DBCEnums.h4
-rw-r--r--src/server/game/Entities/Object/Object.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp13
-rw-r--r--src/server/game/Entities/Player/Player.h1
-rw-r--r--src/server/game/Spells/SpellEffects.cpp17
5 files changed, 34 insertions, 5 deletions
diff --git a/src/server/game/DataStores/DBCEnums.h b/src/server/game/DataStores/DBCEnums.h
index 920e88ddbbf..537cc256c07 100644
--- a/src/server/game/DataStores/DBCEnums.h
+++ b/src/server/game/DataStores/DBCEnums.h
@@ -1431,7 +1431,7 @@ enum SummonPropFlags
SUMMON_PROP_FLAG_UNK2 = 0x00000002, // 616 spells in 3.0.3, something friendly
SUMMON_PROP_FLAG_UNK3 = 0x00000004, // 22 spells in 3.0.3, no idea...
SUMMON_PROP_FLAG_UNK4 = 0x00000008, // 49 spells in 3.0.3, some mounts
- SUMMON_PROP_FLAG_PERSONAL_SPAWN = 0x00000010, // Personal Spawn (creature visible only by summoner)
+ SUMMON_PROP_FLAG_PERSONAL_SPAWN = 0x00000010, // Only Visible to Summoner
SUMMON_PROP_FLAG_UNK6 = 0x00000020, // 0 spells in 3.3.5, unused
SUMMON_PROP_FLAG_UNK7 = 0x00000040, // 12 spells in 3.0.3, no idea
SUMMON_PROP_FLAG_UNK8 = 0x00000080, // 4 spells in 3.0.3, no idea
@@ -1443,7 +1443,7 @@ enum SummonPropFlags
SUMMON_PROP_FLAG_UNK14 = 0x00002000, // Guides, player follows
SUMMON_PROP_FLAG_UNK15 = 0x00004000, // Force of Nature, Shadowfiend, Feral Spirit, Summon Water Elemental
SUMMON_PROP_FLAG_UNK16 = 0x00008000, // Light/Dark Bullet, Soul/Fiery Consumption, Twisted Visage, Twilight Whelp. Phase related?
- SUMMON_PROP_FLAG_UNK17 = 0x00010000,
+ SUMMON_PROP_FLAG_PERSONAL_GROUP_SPAWN = 0x00010000, // Only Visible to Summoner's Group
SUMMON_PROP_FLAG_UNK18 = 0x00020000,
SUMMON_PROP_FLAG_UNK19 = 0x00040000,
SUMMON_PROP_FLAG_UNK20 = 0x00080000,
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index 9ddf63b99f9..01ade19f1d4 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -1424,6 +1424,10 @@ bool WorldObject::CheckPrivateObjectOwnerVisibility(WorldObject const* seer) con
if (_privateObjectOwner == seer->GetPrivateObjectOwner())
return true;
+ if (Player const* playerSeer = seer->ToPlayer())
+ if (playerSeer->IsInGroup(_privateObjectOwner))
+ return true;
+
return false;
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 8413516bf78..e0e75e06f4a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -24403,6 +24403,19 @@ void Player::ClearComboPoints()
SetPower(POWER_COMBO_POINTS, 0);
}
+bool Player::IsInGroup(ObjectGuid groupGuid) const
+{
+ if (Group const* group = GetGroup())
+ if (group->GetGUID() == groupGuid)
+ return true;
+
+ if (Group const* group = GetOriginalGroup())
+ if (group->GetGUID() == groupGuid)
+ return true;
+
+ return false;
+}
+
void Player::SetGroup(Group* group, int8 subgroup)
{
if (group == nullptr)
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 13114628a13..bf512a63fd0 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -2334,6 +2334,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
/*** GROUP SYSTEM ***/
/*********************************************************/
+ bool IsInGroup(ObjectGuid groupGuid) const;
Group* GetGroupInvite() const { return m_groupInvite; }
void SetGroupInvite(Group* group) { m_groupInvite = group; }
Group* GetGroup() { return m_group.getTarget(); }
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 8b835717872..619297d91ed 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1892,9 +1892,20 @@ void Spell::EffectSummonType(SpellEffIndex effIndex)
if (!m_originalCaster)
return;
- ObjectGuid privateObjectOwner;
- if (properties->Flags & SUMMON_PROP_FLAG_PERSONAL_SPAWN)
- privateObjectOwner = m_originalCaster->IsPrivateObject() ? m_originalCaster->GetPrivateObjectOwner() : m_originalCaster->GetGUID();
+ ObjectGuid privateObjectOwner = [&]()
+ {
+ if (!(properties->Flags & (SUMMON_PROP_FLAG_PERSONAL_SPAWN | SUMMON_PROP_FLAG_PERSONAL_GROUP_SPAWN)))
+ return ObjectGuid::Empty;
+
+ if (m_originalCaster->IsPrivateObject())
+ return m_originalCaster->GetPrivateObjectOwner();
+
+ if (properties->Flags & SUMMON_PROP_FLAG_PERSONAL_GROUP_SPAWN)
+ if (m_originalCaster->IsPlayer() && m_originalCaster->ToPlayer()->GetGroup())
+ return m_originalCaster->ToPlayer()->GetGroup()->GetGUID();
+
+ return m_originalCaster->GetGUID();
+ }();
int32 duration = m_spellInfo->CalcDuration(m_originalCaster);