forked from Bastion/Bastion
parent
84f8ab52f8
commit
9406772384
@ -0,0 +1,191 @@ |
||||
local Tinkr, _Bastion = ... |
||||
|
||||
---@type Bastion |
||||
local Bastion = _Bastion |
||||
|
||||
local ProtModule = Bastion.Module:New('paladin_protection') |
||||
local Player = Bastion.UnitManager:Get('player') |
||||
local Target = Bastion.UnitManager:Get('target') |
||||
local None = Bastion.UnitManager:Get('none') |
||||
|
||||
local CrusaderAura = Bastion.SpellBook:GetSpell(32223) |
||||
local DevoAura = Bastion.SpellBook:GetSpell(465) |
||||
local Consecrate = Bastion.SpellBook:GetSpell(26573) |
||||
local ConsecrateAura = Bastion.SpellBook:GetSpell(188370) |
||||
local Judgement = Bastion.SpellBook:GetSpell(275779) |
||||
local AvengersShield = Bastion.SpellBook:GetSpell(31935) |
||||
local OfDuskAndDawn = Bastion.SpellBook:GetSpell(385125) |
||||
local BlessingOfTheDawn = Bastion.SpellBook:GetSpell(385127) |
||||
local BlessingOfTheDusk = Bastion.SpellBook:GetSpell(385126) |
||||
local ShieldOfTheRighteous = Bastion.SpellBook:GetSpell(53600) |
||||
local BlessedHammer = Bastion.SpellBook:GetSpell(204019) |
||||
local Rebuke = Bastion.SpellBook:GetSpell(96231) |
||||
local AutoAttack = Bastion.SpellBook:GetSpell(6603) |
||||
|
||||
local AvengersShieldTarget = Bastion.UnitManager:CreateCustomUnit('avengers_shield', function() |
||||
local target = nil |
||||
|
||||
Bastion.UnitManager:EnumEnemies(function(unit) |
||||
if unit:IsDead() then |
||||
return false |
||||
end |
||||
|
||||
if not Player:CanSee(unit) then |
||||
return false |
||||
end |
||||
|
||||
if not AvengersShield:IsInRange(unit) then |
||||
return false |
||||
end |
||||
|
||||
if unit:IsCasting() and unit:IsInterruptible() then |
||||
target = unit |
||||
return true |
||||
end |
||||
|
||||
return false |
||||
end) |
||||
|
||||
if target == nil then |
||||
if Target:Exists() then |
||||
target = Target |
||||
else |
||||
target = None |
||||
end |
||||
end |
||||
|
||||
return target |
||||
end) |
||||
|
||||
local KickTarget = Bastion.UnitManager:CreateCustomUnit('kick', function() |
||||
local kick = nil |
||||
|
||||
Bastion.UnitManager:EnumEnemies(function(unit) |
||||
if unit:IsDead() then |
||||
return false |
||||
end |
||||
|
||||
if not Player:CanSee(unit) then |
||||
return false |
||||
end |
||||
|
||||
if Player:GetDistance(unit) > 40 then |
||||
return false |
||||
end |
||||
|
||||
if unit:IsInterruptible() and Rebuke:IsInRange(unit) then |
||||
kick = unit |
||||
return true |
||||
end |
||||
|
||||
-- TODO: Only consider this if the player is in an M+ dungeon |
||||
-- if Player:InMelee(unit) and Player:IsFacing(unit) and Bastion.MythicPlusUtils:CastingCriticalKick(unit, 5) then |
||||
-- kick = unit |
||||
-- return true |
||||
-- end |
||||
|
||||
return false |
||||
end) |
||||
|
||||
if kick == nil then |
||||
kick = None |
||||
end |
||||
|
||||
return kick |
||||
end) |
||||
|
||||
---@return boolean |
||||
local function CombatRotation() |
||||
-- Attack the target is auto attack isnt active. |
||||
if AutoAttack:IsKnownAndUsable() and not IsCurrentSpell(AutoAttack:GetID()) and Player:InMelee(Target) and not Target:IsDead() then |
||||
AutoAttack:Cast(Target) |
||||
end |
||||
|
||||
-- Kick |
||||
if KickTarget:Exists() and not Player:IsCastingOrChanneling() and Rebuke:IsKnownAndUsable() then |
||||
Rebuke:Cast(KickTarget) |
||||
end |
||||
|
||||
-- Cast Consecrate if an enemy is in range, and the player isnt moving. |
||||
if Consecrate:IsKnownAndUsable() and not Player:IsMoving() and not Player:GetAuras():FindMy(ConsecrateAura):IsUp() and Player:GetEnemies(10) >= 1 then |
||||
return Consecrate:Cast(Player) |
||||
end |
||||
|
||||
-- Handle SoR specially if DuskAndDawn is known. |
||||
if OfDuskAndDawn:IsKnown() then |
||||
-- If Blessing of Dawn isnt up, or will expire soon then wait for 5 HP to cast it. |
||||
if not Player:GetAuras():FindMy(BlessingOfTheDawn):IsUp() or Player:GetAuras():FindMy(BlessingOfTheDawn):GetRemainingTime() < 7 then |
||||
if Player:GetPower(Enum.PowerType.HolyPower) > 4 and ShieldOfTheRighteous:IsKnownAndUsable() and ShieldOfTheRighteous:IsInRange(Target) then |
||||
return ShieldOfTheRighteous:Cast(Target) |
||||
end |
||||
-- If Blessing of Dawn is up, cast SoR at 3 or more HP |
||||
elseif Player:GetPower(Enum.PowerType.HolyPower) >= 3 and ShieldOfTheRighteous:IsKnownAndUsable() and ShieldOfTheRighteous:IsInRange(Target) then |
||||
return ShieldOfTheRighteous:Cast(Target) |
||||
end |
||||
else |
||||
-- If Dusk And Dawn isnt known, rip SoR normally. |
||||
if ShieldOfTheRighteous:IsKnownAndUsable() and ShieldOfTheRighteous:IsInRange(Target) then |
||||
return ShieldOfTheRighteous:Cast(Target) |
||||
end |
||||
end |
||||
|
||||
-- Avengers shield with higher prio than Judgement in AOE. Prefer targets that are casting. |
||||
if Player:GetEnemies(10) > 1 and AvengersShield:IsKnownAndUsable() and AvengersShieldTarget:Exists() then |
||||
return AvengersShield:Cast(AvengersShieldTarget) |
||||
end |
||||
|
||||
-- Judgement |
||||
if Judgement:IsKnownAndUsable() and Target:Exists() and not Player:IsCastingOrChanneling() and Judgement:IsInRange(Target) then |
||||
return Judgement:Cast(Target) |
||||
end |
||||
|
||||
-- Avengers shield with lower prio than Judgement in ST. Prefer targets that are casting. |
||||
if Player:GetEnemies(10) == 1 and AvengersShield:IsKnownAndUsable() and AvengersShieldTarget:Exists() then |
||||
return AvengersShield:Cast(AvengersShieldTarget) |
||||
end |
||||
|
||||
-- Blessed Hammer if there are more than 1 enemy in 10 yds. |
||||
if BlessedHammer:IsKnownAndUsable() and Player:GetEnemies(10) >= 1 then |
||||
return BlessedHammer:Cast(Player) |
||||
end |
||||
|
||||
return false |
||||
end |
||||
|
||||
---@return boolean |
||||
local function OutOfCombatRotation() |
||||
return false |
||||
end |
||||
|
||||
local isRunning = false |
||||
|
||||
ProtModule:Sync(function() |
||||
if not isRunning then |
||||
Bastion:Print('Prot Paladin Started') |
||||
isRunning = true |
||||
end |
||||
|
||||
if not Player:IsAlive() then |
||||
return false |
||||
end |
||||
|
||||
-- Cast Crusader Aura if talented and the player is mounted. |
||||
if Player:IsMounted() and CrusaderAura:IsKnownAndUsable() and not Player:GetAuras():FindMy(CrusaderAura):IsUp() and not Player:IsCastingOrChanneling() then |
||||
return CrusaderAura:Cast(Player) |
||||
end |
||||
|
||||
-- Cast Devo Aura if the player is not mounted. |
||||
if not Player:IsMounted() and DevoAura:IsKnownAndUsable() and not Player:GetAuras():FindMy(DevoAura):IsUp() and not Player:IsCastingOrChanneling() then |
||||
return DevoAura:Cast(Player) |
||||
end |
||||
|
||||
if Player:IsAffectingCombat() then |
||||
-- Combat Rotation |
||||
return CombatRotation() |
||||
else |
||||
-- Out Of Combat Rotation |
||||
return OutOfCombatRotation() |
||||
end |
||||
end) |
||||
|
||||
Bastion:Register(ProtModule) |
@ -1,66 +0,0 @@ |
||||
local Tinkr, _Bastion = ... |
||||
|
||||
---@type Bastion |
||||
local Bastion = _Bastion |
||||
|
||||
local ProtModule = Bastion.Module:New('paladin_protection') |
||||
local Player = Bastion.UnitManager:Get('player') |
||||
local Target = Bastion.UnitManager:Get('target') |
||||
|
||||
local CrusaderAura = Bastion.SpellBook:GetSpell(32223) |
||||
local DevoAura = Bastion.SpellBook:GetSpell(465) |
||||
local Consecrate = Bastion.SpellBook:GetSpell(26573) |
||||
local ConsecrateAura = Bastion.SpellBook:GetSpell(188370) |
||||
local Judgement = Bastion.SpellBook:GetSpell(275779) |
||||
|
||||
---@return boolean |
||||
local function CombatRotation() |
||||
-- Cast Consecrate if an enemy is in range, and the player isnt moving. |
||||
if Consecrate:IsKnownAndUsable() and not Player:IsMoving() and not Player:GetAuras():FindMy(ConsecrateAura):IsUp() and Player:GetEnemies(10) >= 1 then |
||||
return Consecrate:Cast(Player) |
||||
end |
||||
|
||||
if Judgement:IsKnownAndUsable() and Target:Exists() and not Player:IsCastingOrChanneling() and Judgement:IsInRange(Target) then |
||||
return Judgement:Cast(Target) |
||||
end |
||||
|
||||
return false |
||||
end |
||||
|
||||
---@return boolean |
||||
local function OutOfCombatRotation() |
||||
return false |
||||
end |
||||
|
||||
local isRunning = false |
||||
|
||||
ProtModule:Sync(function() |
||||
if not isRunning then |
||||
Bastion:Print('Prot Paladin Started') |
||||
isRunning = true |
||||
end |
||||
|
||||
if not Player:IsAlive() then |
||||
return false |
||||
end |
||||
|
||||
-- Cast Crusader Aura if talented and the player is mounted. |
||||
if Player:IsMounted() and CrusaderAura:IsKnownAndUsable() and not Player:GetAuras():FindMy(CrusaderAura):IsUp() and not Player:IsCastingOrChanneling() then |
||||
return CrusaderAura:Cast(Player) |
||||
end |
||||
|
||||
-- Cast Devo Aura if the player is not mounted. |
||||
if not Player:IsMounted() and DevoAura:IsKnownAndUsable() and not Player:GetAuras():FindMy(DevoAura):IsUp() and not Player:IsCastingOrChanneling() then |
||||
return DevoAura:Cast(Player) |
||||
end |
||||
|
||||
if Player:IsAffectingCombat() then |
||||
-- Combat Rotation |
||||
return CombatRotation() |
||||
else |
||||
-- Out Of Combat Rotation |
||||
return OutOfCombatRotation() |
||||
end |
||||
end) |
||||
|
||||
Bastion:Register(ProtModule) |
Loading…
Reference in new issue