TrinityCore
Vignette.cpp
Go to the documentation of this file.
1/*
2 * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms of the GNU General Public License as published by the
6 * Free Software Foundation; either version 2 of the License, or (at your
7 * option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful, but WITHOUT
10 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
12 * more details.
13 *
14 * You should have received a copy of the GNU General Public License along
15 * with this program. If not, see <http://www.gnu.org/licenses/>.
16 */
17
18#include "Vignette.h"
19#include "CellImpl.h"
20#include "DB2Stores.h"
21#include "GridNotifiersImpl.h"
22#include "VignettePackets.h"
23
24namespace Vignettes
25{
26namespace
27{
28void UpdatePosition(VignetteData& vignette, WorldObject const* owner)
29{
30 vignette.Position = owner->GetPosition();
31 if (WmoLocation const* wmoLocation = owner->GetCurrentWmo())
32 {
33 vignette.WMOGroupID = wmoLocation->GroupId;
34 vignette.WMODoodadPlacementID = wmoLocation->UniqueId;
35 }
36}
37
38template<WorldPackets::Vignette::VignetteDataSet WorldPackets::Vignette::VignetteUpdate::* Field>
39void SendVignetteUpdate(VignetteData const& vignette, WorldObject const* owner)
40{
41 if (!owner->IsInWorld())
42 return;
43
45 vignette.FillPacket(vignetteUpdate.*Field);
46 vignetteUpdate.Write();
47
48 auto sender = [&](Player const* receiver)
49 {
50 if (CanSee(receiver, vignette))
51 receiver->SendDirectMessage(vignetteUpdate.GetRawPacket());
52 };
53
54 Trinity::MessageDistDeliverer notifier(owner, sender, owner->GetVisibilityRange());
55 Cell::VisitWorldObjects(owner, notifier, owner->GetVisibilityRange());
56}
57}
58
60{
61 dataSet.IDs.push_back(Guid);
62
63 WorldPackets::Vignette::VignetteData& data = dataSet.Data.emplace_back();
64 data.ObjGUID = Object;
65 data.Position = Position;
66 data.VignetteID = Data->ID;
67 data.ZoneID = ZoneID;
70}
71
72std::unique_ptr<VignetteData> Create(VignetteEntry const* vignetteData, WorldObject const* owner)
73{
74 std::unique_ptr<VignetteData> vignette = std::make_unique<VignetteData>();
75 vignette->Guid = ObjectGuid::Create<HighGuid::Vignette>(owner->GetMapId(), vignetteData->ID, owner->GetMap()->GenerateLowGuid<HighGuid::Vignette>());
76 vignette->Object = owner->GetGUID();
77 vignette->Position = owner->GetPosition();
78 vignette->Data = vignetteData;
79 vignette->ZoneID = owner->GetZoneId(); // not updateable
80 UpdatePosition(*vignette, owner);
81
82 if (vignetteData->IsInfiniteAOI())
83 owner->GetMap()->AddInfiniteAOIVignette(vignette.get());
84 else
85 SendVignetteUpdate<&WorldPackets::Vignette::VignetteUpdate::Added>(*vignette, owner);
86
87 return vignette;
88}
89
90void Update(VignetteData& vignette, WorldObject const* owner)
91{
92 UpdatePosition(vignette, owner);
93
94 if (vignette.Data->IsInfiniteAOI())
95 vignette.NeedUpdate = true;
96 else
97 SendVignetteUpdate<&WorldPackets::Vignette::VignetteUpdate::Updated>(vignette, owner);
98}
99
100void Remove(VignetteData& vignette, WorldObject const* owner)
101{
102 if (vignette.Data->IsInfiniteAOI())
103 owner->GetMap()->RemoveInfiniteAOIVignette(&vignette);
104 else
105 {
107 vignetteUpdate.Removed.push_back(vignette.Guid);
108 owner->SendMessageToSet(vignetteUpdate.Write(), true);
109 }
110}
111
112bool CanSee(Player const* player, VignetteData const& vignette)
113{
114 if (vignette.Data->GetFlags().HasFlag(VignetteFlags::ZoneInfiniteAOI))
115 if (vignette.ZoneID != player->GetZoneId())
116 return false;
117
118 if (vignette.Data->VisibleTrackingQuestID)
119 if (player->IsQuestRewarded(vignette.Data->VisibleTrackingQuestID))
120 return false;
121
122 if (PlayerConditionEntry const* playerCondition = sPlayerConditionStore.LookupEntry(vignette.Data->PlayerConditionID))
123 if (!ConditionMgr::IsPlayerMeetingCondition(player, playerCondition))
124 return false;
125
126 return true;
127}
128}
DB2Storage< PlayerConditionEntry > sPlayerConditionStore("PlayerCondition.db2", &PlayerConditionLoadInfo::Instance)
static bool IsPlayerMeetingCondition(Player const *player, PlayerConditionEntry const *condition)
Class used to access individual fields of database query result.
Definition: Field.h:90
void RemoveInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition: Map.cpp:515
void AddInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition: Map.cpp:502
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:519
bool IsInWorld() const
Definition: Object.h:154
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
bool IsQuestRewarded(uint32 quest_id) const
Definition: Player.cpp:24137
constexpr uint32 GetMapId() const
Definition: Position.h:201
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:1744
Map * GetMap() const
Definition: Object.h:624
WmoLocation const * GetCurrentWmo() const
Definition: Object.h:551
float GetVisibilityRange() const
Definition: Object.cpp:1447
uint32 GetZoneId() const
Definition: Object.h:545
WorldPacket const * GetRawPacket() const
Definition: Packet.h:38
WorldPacket const * Write() override
std::vector< ObjectGuid > Removed
std::unique_ptr< VignetteData > Create(VignetteEntry const *vignetteData, WorldObject const *owner)
Definition: Vignette.cpp:72
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:90
bool CanSee(Player const *player, VignetteData const &vignette)
Definition: Vignette.cpp:112
void Remove(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:100
static void VisitWorldObjects(WorldObject const *obj, T &visitor, float radius, bool dont_load=true)
Definition: CellImpl.h:191
constexpr void GetPosition(float &x, float &y) const
Definition: Position.h:81
uint32 PlayerConditionID
uint32 VisibleTrackingQuestID
EnumFlag< VignetteFlags > GetFlags() const
bool IsInfiniteAOI() const
VignetteEntry const * Data
Definition: Vignette.h:41
::Position Position
Definition: Vignette.h:40
uint32 WMODoodadPlacementID
Definition: Vignette.h:44
void FillPacket(WorldPackets::Vignette::VignetteDataSet &dataSet) const
Definition: Vignette.cpp:59
std::vector< VignetteData > Data
TaggedPosition<::Position::XYZ > Position