aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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
-rw-r--r--src/server/game/Entities/Player/Player.cpp25
-rw-r--r--src/server/game/Maps/MapScripts.cpp11
-rw-r--r--src/server/game/Spells/Auras/SpellAuras.cpp6
-rw-r--r--src/server/game/Spells/Spell.cpp3
-rw-r--r--src/server/scripts/Outland/zone_blades_edge_mountains.cpp2
8 files changed, 63 insertions, 42 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
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index b4c0139c766..aca4f18335b 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -15173,7 +15173,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
if (quest->GetRewSpellCast() > 0)
{
SpellInfo const* spellInfo = ASSERT_NOTNULL(sSpellMgr->GetSpellInfo(quest->GetRewSpellCast()));
- if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
+ if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
{
if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
creature->CastSpell(this, quest->GetRewSpellCast(), true);
@@ -15184,7 +15184,7 @@ void Player::RewardQuest(Quest const* quest, uint32 reward, Object* questGiver,
else if (quest->GetRewSpell() > 0)
{
SpellInfo const* spellInfo = sSpellMgr->GetSpellInfo(quest->GetRewSpell());
- if (questGiver->isType(TYPEMASK_UNIT) && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
+ if (questGiver->IsUnit() && !spellInfo->HasEffect(SPELL_EFFECT_LEARN_SPELL) && !spellInfo->HasEffect(SPELL_EFFECT_CREATE_ITEM) && !spellInfo->IsSelfCast())
{
if (Creature* creature = GetMap()->GetCreature(questGiver->GetGUID()))
creature->CastSpell(this, quest->GetRewSpell(), true);
@@ -22393,7 +22393,7 @@ void Player::UpdateVisibilityOf(WorldObject* target)
// target aura duration for caster show only if target exist at caster client
// send data at target visibility change (adding to client)
- if (target->isType(TYPEMASK_UNIT))
+ if (target->IsUnit())
SendInitialVisiblePackets(static_cast<Unit*>(target));
}
}
@@ -24308,14 +24308,11 @@ bool ItemPosCount::isContainedIn(std::vector<ItemPosCount> const& vec) const
void Player::StopCastingBindSight() const
{
- if (WorldObject* target = GetViewpoint())
+ if (Unit* target = Object::ToUnit(GetViewpoint()))
{
- if (target->isType(TYPEMASK_UNIT))
- {
- static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID());
- static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID());
- static_cast<Unit*>(target)->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID());
- }
+ target->RemoveAurasByType(SPELL_AURA_BIND_SIGHT, GetGUID());
+ target->RemoveAurasByType(SPELL_AURA_MOD_POSSESS, GetGUID());
+ target->RemoveAurasByType(SPELL_AURA_MOD_POSSESS_PET, GetGUID());
}
}
@@ -24335,8 +24332,8 @@ void Player::SetViewpoint(WorldObject* target, bool apply)
// farsight dynobj or puppet may be very far away
UpdateVisibilityOf(target);
- if (target->isType(TYPEMASK_UNIT) && target != GetVehicleBase())
- static_cast<Unit*>(target)->AddPlayerToVision(this);
+ if (Unit* targetUnit = target->ToUnit(); targetUnit && targetUnit != GetVehicleBase())
+ targetUnit->AddPlayerToVision(this);
SetSeer(target);
}
else
@@ -24349,8 +24346,8 @@ void Player::SetViewpoint(WorldObject* target, bool apply)
return;
}
- if (target->isType(TYPEMASK_UNIT) && target != GetVehicleBase())
- static_cast<Unit*>(target)->RemovePlayerFromVision(this);
+ if (Unit* targetUnit = target->ToUnit(); targetUnit && targetUnit != GetVehicleBase())
+ targetUnit->RemovePlayerFromVision(this);
//must immediately set seer back otherwise may crash
SetSeer(this);
diff --git a/src/server/game/Maps/MapScripts.cpp b/src/server/game/Maps/MapScripts.cpp
index 8c22fe3d873..9972c3f4a29 100644
--- a/src/server/game/Maps/MapScripts.cpp
+++ b/src/server/game/Maps/MapScripts.cpp
@@ -42,7 +42,7 @@ void Map::ScriptsStart(std::map<uint32, std::multimap<uint32, ScriptInfo>> const
// prepare static data
ObjectGuid sourceGUID = source ? source->GetGUID() : ObjectGuid::Empty; //some script commands doesn't have source
ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty;
- ObjectGuid ownerGUID = (source && source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : ObjectGuid::Empty;
+ ObjectGuid ownerGUID = [&] { if (Item* item = Object::ToItem(source)) return item->GetOwnerGUID(); return ObjectGuid::Empty; }();
///- Schedule script execution for all scripts in the script map
ScriptMap const* s2 = &(s->second);
@@ -77,7 +77,7 @@ void Map::ScriptCommandStart(ScriptInfo const& script, uint32 delay, Object* sou
// prepare static data
ObjectGuid sourceGUID = source ? source->GetGUID() : ObjectGuid::Empty;
ObjectGuid targetGUID = target ? target->GetGUID() : ObjectGuid::Empty;
- ObjectGuid ownerGUID = (source && source->GetTypeId() == TYPEID_ITEM) ? ((Item*)source)->GetOwnerGUID() : ObjectGuid::Empty;
+ ObjectGuid ownerGUID = [&] { if (Item* item = Object::ToItem(source)) return item->GetOwnerGUID(); return ObjectGuid::Empty; }();
ScriptAction sa;
sa.sourceGUID = sourceGUID;
@@ -192,7 +192,7 @@ inline Unit* Map::_GetScriptUnit(Object* obj, bool isSource, ScriptInfo const* s
Unit* unit = nullptr;
if (!obj)
TC_LOG_ERROR("scripts", "{} {} object is NULL.", scriptInfo->GetDebugInfo(), isSource ? "source" : "target");
- else if (!obj->isType(TYPEMASK_UNIT))
+ else if (!obj->IsUnit())
TC_LOG_ERROR("scripts", "{} {} object is not unit {}, skipping.",
scriptInfo->GetDebugInfo(), isSource ? "source" : "target", obj->GetGUID().ToString());
else
@@ -268,7 +268,7 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, ScriptInfo c
TC_LOG_ERROR("scripts", "{} door guid is not specified.", scriptInfo->GetDebugInfo());
else if (!source)
TC_LOG_ERROR("scripts", "{} source object is NULL.", scriptInfo->GetDebugInfo());
- else if (!source->isType(TYPEMASK_UNIT))
+ else if (!source->IsUnit())
TC_LOG_ERROR("scripts", "{} source object is not unit {}, skipping.", scriptInfo->GetDebugInfo(),
source->GetGUID().ToString());
else
@@ -289,9 +289,8 @@ inline void Map::_ScriptProcessDoor(Object* source, Object* target, ScriptInfo c
{
pDoor->UseDoorOrButton(nTimeToToggle);
- if (target && target->isType(TYPEMASK_GAMEOBJECT))
+ if (GameObject* goTarget = Object::ToGameObject(target))
{
- GameObject* goTarget = target->ToGameObject();
if (goTarget && goTarget->GetGoType() == GAMEOBJECT_TYPE_BUTTON)
goTarget->UseDoorOrButton(nTimeToToggle);
}
diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp
index c987893f2bd..7458e62ec94 100644
--- a/src/server/game/Spells/Auras/SpellAuras.cpp
+++ b/src/server/game/Spells/Auras/SpellAuras.cpp
@@ -374,10 +374,10 @@ Aura* Aura::Create(AuraCreateInfo& createInfo)
createInfo.CasterGUID = createInfo.Caster->GetGUID();
// check if aura can be owned by owner
- if (createInfo._owner->isType(TYPEMASK_UNIT))
- if (!createInfo._owner->IsInWorld() || createInfo._owner->ToUnit()->IsDuringRemoveFromWorld())
+ if (Unit* ownerUnit = createInfo._owner->ToUnit())
+ if (!ownerUnit->IsInWorld() || ownerUnit->IsDuringRemoveFromWorld())
// owner not in world so don't allow to own not self cast single target auras
- if (createInfo.CasterGUID != createInfo._owner->GetGUID() && createInfo._spellInfo->IsSingleTarget())
+ if (createInfo.CasterGUID != ownerUnit->GetGUID() && createInfo._spellInfo->IsSingleTarget())
return nullptr;
Aura* aura = nullptr;
diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp
index 22b2b3a4c18..95189047916 100644
--- a/src/server/game/Spells/Spell.cpp
+++ b/src/server/game/Spells/Spell.cpp
@@ -596,7 +596,8 @@ m_caster((info->HasAttribute(SPELL_ATTR6_CAST_BY_CHARMER) && caster->GetCharmerO
// Determine if spell can be reflected back to the caster
// Patch 1.2 notes: Spell Reflection no longer reflects abilities
- m_canReflect = caster->isType(TYPEMASK_UNIT) && m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)
+ m_canReflect = caster->IsUnit()
+ && m_spellInfo->DmgClass == SPELL_DAMAGE_CLASS_MAGIC && !m_spellInfo->HasAttribute(SPELL_ATTR0_ABILITY)
&& !m_spellInfo->HasAttribute(SPELL_ATTR1_CANT_BE_REFLECTED) && !m_spellInfo->HasAttribute(SPELL_ATTR0_UNAFFECTED_BY_INVULNERABILITY)
&& !m_spellInfo->IsPassive();
diff --git a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
index 71fba09e871..f6a31d4ba6c 100644
--- a/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
+++ b/src/server/scripts/Outland/zone_blades_edge_mountains.cpp
@@ -956,7 +956,7 @@ public:
void IsSummonedBy(WorldObject* summoner) override
{
- if (summoner->isType(TYPEMASK_PLAYER))
+ if (summoner->IsPlayer())
playerGuid = summoner->GetGUID();
}