aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Player
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/game/Entities/Player')
-rw-r--r--src/server/game/Entities/Player/Player.cpp105
1 files changed, 103 insertions, 2 deletions
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 337055bf4ab..469bbee9e74 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -130,6 +130,8 @@
#include "Util.h"
#include "Vehicle.h"
#include "VehiclePackets.h"
+#include "Vignette.h"
+#include "VignettePackets.h"
#include "World.h"
#include "WorldPacket.h"
#include "WorldSession.h"
@@ -7623,6 +7625,24 @@ void Player::UpdateZone(uint32 newZone, uint32 newArea)
guild->UpdateMemberData(this, GUILD_MEMBER_DATA_ZONEID, newZone);
UpdateCriteria(CriteriaType::EnterTopLevelArea, newZone);
UpdateCriteria(CriteriaType::LeaveTopLevelArea, oldZone);
+
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+
+ for (Vignettes::VignetteData const* vignette : GetMap()->GetInfiniteAOIVignettes())
+ {
+ if (!vignette->Data->GetFlags().HasFlag(VignetteFlags::ZoneInfiniteAOI))
+ continue;
+
+ if (vignette->ZoneID == newZone && Vignettes::CanSee(this, *vignette))
+ vignette->FillPacket(vignetteUpdate.Added);
+ else if (vignette->ZoneID == oldZone)
+ vignetteUpdate.Removed.push_back(vignette->Guid);
+ }
+
+ if (!vignetteUpdate.Added.IDs.empty() || !vignetteUpdate.Removed.empty())
+ SendDirectMessage(vignetteUpdate.Write());
+ }
}
}
@@ -23787,6 +23807,44 @@ inline void BeforeVisibilityDestroy<Creature>(Creature* t, Player* p)
{
if (p->GetPetGUID() == t->GetGUID() && t->IsPet())
t->ToPet()->Remove(PET_SAVE_NOT_IN_SLOT, true);
+
+ if (Vignettes::VignetteData const* vignette = t->GetVignette())
+ {
+ if (!vignette->Data->IsInfiniteAOI())
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+ vignetteUpdate.Removed.push_back(vignette->Guid);
+ p->SendDirectMessage(vignetteUpdate.Write());
+ }
+ }
+}
+
+template<>
+inline void BeforeVisibilityDestroy<Player>(Player* t, Player* p)
+{
+ if (Vignettes::VignetteData const* vignette = t->GetVignette())
+ {
+ if (!vignette->Data->IsInfiniteAOI())
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+ vignetteUpdate.Removed.push_back(vignette->Guid);
+ p->SendDirectMessage(vignetteUpdate.Write());
+ }
+ }
+}
+
+template<>
+inline void BeforeVisibilityDestroy<GameObject>(GameObject* t, Player* p)
+{
+ if (Vignettes::VignetteData const* vignette = t->GetVignette())
+ {
+ if (!vignette->Data->IsInfiniteAOI())
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+ vignetteUpdate.Removed.push_back(vignette->Guid);
+ p->SendDirectMessage(vignetteUpdate.Write());
+ }
+ }
}
void Player::UpdateVisibilityOf(Trinity::IteratorPair<WorldObject**> targets)
@@ -23850,8 +23908,20 @@ void Player::UpdateVisibilityOf(WorldObject* target)
{
if (!CanSeeOrDetect(target, false, true))
{
- if (target->GetTypeId() == TYPEID_UNIT)
- BeforeVisibilityDestroy<Creature>(target->ToCreature(), this);
+ switch (target->GetTypeId())
+ {
+ case TYPEID_UNIT:
+ BeforeVisibilityDestroy<Creature>(target->ToCreature(), this);
+ break;
+ case TYPEID_PLAYER:
+ BeforeVisibilityDestroy<Player>(target->ToPlayer(), this);
+ break;
+ case TYPEID_GAMEOBJECT:
+ BeforeVisibilityDestroy<GameObject>(target->ToGameObject(), this);
+ break;
+ default:
+ break;
+ }
if (!target->IsDestroyedObject())
target->SendOutOfRangeForPlayer(this);
@@ -23927,6 +23997,16 @@ void Player::UpdateTriggerVisibility()
void Player::SendInitialVisiblePackets(WorldObject* target) const
{
+ auto sendVignette = [](Vignettes::VignetteData const& vignette, Player const* where)
+ {
+ if (!vignette.Data->IsInfiniteAOI() && Vignettes::CanSee(where, vignette))
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+ vignette.FillPacket(vignetteUpdate.Added);
+ where->SendDirectMessage(vignetteUpdate.Write());
+ }
+ };
+
if (Unit* targetUnit = target->ToUnit())
{
SendAurasForTarget(targetUnit);
@@ -23935,6 +24015,14 @@ void Player::SendInitialVisiblePackets(WorldObject* target) const
if (targetUnit->HasUnitState(UNIT_STATE_MELEE_ATTACKING) && targetUnit->GetVictim())
targetUnit->SendMeleeAttackStart(targetUnit->GetVictim());
}
+
+ if (Vignettes::VignetteData const* vignette = targetUnit->GetVignette())
+ sendVignette(*vignette, this);
+ }
+ else if (GameObject* targetGo = target->ToGameObject())
+ {
+ if (Vignettes::VignetteData const* vignette = targetGo->GetVignette())
+ sendVignette(*vignette, this);
}
}
@@ -24233,6 +24321,19 @@ void Player::SendInitialPacketsAfterAddToMap()
{
UpdateVisibilityForPlayer();
+ // Send map wide vignettes before UpdateZone, that will send zone wide vignettes
+ // But first send on new map will wipe all vignettes on client
+ {
+ WorldPackets::Vignette::VignetteUpdate vignetteUpdate;
+ vignetteUpdate.ForceUpdate = true;
+
+ for (Vignettes::VignetteData const* vignette : GetMap()->GetInfiniteAOIVignettes())
+ if (!vignette->Data->GetFlags().HasFlag(VignetteFlags::ZoneInfiniteAOI) && Vignettes::CanSee(this, *vignette))
+ vignette->FillPacket(vignetteUpdate.Added);
+
+ SendDirectMessage(vignetteUpdate.Write());
+ }
+
// update zone
uint32 newzone, newarea;
GetZoneAndAreaId(newzone, newarea);