aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2020-12-13 18:38:31 +0100
committerShauren <shauren.trinity@gmail.com>2020-12-13 18:38:31 +0100
commit93f2affbf2f70c619cdc41b073dd19827df20448 (patch)
treebe8a2ec3e25ad3109feb8450660d52eb2955789b /src
parent015666b0442ac2d4f34874da068f31f58d2580e9 (diff)
Core/Corpses: Fixed client crashes with player corpses
Closes #25714
Diffstat (limited to 'src')
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp4
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp18
-rw-r--r--src/server/game/Entities/Corpse/Corpse.h1
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.cpp10
-rw-r--r--src/server/game/Entities/Object/Updates/UpdateFields.h6
-rw-r--r--src/server/game/Entities/Player/Player.cpp1
-rw-r--r--src/server/game/Maps/Map.cpp11
7 files changed, 27 insertions, 24 deletions
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index cbce793b1a2..f779f3e884b 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -421,8 +421,8 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?", CONNECTION_ASYNC);
// Corpse
- PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
- PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?", CONNECTION_SYNCH);
+ PrepareStatement(CHAR_INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_CORPSES_FROM_MAP, "DELETE cp, c FROM corpse_phases cp INNER JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CORPSE_PHASES, "SELECT cp.OwnerGuid, cp.PhaseId FROM corpse_phases cp LEFT JOIN corpse c ON cp.OwnerGuid = c.guid WHERE c.mapId = ? AND c.instanceId = ?", CONNECTION_SYNCH);
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp
index 299117ace95..77e9bcfa808 100644
--- a/src/server/game/Entities/Corpse/Corpse.cpp
+++ b/src/server/game/Entities/Corpse/Corpse.cpp
@@ -113,6 +113,7 @@ void Corpse::SaveToDB()
stmt->setUInt32(index++, m_corpseData->DisplayID); // displayId
stmt->setString(index++, items.str()); // itemCache
stmt->setUInt8 (index++, m_corpseData->RaceID); // race
+ stmt->setUInt8 (index++, m_corpseData->Class); // class
stmt->setUInt8 (index++, m_corpseData->Sex); // gender
stmt->setUInt8 (index++, m_corpseData->Flags); // flags
stmt->setUInt8 (index++, m_corpseData->DynamicFlags); // dynFlags
@@ -165,8 +166,8 @@ void Corpse::DeleteFromDB(ObjectGuid const& ownerGuid, CharacterDatabaseTransact
bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields)
{
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, race, gender, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
float posX = fields[0].GetFloat();
float posY = fields[1].GetFloat();
@@ -184,15 +185,16 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields)
SetItem(index, atoul(items[index]));
SetRace(fields[7].GetUInt8());
- SetSex(fields[8].GetUInt8());
- SetFlags(fields[9].GetUInt8());
- SetCorpseDynamicFlags(CorpseDynFlags(fields[10].GetUInt8()));
- SetOwnerGUID(ObjectGuid::Create<HighGuid::Player>(fields[14].GetUInt64()));
+ SetClass(fields[8].GetUInt8());
+ SetSex(fields[9].GetUInt8());
+ SetFlags(fields[10].GetUInt8());
+ SetCorpseDynamicFlags(CorpseDynFlags(fields[11].GetUInt8()));
+ SetOwnerGUID(ObjectGuid::Create<HighGuid::Player>(fields[15].GetUInt64()));
SetFactionTemplate(sChrRacesStore.AssertEntry(m_corpseData->RaceID)->FactionID);
- m_time = time_t(fields[11].GetUInt32());
+ m_time = time_t(fields[12].GetUInt32());
- uint32 instanceId = fields[13].GetUInt32();
+ uint32 instanceId = fields[14].GetUInt32();
// place
SetLocationInstanceId(instanceId);
diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h
index fc3030ff2ac..cbf57781fe1 100644
--- a/src/server/game/Entities/Corpse/Corpse.h
+++ b/src/server/game/Entities/Corpse/Corpse.h
@@ -83,6 +83,7 @@ class TC_GAME_API Corpse : public WorldObject, public GridObject<Corpse>
void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::GuildGUID), guildGuid); }
void SetDisplayId(uint32 displayId) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::DisplayID), displayId); }
void SetRace(uint8 race) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::RaceID), race); }
+ void SetClass(uint8 playerClass) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Class), playerClass); }
void SetSex(uint8 sex) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Sex), sex); }
void SetFlags(uint32 flags) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::Flags), flags); }
void SetFactionTemplate(int32 factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(&Corpse::m_corpseData).ModifyValue(&UF::CorpseData::FactionTemplate), factionTemplate); }
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.cpp b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
index 6a7b62e93ce..c6b75392e26 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.cpp
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.cpp
@@ -4483,9 +4483,9 @@ void CorpseData::WriteCreate(ByteBuffer& data, EnumFlag<UpdateFieldFlag> fieldVi
{
data << uint32(Items[i]);
}
- data << uint8(Unused);
data << uint8(RaceID);
data << uint8(Sex);
+ data << uint8(Class);
data << uint32(Customizations.size());
data << uint32(Flags);
data << int32(FactionTemplate);
@@ -4553,15 +4553,15 @@ void CorpseData::WriteUpdate(ByteBuffer& data, UpdateMask<33> const& changesMask
}
if (changesMask[7])
{
- data << uint8(Unused);
+ data << uint8(RaceID);
}
if (changesMask[8])
{
- data << uint8(RaceID);
+ data << uint8(Sex);
}
if (changesMask[9])
{
- data << uint8(Sex);
+ data << uint8(Class);
}
if (changesMask[10])
{
@@ -4596,9 +4596,9 @@ void CorpseData::ClearChangesMask()
Base::ClearChangesMask(PartyGUID);
Base::ClearChangesMask(GuildGUID);
Base::ClearChangesMask(DisplayID);
- Base::ClearChangesMask(Unused);
Base::ClearChangesMask(RaceID);
Base::ClearChangesMask(Sex);
+ Base::ClearChangesMask(Class);
Base::ClearChangesMask(Flags);
Base::ClearChangesMask(FactionTemplate);
Base::ClearChangesMask(StateSpellVisualKitID);
diff --git a/src/server/game/Entities/Object/Updates/UpdateFields.h b/src/server/game/Entities/Object/Updates/UpdateFields.h
index 6d0998d631b..35cd04e5bff 100644
--- a/src/server/game/Entities/Object/Updates/UpdateFields.h
+++ b/src/server/game/Entities/Object/Updates/UpdateFields.h
@@ -837,9 +837,9 @@ struct CorpseData : public IsUpdateFieldStructureTag, public HasChangesMask<33>
UpdateField<ObjectGuid, 0, 4> PartyGUID;
UpdateField<ObjectGuid, 0, 5> GuildGUID;
UpdateField<uint32, 0, 6> DisplayID;
- UpdateField<uint8, 0, 7> Unused;
- UpdateField<uint8, 0, 8> RaceID;
- UpdateField<uint8, 0, 9> Sex;
+ UpdateField<uint8, 0, 7> RaceID;
+ UpdateField<uint8, 0, 8> Sex;
+ UpdateField<uint8, 0, 9> Class;
UpdateField<uint32, 0, 10> Flags;
UpdateField<int32, 0, 11> FactionTemplate;
UpdateField<uint32, 0, 12> StateSpellVisualKitID;
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 860933b7c39..46ef5418b6d 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -4437,6 +4437,7 @@ Corpse* Player::CreateCorpse()
corpse->SetRace(getRace());
corpse->SetSex(GetNativeSex());
+ corpse->SetClass(getClass());
corpse->SetCustomizations(Trinity::Containers::MakeIteratorPair(m_playerData->Customizations.begin(), m_playerData->Customizations.end()));
corpse->SetFlags(flags);
corpse->SetDisplayId(GetNativeDisplayId());
diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp
index c77af89ae93..5d8c07dd2da 100644
--- a/src/server/game/Maps/Map.cpp
+++ b/src/server/game/Maps/Map.cpp
@@ -4789,8 +4789,8 @@ void Map::LoadCorpseData()
stmt->setUInt32(0, GetId());
stmt->setUInt32(1, GetInstanceId());
- // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
- // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
+ // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+ // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
PreparedQueryResult result = CharacterDatabase.Query(stmt);
if (!result)
return;
@@ -4838,8 +4838,8 @@ void Map::LoadCorpseData()
do
{
Field* fields = result->Fetch();
- CorpseType type = CorpseType(fields[12].GetUInt8());
- ObjectGuid::LowType guid = fields[14].GetUInt64();
+ CorpseType type = CorpseType(fields[13].GetUInt8());
+ ObjectGuid::LowType guid = fields[15].GetUInt64();
if (type >= MAX_CORPSE_TYPE || type == CORPSE_BONES)
{
TC_LOG_ERROR("misc", "Corpse (guid: " UI64FMTD ") have wrong corpse type (%u), not loading.", guid, type);
@@ -4935,11 +4935,10 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*=
bones->SetDisplayId(corpse->m_corpseData->DisplayID);
bones->SetRace(corpse->m_corpseData->RaceID);
bones->SetSex(corpse->m_corpseData->Sex);
+ bones->SetClass(corpse->m_corpseData->Class);
bones->SetCustomizations(Trinity::Containers::MakeIteratorPair(corpse->m_corpseData->Customizations.begin(), corpse->m_corpseData->Customizations.end()));
bones->SetFlags(corpse->m_corpseData->Flags | CORPSE_FLAG_BONES);
bones->SetFactionTemplate(corpse->m_corpseData->FactionTemplate);
- for (uint32 i = 0; i < EQUIPMENT_SLOT_END; ++i)
- bones->SetItem(i, corpse->m_corpseData->Items[i]);
bones->SetCellCoord(corpse->GetCellCoord());
bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation());