aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2014-10-29 21:13:21 +0100
committerShauren <shauren.trinity@gmail.com>2014-10-29 21:13:21 +0100
commit15fbb6f46fb24fdc6f91786543b32f247e6525fc (patch)
tree3d07a448e71dae1d948aa5a49b4ea818b2e9a986 /src/server/game/Entities/Object
parent13281fef3c85688df18b5ea7cfab74411c6529f7 (diff)
Core/Entites: Updated GUID format
Diffstat (limited to 'src/server/game/Entities/Object')
-rw-r--r--src/server/game/Entities/Object/Object.cpp9
-rw-r--r--src/server/game/Entities/Object/Object.h3
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.cpp146
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h90
4 files changed, 173 insertions, 75 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp
index c99a5a3cde0..6fc422c65cf 100644
--- a/src/server/game/Entities/Object/Object.cpp
+++ b/src/server/game/Entities/Object/Object.cpp
@@ -130,11 +130,10 @@ void Object::_InitValues()
m_objectUpdated = false;
}
-void Object::_Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh)
+void Object::_Create(ObjectGuid const& guid)
{
if (!m_uint32Values) _InitValues();
- ObjectGuid guid(guidhigh, entry, guidlow);
SetGuidValue(OBJECT_FIELD_GUID, guid);
SetUInt16Value(OBJECT_FIELD_TYPE, 0, m_objectType);
m_PackGUID.Set(guid);
@@ -1532,12 +1531,6 @@ void WorldObject::CleanupsBeforeDelete(bool /*finalCleanup*/)
transport->RemovePassenger(this);
}
-void WorldObject::_Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask)
-{
- Object::_Create(guidlow, 0, guidhigh);
- m_phaseMask = phaseMask;
-}
-
void WorldObject::RemoveFromWorld()
{
if (!IsInWorld())
diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h
index 353dfc1b917..b989aca0b17 100644
--- a/src/server/game/Entities/Object/Object.h
+++ b/src/server/game/Entities/Object/Object.h
@@ -211,7 +211,7 @@ class Object
Object();
void _InitValues();
- void _Create(ObjectGuid::LowType guidlow, uint32 entry, HighGuid guidhigh);
+ void _Create(ObjectGuid const& guid);
std::string _ConcatFields(uint16 startIndex, uint16 size) const;
void _LoadIntoDataField(std::string const& data, uint32 startOffset, uint32 count);
@@ -591,7 +591,6 @@ class WorldObject : public Object, public WorldLocation
virtual void Update (uint32 /*time_diff*/) { }
- void _Create(ObjectGuid::LowType guidlow, HighGuid guidhigh, uint32 phaseMask);
virtual void RemoveFromWorld() override;
void GetNearPoint2D(float &x, float &y, float distance, float absAngle) const;
diff --git a/src/server/game/Entities/Object/ObjectGuid.cpp b/src/server/game/Entities/Object/ObjectGuid.cpp
index 41ea166a6d5..ebcf110b5f4 100644
--- a/src/server/game/Entities/Object/ObjectGuid.cpp
+++ b/src/server/game/Entities/Object/ObjectGuid.cpp
@@ -22,27 +22,60 @@
#include <sstream>
#include <iomanip>
-ObjectGuid const ObjectGuid::Empty = ObjectGuid();
+char const* TypeNames[] =
+{
+ "Null",
+ "Uniq",
+ "Player",
+ "Item",
+ "StaticDoor",
+ "Transport",
+ "Conversation",
+ "Creature",
+ "Vehicle",
+ "Pet",
+ "GameObject",
+ "DynamicObject",
+ "AreaTrigger",
+ "Corpse",
+ "LootObject",
+ "SceneObject",
+ "Scenario",
+ "AIGroup",
+ "DynamicDoor",
+ "ClientActor",
+ "Vignette",
+ "CallForHelp",
+ "AIResource",
+ "AILock",
+ "AILockTicket",
+ "ChatChannel",
+ "Party",
+ "Guild",
+ "WowAccount",
+ "BNetAccount",
+ "GMTask",
+ "MobileSession",
+ "RaidGroup",
+ "Spell",
+ "Mail",
+ "WebObj",
+ "LFGObject",
+ "LFGList",
+ "UserRouter",
+ "PVPQueueGroup",
+ "UserClient",
+ "PetBattle",
+ "UniqueUserClient",
+ "BattlePet",
+};
char const* ObjectGuid::GetTypeName(HighGuid high)
{
- switch (high)
- {
- case HighGuid::Item: return "Item";
- case HighGuid::Player: return "Player";
- case HighGuid::GameObject: return "Gameobject";
- case HighGuid::Creature: return "Creature";
- case HighGuid::Pet: return "Pet";
- case HighGuid::Vehicle: return "Vehicle";
- case HighGuid::DynamicObject: return "DynObject";
- case HighGuid::Corpse: return "Corpse";
- case HighGuid::AreaTrigger: return "AreaTrigger";
- case HighGuid::Transport: return "Transport";
- case HighGuid::Party: return "Party";
- case HighGuid::Guild: return "Guild";
- default:
- return "<unknown>";
- }
+ if (high > HighGuid::Count)
+ return "<unknown>";
+
+ return TypeNames[uint32(high)];
}
std::string ObjectGuid::ToString() const
@@ -70,7 +103,7 @@ void ObjectGuid::SetRawValue(std::vector<uint8> const& guid)
memcpy(this, guid.data(), sizeof(*this));
}
-void PackedGuid::Set(ObjectGuid guid)
+void PackedGuid::Set(ObjectGuid const& guid)
{
uint8 lowMask = 0;
uint8 highMask = 0;
@@ -133,6 +166,81 @@ std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid)
return stream;
}
+class GuidFormat
+{
+public:
+ inline static ObjectGuid Global(HighGuid type, ObjectGuid::LowType counter)
+ {
+ return ObjectGuid(uint64(uint64(type) << 58), counter);
+ }
+
+ inline static ObjectGuid RealmSpecific(HighGuid type, ObjectGuid::LowType counter)
+ {
+ return ObjectGuid(uint64(uint64(type) << 58 | uint64(realmHandle.Index) << 42), counter);
+ }
+
+ inline static ObjectGuid MapSpecific(HighGuid type, uint8 subType, uint16 mapId, uint32 serverId, uint32 entry, ObjectGuid::LowType counter)
+ {
+ return ObjectGuid(uint64((uint64(type) << 58) | (uint64(realmHandle.Index & 0x1FFF) << 42) | (uint64(mapId & 0x1FFF) << 29) | (uint64(entry & 0x7FFFFF) << 6)),
+ uint64((uint64(serverId & 0xFFFFFF) << 40) | (counter & UI64LIT(0xFFFFFFFFFF))));
+ }
+};
+
+#define GLOBAL_GUID_CREATE(highguid) template<> ObjectGuid ObjectGuid::Create<highguid>(LowType counter) { return GuidFormat::Global(highguid, counter); }
+#define REALM_GUID_CREATE(highguid) template<> ObjectGuid ObjectGuid::Create<highguid>(LowType counter) { return GuidFormat::RealmSpecific(highguid, counter); }
+#define MAP_GUID_CREATE(highguid) template<> ObjectGuid ObjectGuid::Create<highguid>(uint16 mapId, uint32 entry, LowType counter) { return GuidFormat::MapSpecific(highguid, 0, mapId, 0, entry, counter); }
+
+GLOBAL_GUID_CREATE(HighGuid::Uniq)
+GLOBAL_GUID_CREATE(HighGuid::Party)
+GLOBAL_GUID_CREATE(HighGuid::WowAccount)
+GLOBAL_GUID_CREATE(HighGuid::BNetAccount)
+GLOBAL_GUID_CREATE(HighGuid::GMTask)
+GLOBAL_GUID_CREATE(HighGuid::RaidGroup)
+GLOBAL_GUID_CREATE(HighGuid::Spell)
+GLOBAL_GUID_CREATE(HighGuid::Mail)
+GLOBAL_GUID_CREATE(HighGuid::UserRouter)
+GLOBAL_GUID_CREATE(HighGuid::PVPQueueGroup)
+GLOBAL_GUID_CREATE(HighGuid::UserClient)
+GLOBAL_GUID_CREATE(HighGuid::UniqueUserClient)
+GLOBAL_GUID_CREATE(HighGuid::BattlePet)
+REALM_GUID_CREATE(HighGuid::Player)
+REALM_GUID_CREATE(HighGuid::Item) // This is not exactly correct, there are 2 more unknown parts in highguid: (high >> 10 & 0xFF), (high >> 18 & 0xFFFFFF)
+REALM_GUID_CREATE(HighGuid::Transport)
+REALM_GUID_CREATE(HighGuid::Guild)
+MAP_GUID_CREATE(HighGuid::Conversation)
+MAP_GUID_CREATE(HighGuid::Creature)
+MAP_GUID_CREATE(HighGuid::Vehicle)
+MAP_GUID_CREATE(HighGuid::Pet)
+MAP_GUID_CREATE(HighGuid::GameObject)
+MAP_GUID_CREATE(HighGuid::DynamicObject)
+MAP_GUID_CREATE(HighGuid::AreaTrigger)
+MAP_GUID_CREATE(HighGuid::Corpse)
+MAP_GUID_CREATE(HighGuid::LootObject)
+MAP_GUID_CREATE(HighGuid::SceneObject)
+MAP_GUID_CREATE(HighGuid::Scenario)
+MAP_GUID_CREATE(HighGuid::AIGroup)
+MAP_GUID_CREATE(HighGuid::DynamicDoor)
+MAP_GUID_CREATE(HighGuid::Vignette)
+MAP_GUID_CREATE(HighGuid::CallForHelp)
+MAP_GUID_CREATE(HighGuid::AIResource)
+MAP_GUID_CREATE(HighGuid::AILock)
+MAP_GUID_CREATE(HighGuid::AILockTicket)
+
+ObjectGuid const ObjectGuid::Empty = ObjectGuid();
+ObjectGuid const ObjectGuid::TradeItem = ObjectGuid::Create<HighGuid::Uniq>(uint64(10));
+
+template<HighGuid type>
+ObjectGuid ObjectGuid::Create(LowType counter)
+{
+ static_assert(false, "Invalid guid construction method for this guid type.");
+}
+
+template<HighGuid type>
+ObjectGuid ObjectGuid::Create(uint16 mapId, uint32 entry, LowType counter)
+{
+ static_assert(false, "Invalid guid construction method for this guid type.");
+}
+
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Player>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Creature>::Generate();
template ObjectGuid::LowType ObjectGuidGenerator<HighGuid::Pet>::Generate();
diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h
index 7a3c05c3b37..247982a2837 100644
--- a/src/server/game/Entities/Object/ObjectGuid.h
+++ b/src/server/game/Entities/Object/ObjectGuid.h
@@ -62,7 +62,7 @@ enum class HighGuid
Uniq = 1,
Player = 2,
Item = 3,
- StaticDoor = 4,
+ StaticDoor = 4, //NYI
Transport = 5,
Conversation = 6,
Creature = 7,
@@ -77,7 +77,7 @@ enum class HighGuid
Scenario = 16,
AIGroup = 17,
DynamicDoor = 18,
- ClientActor = 19,
+ ClientActor = 19, //NYI
Vignette = 20,
CallForHelp = 21,
AIResource = 22,
@@ -89,23 +89,26 @@ enum class HighGuid
WowAccount = 28,
BNetAccount = 29,
GMTask = 30,
- MobileSession = 31,
+ MobileSession = 31, //NYI
RaidGroup = 32,
Spell = 33,
Mail = 34,
- WebObj = 35,
- LFGObject = 36,
- LFGList = 37,
+ WebObj = 35, //NYI
+ LFGObject = 36, //NYI
+ LFGList = 37, //NYI
UserRouter = 38,
PVPQueueGroup = 39,
UserClient = 40,
- PetBattle = 41,
+ PetBattle = 41, //NYI
UniqueUserClient = 42,
- BattlePet = 43
+ BattlePet = 43,
+
+ Count,
};
class ObjectGuid;
class PackedGuid;
+class GuidFormat;
struct PackedGuidReader
{
@@ -120,15 +123,21 @@ class ObjectGuid
friend std::ostream& operator<<(std::ostream& stream, ObjectGuid const& guid);
friend ByteBuffer& operator>>(ByteBuffer& buf, PackedGuidReader const& guid);
friend class PackedGuid;
+ friend class GuidFormat;
public:
static ObjectGuid const Empty;
+ static ObjectGuid const TradeItem;
typedef uint64 LowType;
+ template<HighGuid type>
+ static ObjectGuid Create(LowType counter);
+
+ template<HighGuid type>
+ static ObjectGuid Create(uint16 mapId, uint32 entry, LowType counter);
+
ObjectGuid() : _low(0), _high(0) { }
- ObjectGuid(HighGuid hi, uint32 entry, LowType counter) : _low(counter ? uint64(counter) | (uint64(entry) << 32) | (uint64(hi) << ((hi == HighGuid::Corpse || hi == HighGuid::AreaTrigger) ? 48 : 52)) : 0), _high(0) { }
- ObjectGuid(HighGuid hi, LowType counter) : _low(counter ? uint64(counter) | (uint64(hi) << ((hi == HighGuid::Corpse || hi == HighGuid::AreaTrigger) ? 48 : 52)) : 0), _high(0) { }
ObjectGuid(ObjectGuid const&) = default;
PackedGuidReader ReadAsPacked() { return PackedGuidReader(*this); }
@@ -136,24 +145,19 @@ class ObjectGuid
std::vector<uint8> GetRawValue() const;
void SetRawValue(std::vector<uint8> const& guid);
void SetRawValue(uint64 high, uint64 low) { _high = high; _low = low; }
- void Clear() { _low = 0; }
+ void Clear() { _high = 0; _low = 0; }
PackedGuid WriteAsPacked() const;
- HighGuid GetHigh() const
- {
- uint32 temp = ((uint64(_low) >> 48) & 0x0000FFFF);
- return HighGuid((temp == uint32(HighGuid::Corpse) || temp == uint32(HighGuid::AreaTrigger)) ? temp : ((temp >> 4) & 0x00000FFF));
- }
- uint32 GetEntry() const { return HasEntry() ? uint32((_low >> 32) & UI64LIT(0x00000000000FFFFF)) : 0; }
- LowType GetCounter() const
- {
- return _low & UI64LIT(0x00000000FFFFFFFF);
- }
+ HighGuid GetHigh() const { return HighGuid((_high >> 58) & 0x3F); }
+ uint32 GetRealmId() const { return uint32((_high >> 42) & 0x1FFF); }
+ uint32 GetMapId() const { return uint32((_high >> 29) & 0x1FFF); }
+ uint32 GetEntry() const { return uint32((_high >> 6) & 0x7FFFFF); }
+ LowType GetCounter() const { return _low & UI64LIT(0x000000FFFFFFFFFF); }
static LowType GetMaxCounter(HighGuid /*high*/)
{
- return UI64LIT(0xFFFFFFFF);
+ return UI64LIT(0xFFFFFFFFFF);
}
uint32 GetMaxCounter() const { return GetMaxCounter(GetHigh()); }
@@ -188,26 +192,26 @@ class ObjectGuid
bool IsAnyTypeGameObject() const { return IsGameObject() || IsMOTransport(); }
bool IsParty() const { return GetHigh() == HighGuid::Party; }
bool IsGuild() const { return GetHigh() == HighGuid::Guild; }
+ bool IsSceneObject() const { return GetHigh() == HighGuid::SceneObject; }
+ bool IsConversation() const { return GetHigh() == HighGuid::Conversation; }
static TypeID GetTypeId(HighGuid high)
{
switch (high)
{
- case HighGuid::Item: return TYPEID_ITEM;
- //case HIGHGUID_CONTAINER: return TYPEID_CONTAINER; HIGHGUID_CONTAINER==HIGHGUID_ITEM currently
- case HighGuid::Creature: return TYPEID_UNIT;
- case HighGuid::Pet: return TYPEID_UNIT;
- case HighGuid::Player: return TYPEID_PLAYER;
- case HighGuid::GameObject: return TYPEID_GAMEOBJECT;
- case HighGuid::DynamicObject: return TYPEID_DYNAMICOBJECT;
- case HighGuid::Corpse: return TYPEID_CORPSE;
- case HighGuid::AreaTrigger: return TYPEID_AREATRIGGER;
- case HighGuid::Transport: return TYPEID_GAMEOBJECT;
- case HighGuid::Vehicle: return TYPEID_UNIT;
- // unknown
- case HighGuid::Party:
- case HighGuid::Guild:
- default: return TYPEID_OBJECT;
+ case HighGuid::Item: return TYPEID_ITEM;
+ case HighGuid::Creature:
+ case HighGuid::Pet:
+ case HighGuid::Vehicle: return TYPEID_UNIT;
+ case HighGuid::Player: return TYPEID_PLAYER;
+ case HighGuid::GameObject:
+ case HighGuid::Transport: return TYPEID_GAMEOBJECT;
+ case HighGuid::DynamicObject: return TYPEID_DYNAMICOBJECT;
+ case HighGuid::Corpse: return TYPEID_CORPSE;
+ case HighGuid::AreaTrigger: return TYPEID_AREATRIGGER;
+ case HighGuid::SceneObject: return TYPEID_SCENEOBJECT;
+ case HighGuid::Conversation: return TYPEID_CONVERSATION;
+ default: return TYPEID_OBJECT;
}
}
@@ -235,13 +239,6 @@ class ObjectGuid
{
switch (high)
{
- case HighGuid::Item:
- case HighGuid::Player:
- case HighGuid::DynamicObject:
- case HighGuid::Corpse:
- case HighGuid::Transport:
- case HighGuid::Party:
- return false;
case HighGuid::GameObject:
case HighGuid::Creature:
case HighGuid::Pet:
@@ -253,6 +250,7 @@ class ObjectGuid
bool HasEntry() const { return HasEntry(GetHigh()); }
+ ObjectGuid(uint64 high, uint64 low) : _low(low), _high(high) { }
explicit ObjectGuid(uint32 const&) = delete; // no implementation, used to catch wrong type assignment
uint64 _low;
@@ -276,9 +274,9 @@ class PackedGuid
public:
explicit PackedGuid() : _packedGuid(PACKED_GUID_MIN_BUFFER_SIZE) { _packedGuid << uint16(0); }
- explicit PackedGuid(ObjectGuid guid) : _packedGuid(PACKED_GUID_MIN_BUFFER_SIZE) { Set(guid); }
+ explicit PackedGuid(ObjectGuid const& guid) : _packedGuid(PACKED_GUID_MIN_BUFFER_SIZE) { Set(guid); }
- void Set(ObjectGuid guid);
+ void Set(ObjectGuid const& guid);
size_t size() const { return _packedGuid.size(); }