diff options
| author | Shauren <shauren.trinity@gmail.com> | 2024-03-14 11:37:32 +0100 |
|---|---|---|
| committer | Shauren <shauren.trinity@gmail.com> | 2024-03-14 21:04:24 +0100 |
| commit | 0dcff2624e6df1c27d7a4d6a66ebcc0b2d698413 (patch) | |
| tree | 667e812489cf06c39bde9d53e60e4e2854a09122 /src/server/game/Entities/Object | |
| parent | b64e261e942e093be906e0591c8b4232706ee0e7 (diff) | |
Core/Objects: Added ToWorldObject and ToItem
(cherry picked from commit 6f6af6a1a1508508d0e42b90f0acf4f363cf91bd)
Diffstat (limited to 'src/server/game/Entities/Object')
| -rw-r--r-- | src/server/game/Entities/Object/Object.cpp | 37 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 13 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/ObjectGuid.h | 8 |
3 files changed, 41 insertions, 17 deletions
diff --git a/src/server/game/Entities/Object/Object.cpp b/src/server/game/Entities/Object/Object.cpp index 155596e7e32..21f296fcad0 100644 --- a/src/server/game/Entities/Object/Object.cpp +++ b/src/server/game/Entities/Object/Object.cpp @@ -81,8 +81,8 @@ Object::~Object() if (IsInWorld()) { TC_LOG_FATAL("misc", "Object::~Object {} deleted but still in world!!", GetGUID().ToString()); - if (isType(TYPEMASK_ITEM)) - TC_LOG_FATAL("misc", "Item slot {}", ((Item*)this)->GetSlot()); + if (Item* item = ToItem()) + TC_LOG_FATAL("misc", "Item slot {}", item->GetSlot()); ABORT(); } @@ -180,9 +180,9 @@ void Object::BuildCreateUpdateBlockForPlayer(UpdateData* data, Player* target) c if (target == this) // building packet for yourself flags |= UPDATEFLAG_SELF; - if (isType(TYPEMASK_UNIT)) + if (Unit const* unit = ToUnit()) { - if (ToUnit()->GetVictim()) + if (unit->GetVictim()) flags |= UPDATEFLAG_HAS_TARGET; } @@ -233,7 +233,7 @@ void Object::DestroyForPlayer(Player* target, bool onDeath) const { ASSERT(target); - if (isType(TYPEMASK_UNIT) || isType(TYPEMASK_PLAYER)) + if (IsUnit()) { if (Battleground* bg = target->GetBattleground()) { @@ -303,10 +303,9 @@ void Object::BuildMovementUpdate(ByteBuffer* data, uint16 flags) const Unit const* unit = nullptr; WorldObject const* object = nullptr; - if (isType(TYPEMASK_UNIT)) - unit = ToUnit(); - else - object = (WorldObject const*)this; + unit = ToUnit(); + if (!unit) + object = ToWorldObject(); *data << uint16(flags); // update flags @@ -1422,7 +1421,11 @@ void WorldObject::UpdateGroundPositionZ(float x, float y, float &z) const { float new_z = GetMapHeight(x, y, z); if (new_z > INVALID_HEIGHT) - z = new_z + (isType(TYPEMASK_UNIT) ? static_cast<Unit const*>(this)->GetHoverOffset() : 0.0f); + { + z = new_z; + if (Unit const* unit = ToUnit()) + z += unit->GetHoverOffset(); + } } void WorldObject::UpdateAllowedPositionZ(float x, float y, float &z, float* groundZ) const @@ -3421,7 +3424,7 @@ void WorldObject::DestroyForNearbyPlayers() if (!player->HaveAtClient(this)) continue; - if (isType(TYPEMASK_UNIT) && ToUnit()->GetCharmerGUID() == player->GetGUID()) /// @todo this is for puppet + if (Unit const* unit = ToUnit(); unit && unit->GetCharmerGUID() == player->GetGUID()) /// @todo this is for puppet continue; if (GetTypeId() == TYPEID_UNIT) @@ -3546,9 +3549,15 @@ float WorldObject::GetFloorZ() const float WorldObject::GetMapWaterOrGroundLevel(float x, float y, float z, float* ground/* = nullptr*/) const { - return GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), x, y, z, ground, - isType(TYPEMASK_UNIT) ? !static_cast<Unit const*>(this)->HasAuraType(SPELL_AURA_WATER_WALK) : false, - GetCollisionHeight()); + bool swimming = [&]() + { + if (Unit const* unit = ToUnit()) + return !unit->HasAuraType(SPELL_AURA_WATER_WALK); + + return false; + }(); + + return GetMap()->GetWaterOrGroundLevel(GetPhaseMask(), x, y, z, ground, swimming, GetCollisionHeight()); } float WorldObject::GetMapHeight(float x, float y, float z, bool vmap/* = true*/, float distanceToSearch/* = DEFAULT_HEIGHT_SEARCH*/) const diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index c0a1a2b2656..b129f5129c6 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -42,6 +42,7 @@ class CreatureAI; class DynamicObject; class GameObject; class InstanceScript; +class Item; class Map; class Player; class Spell; @@ -163,6 +164,18 @@ class TC_GAME_API Object // FG: some hacky helpers void ForceValuesUpdateAtIndex(uint32); + inline bool IsWorldObject() const { return isType(TYPEMASK_WORLDOBJECT); } + static WorldObject* ToWorldObject(Object* o) { return o ? o->ToWorldObject() : nullptr; } + static WorldObject const* ToWorldObject(Object const* o) { return o ? o->ToWorldObject() : nullptr; } + WorldObject* ToWorldObject() { if (IsUnit()) return reinterpret_cast<WorldObject*>(this); else return nullptr; } + WorldObject const* ToWorldObject() const { if (IsUnit()) return reinterpret_cast<WorldObject const*>(this); else return nullptr; } + + inline bool IsItem() const { return isType(TYPEMASK_ITEM); } + static Item* ToItem(Object* o) { return o ? o->ToItem() : nullptr; } + static Item const* ToItem(Object const* o) { return o ? o->ToItem() : nullptr; } + Item* ToItem() { if (IsItem()) return reinterpret_cast<Item*>(this); else return nullptr; } + Item const* ToItem() const { if (IsItem()) return reinterpret_cast<Item const*>(this); else return nullptr; } + inline bool IsPlayer() const { return GetTypeId() == TYPEID_PLAYER; } static Player* ToPlayer(Object* o) { return o ? o->ToPlayer() : nullptr; } static Player const* ToPlayer(Object const* o) { return o ? o->ToPlayer() : nullptr; } diff --git a/src/server/game/Entities/Object/ObjectGuid.h b/src/server/game/Entities/Object/ObjectGuid.h index cc720effc9e..9c09e75c56e 100644 --- a/src/server/game/Entities/Object/ObjectGuid.h +++ b/src/server/game/Entities/Object/ObjectGuid.h @@ -26,8 +26,8 @@ #include <set> #include <string> #include <type_traits> -#include <vector> #include <unordered_set> +#include <vector> enum TypeID { @@ -47,13 +47,15 @@ enum TypeMask { TYPEMASK_OBJECT = 0x0001, TYPEMASK_ITEM = 0x0002, - TYPEMASK_CONTAINER = 0x0006, // TYPEMASK_ITEM | 0x0004 + TYPEMASK_CONTAINER = 0x0004, // TYPEMASK_ITEM | 0x0004 TYPEMASK_UNIT = 0x0008, // creature TYPEMASK_PLAYER = 0x0010, TYPEMASK_GAMEOBJECT = 0x0020, TYPEMASK_DYNAMICOBJECT = 0x0040, TYPEMASK_CORPSE = 0x0080, - TYPEMASK_SEER = TYPEMASK_PLAYER | TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT + + TYPEMASK_SEER = TYPEMASK_UNIT | TYPEMASK_DYNAMICOBJECT, + TYPEMASK_WORLDOBJECT = TYPEMASK_UNIT | TYPEMASK_GAMEOBJECT | TYPEMASK_DYNAMICOBJECT | TYPEMASK_CORPSE }; enum class HighGuid |
