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
+17 -14
View File
@@ -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);
+3 -2
View File
@@ -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());
+7 -6
View File
@@ -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);