diff --git a/src/game/Chat.cpp b/src/game/Chat.cpp index 1b1bf20ff..5111aec53 100644 --- a/src/game/Chat.cpp +++ b/src/game/Chat.cpp @@ -899,10 +899,10 @@ bool ChatHandler::ExecuteCommandInTable(ChatCommand *table, const char* text, co if (m_session) { Player* p = m_session->GetPlayer(); - uint64 sel_guid = p->GetSelection(); - sLog.outCommand(GetAccountId(),"Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s (GUID: %u)]", + ObjectGuid sel_guid = p->GetSelection(); + sLog.outCommand(GetAccountId(),"Command: %s [Player: %s (Account: %u) X: %f Y: %f Z: %f Map: %u Selected: %s]", fullcmd.c_str(),p->GetName(),GetAccountId(),p->GetPositionX(),p->GetPositionY(),p->GetPositionZ(),p->GetMapId(), - GetLogNameForGuid(sel_guid),GUID_LOPART(sel_guid)); + sel_guid.GetString().c_str()); } else // 0 account -> console { diff --git a/src/game/CombatHandler.cpp b/src/game/CombatHandler.cpp index 5203738a8..7aef031e1 100644 --- a/src/game/CombatHandler.cpp +++ b/src/game/CombatHandler.cpp @@ -26,19 +26,19 @@ void WorldSession::HandleAttackSwingOpcode( WorldPacket & recv_data ) { - uint64 guid; + ObjectGuid guid; recv_data >> guid; - DEBUG_LOG( "WORLD: Recvd CMSG_ATTACKSWING Message guidlow:%u guidhigh:%u", GUID_LOPART(guid), GUID_HIPART(guid) ); + DEBUG_LOG("WORLD: Recvd CMSG_ATTACKSWING Message %s", guid.GetString().c_str()); - Unit *pEnemy = ObjectAccessor::GetUnit(*_player, guid); + Unit *pEnemy = ObjectAccessor::GetUnit(*_player, guid.GetRawValue()); if(!pEnemy) { - if(!IS_UNIT_GUID(guid)) - sLog.outError("WORLD: Object %u (TypeID: %u) isn't player, pet or creature",GUID_LOPART(guid),GuidHigh2TypeId(GUID_HIPART(guid))); + if(!guid.IsUnit()) + sLog.outError("WORLD: %u isn't player, pet or creature", guid.GetString().c_str()); else - sLog.outError( "WORLD: Enemy %s %u not found",GetLogNameForGuid(guid),GUID_LOPART(guid)); + sLog.outError( "WORLD: Enemy %s not found", guid.GetString().c_str()); // stop attack state at client SendAttackStop(NULL); @@ -47,7 +47,7 @@ void WorldSession::HandleAttackSwingOpcode( WorldPacket & recv_data ) if(_player->IsFriendlyTo(pEnemy) || pEnemy->HasFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_NON_ATTACKABLE | UNIT_FLAG_NOT_SELECTABLE)) { - sLog.outError( "WORLD: Enemy %s %u is friendly",(IS_PLAYER_GUID(guid) ? "player" : "creature"),GUID_LOPART(guid)); + sLog.outError( "WORLD: Enemy %s is friendly",guid.GetString().c_str()); // stop attack state at client SendAttackStop(pEnemy); diff --git a/src/game/Makefile.am b/src/game/Makefile.am index bfd852d5a..39d6982e1 100644 --- a/src/game/Makefile.am +++ b/src/game/Makefile.am @@ -194,6 +194,7 @@ libmangosgame_a_SOURCES = \ ObjectAccessor.cpp \ ObjectAccessor.h \ Object.cpp \ + ObjectGuid.cpp \ ObjectGuid.h \ ObjectGridLoader.cpp \ ObjectGridLoader.h \ diff --git a/src/game/Object.cpp b/src/game/Object.cpp index 5dea8a5f1..53c830943 100644 --- a/src/game/Object.cpp +++ b/src/game/Object.cpp @@ -60,7 +60,7 @@ uint32 GuidHigh2TypeId(uint32 guid_hi) case HIGHGUID_MO_TRANSPORT: return TYPEID_GAMEOBJECT; case HIGHGUID_VEHICLE: return TYPEID_UNIT; } - return NUM_CLIENT_OBJECT_TYPES; // unknown + return TYPEID_OBJECT; // unknown } Object::Object( ) : m_PackGUID(sizeof(uint64)+1) diff --git a/src/game/Object.h b/src/game/Object.h index ff7129cec..1fdab34f8 100644 --- a/src/game/Object.h +++ b/src/game/Object.h @@ -40,32 +40,6 @@ #define DEFAULT_WORLD_OBJECT_SIZE 0.388999998569489f // player size, also currently used (correctly?) for any non Unit world objects #define MAX_STEALTH_DETECT_RANGE 45.0f -enum TypeMask -{ - TYPEMASK_OBJECT = 0x0001, - TYPEMASK_ITEM = 0x0002, - TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004 - TYPEMASK_UNIT = 0x0008, - TYPEMASK_PLAYER = 0x0010, - TYPEMASK_GAMEOBJECT = 0x0020, - TYPEMASK_DYNAMICOBJECT = 0x0040, - TYPEMASK_CORPSE = 0x0080 -}; - -enum TypeID -{ - TYPEID_OBJECT = 0, - TYPEID_ITEM = 1, - TYPEID_CONTAINER = 2, - TYPEID_UNIT = 3, - TYPEID_PLAYER = 4, - TYPEID_GAMEOBJECT = 5, - TYPEID_DYNAMICOBJECT = 6, - TYPEID_CORPSE = 7 -}; - -#define NUM_CLIENT_OBJECT_TYPES 8 - uint32 GuidHigh2TypeId(uint32 guid_hi); enum TempSummonType diff --git a/src/game/ObjectGuid.h b/src/game/ObjectGuid.h index bbb560bc0..e3e3e2072 100644 --- a/src/game/ObjectGuid.h +++ b/src/game/ObjectGuid.h @@ -19,7 +19,35 @@ #ifndef MANGOS_OBJECT_GUID_H #define MANGOS_OBJECT_GUID_H -#include "Platform/Define.h" +#include "Common.h" + +class ByteBuffer; + +enum TypeID +{ + TYPEID_OBJECT = 0, + TYPEID_ITEM = 1, + TYPEID_CONTAINER = 2, + TYPEID_UNIT = 3, + TYPEID_PLAYER = 4, + TYPEID_GAMEOBJECT = 5, + TYPEID_DYNAMICOBJECT = 6, + TYPEID_CORPSE = 7 +}; + +#define MAX_TYPE_ID 8 + +enum TypeMask +{ + TYPEMASK_OBJECT = 0x0001, + TYPEMASK_ITEM = 0x0002, + TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004 + TYPEMASK_UNIT = 0x0008, + TYPEMASK_PLAYER = 0x0010, + TYPEMASK_GAMEOBJECT = 0x0020, + TYPEMASK_DYNAMICOBJECT = 0x0040, + TYPEMASK_CORPSE = 0x0080 +}; enum HighGuid { @@ -36,8 +64,7 @@ enum HighGuid HIGHGUID_MO_TRANSPORT = 0x1FC0, // blizz 1FC0 (for GAMEOBJECT_TYPE_MO_TRANSPORT) }; -#define IS_EMPTY_GUID(Guid) ( Guid == 0 ) - +//*** Must be replaced by ObjectGuid use *** #define IS_CREATURE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_UNIT ) #define IS_PET_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_PET ) #define IS_VEHICLE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_VEHICLE ) @@ -47,9 +74,7 @@ enum HighGuid // special case for empty guid need check #define IS_ITEM_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_ITEM ) #define IS_GAMEOBJECT_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_GAMEOBJECT ) -#define IS_DYNAMICOBJECT_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_DYNAMICOBJECT ) #define IS_CORPSE_GUID(Guid) ( GUID_HIPART(Guid) == HIGHGUID_CORPSE ) -#define IS_TRANSPORT(Guid) ( GUID_HIPART(Guid) == HIGHGUID_TRANSPORT ) #define IS_MO_TRANSPORT(Guid) ( GUID_HIPART(Guid) == HIGHGUID_MO_TRANSPORT ) // l - OBJECT_FIELD_GUID @@ -88,22 +113,92 @@ inline bool IsGuidHaveEnPart(uint64 const& guid) #define GUID_ENPART(x) (IsGuidHaveEnPart(x) ? _GUID_ENPART_3(x) : _GUID_ENPART_2(x)) #define GUID_LOPART(x) (IsGuidHaveEnPart(x) ? _GUID_LOPART_3(x) : _GUID_LOPART_2(x)) -inline char const* GetLogNameForGuid(uint64 guid) +//*** Must be replaced by ObjectGuid use END *** + +class ObjectGuid { - switch(GUID_HIPART(guid)) - { - case HIGHGUID_ITEM: return "item"; - case HIGHGUID_PLAYER: return guid ? "player" : "none"; - case HIGHGUID_GAMEOBJECT: return "gameobject"; - case HIGHGUID_TRANSPORT: return "transport"; - case HIGHGUID_UNIT: return "creature"; - case HIGHGUID_PET: return "pet"; - case HIGHGUID_VEHICLE: return "vehicle"; - case HIGHGUID_DYNAMICOBJECT:return "dynobject"; - case HIGHGUID_CORPSE: return "corpse"; - case HIGHGUID_MO_TRANSPORT: return "mo_transport"; - default: - return ""; - } -} + public: // constructors + ObjectGuid() : m_guid(0) {} + ObjectGuid(uint64 const& guid) : m_guid(guid) {} // NOTE: must be explicit in future for more strict control type conversions + ObjectGuid(HighGuid hi, uint32 entry, uint32 counter) : m_guid(uint64(counter) | (uint64(entry) << 24) | (uint64(hi) << 48)) {} + + public: // modifiers + void Set(uint64 const& guid) { m_guid = guid; } + + // Possible removed in future for more strict control type conversions + void operator= (uint64 const& guid) { m_guid = guid; } + public: // accessors + uint64 const& GetRawValue() const { return m_guid; } + HighGuid GetHigh() const { return HighGuid((m_guid >> 48) & 0x0000FFFF); } + uint32 GetEntry() const { return HasEntry() ? uint32((m_guid >> 24) & UI64LIT(0x0000000000FFFFFF)) : 0; } + uint32 GetCounter() const + { + return HasEntry() + ? uint32(m_guid & UI64LIT(0x0000000000FFFFFF)) + : uint32(m_guid & UI64LIT(0x00000000FFFFFFFF)); + } + + bool IsEmpty() const { return m_guid == 0; } + bool IsCreature() const { return GetHigh() == HIGHGUID_UNIT; } + bool IsPet() const { return GetHigh() == HIGHGUID_PET; } + bool IsVehicle() const { return GetHigh() == HIGHGUID_VEHICLE; } + bool IsCreatureOrPet() const { return GetHigh() == HIGHGUID_VEHICLE; } + bool IsPlayer() const { return !IsEmpty() && GetHigh() == HIGHGUID_PLAYER; } + bool IsUnit() const { return IsCreatureOrPet() || IsPlayer(); } + bool IsItem() const { return GetHigh() == HIGHGUID_ITEM; } + bool IsGameobject() const { return GetHigh() == HIGHGUID_GAMEOBJECT; } + bool IsDynamicObject() const { return GetHigh() == HIGHGUID_DYNAMICOBJECT; } + bool IsCorpse() const { return GetHigh() == HIGHGUID_CORPSE; } + bool IsTransport() const { return GetHigh() == HIGHGUID_TRANSPORT; } + bool IsMOTransport() const { return GetHigh() == HIGHGUID_MO_TRANSPORT; } + + TypeID GetTypeId() + { + switch(GetHigh()) + { + case HIGHGUID_ITEM: return TYPEID_ITEM; + //case HIGHGUID_CONTAINER: return TYPEID_CONTAINER; HIGHGUID_CONTAINER==HIGHGUID_ITEM currently + case HIGHGUID_UNIT: 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_MO_TRANSPORT: return TYPEID_GAMEOBJECT; + case HIGHGUID_VEHICLE: return TYPEID_UNIT; + // unknown + default: return TYPEID_OBJECT; + } + } + public: // accessors - for debug + char const* GetTypeName() const; + std::string GetString() const; + private: // internal functions + bool HasEntry() const + { + switch(GetHigh()) + { + case HIGHGUID_ITEM: + case HIGHGUID_PLAYER: + case HIGHGUID_DYNAMICOBJECT: + case HIGHGUID_CORPSE: + return false; + case HIGHGUID_GAMEOBJECT: + case HIGHGUID_TRANSPORT: + case HIGHGUID_UNIT: + case HIGHGUID_PET: + case HIGHGUID_VEHICLE: + case HIGHGUID_MO_TRANSPORT: + default: + return true; + } + } + + private: // fields + uint64 m_guid; +}; + +ByteBuffer& operator<< (ByteBuffer& buf, ObjectGuid const& guid); +ByteBuffer& operator>> (ByteBuffer& buf, ObjectGuid& guid); + #endif diff --git a/src/shared/revision_nr.h b/src/shared/revision_nr.h index f92d94fa6..50bb0d39a 100644 --- a/src/shared/revision_nr.h +++ b/src/shared/revision_nr.h @@ -1,4 +1,4 @@ #ifndef __REVISION_NR_H__ #define __REVISION_NR_H__ - #define REVISION_NR "9546" + #define REVISION_NR "9547" #endif // __REVISION_NR_H__ diff --git a/win/VC100/game.vcxproj b/win/VC100/game.vcxproj index 2c8376444..7f9ba21ae 100644 --- a/win/VC100/game.vcxproj +++ b/win/VC100/game.vcxproj @@ -435,6 +435,7 @@ + diff --git a/win/VC80/game.vcproj b/win/VC80/game.vcproj index 9a38572e2..49835dc06 100644 --- a/win/VC80/game.vcproj +++ b/win/VC80/game.vcproj @@ -1309,6 +1309,10 @@ RelativePath="..\..\src\game\ObjectAccessor.h" > + + diff --git a/win/VC90/game.vcproj b/win/VC90/game.vcproj index 353ce3c45..d0dea11a7 100644 --- a/win/VC90/game.vcproj +++ b/win/VC90/game.vcproj @@ -1310,6 +1310,10 @@ RelativePath="..\..\src\game\ObjectAccessor.h" > + +