diff options
| author | Shauren <shauren.trinity@gmail.com> | 2020-12-13 18:38:31 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2020-12-13 18:38:31 +0100 |
| commit | 93f2affbf2f70c619cdc41b073dd19827df20448 (patch) | |
| tree | be8a2ec3e25ad3109feb8450660d52eb2955789b /src/server/game | |
| parent | 015666b0442ac2d4f34874da068f31f58d2580e9 (diff) | |
Core/Corpses: Fixed client crashes with player corpses
Closes #25714
Diffstat (limited to 'src/server/game')
| -rw-r--r-- | src/server/game/Entities/Corpse/Corpse.cpp | 18 | ||||
| -rw-r--r-- | src/server/game/Entities/Corpse/Corpse.h | 1 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.cpp | 10 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Updates/UpdateFields.h | 6 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 1 | ||||
| -rw-r--r-- | src/server/game/Maps/Map.cpp | 11 |
6 files changed, 25 insertions, 22 deletions
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()); |
