Core/Corpses: Fixed client crashes with player corpses
Port From (https://github.com/TrinityCore/TrinityCore/commit/93f2affbf2f70c619cdc41b073dd19827df20448)
This commit is contained in:
@@ -417,8 +417,8 @@ namespace Framework.Database
|
||||
PrepareStatement(CharStatements.DEL_PLAYER_HOMEBIND, "DELETE FROM character_homebind WHERE guid = ?");
|
||||
|
||||
// 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.INS_CORPSE, "INSERT INTO corpse (guid, posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
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, class, gender, flags, dynFlags, time, corpseType, instanceId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||
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.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 = ?");
|
||||
|
||||
@@ -111,8 +111,9 @@ namespace Game.Entities
|
||||
stmt.AddValue(index++, GetMapId()); // mapId
|
||||
stmt.AddValue(index++, (uint)m_corpseData.DisplayID); // displayId
|
||||
stmt.AddValue(index++, items.ToString()); // itemCache
|
||||
stmt.AddValue(index++, m_corpseData.RaceID); // race
|
||||
stmt.AddValue(index++, m_corpseData.Sex); // gender
|
||||
stmt.AddValue(index++, (byte)m_corpseData.RaceID); // race
|
||||
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.DynamicFlags); // dynFlags
|
||||
stmt.AddValue(index++, (uint)m_time); // time
|
||||
@@ -164,10 +165,10 @@ namespace Game.Entities
|
||||
|
||||
public bool LoadCorpseFromDB(ulong guid, SQLFields field)
|
||||
{
|
||||
// 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
||||
// SELECT posX, posY, posZ, orientation, mapId, displayId, itemCache, race, gender, 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 = ?
|
||||
|
||||
float posX = field.Read<float>(0);
|
||||
float posX = field.Read<float>(0);
|
||||
float posY = field.Read<float>(1);
|
||||
float posZ = field.Read<float>(2);
|
||||
float o = field.Read<float>(3);
|
||||
@@ -181,16 +182,17 @@ namespace Game.Entities
|
||||
for (uint index = 0; index < EquipmentSlot.End; ++index)
|
||||
SetItem(index, uint.Parse(items[(int)index]));
|
||||
|
||||
SetRace((Race)field.Read<byte>(7));
|
||||
SetSex((Gender)field.Read<byte>(8));
|
||||
SetFlags((CorpseFlags)field.Read<byte>(9));
|
||||
SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(10));
|
||||
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(14)));
|
||||
SetRace(field.Read<byte>(7));
|
||||
SetClass(field.Read<byte>(8));
|
||||
SetSex(field.Read<byte>(9));
|
||||
SetFlags((CorpseFlags)field.Read<byte>(10));
|
||||
SetCorpseDynamicFlags((CorpseDynFlags)field.Read<byte>(11));
|
||||
SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read<ulong>(15)));
|
||||
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
|
||||
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 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 SetRace(Race race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), (byte)race); }
|
||||
public void SetSex(Gender sex) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.Sex), (byte)sex); }
|
||||
public void SetRace(byte race) { SetUpdateFieldValue(m_values.ModifyValue(m_corpseData).ModifyValue(m_corpseData.RaceID), race); }
|
||||
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 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); }
|
||||
|
||||
@@ -5189,9 +5189,9 @@ namespace Game.Entities
|
||||
public UpdateField<ObjectGuid> PartyGUID = new UpdateField<ObjectGuid>(0, 4);
|
||||
public UpdateField<ObjectGuid> GuildGUID = new UpdateField<ObjectGuid>(0, 5);
|
||||
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, 8);
|
||||
public UpdateField<byte> Sex = new UpdateField<byte>(0, 9);
|
||||
public UpdateField<byte> RaceID = new UpdateField<byte>(0, 7);
|
||||
public UpdateField<byte> Sex = new UpdateField<byte>(0, 8);
|
||||
public UpdateField<byte> Class = new UpdateField<byte>(0, 9);
|
||||
public UpdateField<uint> Flags = new UpdateField<uint>(0, 10);
|
||||
public UpdateField<int> FactionTemplate = new UpdateField<int>(0, 11);
|
||||
public UpdateField<uint> StateSpellVisualKitID = new UpdateField<uint>(0, 12);
|
||||
@@ -5210,9 +5210,9 @@ namespace Game.Entities
|
||||
{
|
||||
data.WriteUInt32(Items[i]);
|
||||
}
|
||||
data.WriteUInt8(Unused);
|
||||
data.WriteUInt8(RaceID);
|
||||
data.WriteUInt8(Sex);
|
||||
data.WriteUInt8(Class);
|
||||
data.WriteInt32(Customizations.Size());
|
||||
data.WriteUInt32(Flags);
|
||||
data.WriteInt32(FactionTemplate);
|
||||
@@ -5280,15 +5280,15 @@ namespace Game.Entities
|
||||
}
|
||||
if (changesMask[7])
|
||||
{
|
||||
data.WriteUInt8(Unused);
|
||||
data.WriteUInt8(RaceID);
|
||||
}
|
||||
if (changesMask[8])
|
||||
{
|
||||
data.WriteUInt8(RaceID);
|
||||
data.WriteUInt8(Sex);
|
||||
}
|
||||
if (changesMask[9])
|
||||
{
|
||||
data.WriteUInt8(Sex);
|
||||
data.WriteUInt8(Class);
|
||||
}
|
||||
if (changesMask[10])
|
||||
{
|
||||
@@ -5323,9 +5323,9 @@ namespace Game.Entities
|
||||
ClearChangesMask(PartyGUID);
|
||||
ClearChangesMask(GuildGUID);
|
||||
ClearChangesMask(DisplayID);
|
||||
ClearChangesMask(Unused);
|
||||
ClearChangesMask(RaceID);
|
||||
ClearChangesMask(Sex);
|
||||
ClearChangesMask(Class);
|
||||
ClearChangesMask(Flags);
|
||||
ClearChangesMask(FactionTemplate);
|
||||
ClearChangesMask(StateSpellVisualKitID);
|
||||
|
||||
@@ -4406,8 +4406,9 @@ namespace Game.Entities
|
||||
if (HasPvpFlag(UnitPVPStateFlags.FFAPvp))
|
||||
flags |= CorpseFlags.FFAPvP;
|
||||
|
||||
corpse.SetRace(GetRace());
|
||||
corpse.SetSex(GetNativeSex());
|
||||
corpse.SetRace((byte)GetRace());
|
||||
corpse.SetSex((byte)GetNativeSex());
|
||||
corpse.SetClass((byte)GetClass());
|
||||
corpse.SetCustomizations(m_playerData.Customizations);
|
||||
corpse.SetFlags(flags);
|
||||
corpse.SetDisplayId(GetNativeDisplayId());
|
||||
|
||||
@@ -3298,8 +3298,8 @@ namespace Game.Maps
|
||||
stmt.AddValue(0, GetId());
|
||||
stmt.AddValue(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 = ?
|
||||
SQLResult result = DB.Characters.Query(stmt);
|
||||
if (result.IsEmpty())
|
||||
return;
|
||||
@@ -3345,8 +3345,8 @@ namespace Game.Maps
|
||||
|
||||
do
|
||||
{
|
||||
CorpseType type = (CorpseType)result.Read<byte>(12);
|
||||
ulong guid = result.Read<ulong>(14);
|
||||
CorpseType type = (CorpseType)result.Read<byte>(13);
|
||||
ulong guid = result.Read<ulong>(15);
|
||||
if (type >= CorpseType.Max || type == CorpseType.Bones)
|
||||
{
|
||||
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.SetGuildGUID(corpse.m_corpseData.GuildGUID);
|
||||
bones.SetDisplayId(corpse.m_corpseData.DisplayID);
|
||||
bones.SetRace((Race)(byte)corpse.m_corpseData.RaceID);
|
||||
bones.SetSex((Gender)(byte)corpse.m_corpseData.Sex);
|
||||
bones.SetRace(corpse.m_corpseData.RaceID);
|
||||
bones.SetSex(corpse.m_corpseData.Sex);
|
||||
bones.SetClass(corpse.m_corpseData.Class);
|
||||
bones.SetCustomizations(corpse.m_corpseData.Customizations);
|
||||
bones.SetFlags((CorpseFlags)(corpse.m_corpseData.Flags | (uint)CorpseFlags.Bones));
|
||||
bones.SetFactionTemplate(corpse.m_corpseData.FactionTemplate);
|
||||
|
||||
@@ -1857,6 +1857,7 @@ CREATE TABLE `corpse` (
|
||||
`displayId` int(10) unsigned NOT NULL DEFAULT '0',
|
||||
`itemCache` text NOT NULL,
|
||||
`race` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`class` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`gender` tinyint(3) unsigned NOT NULL DEFAULT '0',
|
||||
`flags` 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_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_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 */;
|
||||
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`);
|
||||
Reference in New Issue
Block a user