mirror of
https://github.com/mod-playerbots/azerothcore-wotlk.git
synced 2025-11-29 17:38:24 +08:00
fix(Core/SAI/SSC): Allow Farthest target to set a min distance (#17992)
This commit is contained in:
@@ -0,0 +1,4 @@
|
|||||||
|
--
|
||||||
|
DELETE FROM `smart_scripts` WHERE (`entryorguid` = 21246) AND (`source_type` = 0) AND (`id` IN (0));
|
||||||
|
INSERT INTO `smart_scripts` (`entryorguid`, `source_type`, `id`, `link`, `event_type`, `event_phase_mask`, `event_chance`, `event_flags`, `event_param1`, `event_param2`, `event_param3`, `event_param4`, `event_param5`, `action_type`, `action_param1`, `action_param2`, `action_param3`, `action_param4`, `action_param5`, `action_param6`, `target_type`, `target_param1`, `target_param2`, `target_param3`, `target_param4`, `target_x`, `target_y`, `target_z`, `target_o`, `comment`) VALUES
|
||||||
|
(21246, 0, 0, 0, 0, 0, 100, 0, 4850, 19400, 10900, 14500, 0, 11, 38461, 0, 0, 0, 0, 0, 28, 25, 0, 0, 8, 0, 0, 0, 0, 'Serpentshrine Sporebat - In Combat - Cast Sonic Charge');
|
||||||
@@ -152,7 +152,7 @@ struct PowerUsersSelector : public Acore::unary_function<Unit*, bool>
|
|||||||
|
|
||||||
struct FarthestTargetSelector : public Acore::unary_function<Unit*, bool>
|
struct FarthestTargetSelector : public Acore::unary_function<Unit*, bool>
|
||||||
{
|
{
|
||||||
FarthestTargetSelector(Unit const* unit, float dist, bool playerOnly, bool inLos) : _me(unit), _dist(dist), _playerOnly(playerOnly), _inLos(inLos) {}
|
FarthestTargetSelector(Unit const* unit, float maxDist, bool playerOnly, bool inLos, float minDist = 0.f) : _me(unit), _minDist(minDist), _maxDist(maxDist), _playerOnly(playerOnly), _inLos(inLos) {}
|
||||||
|
|
||||||
bool operator()(Unit const* target) const
|
bool operator()(Unit const* target) const
|
||||||
{
|
{
|
||||||
@@ -162,7 +162,7 @@ struct FarthestTargetSelector : public Acore::unary_function<Unit*, bool>
|
|||||||
if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER)
|
if (_playerOnly && target->GetTypeId() != TYPEID_PLAYER)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (_dist > 0.0f && !_me->IsWithinCombatRange(target, _dist))
|
if (_maxDist > 0.0f && !_me->IsInRange(target, _minDist, _maxDist))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (_inLos && !_me->IsWithinLOSInMap(target))
|
if (_inLos && !_me->IsWithinLOSInMap(target))
|
||||||
@@ -173,7 +173,7 @@ struct FarthestTargetSelector : public Acore::unary_function<Unit*, bool>
|
|||||||
|
|
||||||
private:
|
private:
|
||||||
Unit const* _me;
|
Unit const* _me;
|
||||||
float _dist;
|
float _minDist, _maxDist;
|
||||||
bool _playerOnly;
|
bool _playerOnly;
|
||||||
bool _inLos;
|
bool _inLos;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -3243,7 +3243,7 @@ void SmartScript::GetTargets(ObjectVector& targets, SmartScriptHolder const& e,
|
|||||||
case SMART_TARGET_FARTHEST:
|
case SMART_TARGET_FARTHEST:
|
||||||
if (me)
|
if (me)
|
||||||
{
|
{
|
||||||
if (Unit* u = me->AI()->SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, e.target.farthest.maxDist, e.target.farthest.playerOnly, e.target.farthest.isInLos)))
|
if (Unit* u = me->AI()->SelectTarget(SelectTargetMethod::MinDistance, 0, FarthestTargetSelector(me, e.target.farthest.maxDist, e.target.farthest.playerOnly, e.target.farthest.isInLos, e.target.farthest.minDist)))
|
||||||
targets.push_back(u);
|
targets.push_back(u);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -1488,7 +1488,7 @@ enum SMARTAI_TARGETS
|
|||||||
SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist, playerOnly
|
SMART_TARGET_CLOSEST_ENEMY = 25, // maxDist, playerOnly
|
||||||
SMART_TARGET_CLOSEST_FRIENDLY = 26, // maxDist, playerOnly
|
SMART_TARGET_CLOSEST_FRIENDLY = 26, // maxDist, playerOnly
|
||||||
SMART_TARGET_LOOT_RECIPIENTS = 27, // all players that have tagged this creature (for kill credit)
|
SMART_TARGET_LOOT_RECIPIENTS = 27, // all players that have tagged this creature (for kill credit)
|
||||||
SMART_TARGET_FARTHEST = 28, // maxDist, playerOnly, isInLos
|
SMART_TARGET_FARTHEST = 28, // maxDist, playerOnly, isInLos, minDist
|
||||||
SMART_TARGET_VEHICLE_PASSENGER = 29, // seat number (vehicle can target it's own accessory)
|
SMART_TARGET_VEHICLE_PASSENGER = 29, // seat number (vehicle can target it's own accessory)
|
||||||
|
|
||||||
SMART_TARGET_TC_END = 30, // placeholder
|
SMART_TARGET_TC_END = 30, // placeholder
|
||||||
@@ -1538,6 +1538,7 @@ struct SmartTarget
|
|||||||
uint32 maxDist;
|
uint32 maxDist;
|
||||||
SAIBool playerOnly;
|
SAIBool playerOnly;
|
||||||
SAIBool isInLos;
|
SAIBool isInLos;
|
||||||
|
uint32 minDist;
|
||||||
} farthest;
|
} farthest;
|
||||||
|
|
||||||
struct
|
struct
|
||||||
|
|||||||
@@ -4146,6 +4146,7 @@ void AuraEffect::HandleModMechanicImmunity(AuraApplication const* aurApp, uint8
|
|||||||
break;
|
break;
|
||||||
case 34471: // The Beast Within
|
case 34471: // The Beast Within
|
||||||
case 19574: // Bestial Wrath
|
case 19574: // Bestial Wrath
|
||||||
|
case 38484: // Bestial Wrath
|
||||||
mechanic = IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
mechanic = IMMUNE_TO_MOVEMENT_IMPAIRMENT_AND_LOSS_CONTROL_MASK;
|
||||||
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_CHARM, apply);
|
||||||
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
target->ApplySpellImmune(GetId(), IMMUNITY_MECHANIC, MECHANIC_DISORIENTED, apply);
|
||||||
|
|||||||
Reference in New Issue
Block a user