TrinityCore
Loading...
Searching...
No Matches
Corpse.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 "CharacterCache.h"
19#include "Common.h"
20#include "Corpse.h"
21#include "DBCStores.h"
22#include "GameTime.h"
23#include "Log.h"
24#include "Map.h"
25#include "Player.h"
26#include "UpdateData.h"
27#include "UpdateMask.h"
28#include "ObjectAccessor.h"
29#include "DatabaseEnv.h"
30#include "World.h"
31
45
47
49{
51 if (!IsInWorld())
53
55}
56
65
67{
68 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow));
69 return true;
70}
71
73{
74 ASSERT(owner);
75
76 Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation());
77
78 if (!IsPositionValid())
79 {
80 TC_LOG_ERROR("entities.player", "Corpse (guidlow {}, owner {}) not created. Suggested coordinates isn't valid (X: {} Y: {})",
81 guidlow, owner->GetName(), owner->GetPositionX(), owner->GetPositionY());
82 return false;
83 }
84
85 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow));
86 SetPhaseMask(owner->GetPhaseMask(), false);
87
88 SetObjectScale(1.0f);
90
92
93 return true;
94}
95
97{
98 // prevent DB data inconsistence problems and duplicates
99 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
100 DeleteFromDB(trans);
101
102 uint16 index = 0;
104 stmt->setUInt32(index++, GetOwnerGUID().GetCounter()); // guid
105 stmt->setFloat (index++, GetPositionX()); // posX
106 stmt->setFloat (index++, GetPositionY()); // posY
107 stmt->setFloat (index++, GetPositionZ()); // posZ
108 stmt->setFloat (index++, GetOrientation()); // orientation
109 stmt->setUInt16(index++, GetMapId()); // mapId
110 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_DISPLAY_ID)); // displayId
111 stmt->setString(index++, _ConcatFields(CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END)); // itemCache
112 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_1)); // bytes1
113 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_2)); // bytes2
114 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_GUILD)); // guildId
115 stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_FLAGS)); // flags
116 stmt->setUInt8 (index++, GetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS)); // dynFlags
117 stmt->setUInt32(index++, uint32(m_time)); // time
118 stmt->setUInt8 (index++, GetType()); // corpseType
119 stmt->setUInt32(index++, GetInstanceId()); // instanceId
120 stmt->setUInt32(index++, GetPhaseMask()); // phaseMask
121 trans->Append(stmt);
122
123 CharacterDatabase.CommitTransaction(trans);
124}
125
130
132{
134 stmt->setUInt32(0, ownerGuid.GetCounter());
135 CharacterDatabase.ExecuteOrAppend(trans, stmt);
136}
137
139{
140 // inherit faction from player race
142
143 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
144 return rEntry ? rEntry->FactionID : 0;
145}
146
151
153{
154 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
155 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, guid FROM corpse WHERE mapId = ? AND instanceId = ?
156
157 float posX = fields[0].GetFloat();
158 float posY = fields[1].GetFloat();
159 float posZ = fields[2].GetFloat();
160 float o = fields[3].GetFloat();
161 uint32 mapId = fields[4].GetUInt16();
162
163 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guid));
164
165 SetObjectScale(1.0f);
166 SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32());
167 if (!_LoadIntoDataField(fields[6].GetString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END))
168 {
169 TC_LOG_ERROR("entities.player", "Corpse ({}, owner: {}) is not created, given equipment info is not valid ('{}')",
170 GetGUID().ToString(), GetOwnerGUID().ToString(), fields[6].GetString());
171 }
172 SetUInt32Value(CORPSE_FIELD_BYTES_1, fields[7].GetUInt32());
173 SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32());
174 SetUInt32Value(CORPSE_FIELD_GUILD, fields[9].GetUInt32());
175 SetUInt32Value(CORPSE_FIELD_FLAGS, fields[10].GetUInt8());
176 SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[11].GetUInt8());
177 SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt32()));
178
179 m_time = time_t(fields[12].GetUInt32());
180
181 uint32 instanceId = fields[14].GetUInt32();
182 uint32 phaseMask = fields[15].GetUInt32();
183
184 // place
185 SetLocationInstanceId(instanceId);
186 SetLocationMapId(mapId);
187 SetPhaseMask(phaseMask, false);
188 Relocate(posX, posY, posZ, o);
189
190 if (!IsPositionValid())
191 {
192 TC_LOG_ERROR("entities.player", "Corpse ({}, owner: {}) is not created, given coordinates are not valid (X: {}, Y: {}, Z: {})",
193 GetGUID().ToString(), GetOwnerGUID().ToString(), posX, posY, posZ);
194 return false;
195 }
196
198 return true;
199}
200
201bool Corpse::IsExpired(time_t t) const
202{
203 // Deleted character
204 if (!sCharacterCache->HasCharacterCacheEntry(GetOwnerGUID()))
205 return true;
206
207 if (m_type == CORPSE_BONES)
208 return m_time < t - 60 * MINUTE;
209 else
210 return m_time < t - 3 * DAY;
211}
#define sCharacterCache
@ CHAR_DEL_CORPSE
@ CHAR_INS_CORPSE
@ MINUTE
Definition Common.h:29
@ DAY
Definition Common.h:31
CorpseType
Definition Corpse.h:28
@ CORPSE_BONES
Definition Corpse.h:29
DBCStorage< ChrRacesEntry > sChrRacesStore(ChrRacesEntryfmt)
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
uint16_t uint16
Definition Define.h:134
uint32_t uint32
Definition Define.h:133
#define ASSERT
Definition Errors.h:68
#define TC_LOG_ERROR(filterType__,...)
Definition Log.h:165
@ TYPEID_CORPSE
Definition ObjectGuid.h:42
@ TYPEMASK_CORPSE
Definition ObjectGuid.h:56
@ EQUIPMENT_SLOT_END
Definition Player.h:571
@ UPDATEFLAG_POSITION
Definition UpdateData.h:49
@ UPDATEFLAG_LOWGUID
Definition UpdateData.h:45
@ UPDATEFLAG_STATIONARY_POSITION
Definition UpdateData.h:47
@ CORPSE_FIELD_BYTES_2
@ CORPSE_FIELD_FLAGS
@ CORPSE_FIELD_BYTES_1
@ CORPSE_END
@ CORPSE_FIELD_DISPLAY_ID
@ CORPSE_FIELD_ITEM
@ CORPSE_FIELD_OWNER
@ CORPSE_FIELD_GUILD
@ CORPSE_FIELD_DYNAMIC_FLAGS
CellCoord _cellCoord
Definition Corpse.h:85
bool IsExpired(time_t t) const
Definition Corpse.cpp:201
void SaveToDB()
Definition Corpse.cpp:96
void ResetGhostTime()
Definition Corpse.cpp:147
Corpse(CorpseType type=CORPSE_BONES)
Definition Corpse.cpp:32
bool Create(ObjectGuid::LowType guidlow)
Definition Corpse.cpp:66
Player * lootRecipient
Definition Corpse.h:78
CorpseType m_type
Definition Corpse.h:83
void RemoveFromWorld() override
Definition Corpse.cpp:57
uint32 GetFaction() const override
Definition Corpse.cpp:138
void AddToWorld() override
Definition Corpse.cpp:48
time_t m_time
Definition Corpse.h:84
~Corpse()
Definition Corpse.cpp:46
ObjectGuid GetOwnerGUID() const override
Definition Corpse.h:67
bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field *fields)
Definition Corpse.cpp:152
CorpseType GetType() const
Definition Corpse.h:72
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition Corpse.cpp:126
Class used to access individual fields of database query result.
Definition Field.h:92
uint16 GetUInt16() const
Definition Field.cpp:45
float GetFloat() const
Definition Field.cpp:93
uint32 GetUInt32() const
Definition Field.cpp:61
MapStoredObjectTypesContainer & GetObjectsStore()
Definition Map.h:489
LowType GetCounter() const
Definition ObjectGuid.h:156
uint32 LowType
Definition ObjectGuid.h:142
uint8 GetByteValue(uint16 index, uint8 offset) const
Definition Object.cpp:267
uint16 m_objectType
Definition Object.h:232
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:249
bool IsInWorld() const
Definition Object.h:73
uint16 m_valuesCount
Definition Object.h:246
void SetGuidValue(uint16 index, ObjectGuid value)
Definition Object.cpp:699
bool _LoadIntoDataField(std::string const &data, uint32 startOffset, uint32 count)
Definition Object.cpp:551
void _Create(ObjectGuid const &guid)
Definition Object.cpp:109
virtual void AddToWorld()
Definition Object.cpp:126
std::string _ConcatFields(uint16 startIndex, uint16 size) const
Definition Object.cpp:118
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:78
virtual void SetObjectScale(float scale)
Definition Object.h:85
void SetUInt32Value(uint16 index, uint32 value)
Definition Object.cpp:585
uint16 m_updateFlag
Definition Object.h:235
ObjectGuid GetGUID() const
Definition Object.h:79
TypeID m_objectTypeId
Definition Object.h:234
void setUInt16(uint8 index, uint16 value)
void setUInt32(uint8 index, uint32 value)
void setFloat(uint8 index, float value)
void setUInt8(uint8 index, uint8 value)
void setString(uint8 index, std::string const &value)
bool Remove(KEY_TYPE const &handle)
bool Insert(KEY_TYPE const &handle, SPECIFIC_TYPE *obj)
uint32 GetMapId() const
Definition Position.h:193
virtual void SetPhaseMask(uint32 newPhaseMask, bool update)
Definition Object.cpp:3417
uint32 GetPhaseMask() const
Definition Object.h:368
Map * GetMap() const
Definition Object.h:449
void RemoveFromWorld() override
Definition Object.cpp:1066
void SetLocationInstanceId(uint32 _instanceId)
Definition Object.h:621
void SetLocationMapId(uint32 _mapId)
Definition Object.h:620
uint32 GetInstanceId() const
Definition Object.h:365
std::string const & GetName() const
Definition Object.h:382
time_t GetGameTime()
Definition GameTime.cpp:42
CellCoord ComputeCellCoord(float x, float y)
std::string ToString() const
Definition Position.cpp:149
float GetPositionZ() const
Definition Position.h:81
float GetOrientation() const
Definition Position.h:82
bool IsPositionValid() const
Definition Position.cpp:44
float GetPositionX() const
Definition Position.h:79
float GetPositionY() const
Definition Position.h:80
void Relocate(float x, float y)
Definition Position.h:66