Core/Spells Implement targets 133, 134, 135 : TARGET_UNIT_LINE_CASTER_TO_DEST_*** (#26786)

This commit is contained in:
Traesh
2021-08-15 11:09:46 +02:00
committed by GitHub
parent 4725941567
commit fb6761c273
10 changed files with 259 additions and 157 deletions
@@ -1759,6 +1759,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const
case TARGET_SELECT_CATEGORY_CONE:
case TARGET_SELECT_CATEGORY_AREA:
case TARGET_SELECT_CATEGORY_TRAJ:
case TARGET_SELECT_CATEGORY_LINE:
continue;
default:
break;
@@ -1770,6 +1771,7 @@ bool ConditionMgr::isSourceTypeValid(Condition* cond) const
case TARGET_SELECT_CATEGORY_CONE:
case TARGET_SELECT_CATEGORY_AREA:
case TARGET_SELECT_CATEGORY_TRAJ:
case TARGET_SELECT_CATEGORY_LINE:
continue;
default:
break;
+5 -5
View File
@@ -154,7 +154,7 @@ bool Position::IsWithinDoubleVerticalCylinder(Position const* center, float radi
return IsInDist2d(center, radius) && std::abs(verticalDelta) <= height;
}
bool Position::HasInArc(float arc, Position const* obj, float border) const
bool Position::HasInArc(float arc, Position const* obj, float border, Optional<float> orientation) const
{
// always have self in arc
if (obj == this)
@@ -164,7 +164,7 @@ bool Position::HasInArc(float arc, Position const* obj, float border) const
arc = NormalizeOrientation(arc);
float angle = GetAngle(obj);
angle -= m_orientation;
angle -= orientation.is_initialized() ? *orientation : GetOrientation();
// move angle to range -pi ... +pi
angle = NormalizeOrientation(angle);
@@ -176,13 +176,13 @@ bool Position::HasInArc(float arc, Position const* obj, float border) const
return ((angle >= lborder) && (angle <= rborder));
}
bool Position::HasInLine(Position const* pos, float objSize, float width) const
bool Position::HasInLine(Position const* pos, float objSize, float width, Optional<float> orientation) const
{
if (!HasInArc(float(M_PI), pos))
if (!HasInArc(float(M_PI), pos, 2.0f, orientation))
return false;
width += objSize;
float angle = GetRelativeAngle(pos);
float angle = GetAngle(pos) - (orientation.is_initialized() ? *orientation : GetOrientation());
return std::fabs(std::sin(angle)) * GetExactDist2d(pos->GetPositionX(), pos->GetPositionY()) < width;
}
+3 -2
View File
@@ -19,6 +19,7 @@
#define Trinity_game_Position_h__
#include "Define.h"
#include "Optional.h"
#include <string>
#include <cmath>
@@ -215,8 +216,8 @@ public:
search using this relation: dist2d < radius && abs(dz) < height
*/
bool IsWithinDoubleVerticalCylinder(Position const* center, float radius, float height) const;
bool HasInArc(float arcangle, Position const* pos, float border = 2.0f) const;
bool HasInLine(Position const* pos, float objSize, float width) const;
bool HasInArc(float arcangle, Position const* pos, float border = 2.0f, Optional<float> orientation = Optional<float>()) const;
bool HasInLine(Position const* pos, float objSize, float width, Optional<float> orientation = Optional<float>()) const;
std::string ToString() const;
// modulos a radian orientation to the range of 0..2PI
+146 -146
View File
@@ -2418,152 +2418,152 @@ enum SpellImmunity
// TARGET_[OBJECT_TYPE]_[REFERENCE_TYPE(skipped for caster)]_[SELECTION_TYPE(skipped for default)]_[additional specifiers(friendly, BACK_LEFT, etc.]
enum Targets
{
TARGET_UNIT_CASTER = 1,
TARGET_UNIT_NEARBY_ENEMY = 2,
TARGET_UNIT_NEARBY_PARTY = 3,
TARGET_UNIT_NEARBY_ALLY = 4,
TARGET_UNIT_PET = 5,
TARGET_UNIT_TARGET_ENEMY = 6,
TARGET_UNIT_SRC_AREA_ENTRY = 7,
TARGET_UNIT_DEST_AREA_ENTRY = 8,
TARGET_DEST_HOME = 9,
TARGET_UNIT_SRC_AREA_UNK_11 = 11,
TARGET_UNIT_SRC_AREA_ENEMY = 15,
TARGET_UNIT_DEST_AREA_ENEMY = 16,
TARGET_DEST_DB = 17,
TARGET_DEST_CASTER = 18,
TARGET_UNIT_CASTER_AREA_PARTY = 20,
TARGET_UNIT_TARGET_ALLY = 21,
TARGET_SRC_CASTER = 22,
TARGET_GAMEOBJECT_TARGET = 23,
TARGET_UNIT_CONE_ENEMY_24 = 24,
TARGET_UNIT_TARGET_ANY = 25,
TARGET_GAMEOBJECT_ITEM_TARGET = 26,
TARGET_UNIT_MASTER = 27,
TARGET_DEST_DYNOBJ_ENEMY = 28,
TARGET_DEST_DYNOBJ_ALLY = 29,
TARGET_UNIT_SRC_AREA_ALLY = 30,
TARGET_UNIT_DEST_AREA_ALLY = 31,
TARGET_DEST_CASTER_SUMMON = 32, // front left, doesn't use radius
TARGET_UNIT_SRC_AREA_PARTY = 33,
TARGET_UNIT_DEST_AREA_PARTY = 34,
TARGET_UNIT_TARGET_PARTY = 35,
TARGET_DEST_CASTER_UNK_36 = 36,
TARGET_UNIT_LASTTARGET_AREA_PARTY = 37,
TARGET_UNIT_NEARBY_ENTRY = 38,
TARGET_DEST_CASTER_FISHING = 39,
TARGET_GAMEOBJECT_NEARBY_ENTRY = 40,
TARGET_DEST_CASTER_FRONT_RIGHT = 41,
TARGET_DEST_CASTER_BACK_RIGHT = 42,
TARGET_DEST_CASTER_BACK_LEFT = 43,
TARGET_DEST_CASTER_FRONT_LEFT = 44,
TARGET_UNIT_TARGET_CHAINHEAL_ALLY = 45,
TARGET_DEST_NEARBY_ENTRY = 46,
TARGET_DEST_CASTER_FRONT = 47,
TARGET_DEST_CASTER_BACK = 48,
TARGET_DEST_CASTER_RIGHT = 49,
TARGET_DEST_CASTER_LEFT = 50,
TARGET_GAMEOBJECT_SRC_AREA = 51,
TARGET_GAMEOBJECT_DEST_AREA = 52,
TARGET_DEST_TARGET_ENEMY = 53,
TARGET_UNIT_CONE_ENEMY_54 = 54,
TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell
TARGET_UNIT_CASTER_AREA_RAID = 56,
TARGET_UNIT_TARGET_RAID = 57,
TARGET_UNIT_NEARBY_RAID = 58,
TARGET_UNIT_CONE_ALLY = 59,
TARGET_UNIT_CONE_ENTRY = 60,
TARGET_UNIT_TARGET_AREA_RAID_CLASS = 61,
TARGET_UNK_62 = 62,
TARGET_DEST_TARGET_ANY = 63,
TARGET_DEST_TARGET_FRONT = 64,
TARGET_DEST_TARGET_BACK = 65,
TARGET_DEST_TARGET_RIGHT = 66,
TARGET_DEST_TARGET_LEFT = 67,
TARGET_DEST_TARGET_FRONT_RIGHT = 68,
TARGET_DEST_TARGET_BACK_RIGHT = 69,
TARGET_DEST_TARGET_BACK_LEFT = 70,
TARGET_DEST_TARGET_FRONT_LEFT = 71,
TARGET_DEST_CASTER_RANDOM = 72,
TARGET_DEST_CASTER_RADIUS = 73,
TARGET_DEST_TARGET_RANDOM = 74,
TARGET_DEST_TARGET_RADIUS = 75,
TARGET_DEST_CHANNEL_TARGET = 76,
TARGET_UNIT_CHANNEL_TARGET = 77,
TARGET_DEST_DEST_FRONT = 78,
TARGET_DEST_DEST_BACK = 79,
TARGET_DEST_DEST_RIGHT = 80,
TARGET_DEST_DEST_LEFT = 81,
TARGET_DEST_DEST_FRONT_RIGHT = 82,
TARGET_DEST_DEST_BACK_RIGHT = 83,
TARGET_DEST_DEST_BACK_LEFT = 84,
TARGET_DEST_DEST_FRONT_LEFT = 85,
TARGET_DEST_DEST_RANDOM = 86,
TARGET_DEST_DEST = 87,
TARGET_DEST_DYNOBJ_NONE = 88,
TARGET_DEST_TRAJ = 89,
TARGET_UNIT_TARGET_MINIPET = 90,
TARGET_DEST_DEST_RADIUS = 91,
TARGET_UNIT_SUMMONER = 92,
TARGET_CORPSE_SRC_AREA_ENEMY = 93, // NYI
TARGET_UNIT_VEHICLE = 94,
TARGET_UNIT_TARGET_PASSENGER = 95,
TARGET_UNIT_PASSENGER_0 = 96,
TARGET_UNIT_PASSENGER_1 = 97,
TARGET_UNIT_PASSENGER_2 = 98,
TARGET_UNIT_PASSENGER_3 = 99,
TARGET_UNIT_PASSENGER_4 = 100,
TARGET_UNIT_PASSENGER_5 = 101,
TARGET_UNIT_PASSENGER_6 = 102,
TARGET_UNIT_PASSENGER_7 = 103,
TARGET_UNIT_CONE_ENEMY_104 = 104,
TARGET_UNIT_UNK_105 = 105, // 1 spell
TARGET_DEST_CHANNEL_CASTER = 106,
TARGET_UNK_DEST_AREA_UNK_107 = 107, // not enough info - only generic spells avalible
TARGET_GAMEOBJECT_CONE_108 = 108,
TARGET_GAMEOBJECT_CONE_109 = 109,
TARGET_UNIT_CONE_ENTRY_110 = 110,
TARGET_UNK_111 = 111,
TARGET_UNK_112 = 112,
TARGET_UNK_113 = 113,
TARGET_UNK_114 = 114,
TARGET_UNK_115 = 115,
TARGET_UNK_116 = 116,
TARGET_UNK_117 = 117,
TARGET_UNIT_TARGET_ALLY_OR_RAID = 118, // If target is in your party or raid, all party and raid members will be affected
TARGET_CORPSE_SRC_AREA_RAID = 119,
TARGET_UNIT_CASTER_AND_SUMMONS = 120,
TARGET_UNK_121 = 121,
TARGET_UNIT_AREA_THREAT_LIST = 122, // any unit on threat list
TARGET_UNIT_AREA_TAP_LIST = 123,
TARGET_UNK_124 = 124,
TARGET_DEST_CASTER_GROUND = 125,
TARGET_UNK_126 = 126,
TARGET_UNK_127 = 127,
TARGET_UNK_128 = 128,
TARGET_UNIT_CONE_ENTRY_129 = 129,
TARGET_UNK_130 = 130,
TARGET_DEST_SUMMONER = 131,
TARGET_DEST_TARGET_ALLY = 132,
TARGET_UNK_133 = 133,
TARGET_UNK_134 = 134,
TARGET_UNK_135 = 135,
TARGET_UNK_136 = 136,
TARGET_UNK_137 = 137,
TARGET_UNK_138 = 138,
TARGET_UNK_139 = 139,
TARGET_UNK_140 = 140,
TARGET_UNK_141 = 141,
TARGET_UNK_142 = 142,
TARGET_UNK_143 = 143,
TARGET_UNK_144 = 144,
TARGET_UNK_145 = 145,
TARGET_UNK_146 = 146,
TARGET_UNK_147 = 147,
TARGET_UNK_148 = 148,
TARGET_UNK_149 = 149,
TARGET_UNIT_OWN_CRITTER = 150, // own battle pet from UNIT_FIELD_CRITTER
TARGET_UNK_151 = 151,
TARGET_UNIT_CASTER = 1,
TARGET_UNIT_NEARBY_ENEMY = 2,
TARGET_UNIT_NEARBY_PARTY = 3,
TARGET_UNIT_NEARBY_ALLY = 4,
TARGET_UNIT_PET = 5,
TARGET_UNIT_TARGET_ENEMY = 6,
TARGET_UNIT_SRC_AREA_ENTRY = 7,
TARGET_UNIT_DEST_AREA_ENTRY = 8,
TARGET_DEST_HOME = 9,
TARGET_UNIT_SRC_AREA_UNK_11 = 11,
TARGET_UNIT_SRC_AREA_ENEMY = 15,
TARGET_UNIT_DEST_AREA_ENEMY = 16,
TARGET_DEST_DB = 17,
TARGET_DEST_CASTER = 18,
TARGET_UNIT_CASTER_AREA_PARTY = 20,
TARGET_UNIT_TARGET_ALLY = 21,
TARGET_SRC_CASTER = 22,
TARGET_GAMEOBJECT_TARGET = 23,
TARGET_UNIT_CONE_ENEMY_24 = 24,
TARGET_UNIT_TARGET_ANY = 25,
TARGET_GAMEOBJECT_ITEM_TARGET = 26,
TARGET_UNIT_MASTER = 27,
TARGET_DEST_DYNOBJ_ENEMY = 28,
TARGET_DEST_DYNOBJ_ALLY = 29,
TARGET_UNIT_SRC_AREA_ALLY = 30,
TARGET_UNIT_DEST_AREA_ALLY = 31,
TARGET_DEST_CASTER_SUMMON = 32, // front left, doesn't use radius
TARGET_UNIT_SRC_AREA_PARTY = 33,
TARGET_UNIT_DEST_AREA_PARTY = 34,
TARGET_UNIT_TARGET_PARTY = 35,
TARGET_DEST_CASTER_UNK_36 = 36,
TARGET_UNIT_LASTTARGET_AREA_PARTY = 37,
TARGET_UNIT_NEARBY_ENTRY = 38,
TARGET_DEST_CASTER_FISHING = 39,
TARGET_GAMEOBJECT_NEARBY_ENTRY = 40,
TARGET_DEST_CASTER_FRONT_RIGHT = 41,
TARGET_DEST_CASTER_BACK_RIGHT = 42,
TARGET_DEST_CASTER_BACK_LEFT = 43,
TARGET_DEST_CASTER_FRONT_LEFT = 44,
TARGET_UNIT_TARGET_CHAINHEAL_ALLY = 45,
TARGET_DEST_NEARBY_ENTRY = 46,
TARGET_DEST_CASTER_FRONT = 47,
TARGET_DEST_CASTER_BACK = 48,
TARGET_DEST_CASTER_RIGHT = 49,
TARGET_DEST_CASTER_LEFT = 50,
TARGET_GAMEOBJECT_SRC_AREA = 51,
TARGET_GAMEOBJECT_DEST_AREA = 52,
TARGET_DEST_TARGET_ENEMY = 53,
TARGET_UNIT_CONE_ENEMY_54 = 54,
TARGET_DEST_CASTER_FRONT_LEAP = 55, // for a leap spell
TARGET_UNIT_CASTER_AREA_RAID = 56,
TARGET_UNIT_TARGET_RAID = 57,
TARGET_UNIT_NEARBY_RAID = 58,
TARGET_UNIT_CONE_ALLY = 59,
TARGET_UNIT_CONE_ENTRY = 60,
TARGET_UNIT_TARGET_AREA_RAID_CLASS = 61,
TARGET_UNK_62 = 62,
TARGET_DEST_TARGET_ANY = 63,
TARGET_DEST_TARGET_FRONT = 64,
TARGET_DEST_TARGET_BACK = 65,
TARGET_DEST_TARGET_RIGHT = 66,
TARGET_DEST_TARGET_LEFT = 67,
TARGET_DEST_TARGET_FRONT_RIGHT = 68,
TARGET_DEST_TARGET_BACK_RIGHT = 69,
TARGET_DEST_TARGET_BACK_LEFT = 70,
TARGET_DEST_TARGET_FRONT_LEFT = 71,
TARGET_DEST_CASTER_RANDOM = 72,
TARGET_DEST_CASTER_RADIUS = 73,
TARGET_DEST_TARGET_RANDOM = 74,
TARGET_DEST_TARGET_RADIUS = 75,
TARGET_DEST_CHANNEL_TARGET = 76,
TARGET_UNIT_CHANNEL_TARGET = 77,
TARGET_DEST_DEST_FRONT = 78,
TARGET_DEST_DEST_BACK = 79,
TARGET_DEST_DEST_RIGHT = 80,
TARGET_DEST_DEST_LEFT = 81,
TARGET_DEST_DEST_FRONT_RIGHT = 82,
TARGET_DEST_DEST_BACK_RIGHT = 83,
TARGET_DEST_DEST_BACK_LEFT = 84,
TARGET_DEST_DEST_FRONT_LEFT = 85,
TARGET_DEST_DEST_RANDOM = 86,
TARGET_DEST_DEST = 87,
TARGET_DEST_DYNOBJ_NONE = 88,
TARGET_DEST_TRAJ = 89,
TARGET_UNIT_TARGET_MINIPET = 90,
TARGET_DEST_DEST_RADIUS = 91,
TARGET_UNIT_SUMMONER = 92,
TARGET_CORPSE_SRC_AREA_ENEMY = 93, // NYI
TARGET_UNIT_VEHICLE = 94,
TARGET_UNIT_TARGET_PASSENGER = 95,
TARGET_UNIT_PASSENGER_0 = 96,
TARGET_UNIT_PASSENGER_1 = 97,
TARGET_UNIT_PASSENGER_2 = 98,
TARGET_UNIT_PASSENGER_3 = 99,
TARGET_UNIT_PASSENGER_4 = 100,
TARGET_UNIT_PASSENGER_5 = 101,
TARGET_UNIT_PASSENGER_6 = 102,
TARGET_UNIT_PASSENGER_7 = 103,
TARGET_UNIT_CONE_ENEMY_104 = 104,
TARGET_UNIT_UNK_105 = 105, // 1 spell
TARGET_DEST_CHANNEL_CASTER = 106,
TARGET_UNK_DEST_AREA_UNK_107 = 107, // not enough info - only generic spells avalible
TARGET_GAMEOBJECT_CONE_108 = 108,
TARGET_GAMEOBJECT_CONE_109 = 109,
TARGET_UNIT_CONE_ENTRY_110 = 110,
TARGET_UNK_111 = 111,
TARGET_UNK_112 = 112,
TARGET_UNK_113 = 113,
TARGET_UNK_114 = 114,
TARGET_UNK_115 = 115,
TARGET_UNK_116 = 116,
TARGET_UNK_117 = 117,
TARGET_UNIT_TARGET_ALLY_OR_RAID = 118, // If target is in your party or raid, all party and raid members will be affected
TARGET_CORPSE_SRC_AREA_RAID = 119,
TARGET_UNIT_CASTER_AND_SUMMONS = 120,
TARGET_UNK_121 = 121,
TARGET_UNIT_AREA_THREAT_LIST = 122, // any unit on threat list
TARGET_UNIT_AREA_TAP_LIST = 123,
TARGET_UNK_124 = 124,
TARGET_DEST_CASTER_GROUND = 125,
TARGET_UNK_126 = 126,
TARGET_UNK_127 = 127,
TARGET_UNK_128 = 128,
TARGET_UNIT_CONE_ENTRY_129 = 129,
TARGET_UNK_130 = 130,
TARGET_DEST_SUMMONER = 131,
TARGET_DEST_TARGET_ALLY = 132,
TARGET_UNIT_LINE_CASTER_TO_DEST_ALLY = 133,
TARGET_UNIT_LINE_CASTER_TO_DEST_ENEMY = 134,
TARGET_UNIT_LINE_CASTER_TO_DEST = 135,
TARGET_UNK_136 = 136,
TARGET_UNK_137 = 137,
TARGET_UNK_138 = 138,
TARGET_UNK_139 = 139,
TARGET_UNK_140 = 140,
TARGET_UNK_141 = 141,
TARGET_UNK_142 = 142,
TARGET_UNK_143 = 143,
TARGET_UNK_144 = 144,
TARGET_UNK_145 = 145,
TARGET_UNK_146 = 146,
TARGET_UNK_147 = 147,
TARGET_UNK_148 = 148,
TARGET_UNK_149 = 149,
TARGET_UNIT_OWN_CRITTER = 150, // own battle pet from UNIT_FIELD_CRITTER
TARGET_UNK_151 = 151,
TOTAL_SPELL_TARGETS
};
+83
View File
@@ -852,6 +852,7 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar
case TARGET_SELECT_CATEGORY_NEARBY:
case TARGET_SELECT_CATEGORY_CONE:
case TARGET_SELECT_CATEGORY_AREA:
case TARGET_SELECT_CATEGORY_LINE:
// targets for effect already selected
if (effectMask & processedEffectMask)
return;
@@ -900,6 +901,9 @@ void Spell::SelectEffectImplicitTargets(SpellEffIndex effIndex, SpellImplicitTar
SelectImplicitTrajTargets(effIndex, targetType);
break;
case TARGET_SELECT_CATEGORY_LINE:
SelectImplicitLineTargets(effIndex, targetType, effectMask);
break;
case TARGET_SELECT_CATEGORY_DEFAULT:
switch (targetType.GetObjectType())
{
@@ -1731,6 +1735,69 @@ void Spell::SelectImplicitTrajTargets(SpellEffIndex effIndex, SpellImplicitTarge
veh->SetLastShootPos(*m_targets.GetDstPos());
}
void Spell::SelectImplicitLineTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType, uint32 effMask)
{
std::list<WorldObject*> targets;
SpellTargetObjectTypes objectType = targetType.GetObjectType();
SpellTargetCheckTypes selectionType = targetType.GetCheckType();
SpellEffectInfo const* effect = m_spellInfo->GetEffect(effIndex);
if (!effect)
return;
Position const* dst = nullptr;
switch (targetType.GetReferenceType())
{
case TARGET_REFERENCE_TYPE_SRC:
dst = m_targets.GetSrcPos();
break;
case TARGET_REFERENCE_TYPE_DEST:
dst = m_targets.GetDstPos();
break;
case TARGET_REFERENCE_TYPE_CASTER:
dst = m_caster;
break;
case TARGET_REFERENCE_TYPE_TARGET:
dst = m_targets.GetUnitTarget();
break;
default:
ASSERT(false, "Spell::SelectImplicitLineTargets: received not implemented target reference type");
return;
}
ConditionContainer* condList = effect->ImplicitTargetConditions;
float radius = effect->CalcRadius(m_caster) * m_spellValue->RadiusMod;
if (uint32 containerTypeMask = GetSearcherTypeMask(objectType, condList))
{
Trinity::WorldObjectSpellLineTargetCheck check(m_caster, dst, m_spellInfo->Width ? m_spellInfo->Width : m_caster->GetCombatReach(), radius, m_caster, m_spellInfo, selectionType, condList, objectType);
Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellLineTargetCheck> searcher(m_caster, targets, check, containerTypeMask);
SearchTargets<Trinity::WorldObjectListSearcher<Trinity::WorldObjectSpellLineTargetCheck>>(searcher, containerTypeMask, m_caster, m_caster, radius);
CallScriptObjectAreaTargetSelectHandlers(targets, effIndex, targetType);
if (!targets.empty())
{
// Other special target selection goes here
if (uint32 maxTargets = m_spellValue->MaxAffectedTargets)
{
if (maxTargets < targets.size())
{
targets.sort(Trinity::ObjectDistanceOrderPred(m_caster));
targets.resize(maxTargets);
}
}
for (std::list<WorldObject*>::iterator itr = targets.begin(); itr != targets.end(); ++itr)
{
if (Unit* unit = (*itr)->ToUnit())
AddUnitTarget(unit, effMask, false);
else if (GameObject* gObjTarget = (*itr)->ToGameObject())
AddGOTarget(gObjTarget, effMask);
}
}
}
}
void Spell::SelectEffectTypeImplicitTargets(uint32 effIndex)
{
// special case for SPELL_EFFECT_SUMMON_RAF_FRIEND and SPELL_EFFECT_SUMMON_PLAYER
@@ -8181,6 +8248,22 @@ bool WorldObjectSpellTrajTargetCheck::operator()(WorldObject* target)
return WorldObjectSpellTargetCheck::operator ()(target);
}
WorldObjectSpellLineTargetCheck::WorldObjectSpellLineTargetCheck(Position const* srcPosition, Position const* dstPosition, float lineWidth, float range, Unit* caster,
SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionContainer* condList, SpellTargetObjectTypes objectType)
: WorldObjectSpellAreaTargetCheck(range, caster, caster, caster, spellInfo, selectionType, condList, objectType), _srcPosition(srcPosition), _dstPosition(dstPosition), _lineWidth(lineWidth) { }
bool WorldObjectSpellLineTargetCheck::operator()(WorldObject* target)
{
float angle = _caster->GetOrientation();
if (*_srcPosition != *_dstPosition)
angle = _srcPosition->GetAngle(_dstPosition);
if (!_caster->HasInLine(target, target->GetCombatReach(), _lineWidth, angle))
return false;
return WorldObjectSpellTargetCheck::operator ()(target);
}
} //namespace Trinity
SpellCastVisual::operator UF::SpellCastVisual() const
+11
View File
@@ -513,6 +513,7 @@ class TC_GAME_API Spell
void SelectImplicitTargetObjectTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType);
void SelectImplicitChainTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType, WorldObject* target, uint32 effMask);
void SelectImplicitTrajTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType);
void SelectImplicitLineTargets(SpellEffIndex effIndex, SpellImplicitTargetInfo const& targetType, uint32 effMask);
void SelectEffectTypeImplicitTargets(uint32 effIndex);
@@ -966,6 +967,16 @@ namespace Trinity
SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionContainer* condList, SpellTargetObjectTypes objectType);
bool operator()(WorldObject* target);
};
struct TC_GAME_API WorldObjectSpellLineTargetCheck : public WorldObjectSpellAreaTargetCheck
{
Position const* _srcPosition;
Position const* _dstPosition;
float _lineWidth;
WorldObjectSpellLineTargetCheck(Position const* srcPosition, Position const* dstPosition, float lineWidth, float range, Unit* caster,
SpellInfo const* spellInfo, SpellTargetCheckTypes selectionType, ConditionContainer* condList, SpellTargetObjectTypes objectType);
bool operator()(WorldObject* target);
};
}
typedef void(Spell::*pEffect)(SpellEffIndex effIndex);
+3 -3
View File
@@ -350,9 +350,9 @@ SpellImplicitTargetInfo::StaticData SpellImplicitTargetInfo::_data[TOTAL_SPELL_
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 130
{TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_CASTER, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 131 TARGET_DEST_SUMMONER
{TARGET_OBJECT_TYPE_DEST, TARGET_REFERENCE_TYPE_TARGET, TARGET_SELECT_CATEGORY_DEFAULT, TARGET_CHECK_ALLY, TARGET_DIR_NONE}, // 132 TARGET_DEST_TARGET_ALLY
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 133
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 134
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 135
{TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_LINE, TARGET_CHECK_ALLY, TARGET_DIR_NONE}, // 133 TARGET_UNIT_LINE_CASTER_TO_DEST_ALLY
{TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_LINE, TARGET_CHECK_ENEMY, TARGET_DIR_NONE}, // 134 TARGET_UNIT_LINE_CASTER_TO_DEST_ENEMY
{TARGET_OBJECT_TYPE_UNIT, TARGET_REFERENCE_TYPE_DEST, TARGET_SELECT_CATEGORY_LINE, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 135 TARGET_UNIT_LINE_CASTER_TO_DEST
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 136
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 137
{TARGET_OBJECT_TYPE_NONE, TARGET_REFERENCE_TYPE_NONE, TARGET_SELECT_CATEGORY_NYI, TARGET_CHECK_DEFAULT, TARGET_DIR_NONE}, // 138
+2 -1
View File
@@ -86,7 +86,8 @@ enum SpellTargetSelectionCategories
TARGET_SELECT_CATEGORY_NEARBY,
TARGET_SELECT_CATEGORY_CONE,
TARGET_SELECT_CATEGORY_AREA,
TARGET_SELECT_CATEGORY_TRAJ
TARGET_SELECT_CATEGORY_TRAJ,
TARGET_SELECT_CATEGORY_LINE
};
enum SpellTargetReferenceTypes
+3
View File
@@ -4553,6 +4553,9 @@ void SpellMgr::LoadSpellInfoCorrections()
if (spellInfo->ActiveIconFileDataId == 135754) // flight
spellInfo->Attributes |= SPELL_ATTR0_PASSIVE;
if (spellInfo->IsSingleTarget())
spellInfo->MaxAffectedTargets = 1;
}
if (SummonPropertiesEntry* properties = const_cast<SummonPropertiesEntry*>(sSummonPropertiesStore.LookupEntry(121)))
+1
View File
@@ -286,6 +286,7 @@ bool SpellScript::TargetHook::CheckEffect(SpellInfo const* spellEntry, uint8 eff
return true;
case TARGET_SELECT_CATEGORY_CONE: // AREA
case TARGET_SELECT_CATEGORY_AREA: // AREA
case TARGET_SELECT_CATEGORY_LINE: // AREA
return area;
case TARGET_SELECT_CATEGORY_DEFAULT:
switch (targetInfo.GetObjectType())