TrinityCore
Loading...
Searching...
No Matches
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#include "WorldPacket.h"
29
39
41
43{
44 if (!IsInWorld())
45 {
48 }
49}
50
59
61{
63
64 if (ShouldBeRemoved())
65 Remove();
66}
67
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 _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(flags, data, target, this);
144 m_sceneObjectData->WriteCreate(flags, data, target, this);
145}
146
148{
150
152 m_objectData->WriteUpdate(flags, data, target, this);
153
155 m_sceneObjectData->WriteUpdate(flags, data, target, this);
156}
157
159 UF::SceneObjectData::Mask const& requestedSceneObjectMask, Player const* target, bool ignoreNestedChangesMask) 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(requestedObjectMask, buffer, target, this, ignoreNestedChangesMask);
177
178 if (valuesMask[TYPEID_SCENEOBJECT])
179 m_sceneObjectData->WriteUpdate(requestedSceneObjectMask, buffer, target, this, ignoreNestedChangesMask);
180
181 buffer.put<uint32>(sizePos, buffer.wpos() - sizePos - 4);
182
183 data->AddUpdateBlock();
184}
185
196
uint32_t uint32
Definition Define.h:154
uint16 flags
@ TYPEID_OBJECT
Definition ObjectGuid.h:38
@ TYPEID_SCENEOBJECT
Definition ObjectGuid.h:50
#define sObjectMgr
Definition ObjectMgr.h:1885
SceneType
Definition SceneObject.h:27
constexpr std::underlying_type< E >::type AsUnderlyingType(E enumValue)
Definition Util.h:565
ObjectGuid const & GetGUID() const
Definition BaseEntity.h:163
void SetUpdateFieldValue(UF::UpdateFieldPrivateSetter< T > setter, typename UF::UpdateFieldPrivateSetter< T >::value_type value)
Definition BaseEntity.h:221
WowCS::EntityFragmentsHolder m_entityFragments
Definition BaseEntity.h:353
UF::UpdateFieldHolder m_values
Definition BaseEntity.h:205
bool IsInWorld() const
Definition BaseEntity.h:158
void _Create(ObjectGuid const &guid)
Definition BaseEntity.h:218
CreateObjectBits m_updateFlag
Definition BaseEntity.h:352
ByteBuffer & PrepareValuesUpdateBuffer(UpdateData *data) const
TypeID m_objectTypeId
Definition BaseEntity.h:351
virtual UF::UpdateFieldFlag GetUpdateFieldFlagsFor(Player const *target) const
size_t wpos() const
Definition ByteBuffer.h:461
void put(std::size_t pos, T value)
Definition ByteBuffer.h:260
Definition Map.h:225
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:458
ObjectGuid::LowType GenerateLowGuid()
Definition Map.h:558
bool IsEmpty() const
Definition ObjectGuid.h:362
uint32 GetEntry() const
Definition ObjectGuid.h:334
uint64 LowType
Definition ObjectGuid.h:321
void BuildEntityFragmentsForValuesUpdateForPlayerWithMask(ByteBuffer &data, EnumFlag< UF::UpdateFieldFlag > flags) const
Definition Object.cpp:113
void SetEntry(uint32 entry)
Definition Object.h:90
virtual void ClearValuesChangesMask()
Definition Object.cpp:130
virtual void SetObjectScale(float scale)
Definition Object.h:93
UF::UpdateField< UF::ObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_OBJECT > m_objectData
Definition Object.h:161
static void InheritPhaseShift(WorldObject *target, WorldObject const *source)
void SendDirectMessage(WorldPacket const *data) const
Definition Player.cpp:6283
void BuildValuesUpdate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
void RemoveFromWorld() override
void BuildValuesUpdateForPlayerWithMask(UpdateData *data, UF::ObjectData::Mask const &requestedObjectMask, UF::SceneObjectData::Mask const &requestedSceneObjectMask, Player const *target, bool ignoreNestedChangesMask) const
bool ShouldBeRemoved() const
void RelocateStationaryPosition(Position const &pos)
Definition SceneObject.h:74
ObjectGuid GetOwnerGUID() const override
Definition SceneObject.h:70
void AddToWorld() override
static SceneObject * CreateSceneObject(uint32 sceneId, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner)
ObjectGuid _createdBySpellCast
Definition SceneObject.h:84
UF::UpdateField< UF::SceneObjectData, int32(WowCS::EntityFragment::CGObject), TYPEID_SCENEOBJECT > m_sceneObjectData
Definition SceneObject.h:78
void BuildValuesCreate(UF::UpdateFieldFlag flags, ByteBuffer &data, Player const *target) const override
bool Create(ObjectGuid::LowType lowGuid, SceneType type, uint32 sceneId, uint32 scriptPackageId, Map *map, Unit *creator, Position const &pos, ObjectGuid privateObjectOwner)
void ClearValuesChangesMask() override
void Update(uint32 diff) override
Mask const & GetChangesMask() const
MutableFieldReference< T, false > ModifyValue(UpdateField< T, BlockBit, Bit >(Derived::*field))
void ClearChangesMask(UpdateField< T, BlockBit, Bit >(Derived::*field))
bool HasChanged(uint32 index) const
Definition BaseEntity.h:83
uint32 GetChangedObjectTypeMask() const
Definition BaseEntity.h:81
Definition Unit.h:635
Aura * GetAura(uint32 spellId, ObjectGuid casterGUID=ObjectGuid::Empty, ObjectGuid itemCasterGUID=ObjectGuid::Empty, uint32 reqEffMask=0) const
Definition Unit.cpp:4700
bool BuildPacket(WorldPacket *packet)
void AddUpdateBlock()
Definition UpdateData.h:46
constexpr uint32 GetBlock(uint32 index) const
Definition UpdateMask.h:59
constexpr void Set(uint32 index)
Definition UpdateMask.h:91
constexpr uint32 GetMapId() const
Definition Position.h:216
Map * GetMap() const
Definition Object.h:411
void AddToWorld() override
Definition Object.cpp:365
void RemoveFromWorld() override
Definition Object.cpp:371
void SetZoneScript()
Definition Object.cpp:1384
void SetPrivateObjectOwner(ObjectGuid const &owner)
Definition Object.h:570
virtual void SetMap(Map *map)
Definition Object.cpp:1144
void AddObjectToRemoveList()
Definition Object.cpp:1174
void UpdatePositionData()
Definition Object.cpp:346
virtual void Update(uint32 diff)
Definition Object.cpp:245
uint32 GetGameTimeMS()
Definition GameTime.cpp:57
TC_GAME_API Unit * GetUnit(WorldObject const &, ObjectGuid const &guid)
UpdateFieldFlag
Definition UpdateField.h:37
constexpr void Relocate(float x, float y)
Definition Position.h:74
void operator()(Player const *player) const
uint32 ScenePackageId
Definition ObjectMgr.h:858
bool Insert(ValueType< ObjectType > object)
bool Remove(ValueType< ObjectType > object)
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, void const *data=nullptr)