diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-09 00:54:27 +0100 |
| commit | fccf6fb72b60b08dfbe6d5fb17fba55239944fca (patch) | |
| tree | d34819afa3813592e60825b1f0d88e1262496dd1 /src/server/game/Entities/Player | |
| parent | 1439535c6ac2ca8db13990e4fee29d4c1312f87a (diff) | |
Core/Objects: Implemented vignettes
Diffstat (limited to 'src/server/game/Entities/Player')
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 105 |
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); |
