Project SkyFire Core
SkyFire 5.4.8 server core API documentation
Loading...
Searching...
No Matches
Corpse.cpp
Go to the documentation of this file.
1/*
2* This file is part of Project SkyFire https://www.projectskyfire.org.
3* See LICENSE.md file for Copyright information
4*/
5
6#include "Common.h"
7#include "Corpse.h"
8#include "DatabaseEnv.h"
9#include "GossipDef.h"
10#include "ObjectAccessor.h"
11#include "Opcodes.h"
12#include "Player.h"
13#include "UpdateMask.h"
14#include "World.h"
15
25
27{
29 if (!IsInWorld())
30 sObjectAccessor->AddObject(this);
31
33}
34
36{
38 if (IsInWorld())
39 sObjectAccessor->RemoveObject(this);
40
42}
43
44bool Corpse::Create(uint32 guidlow, Map* map)
45{
46 SetMap(map);
48 return true;
49}
50
51bool Corpse::Create(uint32 guidlow, Player* owner)
52{
53 ASSERT(owner);
54
55 Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation());
56
57 if (!IsPositionValid())
58 {
59 SF_LOG_ERROR("entities.player", "Corpse (guidlow %d, owner %s) not created. Suggested coordinates isn't valid (X: %f Y: %f)",
60 guidlow, owner->GetName().c_str(), owner->GetPositionX(), owner->GetPositionY());
61 return false;
62 }
63
64 //we need to assign owner's map for corpse
65 //in other way we will get a crash in Corpse::SaveToDB()
66 SetMap(owner->GetMap());
67
69
72
74
75 return true;
76}
77
79{
80 // prevent DB data inconsistence problems and duplicates
81 SQLTransaction trans = CharacterDatabase.BeginTransaction();
82 DeleteFromDB(trans);
83
84 uint16 index = 0;
85 PreparedStatement* stmt = CharacterDatabase.GetPreparedStatement(CHAR_INS_CORPSE);
86 stmt->setUInt32(index++, GetGUIDLow()); // corpseGuid
87 stmt->setUInt32(index++, GUID_LOPART(GetOwnerGUID())); // guid
88 stmt->setFloat(index++, GetPositionX()); // posX
89 stmt->setFloat(index++, GetPositionY()); // posY
90 stmt->setFloat(index++, GetPositionZ()); // posZ
91 stmt->setFloat(index++, GetOrientation()); // orientation
92 stmt->setUInt16(index++, GetMapId()); // mapId
93 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_DISPLAY_ID)); // displayId
94 stmt->setString(index++, _ConcatFields(CORPSE_FIELD_ITEMS, EQUIPMENT_SLOT_END)); // itemCache
95 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_SKIN_ID)); // bytes1
97 stmt->setUInt8(index++, GetUInt32Value(CORPSE_FIELD_FLAGS)); // flags
98 stmt->setUInt8(index++, GetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS)); // dynFlags
99 stmt->setUInt32(index++, uint32(m_time)); // time
100 stmt->setUInt8(index++, uint8(GetType())); // corpseType
101 stmt->setUInt32(index++, GetInstanceId()); // instanceId
102 stmt->setUInt32(index++, GetPhaseMask()); // phaseMask
103 trans->Append(stmt);
104
105 CharacterDatabase.CommitTransaction(trans);
106}
107
109{
111 Corpse* corpse = ObjectAccessor::GetCorpse(*this, GetGUID());
112
113 if (!corpse)
114 {
115 SF_LOG_ERROR("entities.player", "Bones %u not found in world.", GetGUIDLow());
116 return;
117 }
118
120}
121
123{
124 PreparedStatement* stmt = NULL;
126 {
127 // Only specific bones
128 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_CORPSE);
129 stmt->setUInt32(0, GetGUIDLow());
130 }
131 else
132 {
133 // all corpses (not bones)
134 stmt = CharacterDatabase.GetPreparedStatement(CHAR_DEL_PLAYER_CORPSES);
136 }
137 trans->Append(stmt);
138}
139
141{
142 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
143 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, phaseMask, corpseGuid, guid FROM corpse WHERE corpseType <> 0
144
145 uint32 ownerGuid = fields[16].GetUInt32();
146 float posX = fields[0].GetFloat();
147 float posY = fields[1].GetFloat();
148 float posZ = fields[2].GetFloat();
149 float o = fields[3].GetFloat();
150 uint32 mapId = fields[4].GetUInt16();
151
153
154 SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32());
156 SetUInt32Value(CORPSE_FIELD_SKIN_ID, fields[7].GetUInt32());
158 SetUInt32Value(CORPSE_FIELD_FLAGS, fields[9].GetUInt8());
159 SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[10].GetUInt8());
161
162 m_time = time_t(fields[11].GetUInt32());
163
164 uint32 instanceId = fields[13].GetUInt32();
165 uint32 phaseMask = fields[14].GetUInt32();
166
167 // place
168 SetLocationInstanceId(instanceId);
169 SetLocationMapId(mapId);
170 SetPhaseMask(phaseMask, false);
171 Relocate(posX, posY, posZ, o);
172
173 if (!IsPositionValid())
174 {
175 SF_LOG_ERROR("entities.player", "Corpse (guid: %u, owner: %u) is not created, given coordinates are not valid (X: %f, Y: %f, Z: %f)",
176 GetGUIDLow(), GUID_LOPART(GetOwnerGUID()), posX, posY, posZ);
177 return false;
178 }
179
181 return true;
182}
183
184bool Corpse::IsExpired(time_t t) const
185{
187 return m_time < t - 60 * MINUTE;
188 else
189 return m_time < t - 3 * DAY;
190}
@ CHAR_DEL_PLAYER_CORPSES
@ CHAR_DEL_CORPSE
@ CHAR_INS_CORPSE
@ MINUTE
Definition Common.h:119
@ DAY
Definition Common.h:121
CorpseType
Definition Corpse.h:15
@ CORPSE_BONES
Definition Corpse.h:16
std::uint8_t uint8
Definition Define.h:79
std::uint32_t uint32
Definition Define.h:77
std::uint16_t uint16
Definition Define.h:78
#define ASSERT
Definition Errors.h:29
#define SF_LOG_ERROR(filterType__,...)
Definition Log.h:143
@ TYPEID_CORPSE
Definition Object.h:58
@ TYPEMASK_CORPSE
Definition Object.h:44
#define sObjectAccessor
uint32 GUID_LOPART(uint64 x)
@ HIGHGUID_CORPSE
@ HIGHGUID_PLAYER
uint64 MAKE_NEW_GUID(uint32 l, uint32 e, uint32 h)
@ EQUIPMENT_SLOT_END
Definition Player.h:708
Skyfire::AutoPtr< Transaction, Skyfire::Mutex > SQLTransaction
Definition Transaction.h:42
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:31
@ CORPSE_FIELD_FLAGS
@ CORPSE_FIELD_FACIAL_HAIR_STYLE_ID
@ CORPSE_END
@ CORPSE_FIELD_DISPLAY_ID
@ CORPSE_FIELD_SKIN_ID
@ CORPSE_FIELD_OWNER
@ CORPSE_FIELD_DYNAMIC_FLAGS
@ CORPSE_FIELD_ITEMS
bool IsExpired(time_t t) const
Definition Corpse.cpp:184
void AddToWorld()
Definition Corpse.cpp:26
void SaveToDB()
Definition Corpse.cpp:78
void RemoveFromWorld()
Definition Corpse.cpp:35
bool LoadCorpseFromDB(uint32 guid, Field *fields)
Definition Corpse.cpp:140
void DeleteFromDB(SQLTransaction &trans)
Definition Corpse.cpp:122
Corpse(CorpseType type=CorpseType::CORPSE_BONES)
Definition Corpse.cpp:16
Player * lootRecipient
Definition Corpse.h:64
CorpseType m_type
Definition Corpse.h:69
GridCoord _gridCoord
Definition Corpse.h:71
bool Create(uint32 guidlow, Map *map)
Definition Corpse.cpp:44
time_t m_time
Definition Corpse.h:70
void DeleteBonesFromWorld()
Definition Corpse.cpp:108
uint64 GetOwnerGUID() const
Definition Corpse.h:54
CorpseType GetType() const
Definition Corpse.h:58
bool lootForBody
Definition Corpse.h:65
Definition Field.h:16
uint16 GetUInt16() const
Definition Field.h:69
float GetFloat() const
Definition Field.h:177
uint32 GetUInt32() const
Definition Field.h:105
Definition Map.h:238
static Corpse * GetCorpse(WorldObject const &u, uint64 guid)
uint16 m_objectType
Definition Object.h:242
uint64 GetGUID() const
Definition Object.h:119
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:325
bool IsInWorld() const
Definition Object.h:114
void _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition Object.cpp:1004
uint32 GetGUIDLow() const
Definition Object.h:120
void _Create(uint32 guidlow, uint32 entry, HighGuid guidhigh)
Definition Object.cpp:129
uint16 m_valuesCount
Definition Object.h:256
virtual void AddToWorld()
Definition Object.cpp:148
std::string _ConcatFields(uint16 startIndex, uint16 size) const
Definition Object.cpp:140
virtual void RemoveFromWorld()
Definition Object.cpp:161
virtual void SetObjectScale(float scale)
Definition Object.h:129
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:1038
uint16 m_updateFlag
Definition Object.h:245
TypeID m_objectTypeId
Definition Object.h:244
void SetUInt64Value(uint16 index, uint64 value)
Definition Object.cpp:1079
void setFloat(const uint8 index, const float value)
void setString(const uint8 index, const std::string &value)
void setUInt16(const uint8 index, const uint16 value)
void setUInt32(const uint8 index, const uint32 value)
void setUInt8(const uint8 index, const uint8 value)
uint32 GetMapId() const
Definition Object.h:546
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:3219
void _Create(uint32 guidlow, HighGuid guidhigh, uint32 phaseMask)
Definition Object.cpp:1581
uint32 GetPhaseMask() const
Definition Object.h:643
Map * GetMap() const
Definition Object.h:740
void SetLocationInstanceId(uint32 _instanceId)
Definition Object.h:827
void SetLocationMapId(uint32 _mapId)
Definition Object.h:826
uint32 GetInstanceId() const
Definition Object.h:638
std::string const & GetName() const
Definition Object.h:664
virtual void SetMap(Map *map)
Definition Object.cpp:2514
void AddObjectToRemoveList()
Definition Object.cpp:2550
WorldObject(bool isWorldObject)
Definition Object.cpp:1514
CharacterDatabaseWorkerPool CharacterDatabase
Accessor to the character database.
Definition Main.cpp:41
GridCoord ComputeGridCoord(float x, float y)
float GetPositionZ() const
Definition Object.h:330
float GetOrientation() const
Definition Object.h:331
bool IsPositionValid() const
Definition Object.cpp:2049
float GetPositionX() const
Definition Object.h:328
float GetPositionY() const
Definition Object.h:329
void Relocate(float x, float y)
Definition Object.h:302