More prot logic

main
Ryan Crockett 2 years ago
parent 84f8ab52f8
commit 9406772384
  1. 191
      scripts/paladin/paladin_protection.lua
  2. 66
      scripts/paladin_protection.lua
  3. 2
      src/_bastion.lua

@ -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)

@ -277,6 +277,6 @@ end)
-- end -- end
if UnitClass('player') == 'Paladin' and GetSpecialization() == 2 then if UnitClass('player') == 'Paladin' and GetSpecialization() == 2 then
Tinkr:require("scripts/bastion/scripts/paladin_protection", Bastion) Tinkr:require("scripts/bastion/scripts/paladin/paladin_protection", Bastion)
Eval('RunMacroText("/bastion module paladin_protection")', 'bastion') Eval('RunMacroText("/bastion module paladin_protection")', 'bastion')
end end

Loading…
Cancel
Save