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 "DatabaseEnv.h"
28#include "StringConvert.h"
29
43
45
47{
49 if (!IsInWorld())
51
53}
54
63
65{
66 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow));
67 return true;
68}
69
71{
72 ASSERT(owner);
73
74 Relocate(owner->GetPositionX(), owner->GetPositionY(), owner->GetPositionZ(), owner->GetOrientation());
75
76 if (!IsPositionValid())
77 {
78 TC_LOG_ERROR("entities.player", "Corpse (guidlow {}, owner {}) not created. Suggested coordinates isn't valid (X: {} Y: {})",
79 guidlow, owner->GetName(), owner->GetPositionX(), owner->GetPositionY());
80 return false;
81 }
82
83 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guidlow));
84 SetPhaseMask(owner->GetPhaseMask(), false);
85
86 SetObjectScale(1.0f);
87 SetOwnerGUID(owner->GetGUID());
88
90
91 return true;
92}
93
95{
96 // prevent DB data inconsistence problems and duplicates
97 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
98 DeleteFromDB(trans);
99
100 std::ostringstream items;
101 for (uint32 itemSlot = 0; itemSlot < EQUIPMENT_SLOT_END; ++itemSlot)
102 items << GetItem(itemSlot) << ' ';
103
104 uint16 index = 0;
106 stmt->setUInt32(index++, GetOwnerGUID().GetCounter()); // guid
107 stmt->setFloat (index++, GetPositionX()); // posX
108 stmt->setFloat (index++, GetPositionY()); // posY
109 stmt->setFloat (index++, GetPositionZ()); // posZ
110 stmt->setFloat (index++, GetOrientation()); // orientation
111 stmt->setUInt16(index++, GetMapId()); // mapId
112 stmt->setUInt32(index++, GetDisplayId()); // displayId
113 stmt->setString(index++, std::move(items).str()); // itemCache
114 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_1)); // bytes1
115 stmt->setUInt32(index++, GetUInt32Value(CORPSE_FIELD_BYTES_2)); // bytes2
116 stmt->setUInt32(index++, GetGuildId()); // guildId
117 stmt->setUInt8 (index++, GetCorpseFlags()); // flags
118 stmt->setUInt8 (index++, GetCorpseDynamicFlags()); // dynFlags
119 stmt->setUInt32(index++, uint32(m_time)); // time
120 stmt->setUInt8 (index++, GetType()); // corpseType
121 stmt->setUInt32(index++, GetInstanceId()); // instanceId
122 stmt->setUInt32(index++, GetPhaseMask()); // phaseMask
123 trans->Append(stmt);
124
125 CharacterDatabase.CommitTransaction(trans);
126}
127
132
134{
136 stmt->setUInt32(0, ownerGuid.GetCounter());
137 CharacterDatabase.ExecuteOrAppend(trans, stmt);
138}
139
141{
142 // inherit faction from player race
143 uint32 const race = GetRace();
144
145 ChrRacesEntry const* rEntry = sChrRacesStore.LookupEntry(race);
146 return rEntry ? rEntry->FactionID : 0;
147}
148
153
155{
156 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
157 // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, guildId, flags, dynFlags, time, corpseType, instanceId, phaseMask, guid FROM corpse WHERE mapId = ? AND instanceId = ?
158
159 float posX = fields[0].GetFloat();
160 float posY = fields[1].GetFloat();
161 float posZ = fields[2].GetFloat();
162 float o = fields[3].GetFloat();
163 uint32 mapId = fields[4].GetUInt16();
164
165 Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(guid));
166
167 SetObjectScale(1.0f);
168 SetDisplayId(fields[5].GetUInt32());
169 std::vector<std::string_view> items = Trinity::Tokenize(fields[6].GetStringView(), ' ', false);
170 if (items.size() == EQUIPMENT_SLOT_END)
171 for (size_t index = 0; index < EQUIPMENT_SLOT_END; ++index)
172 SetItem(index, Trinity::StringTo<uint32>(items[index]).value_or(0));
173
174 SetUInt32Value(CORPSE_FIELD_BYTES_1, fields[7].GetUInt32());
175 SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32());
176 SetGuildId(fields[9].GetUInt32());
177 ReplaceAllCorpseFlags(CorpseFlags(fields[10].GetUInt8()));
178 ReplaceAllCorpseDynamicFlags(CorpseDynFlags(fields[11].GetUInt8()));
179 SetOwnerGUID(ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt32()));
180
181 m_time = time_t(fields[12].GetUInt32());
182
183 uint32 instanceId = fields[14].GetUInt32();
184 uint32 phaseMask = fields[15].GetUInt32();
185
186 // place
187 SetLocationInstanceId(instanceId);
188 SetLocationMapId(mapId);
189 SetPhaseMask(phaseMask, false);
190 Relocate(posX, posY, posZ, o);
191
192 if (!IsPositionValid())
193 {
194 TC_LOG_ERROR("entities.player", "Corpse ({}, owner: {}) is not created, given coordinates are not valid (X: {}, Y: {}, Z: {})",
195 GetGUID().ToString(), GetOwnerGUID().ToString(), posX, posY, posZ);
196 return false;
197 }
198
200 return true;
201}
202
203bool Corpse::IsExpired(time_t t) const
204{
205 // Deleted character
206 if (!sCharacterCache->HasCharacterCacheEntry(GetOwnerGUID()))
207 return true;
208
209 if (m_type == CORPSE_BONES)
210 return m_time < t - 60 * MINUTE;
211 else
212 return m_time < t - 3 * DAY;
213}
#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
CorpseFlags
Definition Corpse.h:39
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:579
CorpseDynFlags
@ 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_BYTES_1
@ CORPSE_END
CellCoord _cellCoord
Definition Corpse.h:123
bool IsExpired(time_t t) const
Definition Corpse.cpp:203
uint32 GetDisplayId() const
Definition Corpse.h:87
void SaveToDB()
Definition Corpse.cpp:94
uint8 GetRace() const
Definition Corpse.h:89
void ResetGhostTime()
Definition Corpse.cpp:149
Corpse(CorpseType type=CORPSE_BONES)
Definition Corpse.cpp:30
bool Create(ObjectGuid::LowType guidlow)
Definition Corpse.cpp:64
void ReplaceAllCorpseDynamicFlags(CorpseDynFlags flag)
Definition Corpse.h:79
void SetDisplayId(uint32 displayId)
Definition Corpse.h:88
Player * lootRecipient
Definition Corpse.h:116
CorpseType m_type
Definition Corpse.h:121
CorpseDynFlags GetCorpseDynamicFlags() const
Definition Corpse.h:75
uint32 GetGuildId() const
Definition Corpse.h:85
void ReplaceAllCorpseFlags(CorpseFlags flags)
Definition Corpse.h:73
void RemoveFromWorld() override
Definition Corpse.cpp:55
void SetOwnerGUID(ObjectGuid owner)
Definition Corpse.h:82
uint32 GetFaction() const override
Definition Corpse.cpp:140
void AddToWorld() override
Definition Corpse.cpp:46
time_t m_time
Definition Corpse.h:122
~Corpse()
Definition Corpse.cpp:44
uint32 GetItem(uint32 slot) const
Definition Corpse.h:94
CorpseFlags GetCorpseFlags() const
Definition Corpse.h:69
ObjectGuid GetOwnerGUID() const override
Definition Corpse.h:81
bool LoadCorpseFromDB(ObjectGuid::LowType guid, Field *fields)
Definition Corpse.cpp:154
void SetGuildId(uint32 guildId)
Definition Corpse.h:86
CorpseType GetType() const
Definition Corpse.h:110
void DeleteFromDB(CharacterDatabaseTransaction trans)
Definition Corpse.cpp:128
void SetItem(uint32 slot, uint32 item)
Definition Corpse.h:95
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:509
LowType GetCounter() const
Definition ObjectGuid.h:156
uint32 LowType
Definition ObjectGuid.h:142
uint16 m_objectType
Definition Object.h:234
uint32 GetUInt32Value(uint16 index) const
Definition Object.cpp:241
bool IsInWorld() const
Definition Object.h:73
uint16 m_valuesCount
Definition Object.h:248
void _Create(ObjectGuid const &guid)
Definition Object.cpp:109
virtual void AddToWorld()
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:577
uint16 m_updateFlag
Definition Object.h:237
ObjectGuid GetGUID() const
Definition Object.h:79
TypeID m_objectTypeId
Definition Object.h:236
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:3416
uint32 GetPhaseMask() const
Definition Object.h:370
Map * GetMap() const
Definition Object.h:451
void RemoveFromWorld() override
Definition Object.cpp:1067
void SetLocationInstanceId(uint32 _instanceId)
Definition Object.h:623
void SetLocationMapId(uint32 _mapId)
Definition Object.h:622
uint32 GetInstanceId() const
Definition Object.h:367
std::string const & GetName() const
Definition Object.h:384
time_t GetGameTime()
Definition GameTime.cpp:42
TC_COMMON_API std::vector< std::string_view > Tokenize(std::string_view str, char sep, bool keepEmpty)
Definition Util.cpp:56
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