aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities
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
parent13281fef3c85688df18b5ea7cfab74411c6529f7 (diff)
Core/Entites: Updated GUID format
Diffstat (limited to 'src/server/game/Entities')
-rw-r--r--src/server/game/Entities/AreaTrigger/AreaTrigger.cpp3
-rw-r--r--src/server/game/Entities/Corpse/Corpse.cpp9
-rw-r--r--src/server/game/Entities/Creature/Creature.cpp9
-rw-r--r--src/server/game/Entities/DynamicObject/DynamicObject.cpp5
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp4
-rw-r--r--src/server/game/Entities/Item/Container/Bag.cpp2
-rw-r--r--src/server/game/Entities/Item/Item.cpp8
-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
-rw-r--r--src/server/game/Entities/Pet/Pet.cpp8
-rw-r--r--src/server/game/Entities/Pet/Pet.h2
-rw-r--r--src/server/game/Entities/Player/Player.cpp32
-rw-r--r--src/server/game/Entities/Player/SocialMgr.cpp2
-rw-r--r--src/server/game/Entities/Transport/Transport.cpp2
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);