aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2017-05-01 20:19:55 +0200
committerShauren <shauren.trinity@gmail.com>2017-05-01 20:20:18 +0200
commit713783531c5657e1f77e5754385258a1a8ebe6cc (patch)
tree4f055d90a70233be0c8b0e2b6fac69903a29b1d7
parent00f28a81af0e93c50df01ac6ba8dcdb6c0887aee (diff)
Core/Corpses: Misc fixes
* Updated corpse flags * Fixed corpse guid during creation * Properly set corpse faction * Fixed setting weapon inventory types if transmogrified * Fixed corpse location query response when corpse cannot be found
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp4
-rw-r--r--src/server/game/Entities/Corpse/Corpse.h5
-rw-r--r--src/server/game/Entities/Player/Player.cpp27
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp1
-rw-r--r--src/server/game/Maps/Map.cpp8
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);