diff --git a/Source/Framework/Database/Databases/CharacterDatabase.cs b/Source/Framework/Database/Databases/CharacterDatabase.cs index 27831a759..2142f9dfa 100644 --- a/Source/Framework/Database/Databases/CharacterDatabase.cs +++ b/Source/Framework/Database/Databases/CharacterDatabase.cs @@ -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 = ?"); diff --git a/Source/Game/Entities/Corpse.cs b/Source/Game/Entities/Corpse.cs index d7292377a..bb4452944 100644 --- a/Source/Game/Entities/Corpse.cs +++ b/Source/Game/Entities/Corpse.cs @@ -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(0); + float posX = field.Read(0); float posY = field.Read(1); float posZ = field.Read(2); float o = field.Read(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(7)); - SetSex((Gender)field.Read(8)); - SetFlags((CorpseFlags)field.Read(9)); - SetCorpseDynamicFlags((CorpseDynFlags)field.Read(10)); - SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read(14))); + SetRace(field.Read(7)); + SetClass(field.Read(8)); + SetSex(field.Read(9)); + SetFlags((CorpseFlags)field.Read(10)); + SetCorpseDynamicFlags((CorpseDynFlags)field.Read(11)); + SetOwnerGUID(ObjectGuid.Create(HighGuid.Player, field.Read(15))); SetFactionTemplate(CliDB.ChrRacesStorage.LookupByKey(m_corpseData.RaceID).FactionID); - m_time = field.Read(11); + m_time = field.Read(12); - uint instanceId = field.Read(13); + uint instanceId = field.Read(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); } diff --git a/Source/Game/Entities/Object/Update/UpdateFields.cs b/Source/Game/Entities/Object/Update/UpdateFields.cs index 288d18688..b7e0cda0c 100644 --- a/Source/Game/Entities/Object/Update/UpdateFields.cs +++ b/Source/Game/Entities/Object/Update/UpdateFields.cs @@ -5189,9 +5189,9 @@ namespace Game.Entities public UpdateField PartyGUID = new UpdateField(0, 4); public UpdateField GuildGUID = new UpdateField(0, 5); public UpdateField DisplayID = new UpdateField(0, 6); - public UpdateField Unused = new UpdateField(0, 7); - public UpdateField RaceID = new UpdateField(0, 8); - public UpdateField Sex = new UpdateField(0, 9); + public UpdateField RaceID = new UpdateField(0, 7); + public UpdateField Sex = new UpdateField(0, 8); + public UpdateField Class = new UpdateField(0, 9); public UpdateField Flags = new UpdateField(0, 10); public UpdateField FactionTemplate = new UpdateField(0, 11); public UpdateField StateSpellVisualKitID = new UpdateField(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); diff --git a/Source/Game/Entities/Player/Player.cs b/Source/Game/Entities/Player/Player.cs index f1a8a08fe..1c5975f6e 100644 --- a/Source/Game/Entities/Player/Player.cs +++ b/Source/Game/Entities/Player/Player.cs @@ -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()); diff --git a/Source/Game/Maps/Map.cs b/Source/Game/Maps/Map.cs index 2eababf4e..dd5e82fdc 100644 --- a/Source/Game/Maps/Map.cs +++ b/Source/Game/Maps/Map.cs @@ -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(12); - ulong guid = result.Read(14); + CorpseType type = (CorpseType)result.Read(13); + ulong guid = result.Read(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); diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql index 2e5b285cf..b2fe7bb0f 100644 --- a/sql/base/characters_database.sql +++ b/sql/base/characters_database.sql @@ -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; diff --git a/sql/updates/characters/master/2020_12_13_00_characters.sql b/sql/updates/characters/master/2020_12_13_00_characters.sql new file mode 100644 index 000000000..e0a3bb433 --- /dev/null +++ b/sql/updates/characters/master/2020_12_13_00_characters.sql @@ -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`);