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 | |
| parent | 13281fef3c85688df18b5ea7cfab74411c6529f7 (diff) | |
Core/Entites: Updated GUID format
Diffstat (limited to 'src/server/game/Entities')
| -rw-r--r-- | src/server/game/Entities/AreaTrigger/AreaTrigger.cpp | 3 | ||||
| -rw-r--r-- | src/server/game/Entities/Corpse/Corpse.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/Creature.cpp | 9 | ||||
| -rw-r--r-- | src/server/game/Entities/DynamicObject/DynamicObject.cpp | 5 | ||||
| -rw-r--r-- | src/server/game/Entities/GameObject/GameObject.cpp | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/Container/Bag.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Item/Item.cpp | 8 | ||||
| -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 | ||||
| -rw-r--r-- | src/server/game/Entities/Pet/Pet.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Pet/Pet.h | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 32 | ||||
| -rw-r--r-- | src/server/game/Entities/Player/SocialMgr.cpp | 2 | ||||
| -rw-r--r-- | src/server/game/Entities/Transport/Transport.cpp | 2 |
16 files changed, 219 insertions, 115 deletions
diff --git a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp index d7f7d2ca467..b68b725ecd9 100644 --- a/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp +++ b/src/server/game/Entities/AreaTrigger/AreaTrigger.cpp @@ -66,7 +66,8 @@ bool AreaTrigger::CreateAreaTrigger(ObjectGuid::LowType guidlow, uint32 triggerE return false; } - WorldObject::_Create(guidlow, HighGuid::AreaTrigger, caster->GetPhaseMask()); + Object::_Create(ObjectGuid::Create<HighGuid::AreaTrigger>(GetMapId(), triggerEntry, guidlow)); + SetPhaseMask(caster->GetPhaseMask(), false); SetEntry(triggerEntry); SetDuration(spell->GetDuration()); diff --git a/src/server/game/Entities/Corpse/Corpse.cpp b/src/server/game/Entities/Corpse/Corpse.cpp index feb3e740e8f..15465ed11e4 100644 --- a/src/server/game/Entities/Corpse/Corpse.cpp +++ b/src/server/game/Entities/Corpse/Corpse.cpp @@ -65,7 +65,7 @@ void Corpse::RemoveFromWorld() bool Corpse::Create(ObjectGuid::LowType guidlow, Map* map) { SetMap(map); - Object::_Create(guidlow, 0, HighGuid::Corpse); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(map->GetId(), 0, guidlow)); return true; } @@ -86,7 +86,8 @@ bool Corpse::Create(ObjectGuid::LowType guidlow, Player* owner) //in other way we will get a crash in Corpse::SaveToDB() SetMap(owner->GetMap()); - WorldObject::_Create(guidlow, HighGuid::Corpse, owner->GetPhaseMask()); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(GetMapId(), 0, guidlow)); + SetPhaseMask(owner->GetPhaseMask(), false); SetObjectScale(1); SetGuidValue(CORPSE_FIELD_OWNER, owner->GetGUID()); @@ -169,7 +170,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) float o = fields[3].GetFloat(); uint32 mapId = fields[4].GetUInt16(); - Object::_Create(guid, 0, HighGuid::Corpse); + Object::_Create(ObjectGuid::Create<HighGuid::Corpse>(mapId, 0, guid)); SetUInt32Value(CORPSE_FIELD_DISPLAY_ID, fields[5].GetUInt32()); _LoadIntoDataField(fields[6].GetCString(), CORPSE_FIELD_ITEM, EQUIPMENT_SLOT_END); @@ -177,7 +178,7 @@ bool Corpse::LoadCorpseFromDB(ObjectGuid::LowType guid, Field* fields) SetUInt32Value(CORPSE_FIELD_BYTES_2, fields[8].GetUInt32()); SetUInt32Value(CORPSE_FIELD_FLAGS, fields[9].GetUInt8()); SetUInt32Value(CORPSE_FIELD_DYNAMIC_FLAGS, fields[10].GetUInt8()); - SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid(HighGuid::Player, fields[16].GetUInt64())); + SetGuidValue(CORPSE_FIELD_OWNER, ObjectGuid::Create<HighGuid::Player>(fields[16].GetUInt64())); m_time = time_t(fields[11].GetUInt32()); diff --git a/src/server/game/Entities/Creature/Creature.cpp b/src/server/game/Entities/Creature/Creature.cpp index 57181986863..3a27207b833 100644 --- a/src/server/game/Entities/Creature/Creature.cpp +++ b/src/server/game/Entities/Creature/Creature.cpp @@ -472,7 +472,7 @@ void Creature::Update(uint32 diff) if (!allowed) // Will be rechecked on next Update call break; - ObjectGuid dbtableHighGuid(HighGuid::Creature, GetEntry(), m_DBTableGuid); + ObjectGuid dbtableHighGuid = ObjectGuid::Create<HighGuid::Creature>(GetMapId(), GetEntry(), m_DBTableGuid); time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); if (!linkedRespawntime) // Can respawn Respawn(); @@ -1194,7 +1194,10 @@ bool Creature::CreateFromProto(ObjectGuid::LowType guidlow, uint32 entry, Creatu SetOriginalEntry(entry); - Object::_Create(guidlow, entry, (vehId || cinfo->VehicleId) ? HighGuid::Vehicle : HighGuid::Creature); + if (vehId || cinfo->VehicleId) + Object::_Create(ObjectGuid::Create<HighGuid::Vehicle>(GetMapId(), entry, guidlow)); + else + Object::_Create(ObjectGuid::Create<HighGuid::Creature>(GetMapId(), entry, guidlow)); if (!UpdateEntry(entry, data)) return false; @@ -1229,7 +1232,7 @@ bool Creature::LoadCreatureFromDB(ObjectGuid::LowType guid, Map* map, bool addTo m_DBTableGuid = guid; if (map->GetInstanceId() == 0) { - if (map->GetCreature(ObjectGuid(HighGuid::Creature, data->id, guid))) + if (map->GetCreature(ObjectGuid::Create<HighGuid::Creature>(data->mapid, data->id, guid))) return false; } else diff --git a/src/server/game/Entities/DynamicObject/DynamicObject.cpp b/src/server/game/Entities/DynamicObject/DynamicObject.cpp index 1131cc2c758..4cd75299c0e 100644 --- a/src/server/game/Entities/DynamicObject/DynamicObject.cpp +++ b/src/server/game/Entities/DynamicObject/DynamicObject.cpp @@ -91,10 +91,11 @@ bool DynamicObject::CreateDynamicObject(ObjectGuid::LowType guidlow, Unit* caste return false; } - WorldObject::_Create(guidlow, HighGuid::DynamicObject, caster->GetPhaseMask()); + WorldObject::_Create(ObjectGuid::Create<HighGuid::DynamicObject>(GetMapId(), spell->Id, guidlow)); + SetPhaseMask(caster->GetPhaseMask(), false); SetEntry(spell->Id); - SetObjectScale(1); + SetObjectScale(1.0f); SetGuidValue(DYNAMICOBJECT_CASTER, caster->GetGUID()); SetUInt32Value(DYNAMICOBJECT_BYTES, spell->SpellVisual[0] | (type << 28)); SetUInt32Value(DYNAMICOBJECT_SPELLID, spell->Id); diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp index 4821014ced0..c3805be45cc 100644 --- a/src/server/game/Entities/GameObject/GameObject.cpp +++ b/src/server/game/Entities/GameObject/GameObject.cpp @@ -194,7 +194,7 @@ bool GameObject::Create(ObjectGuid::LowType guidlow, uint32 name_id, Map* map, u if (goinfo->type == GAMEOBJECT_TYPE_TRANSPORT) m_updateFlag |= UPDATEFLAG_TRANSPORT; - Object::_Create(guidlow, goinfo->entry, HighGuid::GameObject); + Object::_Create(ObjectGuid::Create<HighGuid::GameObject>(map->GetId(), goinfo->entry, guidlow)); m_goInfo = goinfo; @@ -404,7 +404,7 @@ void GameObject::Update(uint32 diff) time_t now = time(NULL); if (m_respawnTime <= now) // timer expired { - ObjectGuid dbtableHighGuid(HighGuid::GameObject, GetEntry(), m_DBTableGuid); + ObjectGuid dbtableHighGuid = ObjectGuid::Create<HighGuid::GameObject>(GetMapId(), GetEntry(), m_DBTableGuid); time_t linkedRespawntime = GetMap()->GetLinkedRespawnTime(dbtableHighGuid); if (linkedRespawntime) // Can't respawn, the master is dead { diff --git a/src/server/game/Entities/Item/Container/Bag.cpp b/src/server/game/Entities/Item/Container/Bag.cpp index 4e33c4fe295..0e4b2990bd3 100644 --- a/src/server/game/Entities/Item/Container/Bag.cpp +++ b/src/server/game/Entities/Item/Container/Bag.cpp @@ -77,7 +77,7 @@ bool Bag::Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner if (!itemProto || itemProto->ContainerSlots > MAX_BAG_SIZE) return false; - Object::_Create(guidlow, 0, HighGuid::Item); + Object::_Create(ObjectGuid::Create<HighGuid::Item>(guidlow)); SetEntry(itemid); SetObjectScale(1.0f); diff --git a/src/server/game/Entities/Item/Item.cpp b/src/server/game/Entities/Item/Item.cpp index af2f75622ad..2eb4026bf07 100644 --- a/src/server/game/Entities/Item/Item.cpp +++ b/src/server/game/Entities/Item/Item.cpp @@ -266,7 +266,7 @@ Item::Item() bool Item::Create(ObjectGuid::LowType guidlow, uint32 itemid, Player const* owner) { - Object::_Create(guidlow, 0, HighGuid::Item); + Object::_Create(ObjectGuid::Create<HighGuid::Item>(guidlow)); SetEntry(itemid); SetObjectScale(1.0f); @@ -413,7 +413,7 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi // create item before any checks for store correct guid // and allow use "FSetState(ITEM_REMOVED); SaveToDB();" for deleting item from DB - Object::_Create(guid, 0, HighGuid::Item); + Object::_Create(ObjectGuid::Create<HighGuid::Item>(guid)); // Set entry, MUST be before proto check SetEntry(entry); @@ -428,8 +428,8 @@ bool Item::LoadFromDB(ObjectGuid::LowType guid, ObjectGuid owner_guid, Field* fi SetOwnerGUID(owner_guid); bool need_save = false; // need explicit save data at load fixes - SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid(HighGuid::Player, fields[0].GetUInt64())); - SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid(HighGuid::Player, fields[1].GetUInt64())); + SetGuidValue(ITEM_FIELD_CREATOR, ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64())); + SetGuidValue(ITEM_FIELD_GIFTCREATOR, ObjectGuid::Create<HighGuid::Player>(fields[1].GetUInt64())); SetCount(fields[2].GetUInt32()); uint32 duration = fields[3].GetUInt32(); 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(); } diff --git a/src/server/game/Entities/Pet/Pet.cpp b/src/server/game/Entities/Pet/Pet.cpp index 1e1ed30cf33..083d08cc41a 100644 --- a/src/server/game/Entities/Pet/Pet.cpp +++ b/src/server/game/Entities/Pet/Pet.cpp @@ -175,7 +175,7 @@ bool Pet::LoadPetFromDB(Player* owner, uint32 petEntry, uint32 petnumber, bool c } Map* map = owner->GetMap(); - if (!Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, owner->GetPhaseMask(), petEntry, petId)) + if (!Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, owner->GetPhaseMask(), petEntry)) return false; for (auto itr : owner->GetPhases()) @@ -771,7 +771,7 @@ bool Pet::CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phas { TC_LOG_DEBUG("entities.pet", "Pet::CreateBaseForTamed"); uint32 petId = sObjectMgr->GeneratePetNumber(); - if (!Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, phaseMask, cinfo->Entry, petId)) + if (!Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, phaseMask, cinfo->Entry)) return false; setPowerType(POWER_FOCUS); @@ -1865,13 +1865,13 @@ bool Pet::IsPermanentPetFor(Player* owner) const } } -bool Pet::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 petId) +bool Pet::Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry) { ASSERT(map); SetMap(map); SetPhaseMask(phaseMask, false); - Object::_Create(guidlow, petId, HighGuid::Pet); + Object::_Create(ObjectGuid::Create<HighGuid::Pet>(map->GetId(), Entry, guidlow)); m_DBTableGuid = guidlow; m_originalEntry = Entry; diff --git a/src/server/game/Entities/Pet/Pet.h b/src/server/game/Entities/Pet/Pet.h index 0d24c1cbd81..9d5340f5a73 100644 --- a/src/server/game/Entities/Pet/Pet.h +++ b/src/server/game/Entities/Pet/Pet.h @@ -55,7 +55,7 @@ class Pet : public Guardian bool IsPermanentPetFor(Player* owner) const; // pet have tab in character windows and set UNIT_FIELD_PETNUMBER - bool Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry, uint32 pet_number); + bool Create(ObjectGuid::LowType guidlow, Map* map, uint32 phaseMask, uint32 Entry); bool CreateBaseAtCreature(Creature* creature); bool CreateBaseAtCreatureInfo(CreatureTemplate const* cinfo, Unit* owner); bool CreateBaseAtTamed(CreatureTemplate const* cinfo, Map* map, uint32 phaseMask); diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index 9fd817198c5..fc7410b702f 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -982,7 +982,7 @@ bool Player::Create(ObjectGuid::LowType guidlow, CharacterCreateInfo* createInfo // should check that skin, face, hair* are valid via DBC per race/class // also do it in Player::BuildEnumData, Player::LoadFromDB - Object::_Create(guidlow, 0, HighGuid::Player); + Object::_Create(ObjectGuid::Create<HighGuid::Player>(guidlow)); m_name = createInfo->Name; @@ -1964,7 +1964,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer) Field* fields = result->Fetch(); - ObjectGuid guid(HighGuid::Player, fields[0].GetUInt64()); + ObjectGuid guid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); std::string name = fields[1].GetString(); uint8 playerRace = fields[2].GetUInt8(); uint8 playerClass = fields[3].GetUInt8(); @@ -1983,7 +1983,7 @@ bool Player::BuildEnumData(PreparedQueryResult result, ByteBuffer* dataBuffer) uint64 guildId = fields[13].GetUInt64(); ObjectGuid guildGuid; if (guildId) - guildGuid = ObjectGuid(HighGuid::Guild, guildId); + guildGuid = ObjectGuid::Create<HighGuid::Guild>(guildId); uint32 playerFlags = fields[14].GetUInt32(); uint32 atLoginFlags = fields[15].GetUInt16(); Tokenizer equipment(fields[19].GetString(), ' '); @@ -4809,7 +4809,7 @@ void Player::DeleteFromDB(ObjectGuid playerguid, uint32 accountId, bool updateRe { do { - if (Player* pFriend = ObjectAccessor::FindPlayer(ObjectGuid(HighGuid::Player, (*resultFriends)[0].GetUInt64()))) + if (Player* pFriend = ObjectAccessor::FindPlayer(ObjectGuid::Create<HighGuid::Player>((*resultFriends)[0].GetUInt64()))) { pFriend->GetSocial()->RemoveFromSocialList(playerguid, false); sSocialMgr->SendFriendStatus(pFriend, FRIEND_REMOVED, playerguid, false); @@ -5017,7 +5017,7 @@ void Player::DeleteOldCharacters(uint32 keepDays) do { Field* fields = result->Fetch(); - Player::DeleteFromDB(ObjectGuid(HighGuid::Player, fields[0].GetUInt64()), fields[1].GetUInt32(), true, true); + Player::DeleteFromDB(ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()), fields[1].GetUInt32(), true, true); } while (result->NextRow()); } @@ -7592,7 +7592,7 @@ void Player::UpdateConquestCurrencyCap(uint32 currency) void Player::SetInGuild(ObjectGuid::LowType guildId) { if (guildId) - SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid(HighGuid::Guild, guildId)); + SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid::Create<HighGuid::Guild>(guildId)); else SetGuidValue(OBJECT_FIELD_DATA, ObjectGuid::Empty); @@ -17229,7 +17229,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) return false; } - Object::_Create(guid.GetCounter(), 0, HighGuid::Player); + Object::_Create(guid); m_name = fields[2].GetString(); @@ -17431,7 +17431,7 @@ bool Player::LoadFromDB(ObjectGuid guid, SQLQueryHolder *holder) // currently we do not support transport in bg else if (transLowGUID) { - ObjectGuid transGUID(HighGuid::Transport, transLowGUID); + ObjectGuid transGUID = ObjectGuid::Create<HighGuid::Transport>(transLowGUID); Transport* transport = NULL; if (GameObject* go = HashMapHolder<GameObject>::Find(transGUID)) @@ -18155,7 +18155,7 @@ void Player::_LoadInventory(PreparedQueryResult result, uint32 timeDiff) Field* fields = result->Fetch(); if (Item* item = _LoadItem(trans, zoneId, timeDiff, fields)) { - ObjectGuid bagGuid(HighGuid::Item, fields[11].GetUInt64()); + ObjectGuid bagGuid = ObjectGuid::Create<HighGuid::Item>(fields[11].GetUInt64()); uint8 slot = fields[12].GetUInt8(); uint8 err = EQUIP_ERR_OK; @@ -18275,7 +18275,7 @@ void Player::_LoadVoidStorage(PreparedQueryResult result) uint64 itemId = fields[0].GetUInt64(); uint32 itemEntry = fields[1].GetUInt32(); uint8 slot = fields[2].GetUInt8(); - ObjectGuid creatorGuid(HighGuid::Player, fields[3].GetUInt64()); + ObjectGuid creatorGuid = ObjectGuid::Create<HighGuid::Player>(fields[3].GetUInt64()); uint32 randomProperty = fields[4].GetUInt32(); uint32 suffixFactor = fields[5].GetUInt32(); @@ -18379,7 +18379,7 @@ Item* Player::_LoadItem(SQLTransaction& trans, uint32 zoneId, uint32 timeDiff, F Tokenizer GUIDlist(strGUID, ' '); GuidSet looters; for (Tokenizer::const_iterator itr = GUIDlist.begin(); itr != GUIDlist.end(); ++itr) - looters.insert(ObjectGuid(HighGuid::Player, uint64(strtoull(*itr, nullptr, 10)))); + looters.insert(ObjectGuid::Create<HighGuid::Player>(uint64(strtoull(*itr, nullptr, 10)))); if (looters.size() > 1 && item->GetTemplate()->GetMaxStackSize() == 1 && item->IsSoulBound()) { @@ -18473,7 +18473,7 @@ void Player::_LoadMailedItems(Mail* mail) Item* item = NewItemOrBag(proto); - if (!item->LoadFromDB(itemGuid, ObjectGuid(HighGuid::Player, fields[13].GetUInt64()), fields, itemTemplate)) + if (!item->LoadFromDB(itemGuid, ObjectGuid::Create<HighGuid::Player>(fields[13].GetUInt64()), fields, itemTemplate)) { TC_LOG_ERROR("entities.player", "Player::_LoadMailedItems - Item in mail (%u) doesn't exist !!!! - item guid: " UI64FMTD ", deleted from mail", mail->messageID, itemGuid); @@ -21363,8 +21363,8 @@ void Player::RemovePetitionsAndSigns(ObjectGuid guid, uint32 type) do // this part effectively does nothing, since the deletion / modification only takes place _after_ the PetitionQuery. Though I don't know if the result remains intact if I execute the delete query beforehand. { // and SendPetitionQueryOpcode reads data from the DB Field* fields = result->Fetch(); - ObjectGuid ownerguid = ObjectGuid(HighGuid::Player, fields[0].GetUInt64()); - ObjectGuid petitionguid = ObjectGuid(HighGuid::Item, fields[1].GetUInt64()); + ObjectGuid ownerguid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); + ObjectGuid petitionguid = ObjectGuid::Create<HighGuid::Item>(fields[1].GetUInt64()); // send update if charter owner in game Player* owner = ObjectAccessor::FindConnectedPlayer(ownerguid); @@ -26393,7 +26393,7 @@ void Player::SendEquipmentSetList() if (itr->second.IgnoreMask & (1 << i)) data << ignoredItemGuid; else - data << ObjectGuid(HighGuid::Item, itr->second.Items[i]); + data << ObjectGuid::Create<HighGuid::Item>(itr->second.Items[i]); } ++count; // client have limit but it checked at loading and set @@ -27543,7 +27543,7 @@ Pet* Player::SummonPet(uint32 entry, float x, float y, float z, float ang, PetTy Map* map = GetMap(); uint32 pet_number = sObjectMgr->GeneratePetNumber(); - if (!pet->Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, GetPhaseMask(), entry, pet_number)) + if (!pet->Create(sObjectMgr->GetGenerator<HighGuid::Pet>()->Generate(), map, GetPhaseMask(), entry)) { TC_LOG_ERROR("misc", "no such creature entry %u", entry); delete pet; diff --git a/src/server/game/Entities/Player/SocialMgr.cpp b/src/server/game/Entities/Player/SocialMgr.cpp index def232fd576..8f2a1ac6060 100644 --- a/src/server/game/Entities/Player/SocialMgr.cpp +++ b/src/server/game/Entities/Player/SocialMgr.cpp @@ -324,7 +324,7 @@ PlayerSocial* SocialMgr::LoadFromDB(PreparedQueryResult result, ObjectGuid const { Field* fields = result->Fetch(); - friendGuid = ObjectGuid(HighGuid::Player, fields[0].GetUInt64()); + friendGuid = ObjectGuid::Create<HighGuid::Player>(fields[0].GetUInt64()); flags = fields[1].GetUInt8(); note = fields[2].GetString(); diff --git a/src/server/game/Entities/Transport/Transport.cpp b/src/server/game/Entities/Transport/Transport.cpp index 189c715861f..98fb132cdd6 100644 --- a/src/server/game/Entities/Transport/Transport.cpp +++ b/src/server/game/Entities/Transport/Transport.cpp @@ -58,7 +58,7 @@ bool Transport::Create(ObjectGuid::LowType guidlow, uint32 entry, uint32 mapid, return false; } - Object::_Create(guidlow, 0, HighGuid::Transport); + Object::_Create(ObjectGuid::Create<HighGuid::Transport>(guidlow)); GameObjectTemplate const* goinfo = sObjectMgr->GetGameObjectTemplate(entry); |
