You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
bastion/scripts/holypriest.lua

476 lines
19 KiB

local Tinkr, Bastion = ...
local HolyModule = Bastion.Module:New('holypriest')
local Evaluator = Tinkr.Util.Evaluator
local Player = Bastion.UnitManager:Get('player')
local None = Bastion.UnitManager:Get('none')
local Target = Bastion.UnitManager:Get('target')
local myconf = Tinkr.Util.Config:New('holy_priest') -- for saving variables
local ArcaneTorrent = Bastion.SpellBook:GetSpell(232633)
local AutoAttack = Bastion.SpellBook:GetSpell(6603)
local AngelicFeather = Bastion.SpellBook:GetSpell(121536)
local DesperatePrayer = Bastion.SpellBook:GetSpell(19236)
local DispelMagic = Bastion.SpellBook:GetSpell(528)
local Fade = Bastion.SpellBook:GetSpell(586)
local FlashHeal = Bastion.SpellBook:GetSpell(2061)
local HolyNova = Bastion.SpellBook:GetSpell(132157)
local HolyWordSalvation = Bastion.SpellBook:GetSpell(265202)
local LeapofFaith = Bastion.SpellBook:GetSpell(73325)
local Levitate = Bastion.SpellBook:GetSpell(1706)
local MassDispel = Bastion.SpellBook:GetSpell(32375)
local MindSoothe = Bastion.SpellBook:GetSpell(453)
local MindVision = Bastion.SpellBook:GetSpell(2096)
local PowerInfusion = Bastion.SpellBook:GetSpell(10060)
local PowerWordFortitude = Bastion.SpellBook:GetSpell(21562)
local PowerWordLife = Bastion.SpellBook:GetSpell(373481)
local PowerWordShield = Bastion.SpellBook:GetSpell(17)
local PrayerofMending = Bastion.SpellBook:GetSpell(33076)
local PsychicScream = Bastion.SpellBook:GetSpell(8122)
local Renew = Bastion.SpellBook:GetSpell(139)
local Resurrection = Bastion.SpellBook:GetSpell(2006)
local ShadowWordPain = Bastion.SpellBook:GetSpell(589)
local Shadowfiend = Bastion.SpellBook:GetSpell(34433)
local Smite = Bastion.SpellBook:GetSpell(585)
local FocusedWill = Bastion.SpellBook:GetSpell(45243)
local CircleofHealing = Bastion.SpellBook:GetSpell(204883)
local DivineHymn = Bastion.SpellBook:GetSpell(64843)
local DivineWord = Bastion.SpellBook:GetSpell(372760)
local GuardianSpirit = Bastion.SpellBook:GetSpell(47788)
local Halo = Bastion.SpellBook:GetSpell(120517)
local Heal = Bastion.SpellBook:GetSpell(2060)
local HolyFire = Bastion.SpellBook:GetSpell(14914)
local HolyWordSanctify = Bastion.SpellBook:GetSpell(34861)
local HolyWordSerenity = Bastion.SpellBook:GetSpell(2050)
local Lightweaver = Bastion.SpellBook:GetSpell(390993)
local MassResurrection = Bastion.SpellBook:GetSpell(212036)
local PrayerofHealing = Bastion.SpellBook:GetSpell(596)
local Purify = Bastion.SpellBook:GetSpell(527)
local SurgeofLight = Bastion.SpellBook:GetSpell(114255)
local SymbolofHope = Bastion.SpellBook:GetSpell(64901)
local MindBlast = Bastion.SpellBook:GetSpell(14914)
local Lowest = Bastion.UnitManager:CreateCustomUnit('lowest', function(unit)
local lowest = nil
local lowestHP = math.huge
Bastion.UnitManager:EnumFriends(function(unit)
if unit:IsDead() then return false end
if Player:GetDistance(unit) > 40 then return false end
if not Player:CanSee(unit) then return false end
local hp = unit:GetHP()
if hp < lowestHP then
lowest = unit
lowestHP = hp
end
end)
if not lowest then
lowest = Player
end
return lowest
end)
local Tank = Bastion.UnitManager:CreateCustomUnit('tank', function(unit)
local tank = nil
Bastion.UnitManager:EnumFriends(function(unit)
if Player:GetDistance(unit) > 40 then return false end
if not Player:CanSee(unit) then return false end
if unit:IsDead() then return false end
if unit:IsTank() then
tank = unit
return true
end
return false
end)
if tank == nil then
tank = Player
end
return tank
end)
local Healer = Bastion.UnitManager:CreateCustomUnit('healer', function(unit)
local healer = nil
Bastion.UnitManager:EnumFriends(function(unit)
if Player:GetDistance(unit) > 40 then return false end
if not Player:CanSee(unit) then return false end
if unit:IsDead() then return false end
if unit:IsHealer() then
healer = unit
return true
end
return false
end)
if healer == nil then
healer = Player
end
return healer
end)
local PurifyUnit = Bastion.UnitManager:CreateCustomUnit('dispel', function(unit)
local lowest = nil
local lowestHP = math.huge
Bastion.UnitManager:EnumFriends(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 not unit:IsDead() and Player:CanSee(unit) and
unit:GetAuras():HasAnyDispelableAura(Purify) then
local hp = unit:GetHP()
if hp < lowestHP then
lowest = unit
lowestHP = hp
end
end
end)
if lowest == nil then
lowest = None
end
return lowest
end)
local SanctifyUnit = Bastion.UnitManager:CreateCustomUnit('sanctify', function(unit)
local lowest = nil
local lowestHP = math.huge
Bastion.UnitManager:EnumFriends(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 Player:CanSee(unit) and unit:GetPartyHPAround(10, 70) >= 5
then
local hp = unit:GetHP()
if hp < lowestHP then
lowest = unit
lowestHP = hp
end
end
end)
if lowest == nil then
lowest = None
end
return lowest
end)
local CoHUnit = Bastion.UnitManager:CreateCustomUnit('coh', function(unit)
local lowest = nil
local lowestHP = math.huge
Bastion.UnitManager:EnumFriends(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 Player:CanSee(unit) and unit:GetPartyHPAround(30, 80) >= 4
then
local hp = unit:GetHP()
if hp < lowestHP then
lowest = unit
lowestHP = hp
end
end
end)
if lowest == nil then
lowest = None
end
return lowest
end)
local Explosive = Bastion.UnitManager:CreateCustomUnit('explosive', function(unit)
local explosive = 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 Player:InMelee(unit) and unit:GetID() == 120651 and Player:IsFacing(unit) then
explosive = unit
return true
end
end)
if explosive == nil then
explosive = None
end
return explosive
end)
local RestingAPL = Bastion.APL:New('resting')
local HealAPL = Bastion.APL:New('heal')
local DamageAPL = Bastion.APL:New('damage')
-- Resting - Out of Combat Actions
local usepwf = myconf:Read('pwf')
RestingAPL:AddSpell(
PowerWordFortitude:CastableIf(function(self)
return usepwf and self:IsKnownAndUsable() and
not Player:IsCastingOrChanneling() and not Player:GetAuras():FindMy(PowerWordFortitude):IsUp() and not IsMounted()
end):SetTarget(Player)
)
-- HealAPL - Healing here
-- Purify
HealAPL:AddSpell(
Purify:CastableIf(function(self)
return PurifyUnit:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and
self:IsInRange(PurifyUnit) and PurifyUnit:GetAuras():HasAnyDispelableAura(Purify)
end):SetTarget(PurifyUnit)
)
-- Symbol of Hope
HealAPL:AddSpell(
SymbolofHope:CastableIf(function(self)
return Healer:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Healer:GetPP() <= 50
end):SetTarget(Player)
)
-- Guardian Spirit
HealAPL:AddSpell(
GuardianSpirit:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Tank:GetHP() <= 40
end):SetTarget(Tank)
)
-- Flash Heal with Surge of Light
HealAPL:AddSpell(
FlashHeal:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:GetAuras():FindMy(SurgeofLight):IsUp()
end):SetTarget(Lowest)
)
-- Holy Word: Salvation when the majority of the raid is heavily injured
HealAPL:AddSpell(
HolyWordSalvation:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:GetPartyHPAround(40, 50) >= 5
and not Player:IsMoving()
end):SetTarget(Player)
)
-- Divine Hymn when the majority of the raid is heavily injured
HealAPL:AddSpell(
DivineHymn:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:GetPartyHPAround(40, 40) >= 5
and not Player:IsMoving()
end):SetTarget(Player)
)
-- Divine Word followed by Holy Word: Sanctify (if available) on a cluster of injured allies
-- Divine Word followed by Holy Word: Serenity (if available) on an injured ally
HealAPL:AddSpell(
DivineWord:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Player:GetAuras():FindMy(DivineWord):IsUp()
and (Lowest:GetHP() <= 60 or SanctifyUnit:GetPartyHPAround(10, 60) >= 5)
end):SetTarget(Player)
)
-- Holy Word: Sanctify when a cluster of your raid is injured
HealAPL:AddSpell(
HolyWordSanctify:CastableIf(function(self)
return SanctifyUnit:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:CanSee(SanctifyUnit) and SanctifyUnit:GetPartyHPAround(10, 70) >= 5
end):SetTarget(None):OnCast(function(self)
local loc = SanctifyUnit:GetPosition()
self:Click(loc)
end)
)
-- Holy Word: Serenity on an injured ally
HealAPL:AddSpell(
HolyWordSerenity:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Lowest:GetHP() <= 70
end):SetTarget(Lowest)
)
-- Circle of Healing on cooldown when at least 4 allies are injured
HealAPL:AddSpell(
CircleofHealing:CastableIf(function(self)
return CoHUnit:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
and Player:CanSee(CoHUnit) and CoHUnit:GetPartyHPAround(30, 80) >= 4
end):SetTarget(CoHUnit)
)
-- Prayer of Mending on cooldown, usually on the active tank
HealAPL:AddSpell(
PrayerofMending:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Tank:GetHP() <= 95
end):SetTarget(Tank)
)
-- Halo when most of your raid is injured
HealAPL:AddSpell(
Halo:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:GetPartyHPAround(30, 70) >= 5
end):SetTarget(Player)
)
-- Power Word: Life for emergency triage on an ally below 35% hitpoints
HealAPL:AddSpell(
PowerWordLife:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Tank:GetHP() <= 35
end):SetTarget(Tank)
)
-- Alternate between Flash Heal and Heal and use Lightweaver buff
HealAPL:AddSpell(
Heal:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:GetAuras():FindMy(Lightweaver):IsUp()
and Lowest:GetHP() <= 90
end):SetTarget(Lowest)
)
HealAPL:AddSpell(
FlashHeal:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Player:GetAuras():FindMy(Lightweaver):IsUp()
and Lowest:GetHP() <= 90
end):SetTarget(Lowest)
)
-- DamageAPL - DPS spells here
-- Cast Shadow Word: Pain if you're moving and nothing else is available
DamageAPL:AddSpell(
ShadowWordPain:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Target:GetAuras():FindMy(ShadowWordPain):IsUp()
end):SetTarget(Target)
)
-- Cast Smite
DamageAPL:AddSpell(
Smite:CastableIf(function(self)
return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling()
end):SetTarget(Target)
)
-- Module that dictates APL flow
HolyModule:Sync(function()
-- Bastion:Print(Lowest)
-- if not Player:IsAffectingCombat() then
-- RestingAPL:Execute()
-- end
HealAPL:Execute()
-- if Player:IsAffectingCombat() and Target:Exists() and Target:IsHostile() then
-- DamageAPL:Execute()
-- end
end)
Bastion:Register(HolyModule)
local tab1 =
{
layoutConfig = { padding = { top = 40 } },
rows = {
[1] = { shadpr = { type = 'label', label = 'Open Combat' } },
[2] = { opener = { type = 'dropdown', label = 'Opener', column = 6, order = 1,
options = {
{ text = 'Shadow Word: Pain', value = 'swp'},
{ text = 'Shadow Crash', value = 'crash'},
{ text = 'None', value = 'none'},
},
initialValue = myconf:Read('opener', 'shield'),
onValueChanged = function(_, value) myconf:Write('opener', value) end }, },
[3] = { shadpr = { type = 'label', label = 'Buffs' } },
[4] = { pwf = { type = 'checkbox', label = 'Power Word: Fortitude', column = 12, order = 1,
initialValue = myconf:Read('pwf', false),
onValueChanged = function(_, flag) myconf:Write('pwf', flag) end }, },
[5] = { shadpr = { type = 'header', label = 'Defensives' } },
[6] = { shield1 = { type = 'checkbox', label = 'Power Word: Shield', column = 6, order = 1,
initialValue = myconf:Read('pws', false),
onValueChanged = function(_, flag) myconf:Write('pws', flag) end },
shield2 = { type = 'slider', label = 'Player Health', column = 6, order = 2,
min = 1, max = 100, precision = 0,
initialValue = myconf:Read('pwspercent', 35),
onValueChanged = function(_, value) myconf:Write('pwspercent', value) end }, },
[7] = { dispersion1 = { type = 'checkbox', label = 'Dispersion', column = 6, order = 1,
initialValue = myconf:Read('dispersion', false),
onValueChanged = function(_, flag) myconf:Write('dispersion', flag) end },
dispersion2 = { type = 'slider', label = 'Player Health', column = 6, order = 2,
min = 1, max = 100, precision = 0,
initialValue = myconf:Read('dispersionpercent', 35),
onValueChanged = function(_, value) myconf:Write('dispersionpercent', value) end }, },
[8] = { shadpr = { type = 'header', label = 'Interrupts' } },
[9] = { silence = { type = 'checkbox', label = 'Silence on CD', column = 6, order = 1,
initialValue = myconf:Read('silence', false),
onValueChanged = function(_, flag) myconf:Write('silence', flag) end },
horror = { type = 'checkbox', label = 'Psychic Horror on CD', column = 6, order = 2,
initialValue = myconf:Read('horror', false),
onValueChanged = function(_, flag) myconf:Write('horror', flag) end }, },
[10] = { shadpr = { type = 'header', label = 'Purify Disease' } },
[11] = { incombat = { type = 'checkbox', label = 'In Combat', column = 6, order = 1,
initialValue = myconf:Read('purifyic', false),
onValueChanged = function(_, flag) myconf:Write('purifyic', flag) end },
outcombat = { type = 'checkbox', label = 'Out of Combat', column = 6, order = 2,
initialValue = myconf:Read('purifyooc', false),
onValueChanged = function(_, flag) myconf:Write('purifyooc', flag) end }, },
[12] = { shadpr = { type = 'header', label = 'Dispel Magic' } },
[13] = { incombat = { type = 'checkbox', label = 'In Combat', column = 12, order = 1,
initialValue = myconf:Read('dispelic', false),
onValueChanged = function(_, flag) myconf:Write('dispelic', flag) end }, },
[14] = { shadpr = { type = 'header', label = 'Dispel Delay Time' } },
[15] = { delay = { type = 'slider', label = 'In seconds', column = 6, order = 1,
min = 0.5, max = 2, precision = 1,
initialValue = myconf:Read('dispeldelay', 1),
onValueChanged = function(_, value) myconf:Write('dispeldelay', value) end }, },
},
}
local tab2 =
{
layoutConfig = { padding = { top = 40 } },
rows = {
[1] = { shadpr = { type = 'header', label = 'Player Healing' } },
[2] = { incombat = { type = 'checkbox', label = 'In Combat Healing', column = 6, order = 1,
initialValue = myconf:Read('playericheal', false),
onValueChanged = function(_, flag) myconf:Write('playericheal', flag) end },
outcombat = { type = 'checkbox', label = 'Out of Combat Healing', column = 6, order = 2,
initialValue = myconf:Read('playeroocheal', false),
onValueChanged = function(_, flag) myconf:Write('playeroocheal', flag) end }, },
[3] = { shadowmend1 = { type = 'checkbox', label = 'Shadow Mend', column = 6, order = 1,
initialValue = myconf:Read('shadowmend', false),
onValueChanged = function(_, flag) myconf:Write('shadowmend', flag) end },
shadowmend2 = { type = 'slider', label = 'Player Health', column = 6, order = 2,
min = 1, max = 100, precision = 0,
initialValue = myconf:Read('shadowmendpercent', 35),
onValueChanged = function(_, value) myconf:Write('shadowmendpercent', value) end }, },
},
}
local holypriestconfig = {
layoutConfig = { padding = { top = 30 } },
rows = {
[1] = {
container = {
type = 'tab',
fullSize = true,
tabs = {
{
name = 'player',
title = 'Player Settings',
layout = tab1
},
{
name = 'group',
title = 'Placeholder',
layout = tab2
}
},
}
},
},
}
Bastion.settingstemplate(holypriestconfig, 'Holy Priest', 400, 600, 1.00, 1.00, 1.00) --, 0.00, 0.44, 0.87, 'enhsha') --Title of Settings Frame, Width, Height, ClassRGB, Rotation Name
-- Class colours
-- Death Knight 0.77 0.12 0.23 Red
-- Demon Hunter 0.64 0.19 0.79 Dark Magenta
-- Druid 1.00 0.49 0.04 Orange
-- Evoker 0.20 0.58 0.50 Dark Emerald
-- Hunter 0.67 0.83 0.45 Green
-- Mage 0.25 0.78 0.92 Light Blue
-- Monk 0.00 1.00 0.60 Spring Green
-- Paladin 0.96 0.55 0.73 Pink
-- Priest 1.00 1.00 1.00 White
-- Rogue 1.00 0.96 0.41 Yellow
-- Shaman 0.00 0.44 0.87 Blue
-- Warlock 0.53 0.53 0.93 Purple
-- Warrior 0.78 0.61 0.43 Tan