Core/Corpses: Fixed client crashes with player corpses

Port From (https://github.com/TrinityCore/TrinityCore/commit/93f2affbf2f70c619cdc41b073dd19827df20448)
This commit is contained in:
hondacrx
2020-12-14 14:21:59 -05:00
parent 0cc9c05093
commit 3ca0947881
7 changed files with 43 additions and 33 deletions
@@ -417,8 +417,8 @@ namespace Framework.Database
PrepareStatement(CharStatements.DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?"); PrepareStatement(CharStatements.DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?");
// Corpse // Corpse
PrepareStatement(CharStatements.SEL_CORPSES, "SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?"); PrepareStatement(CharStatements.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 = ?");
PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?"); PrepareStatement(CharStatements.DEL_CORPSE, "DELETE FROM corpse WHERE guid = ?");
PrepareStatement(CharStatements.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 = ?"); PrepareStatement(CharStatements.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 = ?");
PrepareStatement(CharStatements.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 = ?"); PrepareStatement(CharStatements.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 = ?");
+17 -14
View File
@@ -111,8 +111,9 @@ namespace Game.Entities
stmt.AddValue(index++, GetMapId()); // mapId stmt.AddValue(index++, GetMapId()); // mapId
stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId
stmt.AddValue(index++, items.ToString()); // itemCache stmt.AddValue(index++, items.ToString()); // itemCache
stmt.AddValue(index++, m_corpseData.RaceID); // race stmt.AddValue(index++, (byte)m_corpseData.RaceID); // race
stmt.AddValue(index++, m_corpseData.Sex); // gender stmt.AddValue(index++, (byte)m_corpseData.Class); // class
stmt.AddValue(index++, (byte)m_corpseData.Sex); // gender
stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags stmt.AddValue(index++, (uint)m_corpseData.Flags); // flags
stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags stmt.AddValue(index++, (uint)m_corpseData.DynamicFlags); // dynFlags
stmt.AddValue(index++, (uint)m_time); // time stmt.AddValue(index++, (uint)m_time); // time
@@ -164,10 +165,10 @@ namespace Game.Entities
public bool LoadCorpseFromDB(ulong guid, SQLFields field) public bool LoadCorpseFromDB(ulong guid, SQLFields field)
{ {
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 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, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? // 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 = field.Read<float>(0); float posX = field.Read<float>(0);
float posY = field.Read<float>(1); float posY = field.Read<float>(1);
float posZ = field.Read<float>(2); float posZ = field.Read<float>(2);
float o = field.Read<float>(3); float o = field.Read<float>(3);
@@ -181,16 +182,17 @@ namespace Game.Entities
for (uint index = 0; index < EquipmentSlot.End; ++index) for (uint index = 0; index < EquipmentSlot.End; ++index)
SetItem(index, uint.Parse(items[(int)index])); SetItem(index, uint.Parse(items[(int)index]));
SetRace((Race)field.Read<byte>(7)); SetRace(field.Read<byte>(7));
SetSex((Gender)field.Read<byte>(8)); SetClass(field.Read<byte>(8));
SetFlags((CorpseFlags)field.Read<byte>(9)); SetSex(field.Read<byte>(9));
SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(10)); SetFlags((CorpseFlags)field.Read<byte>(10));
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(14))); SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(11));
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(15)));
SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(m_corpseData.RaceID).FactionID); SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(m_corpseData.RaceID).FactionID);
m_time = field.Read<uint>(11); m_time = field.Read<uint>(12);
uint instanceId = field.Read<uint>(13); uint instanceId = field.Read<uint>(14);
// place // place
SetLocationInstanceId(instanceId); SetLocationInstanceId(instanceId);
@@ -290,8 +292,9 @@ namespace Game.Entities
public void SetPartyGUID(ObjectGuid partyGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.PartyGUID), partyGuid); } public void SetPartyGUID(ObjectGuid partyGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.PartyGUID), partyGuid); }
public void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.GuildGUID), guildGuid); } public void SetGuildGUID(ObjectGuid guildGuid) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.GuildGUID), guildGuid); }
public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); } public void SetDisplayId(uint displayId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.DisplayID), displayId); }
public void SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); } public void SetRace(byte race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), race); }
public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); } public void SetClass(byte classId) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Class), classId); }
public void SetSex(byte sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), sex); }
public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); } public void SetFlags(CorpseFlags flags) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Flags), (uint)flags); }
public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); } public void SetFactionTemplate(int factionTemplate) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.FactionTemplate), factionTemplate); }
public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); } public void SetItem(uint slot, uint item) { SetUpdateFieldValue(ref m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Items, (int)slot), item); }
@@ -5189,9 +5189,9 @@ namespace Game.Entities
public UpdateField<ObjectGuid> PartyGUID = new UpdateField<ObjectGuid>(0, 4); public UpdateField<ObjectGuid> PartyGUID = new UpdateField<ObjectGuid>(0, 4);
public UpdateField<ObjectGuid> GuildGUID = new UpdateField<ObjectGuid>(0, 5); public UpdateField<ObjectGuid> GuildGUID = new UpdateField<ObjectGuid>(0, 5);
public UpdateField<uint> DisplayID = new UpdateField<uint>(0, 6); public UpdateField<uint> DisplayID = new UpdateField<uint>(0, 6);
public UpdateField<byte> Unused = new UpdateField<byte>(0, 7); public UpdateField<byte> RaceID = new UpdateField<byte>(0, 7);
public UpdateField<byte> RaceID = new UpdateField<byte>(0, 8); public UpdateField<byte> Sex = new UpdateField<byte>(0, 8);
public UpdateField<byte> Sex = new UpdateField<byte>(0, 9); public UpdateField<byte> Class = new UpdateField<byte>(0, 9);
public UpdateField<uint> Flags = new UpdateField<uint>(0, 10); public UpdateField<uint> Flags = new UpdateField<uint>(0, 10);
public UpdateField<int> FactionTemplate = new UpdateField<int>(0, 11); public UpdateField<int> FactionTemplate = new UpdateField<int>(0, 11);
public UpdateField<uint> StateSpellVisualKitID = new UpdateField<uint>(0, 12); public UpdateField<uint> StateSpellVisualKitID = new UpdateField<uint>(0, 12);
@@ -5210,9 +5210,9 @@ namespace Game.Entities
{ {
data.WriteUInt32(Items[i]); data.WriteUInt32(Items[i]);
} }
data.WriteUInt8(Unused);
data.WriteUInt8(RaceID); data.WriteUInt8(RaceID);
data.WriteUInt8(Sex); data.WriteUInt8(Sex);
data.WriteUInt8(Class);
data.WriteInt32(Customizations.Size()); data.WriteInt32(Customizations.Size());
data.WriteUInt32(Flags); data.WriteUInt32(Flags);
data.WriteInt32(FactionTemplate); data.WriteInt32(FactionTemplate);
@@ -5280,15 +5280,15 @@ namespace Game.Entities
} }
if (changesMask[7]) if (changesMask[7])
{ {
data.WriteUInt8(Unused); data.WriteUInt8(RaceID);
} }
if (changesMask[8]) if (changesMask[8])
{ {
data.WriteUInt8(RaceID); data.WriteUInt8(Sex);
} }
if (changesMask[9]) if (changesMask[9])
{ {
data.WriteUInt8(Sex); data.WriteUInt8(Class);
} }
if (changesMask[10]) if (changesMask[10])
{ {
@@ -5323,9 +5323,9 @@ namespace Game.Entities
ClearChangesMask(PartyGUID); ClearChangesMask(PartyGUID);
ClearChangesMask(GuildGUID); ClearChangesMask(GuildGUID);
ClearChangesMask(DisplayID); ClearChangesMask(DisplayID);
ClearChangesMask(Unused);
ClearChangesMask(RaceID); ClearChangesMask(RaceID);
ClearChangesMask(Sex); ClearChangesMask(Sex);
ClearChangesMask(Class);
ClearChangesMask(Flags); ClearChangesMask(Flags);
ClearChangesMask(FactionTemplate); ClearChangesMask(FactionTemplate);
ClearChangesMask(StateSpellVisualKitID); ClearChangesMask(StateSpellVisualKitID);
+3 -2
View File
@@ -4406,8 +4406,9 @@ namespace Game.Entities
if (HasPvpFlag(UnitPVPStateFlags.FFAPvp)) if (HasPvpFlag(UnitPVPStateFlags.FFAPvp))
flags |= CorpseFlags.FFAPvP; flags |= CorpseFlags.FFAPvP;
corpse.SetRace(GetRace()); corpse.SetRace((byte)GetRace());
corpse.SetSex(GetNativeSex()); corpse.SetSex((byte)GetNativeSex());
corpse.SetClass((byte)GetClass());
corpse.SetCustomizations(m_playerData.Customizations); corpse.SetCustomizations(m_playerData.Customizations);
corpse.SetFlags(flags); corpse.SetFlags(flags);
corpse.SetDisplayId(GetNativeDisplayId()); corpse.SetDisplayId(GetNativeDisplayId());
+7 -6
View File
@@ -3298,8 +3298,8 @@ namespace Game.Maps
stmt.AddValue(0, GetId()); stmt.AddValue(0, GetId());
stmt.AddValue(1, GetInstanceId()); stmt.AddValue(1, GetInstanceId());
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 // 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, bytes1, bytes2, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ? // SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, class, gender, flags, dynFlags, time, corpseType, instanceId, guid FROM corpse WHERE mapId = ? AND instanceId = ?
SQLResult result = DB.Characters.Query(stmt); SQLResult result = DB.Characters.Query(stmt);
if (result.IsEmpty()) if (result.IsEmpty())
return; return;
@@ -3345,8 +3345,8 @@ namespace Game.Maps
do do
{ {
CorpseType type = (CorpseType)result.Read<byte>(12); CorpseType type = (CorpseType)result.Read<byte>(13);
ulong guid = result.Read<ulong>(14); ulong guid = result.Read<ulong>(15);
if (type >= CorpseType.Max || type == CorpseType.Bones) if (type >= CorpseType.Max || type == CorpseType.Bones)
{ {
Log.outError(LogFilter.Maps, "Corpse (guid: {0}) have wrong corpse type ({1}), not loading.", guid, type); Log.outError(LogFilter.Maps, "Corpse (guid: {0}) have wrong corpse type ({1}), not loading.", guid, type);
@@ -3436,8 +3436,9 @@ namespace Game.Maps
bones.SetPartyGUID(corpse.m_corpseData.PartyGUID); bones.SetPartyGUID(corpse.m_corpseData.PartyGUID);
bones.SetGuildGUID(corpse.m_corpseData.GuildGUID); bones.SetGuildGUID(corpse.m_corpseData.GuildGUID);
bones.SetDisplayId(corpse.m_corpseData.DisplayID); bones.SetDisplayId(corpse.m_corpseData.DisplayID);
bones.SetRace((Race)(byte)corpse.m_corpseData.RaceID); bones.SetRace(corpse.m_corpseData.RaceID);
bones.SetSex((Gender)(byte)corpse.m_corpseData.Sex); bones.SetSex(corpse.m_corpseData.Sex);
bones.SetClass(corpse.m_corpseData.Class);
bones.SetCustomizations(corpse.m_corpseData.Customizations); bones.SetCustomizations(corpse.m_corpseData.Customizations);
bones.SetFlags((CorpseFlags)(corpse.m_corpseData.Flags | (uint)CorpseFlags.Bones)); bones.SetFlags((CorpseFlags)(corpse.m_corpseData.Flags | (uint)CorpseFlags.Bones));
bones.SetFactionTemplate(corpse.m_corpseData.FactionTemplate); bones.SetFactionTemplate(corpse.m_corpseData.FactionTemplate);
+3 -1
View File
@@ -1857,6 +1857,7 @@ CREATE TABLE `corpse` (
`displayId` int(10) unsigned NOT NULL DEFAULT '0', `displayId` int(10) unsigned NOT NULL DEFAULT '0',
`itemCache` text NOT NULL, `itemCache` text NOT NULL,
`race` tinyint(3) unsigned NOT NULL DEFAULT '0', `race` tinyint(3) unsigned NOT NULL DEFAULT '0',
`class` tinyint(3) unsigned NOT NULL DEFAULT '0',
`gender` tinyint(3) unsigned NOT NULL DEFAULT '0', `gender` tinyint(3) unsigned NOT NULL DEFAULT '0',
`flags` tinyint(3) unsigned NOT NULL DEFAULT '0', `flags` tinyint(3) unsigned NOT NULL DEFAULT '0',
`dynFlags` tinyint(3) unsigned NOT NULL DEFAULT '0', `dynFlags` tinyint(3) unsigned NOT NULL DEFAULT '0',
@@ -3820,7 +3821,8 @@ INSERT INTO `updates` VALUES
('2020_06_17_00_characters.sql','C3EE0D751E4B97CDF15F3BE27AAAE3646514A358','ARCHIVED','2020-06-17 17:04:56',0), ('2020_06_17_00_characters.sql','C3EE0D751E4B97CDF15F3BE27AAAE3646514A358','ARCHIVED','2020-06-17 17:04:56',0),
('2020_08_14_00_characters.sql','355685FF86EE64E2ED9D4B7D1311D53A9C2E0FA5','ARCHIVED','2020-08-14 21:41:24',0), ('2020_08_14_00_characters.sql','355685FF86EE64E2ED9D4B7D1311D53A9C2E0FA5','ARCHIVED','2020-08-14 21:41:24',0),
('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0), ('2020_10_20_00_characters.sql','744F2A36865761920CE98A6DDE3A3BADF44D1E77','ARCHIVED','2020-10-20 21:36:49',0),
('2020_11_16_00_characters.sql','33D5C7539E239132923D01F4B6EAD5F3EF3EEB69','RELEASED','2020-11-16 19:16:31',0); ('2020_11_16_00_characters.sql','33D5C7539E239132923D01F4B6EAD5F3EF3EEB69','RELEASED','2020-11-16 19:16:31',0),
('2020_12_13_00_characters.sql','6AC743240033DED2C402ECB894A59D79EF607920','RELEASED','2020-12-13 18:36:58',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */; /*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES; UNLOCK TABLES;
@@ -0,0 +1,3 @@
ALTER TABLE `corpse` ADD `class` tinyint(3) unsigned NOT NULL DEFAULT '0' AFTER `race`;
UPDATE `corpse` SET `class`=(SELECT c.`class` FROM `characters` c WHERE c.`guid`=`guid`);