diff options
| author | Shauren <shauren.trinity@gmail.com> | 2014-10-29 21:13:21 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2014-10-29 21:13:21 +0100 |
| commit | 15fbb6f46fb24fdc6f91786543b32f247e6525fc (patch) | |
| tree | 3d07a448e71dae1d948aa5a49b4ea818b2e9a986 /src/server/game/Entities/Object | |
| parent | 13281fef3c85688df18b5ea7cfab74411c6529f7 (diff) | |
Core/Entites: Updated GUID format
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/ObjectGuid.cpp | 146 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/ObjectGuid.h | 90 |
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(); } |
