TrinityCore
SceneObject.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 "SceneObject.h"
19#include "GameTime.h"
20#include "Map.h"
21#include "ObjectAccessor.h"
22#include "ObjectMgr.h"
23#include "PhasingHandler.h"
24#include "Player.h"
25#include "SpellAuras.h"
26#include "UpdateData.h"
27#include "Util.h"
28
30{
33
36}
37
39
41{
42 if (!IsInWorld())
43 {
46 }
47}
48
50{
51 if (IsInWorld())
52 {
55 }
56}
57
59{
61
62 if (ShouldBeRemoved())
63 Remove();
64}
65
67{
68 if (IsInWorld())
70}
71
73{
74 Unit* creator = ObjectAccessor::GetUnit(*this, GetOwnerGUID());
75 if (!creator)
76 return true;
77
79 {
80 // search for a dummy aura on creator
81 Aura const* linkedAura = creator->GetAura(_createdBySpellCast.GetEntry(), [this](Aura const* aura)
82 {
83 return aura->GetCastId() == _createdBySpellCast;
84 });
85 if (!linkedAura)
86 return true;
87 }
88
89 return false;
90}
91
92SceneObject* SceneObject::CreateSceneObject(uint32 sceneId, Unit* creator, Position const& pos, ObjectGuid privateObjectOwner)
93{
94 SceneTemplate const* sceneTemplate = sObjectMgr->GetSceneTemplate(sceneId);
95 if (!sceneTemplate)
96 return nullptr;
97
99
100 SceneObject* sceneObject = new SceneObject();
101 if (!sceneObject->Create(lowGuid, SceneType::Normal, sceneId, sceneTemplate ? sceneTemplate->ScenePackageId : 0, creator->GetMap(), creator, pos, privateObjectOwner))
102 {
103 delete sceneObject;
104 return nullptr;
105 }
106
107 return sceneObject;
108}
109
110bool SceneObject::Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sceneId, uint32 scriptPackageId, Map* map, Unit* creator,
111 Position const& pos, ObjectGuid privateObjectOwner)
112{
113 SetMap(map);
114 Relocate(pos);
116
117 SetPrivateObjectOwner(privateObjectOwner);
118
119 Object::_Create(ObjectGuid::Create<HighGuid::SceneObject>(GetMapId(), sceneId, lowGuid));
121
124
125 SetEntry(scriptPackageId);
126 SetObjectScale(1.0f);
127
132
133 if (!GetMap()->AddToMap(this))
134 return false;
135
136 return true;
137}
138
139void SceneObject::BuildValuesCreate(ByteBuffer* data, Player const* target) const
140{
142 std::size_t sizePos = data->wpos();
143 *data << uint32(0);
144 *data << uint8(flags);
145 m_objectData->WriteCreate(*data, flags, this, target);
146 m_sceneObjectData->WriteCreate(*data, flags, this, target);
147 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
148}
149
150void SceneObject::BuildValuesUpdate(ByteBuffer* data, Player const* target) const
151{
153 std::size_t sizePos = data->wpos();
154 *data << uint32(0);
156
158 m_objectData->WriteUpdate(*data, flags, this, target);
159
161 m_sceneObjectData->WriteUpdate(*data, flags, this, target);
162
163 data->put<uint32>(sizePos, data->wpos() - sizePos - 4);
164}
165
167 UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target) const
168{
170 if (requestedObjectMask.IsAnySet())
171 valuesMask.Set(TYPEID_OBJECT);
172
173 if (requestedSceneObjectMask.IsAnySet())
174 valuesMask.Set(TYPEID_SCENEOBJECT);
175
177 std::size_t sizePos = buffer.wpos();
178 buffer << uint32(0);
179 buffer << uint32(valuesMask.GetBlock(0));
180
181 if (valuesMask[TYPEID_OBJECT])
182 m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target);
183
184 if (valuesMask[TYPEID_SCENEOBJECT])
185 m_sceneObjectData->WriteUpdate(buffer, requestedSceneObjectMask, true, this, target);
186
187 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
188
189 data->AddUpdateBlock();
190}
191
193{
194 UpdateData udata(Owner->GetMapId());
195 WorldPacket packet;
196
198
199 udata.BuildPacket(&packet);
200 player->SendDirectMessage(&packet);
201}
202
204{
207}
uint8_t uint8
Definition: Define.h:144
uint32_t uint32
Definition: Define.h:142
uint16 flags
Definition: DisableMgr.cpp:49
@ TYPEID_OBJECT
Definition: ObjectGuid.h:35
@ TYPEID_SCENEOBJECT
Definition: ObjectGuid.h:47
@ TYPEMASK_SCENEOBJECT
Definition: ObjectGuid.h:67
#define sObjectMgr
Definition: ObjectMgr.h:1946
SceneType
Definition: SceneObject.h:27
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:491
size_t wpos() const
Definition: ByteBuffer.h:412
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:220
Definition: Map.h:189
MapStoredObjectTypesContainer & GetObjectsStore()
Definition: Map.h:422
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:519
bool IsEmpty() const
Definition: ObjectGuid.h:319
uint32 GetEntry() const
Definition: ObjectGuid.h:291
uint64 LowType
Definition: ObjectGuid.h:278
uint16 m_objectType
Definition: Object.h:401
ObjectGuid const & GetGUID() const
Definition: Object.h:160
bool IsInWorld() const
Definition: Object.h:154
UF::UpdateField< UF::ObjectData, 0, TYPEID_OBJECT > m_objectData
Definition: Object.h:267
CreateObjectBits m_updateFlag
Definition: Object.h:404
virtual void ClearUpdateMask(bool remove)
Definition: Object.cpp:790
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:287
UF::UpdateFieldHolder m_values
Definition: Object.h:266
void _Create(ObjectGuid const &guid)
Definition: Object.cpp:101
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
Definition: Object.cpp:225
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:159
void SetEntry(uint32 entry)
Definition: Object.h:162
virtual void SetObjectScale(float scale)
Definition: Object.h:165
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
Definition: Object.cpp:770
TypeID m_objectTypeId
Definition: Object.h:403
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6324
void ClearUpdateMask(bool remove) override
void Remove()
Definition: SceneObject.cpp:66
UF::UpdateField< UF::SceneObjectData, 0, TYPEID_SCENEOBJECT > m_sceneObjectData
Definition: SceneObject.h:80
void RemoveFromWorld() override
Definition: SceneObject.cpp:49
bool ShouldBeRemoved() const
Definition: SceneObject.cpp:72
void RelocateStationaryPosition(Position const &pos)
Definition: SceneObject.h:76
ObjectGuid GetOwnerGUID() const override
Definition: SceneObject.h:69
void BuildValuesCreate(ByteBuffer *data, Player const *target) const override
void AddToWorld() override
Definition: SceneObject.cpp:40
static SceneObject * CreateSceneObject(uint32 sceneId, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner)
Definition: SceneObject.cpp:92
ObjectGuid _createdBySpellCast
Definition: SceneObject.h:86
void BuildValuesUpdate(ByteBuffer *data, Player const *target) const override
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::SceneObjectData::Mask const &requestedSceneObjectMask, Player const *target) const
bool Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sceneId, uint32 scriptPackageId, Map *map, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner)
void Update(uint32 diff) override
Definition: SceneObject.cpp:58
bool Remove(KEY_TYPE const &handle)
bool Insert(KEY_TYPE const &handle, SPECIFIC_TYPE *obj)
Mask const & GetChangesMask() const
Definition: UpdateField.h:605
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
Definition: UpdateField.h:683
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
Definition: UpdateField.h:690
bool HasChanged(uint32 index) const
Definition: UpdateField.h:701
uint32 GetChangedObjectTypeMask() const
Definition: UpdateField.h:696
Definition: Unit.h:627
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4560
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
void AddUpdateBlock()
Definition: UpdateData.h:49
uint32 GetBlock(uint32 index) const
Definition: UpdateMask.h:53
void Set(uint32 index)
Definition: UpdateMask.h:84
constexpr uint32 GetMapId() const
Definition: Position.h:201
Map * GetMap() const
Definition: Object.h:624
void AddToWorld() override
Definition: Object.cpp:1011
void RemoveFromWorld() override
Definition: Object.cpp:1017
void SetZoneScript()
Definition: Object.cpp:2011
void SetPrivateObjectOwner(ObjectGuid const &owner)
Definition: Object.h:786
virtual void SetMap(Map *map)
Definition: Object.cpp:1794
void AddObjectToRemoveList()
Definition: Object.cpp:1824
void UpdatePositionData()
Definition: Object.cpp:992
virtual void Update(uint32 diff)
Definition: Object.cpp:898
uint32 GetGameTimeMS()
Definition: GameTime.cpp:49
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
UpdateFieldFlag
Definition: UpdateField.h:34
bool Stationary
Definition: Object.h:88
bool SceneObject
Definition: Object.h:98
constexpr void Relocate(float x, float y)
Definition: Position.h:63
void operator()(Player const *player) const
uint32 ScenePackageId
Definition: ObjectMgr.h:856
UpdateField< uint32, 0, 4 > SceneType
UpdateField< int32, 0, 1 > ScriptPackageID
UpdateField< ObjectGuid, 0, 3 > CreatedBy
UpdateField< uint32, 0, 2 > RndSeedVal