aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Entities/Object
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-03-14 11:37:32 +0100
committerShauren <shauren.trinity@gmail.com>2024-03-14 21:04:24 +0100
commit0dcff2624e6df1c27d7a4d6a66ebcc0b2d698413 (patch)
tree667e812489cf06c39bde9d53e60e4e2854a09122 /src/server/game/Entities/Object
parentb64e261e942e093be906e0591c8b4232706ee0e7 (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.cpp37
-rw-r--r--src/server/game/Entities/Object/Object.h13
-rw-r--r--src/server/game/Entities/Object/ObjectGuid.h8
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