From e93a66d2875adea083aededc9fb4bcb938872f20 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Tue, 30 Mar 2021 10:26:15 +0200 Subject: [PATCH] Core/Spells: defined and implemented SPELL_ATTR5_DONT_TARGET_PLAYERS --- src/server/game/Grids/Notifiers/GridNotifiers.h | 12 ++++++++++-- src/server/game/Miscellaneous/SharedDefines.h | 2 +- src/server/game/Spells/Auras/SpellAuras.cpp | 2 +- src/server/game/Spells/Spell.cpp | 2 ++ 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/src/server/game/Grids/Notifiers/GridNotifiers.h b/src/server/game/Grids/Notifiers/GridNotifiers.h index 548b877920..c314db286a 100644 --- a/src/server/game/Grids/Notifiers/GridNotifiers.h +++ b/src/server/game/Grids/Notifiers/GridNotifiers.h @@ -945,10 +945,14 @@ namespace Trinity class AnyFriendlyUnitInObjectRangeCheck { public: - AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool playerOnly = false) : i_obj(obj), i_funit(funit), i_range(range), i_playerOnly(playerOnly) { } + AnyFriendlyUnitInObjectRangeCheck(WorldObject const* obj, Unit const* funit, float range, bool playerOnly = false, bool noPlayerTarget = false) : i_obj(obj), i_funit(funit), i_range(range), i_playerOnly(playerOnly), i_noPlayerTarget(noPlayerTarget) { } bool operator()(Unit* u) { - if (u->IsAlive() && i_obj->IsWithinDistInMap(u, i_range) && i_funit->IsFriendlyTo(u) && (!i_playerOnly || u->GetTypeId() == TYPEID_PLAYER)) + if (u->IsAlive() + && i_obj->IsWithinDistInMap(u, i_range) + && i_funit->IsFriendlyTo(u) + && (!i_playerOnly || u->GetTypeId() == TYPEID_PLAYER) + && (!i_noPlayerTarget || u->GetTypeId() != TYPEID_PLAYER)) return true; else return false; @@ -958,6 +962,7 @@ namespace Trinity Unit const* i_funit; float i_range; bool i_playerOnly; + bool i_noPlayerTarget; }; class AnyGroupedUnitInObjectRangeCheck @@ -1054,6 +1059,9 @@ namespace Trinity if (_spellInfo && _spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS) && u->GetTypeId() != TYPEID_PLAYER) return false; + if (_spellInfo && _spellInfo->HasAttribute(SPELL_ATTR5_DONT_TARGET_PLAYERS) && u->GetTypeId() == TYPEID_PLAYER) + return false; + return i_funit->_IsValidAttackTarget(u, _spellInfo, i_obj->GetTypeId() == TYPEID_DYNAMICOBJECT ? i_obj : nullptr) && i_obj->IsWithinDistInMap(u, i_range); } private: diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h index 9046c92a8c..83108a37ed 100644 --- a/src/server/game/Miscellaneous/SharedDefines.h +++ b/src/server/game/Miscellaneous/SharedDefines.h @@ -540,7 +540,7 @@ enum SpellAttr5 SPELL_ATTR5_UNK4 = 0x00000010, // 4 SPELL_ATTR5_SINGLE_TARGET_SPELL = 0x00000020, // 5 Only one target can be apply at a time SPELL_ATTR5_UNK6 = 0x00000040, // 6 - SPELL_ATTR5_UNK7 = 0x00000080, // 7 + SPELL_ATTR5_DONT_TARGET_PLAYERS = 0x00000080, // 7 Not On Player SPELL_ATTR5_DONT_ALLOW_PET_TARGET = 0x00000100, // 8 do not allow the following spell to affect or target pets SPELL_ATTR5_START_PERIODIC_AT_APPLY = 0x00000200, // 9 begin periodic tick at aura apply SPELL_ATTR5_HIDE_DURATION = 0x00000400, // 10 do not send duration to client diff --git a/src/server/game/Spells/Auras/SpellAuras.cpp b/src/server/game/Spells/Auras/SpellAuras.cpp index ae3511011d..c1c080bcc2 100644 --- a/src/server/game/Spells/Auras/SpellAuras.cpp +++ b/src/server/game/Spells/Auras/SpellAuras.cpp @@ -2427,7 +2427,7 @@ void DynObjAura::FillTargetMap(std::unordered_map& targets, Unit* if (GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_DEST_DYNOBJ_ALLY || GetSpellInfo()->Effects[effIndex].TargetB.GetTarget() == TARGET_UNIT_DEST_AREA_ALLY) { - Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius, m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS)); + Trinity::AnyFriendlyUnitInObjectRangeCheck u_check(GetDynobjOwner(), dynObjOwnerCaster, radius, m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_PLAYERS), m_spellInfo->HasAttribute(SPELL_ATTR5_DONT_TARGET_PLAYERS)); Trinity::UnitListSearcher searcher(GetDynobjOwner(), units, u_check); Cell::VisitAllObjects(GetDynobjOwner(), searcher, radius); } diff --git a/src/server/game/Spells/Spell.cpp b/src/server/game/Spells/Spell.cpp index 82b361611e..0ae9a61aec 100644 --- a/src/server/game/Spells/Spell.cpp +++ b/src/server/game/Spells/Spell.cpp @@ -1916,6 +1916,8 @@ uint32 Spell::GetSearcherTypeMask(SpellTargetObjectTypes objType, ConditionConta retMask &= GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER; if (m_spellInfo->HasAttribute(SPELL_ATTR3_ONLY_TARGET_GHOSTS)) retMask &= GRID_MAP_TYPE_MASK_PLAYER; + if (m_spellInfo->HasAttribute(SPELL_ATTR5_DONT_TARGET_PLAYERS)) + retMask &= ~(GRID_MAP_TYPE_MASK_CORPSE | GRID_MAP_TYPE_MASK_PLAYER); if (condList) retMask &= sConditionMgr->GetSearcherTypeMaskForConditionList(*condList);