TrinityCore
Loading...
Searching...
No Matches
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}
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
bool IsInWorld() const
Definition BaseEntity.h:158
static bool IsPlayerMeetingCondition(Player const *player, uint32 conditionId)
Class used to access individual fields of database query result.
Definition Field.h:94
void RemoveInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition Map.cpp:482
void AddInfiniteAOIVignette(Vignettes::VignetteData *vignette)
Definition Map.cpp:469
ObjectGuid::LowType GenerateLowGuid()
Definition Map.h:558
Player * ToPlayer()
Definition Object.h:126
Unit * ToUnit()
Definition Object.h:116
bool IsQuestRewarded(uint32 quest_id) const
Definition Player.cpp:24889
Definition Unit.h:635
uint64 GetMaxHealth() const
Definition Unit.h:789
uint64 GetHealth() const
Definition Unit.h:788
constexpr uint32 GetMapId() const
Definition Position.h:216
virtual void SendMessageToSet(WorldPacket const *data, bool self) const
Definition Object.cpp:1094
Map * GetMap() const
Definition Object.h:411
WmoLocation const * GetCurrentWmo() const
Definition Object.h:338
float GetVisibilityRange() const
Definition Object.cpp:787
uint32 GetZoneId() const
Definition Object.h:332
WorldPacket const * GetRawPacket() const
Definition Packet.h:38
WorldPacket const * Write() override
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
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:92
uint32 PlayerConditionID
uint32 VisibleTrackingQuestID
EnumFlag< VignetteFlags > GetFlags() const
bool IsInfiniteAOI() const
VignetteEntry const * Data
Definition Vignette.h:41
void FillPacket(WorldPackets::Vignette::VignetteDataSet &dataSet) const
Definition Vignette.cpp:67
TaggedPosition<::Position::XYZ > Position