diff options
-rw-r--r-- | src/server/game/Entities/Corpse/Corpse.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Entities/Corpse/Corpse.h | 5 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 27 | ||||
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 1 | ||||
-rw-r--r-- | src/server/game/Maps/Map.cpp | 8 |
5 files changed, 22 insertions, 23 deletions
diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index 892b1077ff2..ac34ebc0e9c 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -77,7 +77,7 @@ bool Corpse::Create(ObjectGuid::LowType guidlow, Player* owner) return false; } - Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(GetMapId(), 0, guidlow)); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(owner->GetMapId(), 0, guidlow)); SetPhaseMask(owner->GetPhaseMask(), false); SetObjectScale(1.0f); @@ -164,6 +164,8 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) SetUInt32Value(CORPSE_FIELD_FLAGS, fields[9].GetUInt8()); SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[10].GetUInt8()); SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid::Create<HighGuid::Player>(fields[14].GetUInt64())); + if (CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(GetGuidValue(CORPSE_FIELD_OWNER))) + SetUInt32Value(CORPSE_FIELD_FACTIONTEMPLATE, sChrRacesStore.AssertEntry(characterInfo->Race)->FactionID); m_time = time_t(fields[11].GetUInt32()); diff --git a/src/server/game/Entities/Corpse/Corpse.h b/src/server/game/Entities/Corpse/Corpse.h index f4a27d983c7..2ce17d8cc82 100644 --- a/src/server/game/Entities/Corpse/Corpse.h +++ b/src/server/game/Entities/Corpse/Corpse.h @@ -40,10 +40,11 @@ enum CorpseFlags CORPSE_FLAG_NONE = 0x00, CORPSE_FLAG_BONES = 0x01, CORPSE_FLAG_UNK1 = 0x02, - CORPSE_FLAG_UNK2 = 0x04, + CORPSE_FLAG_PVP = 0x04, CORPSE_FLAG_HIDE_HELM = 0x08, CORPSE_FLAG_HIDE_CLOAK = 0x10, - CORPSE_FLAG_LOOTABLE = 0x20 + CORPSE_FLAG_SKINNABLE = 0x20, + CORPSE_FLAG_FFA_PVP = 0x40 }; class TC_GAME_API Corpse : public WorldObject, public GridObject<Corpse> diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 43e7b0b3d45..a7e773a9039 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -4395,29 +4395,30 @@ Corpse* Player::CreateCorpse() corpse->SetUInt32Value(CORPSE_FIELD_BYTES_1, _cfb1); corpse->SetUInt32Value(CORPSE_FIELD_BYTES_2, _cfb2); - uint32 flags = CORPSE_FLAG_UNK2; - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM)) - flags |= CORPSE_FLAG_HIDE_HELM; - if (HasFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK)) - flags |= CORPSE_FLAG_HIDE_CLOAK; + uint32 flags = 0; + if (HasByteFlag(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG, UNIT_BYTE2_FLAG_PVP)) + flags |= CORPSE_FLAG_PVP; if (InBattleground() && !InArena()) - flags |= CORPSE_FLAG_LOOTABLE; // to be able to remove insignia + flags |= CORPSE_FLAG_SKINNABLE; // to be able to remove insignia + if (HasByteFlag(UNIT_FIELD_BYTES_2, UNIT_BYTES_2_OFFSET_PVP_FLAG, UNIT_BYTE2_FLAG_FFA_PVP)) + flags |= CORPSE_FLAG_FFA_PVP; corpse->SetUInt32Value(CORPSE_FIELD_FLAGS, flags); corpse->SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, GetNativeDisplayId()); + corpse->SetUInt32Value(CORPSE_FIELD_FACTIONTEMPLATE, sChrRacesStore.AssertEntry(getRace())->FactionID); - uint32 iDisplayID; - uint32 iIventoryType; - uint32 _cfi; for (uint8 i = 0; i < EQUIPMENT_SLOT_END; i++) { if (m_items[i]) { - iDisplayID = m_items[i]->GetDisplayId(this); - iIventoryType = m_items[i]->GetTemplate()->GetInventoryType(); + uint32 itemDisplayId = m_items[i]->GetDisplayId(this); + uint32 itemInventoryType; + if (ItemEntry const* itemEntry = sItemStore.LookupEntry(m_items[i]->GetVisibleEntry(this))) + itemInventoryType = itemEntry->InventoryType; + else + itemInventoryType = m_items[i]->GetTemplate()->GetInventoryType(); - _cfi = iDisplayID | (iIventoryType << 24); - corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, _cfi); + corpse->SetUInt32Value(CORPSE_FIELD_ITEM + i, itemDisplayId | (itemInventoryType << 24)); } } diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 6006f66772c..b05f2add7ae 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -173,6 +173,7 @@ void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLoc { WorldPackets::Query::CorpseLocation packet; packet.Valid = false; // corpse not found + packet.Player = queryCorpseLocation.Player; SendPacket(packet.Write()); return; } diff --git a/src/server/game/Maps/Map.cpp b/src/server/game/Maps/Map.cpp index d9f017ea8f8..1892c36cec5 100644 --- a/src/server/game/Maps/Map.cpp +++ b/src/server/game/Maps/Map.cpp @@ -4096,13 +4096,7 @@ Corpse* Map::ConvertCorpseToBones(ObjectGuid const& ownerGuid, bool insignia /*= bones->SetCellCoord(corpse->GetCellCoord()); bones->Relocate(corpse->GetPositionX(), corpse->GetPositionY(), corpse->GetPositionZ(), corpse->GetOrientation()); - bones->SetUInt32Value(CORPSE_FIELD_FLAGS, CORPSE_FLAG_UNK2 | CORPSE_FLAG_BONES); - bones->SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid::Empty); - bones->SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid::Empty); - - for (uint8 i = 0; i < EQUIPMENT_SLOT_END; ++i) - if (corpse->GetUInt32Value(CORPSE_FIELD_ITEM + i)) - bones->SetUInt32Value(CORPSE_FIELD_ITEM + i, 0); + bones->SetUInt32Value(CORPSE_FIELD_FLAGS, corpse->GetUInt32Value(CORPSE_FIELD_FLAGS) | CORPSE_FLAG_BONES); bones->CopyPhaseFrom(corpse); |