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 "DB2Structure.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
38void UpdateHealth(VignetteData& vignette, Unit const* owner)
39{
40 vignette.HealthPercent = float(owner->GetHealth()) / float(owner->GetMaxHealth()); // converted to percentage in lua
41}
42
43template<WorldPackets::Vignette::VignetteDataSet WorldPackets::Vignette::VignetteUpdate::* Field>
44void SendVignetteUpdate(VignetteData const& vignette, WorldObject const* owner)
45{
46 if (!owner->IsInWorld())
47 return;
48
50 vignette.FillPacket(vignetteUpdate.*Field);
51 vignetteUpdate.Write();
52
53 auto sender = [&](Player const* receiver)
54 {
55 if (CanSee(receiver, vignette))
56 receiver->SendDirectMessage(vignetteUpdate.GetRawPacket());
57 };
58
59 if (Player const* playerOwner = owner->ToPlayer())
60 sender(playerOwner);
61
62 Trinity::MessageDistDeliverer notifier(owner, sender, owner->GetVisibilityRange());
63 Cell::VisitWorldObjects(owner, notifier, owner->GetVisibilityRange());
64}
65}
66
68{
69 dataSet.IDs.push_back(Guid);
70
71 WorldPackets::Vignette::VignetteData& data = dataSet.Data.emplace_back();
72 data.ObjGUID = Object;
73 data.Position = Position;
74 data.VignetteID = Data->ID;
75 data.ZoneID = ZoneID;
79}
80
81std::unique_ptr<VignetteData> Create(VignetteEntry const* vignetteData, WorldObject const* owner)
82{
83 std::unique_ptr<VignetteData> vignette = std::make_unique<VignetteData>();
84 vignette->Guid = ObjectGuid::Create<HighGuid::Vignette>(owner->GetMapId(), vignetteData->ID, owner->GetMap()->GenerateLowGuid<HighGuid::Vignette>());
85 vignette->Object = owner->GetGUID();
86 vignette->Position = owner->GetPosition();
87 vignette->Data = vignetteData;
88 vignette->ZoneID = owner->GetZoneId(); // not updateable
89 UpdatePosition(*vignette, owner);
90 if (Unit const* unitOwner = owner->ToUnit())
91 UpdateHealth(*vignette, unitOwner);
92
93 if (vignetteData->IsInfiniteAOI())
94 owner->GetMap()->AddInfiniteAOIVignette(vignette.get());
95 else
96 SendVignetteUpdate<&WorldPackets::Vignette::VignetteUpdate::Added>(*vignette, owner);
97
98 return vignette;
99}
100
101void Update(VignetteData& vignette, WorldObject const* owner)
102{
103 UpdatePosition(vignette, owner);
104 if (Unit const* unitOwner = owner->ToUnit())
105 UpdateHealth(vignette, unitOwner);
106
107 if (vignette.Data->IsInfiniteAOI())
108 vignette.NeedUpdate = true;
109 else
110 SendVignetteUpdate<&WorldPackets::Vignette::VignetteUpdate::Updated>(vignette, owner);
111}
112
113void Remove(VignetteData& vignette, WorldObject const* owner)
114{
115 if (vignette.Data->IsInfiniteAOI())
116 owner->GetMap()->RemoveInfiniteAOIVignette(&vignette);
117 else
118 {
120 vignetteUpdate.Removed.push_back(vignette.Guid);
121 owner->SendMessageToSet(vignetteUpdate.Write(), true);
122 }
123}
124
125bool CanSee(Player const* player, VignetteData const& vignette)
126{
127 if (vignette.Data->GetFlags().HasFlag(VignetteFlags::ZoneInfiniteAOI))
128 if (vignette.ZoneID != player->GetZoneId())
129 return false;
130
131 if (vignette.Data->VisibleTrackingQuestID)
132 if (player->IsQuestRewarded(vignette.Data->VisibleTrackingQuestID))
133 return false;
134
136 return false;
137
138 return true;
139}
140}
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
Class used to access individual fields of database query result.
Definition: Field.h:93
void RemoveInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition: Map.cpp:487
void AddInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition: Map.cpp:474
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:552
static Unit * ToUnit(Object *o)
Definition: Object.h:261
bool IsInWorld() const
Definition: Object.h:190
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:195
static Player * ToPlayer(Object *o)
Definition: Object.h:249
bool IsQuestRewarded(uint32 quest_id) const
Definition: Player.cpp:24576
Definition: Unit.h:630
uint64 GetMaxHealth() const
Definition: Unit.h:784
uint64 GetHealth() const
Definition: Unit.h:783
constexpr uint32 GetMapId() const
Definition: Position.h:215
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition: Object.cpp:1799
Map * GetMap() const
Definition: Object.h:749
WmoLocation const * GetCurrentWmo() const
Definition: Object.h:676
float GetVisibilityRange() const
Definition: Object.cpp:1496
uint32 GetZoneId() const
Definition: Object.h:670
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:81
void Update(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:101
bool CanSee(Player const *player, VignetteData const &vignette)
Definition: Vignette.cpp:125
void Remove(VignetteData &vignette, WorldObject const *owner)
Definition: Vignette.cpp:113
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:91
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:67
std::vector< VignetteData > Data
TaggedPosition<::Position::XYZ > Position