diff options
-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 | ||||
-rw-r--r-- | src/server/game/Entities/Player/Player.cpp | 25 | ||||
-rw-r--r-- | src/server/game/Maps/MapScripts.cpp | 11 | ||||
-rw-r--r-- | src/server/game/Spells/Auras/SpellAuras.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Spells/Spell.cpp | 3 | ||||
-rw-r--r-- | src/server/scripts/Outland/zone_blades_edge_mountains.cpp | 2 |
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(); } |