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
38}
39
41
43{
44 if (!IsInWorld())
45 {
48 }
49}
50
52{
53 if (IsInWorld())
54 {
57 }
58}
59
61{
63
64 if (ShouldBeRemoved())
65 Remove();
66}
67
69{
70 if (IsInWorld())
72}
73
75{
76 Unit* creator = ObjectAccessor::GetUnit(*this, GetOwnerGUID());
77 if (!creator)
78 return true;
79
81 {
82 // search for a dummy aura on creator
83 Aura const* linkedAura = creator->GetAura(_createdBySpellCast.GetEntry(), [this](Aura const* aura)
84 {
85 return aura->GetCastId() == _createdBySpellCast;
86 });
87 if (!linkedAura)
88 return true;
89 }
90
91 return false;
92}
93
94SceneObject* SceneObject::CreateSceneObject(uint32 sceneId, Unit* creator, Position const& pos, ObjectGuid privateObjectOwner)
95{
96 SceneTemplate const* sceneTemplate = sObjectMgr->GetSceneTemplate(sceneId);
97 if (!sceneTemplate)
98 return nullptr;
99
101
102 SceneObject* sceneObject = new SceneObject();
103 if (!sceneObject->Create(lowGuid, SceneType::Normal, sceneId, sceneTemplate ? sceneTemplate->ScenePackageId : 0, creator->GetMap(), creator, pos, privateObjectOwner))
104 {
105 delete sceneObject;
106 return nullptr;
107 }
108
109 return sceneObject;
110}
111
112bool SceneObject::Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sceneId, uint32 scriptPackageId, Map* map, Unit* creator,
113 Position const& pos, ObjectGuid privateObjectOwner)
114{
115 SetMap(map);
116 Relocate(pos);
118
119 SetPrivateObjectOwner(privateObjectOwner);
120
121 Object::_Create(ObjectGuid::Create<HighGuid::SceneObject>(GetMapId(), sceneId, lowGuid));
123
126
127 SetEntry(scriptPackageId);
128 SetObjectScale(1.0f);
129
134
135 if (!GetMap()->AddToMap(this))
136 return false;
137
138 return true;
139}
140
142{
143 m_objectData->WriteCreate(*data, flags, this, target);
144 m_sceneObjectData->WriteCreate(*data, flags, this, target);
145}
146
148{
150
152 m_objectData->WriteUpdate(*data, flags, this, target);
153
155 m_sceneObjectData->WriteUpdate(*data, flags, this, target);
156}
157
159 UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target) const
160{
163 if (requestedObjectMask.IsAnySet())
164 valuesMask.Set(TYPEID_OBJECT);
165
166 if (requestedSceneObjectMask.IsAnySet())
167 valuesMask.Set(TYPEID_SCENEOBJECT);
168
170 std::size_t sizePos = buffer.wpos();
171 buffer << uint32(0);
173 buffer << uint32(valuesMask.GetBlock(0));
174
175 if (valuesMask[TYPEID_OBJECT])
176 m_objectData->WriteUpdate(buffer, requestedObjectMask, true, this, target);
177
178 if (valuesMask[TYPEID_SCENEOBJECT])
179 m_sceneObjectData->WriteUpdate(buffer, requestedSceneObjectMask, true, this, target);
180
181 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
182
183 data->AddUpdateBlock();
184}
185
187{
188 UpdateData udata(Owner->GetMapId());
189 WorldPacket packet;
190
192
193 udata.BuildPacket(&packet);
194 player->SendDirectMessage(&packet);
195}
196
198{
201}
uint32_t uint32
Definition: Define.h:142
uint16 flags
Definition: DisableMgr.cpp:49
@ TYPEID_OBJECT
Definition: ObjectGuid.h:37
@ TYPEID_SCENEOBJECT
Definition: ObjectGuid.h:49
@ TYPEMASK_SCENEOBJECT
Definition: ObjectGuid.h:69
#define sObjectMgr
Definition: ObjectMgr.h:1986
SceneType
Definition: SceneObject.h:27
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition: Util.h:528
size_t wpos() const
Definition: ByteBuffer.h:438
void put(std::size_t pos, T value)
Definition: ByteBuffer.h:246
Definition: Map.h:223
MapStoredObjectTypesContainer & GetObjectsStore()
Definition: Map.h:456
ObjectGuid::LowType GenerateLowGuid()
Definition: Map.h:553
bool IsEmpty() const
Definition: ObjectGuid.h:322
uint32 GetEntry() const
Definition: ObjectGuid.h:294
uint64 LowType
Definition: ObjectGuid.h:281
uint16 m_objectType
Definition: Object.h:442
bool IsInWorld() const
Definition: Object.h:190
CreateObjectBits m_updateFlag
Definition: Object.h:445
virtual void ClearUpdateMask(bool remove)
Definition: Object.cpp:854
void SetUpdateFieldValue(UF::UpdateFieldSetter< T > setter, typename UF::UpdateFieldSetter< T >::value_type value)
Definition: Object.h:326
UF::UpdateFieldHolder m_values
Definition: Object.h:303
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer *data, EnumFlag< UF::UpdateFieldFlag > flags) const
Definition: Object.cpp:251
void _Create(ObjectGuid const &guid)
Definition: Object.cpp:104
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
Definition: Object.cpp:273
static ObjectGuid GetGUID(Object const *o)
Definition: Object.h:195
WowCS::EntityFragmentsHolder m_entityFragments
Definition: Object.h:446
void SetEntry(uint32 entry)
Definition: Object.h:198
virtual void SetObjectScale(float scale)
Definition: Object.h:201
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
Definition: Object.h:304
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
Definition: Object.cpp:838
TypeID m_objectTypeId
Definition: Object.h:444
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
void SendDirectMessage(WorldPacket const *data) const
Definition: Player.cpp:6322
void ClearUpdateMask(bool remove) override
void Remove()
Definition: SceneObject.cpp:68
void RemoveFromWorld() override
Definition: SceneObject.cpp:51
bool ShouldBeRemoved() const
Definition: SceneObject.cpp:74
void RelocateStationaryPosition(Position const &pos)
Definition: SceneObject.h:76
ObjectGuid GetOwnerGUID() const override
Definition: SceneObject.h:69
void AddToWorld() override
Definition: SceneObject.cpp:42
static SceneObject * CreateSceneObject(uint32 sceneId, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner)
Definition: SceneObject.cpp:94
ObjectGuid _createdBySpellCast
Definition: SceneObject.h:86
UF::UpdateField< UF::SceneObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_SCENEOBJECT > m_sceneObjectData
Definition: SceneObject.h:80
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 BuildValuesCreate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const override
void BuildValuesUpdate(ByteBuffer *data, UF::UpdateFieldFlag flags, Player const *target) const override
void Update(uint32 diff) override
Definition: SceneObject.cpp:60
Mask const & GetChangesMask() const
Definition: UpdateField.h:614
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
Definition: Object.h:132
uint32 GetChangedObjectTypeMask() const
Definition: Object.h:130
Definition: Unit.h:631
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition: Unit.cpp:4629
bool BuildPacket(WorldPacket *packet)
Definition: UpdateData.cpp:40
void AddUpdateBlock()
Definition: UpdateData.h:49
constexpr uint32 GetBlock(uint32 index) const
Definition: UpdateMask.h:59
constexpr void Set(uint32 index)
Definition: UpdateMask.h:90
constexpr uint32 GetMapId() const
Definition: Position.h:215
Map * GetMap() const
Definition: Object.h:762
void AddToWorld() override
Definition: Object.cpp:1076
void RemoveFromWorld() override
Definition: Object.cpp:1082
void SetZoneScript()
Definition: Object.cpp:2110
void SetPrivateObjectOwner(ObjectGuid const &owner)
Definition: Object.h:926
virtual void SetMap(Map *map)
Definition: Object.cpp:1865
void AddObjectToRemoveList()
Definition: Object.cpp:1895
void UpdatePositionData()
Definition: Object.cpp:1057
virtual void Update(uint32 diff)
Definition: Object.cpp:956
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:90
bool SceneObject
Definition: Object.h:100
constexpr void Relocate(float x, float y)
Definition: Position.h:73
void operator()(Player const *player) const
uint32 ScenePackageId
Definition: ObjectMgr.h:863
bool Remove(ObjectType *object)
Definition: TypeContainer.h:75
bool Insert(ObjectType *object)
Definition: TypeContainer.h:69
UpdateField< uint32, 0, 4 > SceneType
UpdateField< int32, 0, 1 > ScriptPackageID
UpdateField< ObjectGuid, 0, 3 > CreatedBy
UpdateField< uint32, 0, 2 > RndSeedVal
void Add(EntityFragment fragment, bool update)