parent
e0b3d7afe6
commit
306948de16
@ -0,0 +1,326 @@ |
|||||||
|
local Tinkr, Bastion = ... |
||||||
|
|
||||||
|
local HolyPriestModule = Bastion.Module:New('HolyPriest') |
||||||
|
local Player = Bastion.UnitManager:Get('player') |
||||||
|
local Target = Bastion.UnitManager:Get('target') |
||||||
|
|
||||||
|
-- Initialize SpellBook |
||||||
|
local SpellBook = Bastion.SpellBook:New() |
||||||
|
|
||||||
|
-- Spells |
||||||
|
local HolyFire = SpellBook:GetSpell(14914) |
||||||
|
local ShadowWordPain = SpellBook:GetSpell(589) |
||||||
|
local Smite = SpellBook:GetSpell(585) |
||||||
|
local PrayerOfMending = SpellBook:GetSpell(33076) |
||||||
|
local CircleOfHealing = SpellBook:GetSpell(204883) |
||||||
|
local PrayerOfHealing = SpellBook:GetSpell(596) |
||||||
|
local HolyWordSanctify = SpellBook:GetSpell(34861) |
||||||
|
local Halo = SpellBook:GetSpell(120517) |
||||||
|
local Lightwell = SpellBook:GetSpell(372835) |
||||||
|
local HolyWordSalvation = SpellBook:GetSpell(265202) |
||||||
|
local DivineHymn = SpellBook:GetSpell(64843) |
||||||
|
local FlashHeal = SpellBook:GetSpell(2061) |
||||||
|
local Heal = SpellBook:GetSpell(2060) |
||||||
|
local BindingHeal = SpellBook:GetSpell(32546) |
||||||
|
local Renew = SpellBook:GetSpell(139) |
||||||
|
local HolyWordSerenity = SpellBook:GetSpell(2050) |
||||||
|
local GuardianSpirit = SpellBook:GetSpell(47788) |
||||||
|
local PowerWordShield = SpellBook:GetSpell(17) |
||||||
|
local Fade = SpellBook:GetSpell(586) |
||||||
|
local DesperatePrayer = SpellBook:GetSpell(19236) |
||||||
|
local Apotheosis = SpellBook:GetSpell(200183) |
||||||
|
local SymbolOfHope = SpellBook:GetSpell(64901) |
||||||
|
local HolyWordChastise = SpellBook:GetSpell(88625) |
||||||
|
local DivineStarTalent = SpellBook:GetSpell(110744) |
||||||
|
local EmpyrealBlaze = SpellBook:GetSpell(372616) |
||||||
|
local AnsweredPrayers = SpellBook:GetSpell(393886) |
||||||
|
local answeredPrayersStacks = 0 |
||||||
|
local PrayerCircle = SpellBook:GetSpell(195329) |
||||||
|
local EmpyrealBlazeAura = SpellBook:GetSpell(372617) |
||||||
|
|
||||||
|
-- Buffs and Debuffs |
||||||
|
local SurgeOfLight = SpellBook:GetSpell(114255) |
||||||
|
local Apotheosis = SpellBook:GetSpell(200183) |
||||||
|
local PowerWordShield = SpellBook:GetSpell(17) |
||||||
|
local TranslucentImage = SpellBook:GetSpell(373446) |
||||||
|
local ProtectiveLight = SpellBook:GetSpell(193065) |
||||||
|
local ShadowWordPainDebuff = SpellBook:GetSpell(589) |
||||||
|
|
||||||
|
-- Custom Units |
||||||
|
local Lowest = Bastion.UnitManager:CreateCustomUnit('lowest', function(unit) |
||||||
|
local lowest = nil |
||||||
|
local lowestHP = math.huge |
||||||
|
|
||||||
|
Bastion.UnitManager:EnumFriends(function(unit) |
||||||
|
if unit:IsDead() or Player:GetDistance(unit) > 40 or not Player:CanSee(unit) then |
||||||
|
return false |
||||||
|
end |
||||||
|
|
||||||
|
local hp = unit:GetHP() |
||||||
|
if hp < lowestHP then |
||||||
|
lowest = unit |
||||||
|
lowestHP = hp |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
return lowest or Player |
||||||
|
end) |
||||||
|
|
||||||
|
local Tank = Bastion.UnitManager:CreateCustomUnit('tank', function(unit) |
||||||
|
local tank = nil |
||||||
|
|
||||||
|
Bastion.UnitManager:EnumFriends(function(unit) |
||||||
|
if Player:GetDistance(unit) > 40 or not Player:CanSee(unit) or unit:IsDead() then |
||||||
|
return false |
||||||
|
end |
||||||
|
|
||||||
|
if unit:IsTank() then |
||||||
|
tank = unit |
||||||
|
return true |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
return tank or Player |
||||||
|
end) |
||||||
|
|
||||||
|
local SWPTarget = Bastion.UnitManager:CreateCustomUnit('swptarget', function(unit) |
||||||
|
local target = nil |
||||||
|
local lowestDuration = 100 |
||||||
|
|
||||||
|
Bastion.UnitManager:EnumEnemies(function(unit) |
||||||
|
if unit:IsAffectingCombat() and unit:GetDistance(Player) <= 40 and Player:CanSee(unit) then |
||||||
|
local aura = unit:GetAuras():FindMy(ShadowWordPainDebuff) |
||||||
|
if not aura:IsUp() then |
||||||
|
target = unit |
||||||
|
return true |
||||||
|
elseif aura:GetRemainingTime() < lowestDuration then |
||||||
|
target = unit |
||||||
|
lowestDuration = aura:GetRemainingTime() |
||||||
|
end |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
return target or Target |
||||||
|
end) |
||||||
|
|
||||||
|
-- APLs |
||||||
|
local DefaultAPL = Bastion.APL:New('default') |
||||||
|
local CooldownAPL = Bastion.APL:New('cooldown') |
||||||
|
local DefensiveAPL = Bastion.APL:New('defensive') |
||||||
|
local DpsAPL = Bastion.APL:New('dps') |
||||||
|
|
||||||
|
-- Helper Functions |
||||||
|
local function GetAnsweredPrayersStacks() |
||||||
|
-- Implement logic to track Answered Prayers stacks |
||||||
|
-- This is a placeholder and should be replaced with actual implementation |
||||||
|
return 0 |
||||||
|
end |
||||||
|
|
||||||
|
local function ShouldUseHalo() |
||||||
|
return Player:GetPartyHPAround(30, 80) >= 3 |
||||||
|
end |
||||||
|
|
||||||
|
local function GetEnemiesWithoutSWP(range) |
||||||
|
local count = 0 |
||||||
|
Bastion.UnitManager:EnumEnemies(function(unit) |
||||||
|
if unit:IsAffectingCombat() and unit:GetDistance(Player) <= range and not unit:GetAuras():FindMy(ShadowWordPainDebuff):IsUp() then |
||||||
|
count = count + 1 |
||||||
|
end |
||||||
|
end) |
||||||
|
return count |
||||||
|
end |
||||||
|
|
||||||
|
-- Default APL |
||||||
|
DefaultAPL:AddSpell( |
||||||
|
PrayerOfMending:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
end):SetTarget(Tank) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
CircleOfHealing:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(30, 90) >= 3 and not Player:GetAuras():FindMy(PrayerCircle):IsUp() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
PrayerOfHealing:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(30, 85) >= 3 and Player:GetAuras():FindMy(PrayerCircle):IsUp() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
HolyWordSanctify:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(30, 80) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
FlashHeal:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 70 and (Player:GetAuras():FindMy(SurgeOfLight):IsUp() or Player:GetAuras():FindMy(Apotheosis):IsUp()) |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Heal:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 85 and not Player:IsMoving() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
BindingHeal:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 80 and Player:GetHP() < 80 and not Player:IsMoving() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Renew:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 90 and not Lowest:GetAuras():FindMy(Renew):IsUp() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
HolyWordSerenity:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 60 |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
-- Cooldown APL |
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Apotheosis:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (answeredPrayersStacks >= 50 or Player:GetPartyHPAround(40, 75) >= 3) |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
DivineHymn:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 70) >= 4 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
HolyWordSalvation:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 65) >= 4 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Halo:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and ShouldUseHalo() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Lightwell:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 80) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
SymbolOfHope:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 85) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
-- Defensive APL |
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
Fade:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetHP() < 90 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
DesperatePrayer:CastableIf(function(self) |
||||||
|
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetHP() < 50 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
GuardianSpirit:CastableIf(function(self) |
||||||
|
return Tank:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Tank:GetHP() < 40 |
||||||
|
end):SetTarget(Tank) |
||||||
|
) |
||||||
|
|
||||||
|
DefensiveAPL:AddSpell( |
||||||
|
PowerWordShield:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 85 and not Lowest:GetAuras():FindMy(PowerWordShield):IsUp() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
-- DPS APL |
||||||
|
DpsAPL:AddSpell( |
||||||
|
HolyWordChastise:CastableIf(function(self) |
||||||
|
return Target:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and EmpyrealBlaze:IsKnownAndUsable() |
||||||
|
end):SetTarget(Target):OnCast(function() |
||||||
|
EmpyrealBlaze:Cast(Player) |
||||||
|
end) |
||||||
|
) |
||||||
|
|
||||||
|
DpsAPL:AddSpell( |
||||||
|
HolyFire:CastableIf(function(self) |
||||||
|
return Target:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (Player:GetAuras():FindMy(EmpyrealBlazeAura):IsUp() or not EmpyrealBlaze:IsKnownAndUsable()) |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
DpsAPL:AddSpell( |
||||||
|
ShadowWordPain:CastableIf(function(self) |
||||||
|
return SWPTarget:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (not SWPTarget:GetAuras():FindMy(ShadowWordPainDebuff):IsUp() |
||||||
|
or SWPTarget:GetAuras():FindMy(ShadowWordPainDebuff):GetRemainingTime() < 4.8) |
||||||
|
end):SetTarget(SWPTarget) |
||||||
|
) |
||||||
|
|
||||||
|
DpsAPL:AddSpell( |
||||||
|
Smite:CastableIf(function(self) |
||||||
|
return Target:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 90) == 0 and GetEnemiesWithoutSWP(40) == 0 |
||||||
|
end):SetTarget(Target) |
||||||
|
) |
||||||
|
|
||||||
|
-- Module Sync |
||||||
|
HolyPriestModule:Sync(function() |
||||||
|
if Player:IsAffectingCombat() then |
||||||
|
DefensiveAPL:Execute() |
||||||
|
CooldownAPL:Execute() |
||||||
|
DefaultAPL:Execute() |
||||||
|
DpsAPL:Execute() |
||||||
|
else |
||||||
|
-- Out of combat logic |
||||||
|
local enemiesWithoutSWP = GetEnemiesWithoutSWP(40) |
||||||
|
if enemiesWithoutSWP > 0 then |
||||||
|
ShadowWordPain:Cast(SWPTarget) |
||||||
|
end |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
Bastion.Globals.EventManager:RegisterWoWEvent("COMBAT_LOG_EVENT_UNFILTERED", function() |
||||||
|
local _, subEvent, _, sourceGUID, _, _, _, _, _, _, _, spellID = CombatLogGetCurrentEventInfo() |
||||||
|
if sourceGUID == Player:GetGUID() and subEvent == "SPELL_HEAL" and spellID == 33076 then |
||||||
|
answeredPrayersStacks = answeredPrayersStacks + 1 |
||||||
|
if answeredPrayersStacks >= 50 then |
||||||
|
answeredPrayersStacks = 0 |
||||||
|
end |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
Bastion:Register(HolyPriestModule) |
Loading…
Reference in new issue