Compare commits

...

2 Commits

  1. 57
      scripts/paladin/paladin_protection.lua
  2. 69
      scripts/paladin/shared/hammer-of-wrath.lua
  3. 59
      scripts/paladin/shared/rebuke.lua
  4. 2
      src/Unit/Unit.lua

@ -16,12 +16,16 @@ 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)
---@type Rebuke
local Rebuke = Tinkr:require("scripts/bastion/scripts/paladin/shared/rebuke", Bastion)
---@type HammerOfWrath
local HammerOfWrath = Tinkr:require("scripts/bastion/scripts/paladin/shared/hammer-of-wrath", Bastion)
local AvengersShieldTarget = Bastion.UnitManager:CreateCustomUnit('avengers_shield', function()
local target = nil
@ -57,43 +61,6 @@ local AvengersShieldTarget = Bastion.UnitManager:CreateCustomUnit('avengers_shie
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.
@ -102,9 +69,7 @@ local function CombatRotation()
end
-- Kick
if KickTarget:Exists() and not Player:IsCastingOrChanneling() and Rebuke:IsKnownAndUsable() then
Rebuke:Cast(KickTarget)
end
if Rebuke() then return true 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
@ -139,6 +104,9 @@ local function CombatRotation()
return Judgement:Cast(Target)
end
-- Hammer of Wrath
if HammerOfWrath() then return true 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)
@ -149,6 +117,11 @@ local function CombatRotation()
return BlessedHammer:Cast(Player)
end
-- Refresh Consecrate if we've got nothing else to cast.
if Consecrate:IsKnownAndUsable() and Player:GetEnemies(10) >= 1 and not Player:IsMoving() then
return Consecrate:Cast(Player)
end
return false
end

@ -0,0 +1,69 @@
local Tinkr, _Bastion = ...
---@type Bastion
local Bastion = _Bastion
local Player = Bastion.UnitManager:Get('player')
local Target = Bastion.UnitManager:Get('target')
local None = Bastion.UnitManager:Get('none')
local _HammerOfWrath = Bastion.SpellBook:GetSpell(24275)
local AvengingWrath = Bastion.SpellBook:GetSpell(389539)
local HammerOfWrathTarget = Bastion.UnitManager:CreateCustomUnit('hammerofwrath', function()
if not _HammerOfWrath:IsKnownAndUsable() then return None end
if Player:GetAuras():FindMy(AvengingWrath):IsUp() and _HammerOfWrath:IsKnownAndUsable() and Target:Exists() and Target:IsEnemy() and Target:IsAffectingCombat() and _HammerOfWrath:IsInRange(Target) then
return Target
end
local how = nil
Bastion.UnitManager:EnumEnemies(function(unit)
if unit:IsDead() then
return false
end
if not Player:CanSee(unit) then
return false
end
if not Player:IsFacing(unit) then
return false
end
if not _HammerOfWrath:IsInRange(unit) then
return false
end
if Player:GetAuras():FindMy(AvengingWrath):IsUp() then
how = unit
return true
end
if unit:GetHealthPercent() <= 20 then
how = unit
return true
end
return false
end)
if how == nil then
how = None
end
return how
end)
---@alias HammerOfWrath fun():boolean
---@type HammerOfWrath
function HammerOfWrath()
if HammerOfWrathTarget:Exists() and not Player:IsCastingOrChanneling() then
return _HammerOfWrath:Cast(HammerOfWrathTarget)
end
return false
end
return HammerOfWrath

@ -0,0 +1,59 @@
local Tinkr, _Bastion = ...
---@type Bastion
local Bastion = _Bastion
local Player = Bastion.UnitManager:Get('player')
local None = Bastion.UnitManager:Get('none')
local _Rebuke = Bastion.SpellBook:GetSpell(96231)
local RebukeTarget = Bastion.UnitManager:CreateCustomUnit('rebuke', 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:IsInterruptibleAt(10) and _Rebuke:IsInRange(unit) and Player:IsFacing(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)
---@alias Rebuke fun():boolean
---@type Rebuke
function Rebuke()
if RebukeTarget:Exists() and not Player:IsCastingOrChanneling() and _Rebuke:IsKnownAndUsable() then
print('HAS KICK TARGET, KICKING')
return _Rebuke:Cast(RebukeTarget)
end
return false
end
return Rebuke

@ -452,7 +452,7 @@ end
-- Check if unit is interruptible
---@param percent number
---@param ignoreInterruptible boolean
---@param ignoreInterruptible? boolean
---@return boolean
function Unit:IsInterruptibleAt(percent, ignoreInterruptible)
if not ignoreInterruptible and not self:IsInterruptible() then

Loading…
Cancel
Save