local Tinkr, Bastion = ... local DiscModule = Bastion.Module:New('disc') 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('disc_priest') 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 LeapofFaith = Bastion.SpellBook:GetSpell(73325) local Levitate = Bastion.SpellBook:GetSpell(1706) local MassDispel = Bastion.SpellBook:GetSpell(32375) local MindBlast = Bastion.SpellBook:GetSpell(8092) 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 PsychicScream = Bastion.SpellBook:GetSpell(8122) local Renew = Bastion.SpellBook:GetSpell(139) local Resurrection = Bastion.SpellBook:GetSpell(2006) local ShadowWordDeath = Bastion.SpellBook:GetSpell(32379) local Shadowfiend = Bastion.SpellBook:GetSpell(34433) local Smite = Bastion.SpellBook:GetSpell(585) local VampiricEmbrace = Bastion.SpellBook:GetSpell(15286) local VoidTendrils = Bastion.SpellBook:GetSpell(108920) local FocusedWill = Bastion.SpellBook:GetSpell(45243) local BoonoftheAscended = Bastion.SpellBook:GetSpell(325013) local Apotheosis = Bastion.SpellBook:GetSpell(392941) local DivineStar = Bastion.SpellBook:GetSpell(110744) local MassResurrection = Bastion.SpellBook:GetSpell(212036) local PainSuppression = Bastion.SpellBook:GetSpell(33206) local Penance = Bastion.SpellBook:GetSpell(47540) local PowerWordBarrier = Bastion.SpellBook:GetSpell(62618) local PowerWordRadiance = Bastion.SpellBook:GetSpell(194509) local PurgetheWicked = Bastion.SpellBook:GetSpell(204197) local Purify = Bastion.SpellBook:GetSpell(527) local Rapture = Bastion.SpellBook:GetSpell(47536) local Schism = Bastion.SpellBook:GetSpell(214621) local ShadowCovenant = Bastion.SpellBook:GetSpell(314867) local Atonement = Bastion.SpellBook:GetSpell(81749) local MasteryGrace = Bastion.SpellBook:GetSpell(271534) local SinsoftheMany = Bastion.SpellBook:GetSpell(280391) local Apotheosis = Bastion.SpellBook:GetSpell(392941) local DivineStar = Bastion.SpellBook:GetSpell(110744) local MassResurrection = Bastion.SpellBook:GetSpell(212036) local Purify = Bastion.SpellBook:GetSpell(527) local ShadowWordPain = Bastion.SpellBook:GetSpell(204197) local DivineStar = Bastion.SpellBook:GetSpell(110744) local ShadowWordPain = Bastion.SpellBook:GetSpell(204197) 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 PurgeTarget = Bastion.UnitManager:CreateCustomUnit('purge', function(unit) local purge = 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 not unit:IsDead() and Player:CanSee(unit) and unit:GetAuras():HasAnyStealableAura() then purge = unit return true end end) if purge == nil then purge = None end return purge end) local DispelTarget = 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 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 = None end return tank 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 RenewUnit = Bastion.UnitManager:CreateCustomUnit('renew', 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 ( not unit:GetAuras():FindMy(Renew):IsUp() or unit:GetAuras():FindMy(Renew):GetRemainingTime() <= 1.6) then local hp = unit:GetHP() if hp < lowestHP then lowest = unit lowestHP = hp end end end) if lowest == nil then lowest = Player end return lowest end) local PshieldUnit = Bastion.UnitManager:CreateCustomUnit('pshield', 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 ( not unit:GetAuras():FindMy(PowerWordShield):IsUp()) then local hp = unit:GetHP() if hp < lowestHP then lowest = unit lowestHP = hp end end end) if lowest == nil then lowest = Player end return lowest end) local DefaultAPL = Bastion.APL:New('default') DefaultAPL: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) ) DefaultAPL:AddSpell( ShadowCovenant:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Player) ) DefaultAPL:AddSpell( ShadowWordPain:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Target:GetAuras():FindMy(ShadowWordPain):IsUp() end):SetTarget(Target) ) DefaultAPL:AddSpell( PowerWordShield:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Player:GetAuras():FindMy(PowerWordShield):IsUp() and not IsMounted() and Player:GetHealth() < 80 end):SetTarget(Player) ) DefaultAPL:AddSpell( Shadowfiend:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Target) ) DefaultAPL:AddSpell( PowerInfusion:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Player) ) DefaultAPL:AddSpell( ShadowWordDeath:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Target:GetHealthPercent() <= 20 end):SetTarget(Target) ) DefaultAPL:AddSpell( MindBlast:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Target) ) DefaultAPL:AddSpell( Smite:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Target) ) DefaultAPL:AddSpell( PurgeTheWicked:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and not Target:GetAuras():PurgeTheWicked() end):SetTarget(Target) ) DefaultAPL:AddSpell( Schism:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Target) ) DefaultAPL:AddSpell( Penance:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() end):SetTarget(Target) ) DefaultAPL:AddSpell( Penance:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Lowest:GetHP() <= 70 end):SetTarget(Lowest) ) DefaultAPL:AddSpell( DispelMagic:CastableIf(function(self) return PurgeTarget:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and self:IsInRange(PurgeTarget) and PurgeTarget:GetAuras():HasAnyStealableAura() end):SetTarget(PurgeTarget) ) DefaultAPL:AddSpell( Purify:CastableIf(function(self) return DispelTarget:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and self:IsInRange(DispelTarget) and DispelTarget:GetAuras():HasAnyDispelableAura(Purify) end):SetTarget(DispelTarget) ) DefaultAPL:AddSpell( PainSuppression:CastableIf(function(self) return Tank:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:CanSee(Tank) and Tank:GetHP() <= 30 end):SetTarget(Tank) ) DefaultAPL:AddSpell( FlashHeal:CastableIf(function(self) return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:CanSee(Lowest) and Lowest:GetHP() <= 65 end):SetTarget(Lowest) ) DefaultAPL:AddSpell( PowerWordLife:CastableIf(function(self) return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:CanSee(Lowest) and Lowest:GetHP() <= 35 end):SetTarget(Lowest) ) DefaultAPL:AddSpell( Renew:CastableIf(function(self) return RenewUnit:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:CanSee(RenewUnit) and RenewUnit:GetHP() <= 95 end):SetTarget(RenewUnit) ) DefaultAPL:AddSpell( PowerWordShield:CastableIf(function(self) return PshieldUnit:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:CanSee(PshieldUnit) and PshieldUnit:GetHP() <= 70 end):SetTarget(PshieldUnit) ) DefaultAPL:AddSpell( PowerWordRadiance:CastableIf(function(self) return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:IsInParty() and self:IsInRange(Player) and Player:GetPartyHPAround(50) >= 3 end):SetTarget(Player) ) DefaultAPL:AddSpell( PowerWordBarrier:CastableIf(function(self) return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:IsInParty() and self:IsInRange(Player) and Player:GetPartyHPAround(40) >= 3 end):SetTarget(Player) ) OpenerAPL:AddSpell( DivineStar:CastableIf(function(self) return self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() and Player:IsFacing(target) end):SetTarget(None):OnCast(function(self) local loc = Target:GetPosition() self:Click(loc) end) ) DiscModule:Sync(function() if Player:IsAffectingCombat() then DefaultAPL:Execute() end end) Bastion:Register(DiscModule) local tab1 = { layoutConfig = { padding = { top = 40 } }, rows = { [1] = { resto = { type = 'header', label = 'DPS Options' } }, [2] = { dps1 = { type = 'slider', label = 'DPS Health Threshold', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('dpshealth', 85), onValueChanged = function(_, value) myconf:Write('dpshealth', value) end }, dps2 = { type = 'slider', label = 'Player Mana Threshold', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('playermana', 85), onValueChanged = function(_, value) myconf:Write('playermana', value) end }, }, [3] = { autoform = { type = 'header', label = 'Natures Cure' } }, [4] = { pummel = { type = 'checkbox', label = 'Dispell', column = 6, initialValue = myconf:Read('naturescure1', false), onValueChanged = function(_, flag) myconf:Write('naturescure1', flag) end }, }, [5] = { resto = { type = 'header', label = 'Soothe' } }, [6] = { incombat = { type = 'checkbox', label = 'Shoote Target', column = 12, order = 1, initialValue = myconf:Read('soothe', false), onValueChanged = function(_, flag) myconf:Write('soothe', flag) end }, }, [7] = { resto = { type = 'header', label = 'Dispel Delay Time' } }, [8] = { 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 }, }, [9] = { innervate1 = { type = 'checkbox', label = 'Innervate', column = 6, order = 1, initialValue = myconf:Read('innervate', false), onValueChanged = function(_, flag) myconf:Write('innervate', flag) end }, innervate2 = { type = 'slider', label = 'Player Mana', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('innervatemana', 35), onValueChanged = function(_, value) myconf:Write('innervatemana', value) end }, }, [10] = { frostmage = { type = 'header', label = 'Trinkets' } }, [11] = { pummel = { type = 'checkbox', label = 'Use Trinkets', column = 6, initialValue = myconf:Read('trinkets', false), onValueChanged = function(_, flag) myconf:Write('trinkets', flag) end }, }, [12] = { autoform = { type = 'header', label = 'Auto Form' } }, [13] = { pummel = { type = 'checkbox', label = 'Use Auto Form', column = 6, initialValue = myconf:Read('autoform', false), onValueChanged = function(_, flag) myconf:Write('autoform', flag) end }, }, }, } local tab2 = { layoutConfig = { padding = { top = 40 } }, rows = { [1] = { resto = { 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 = 'Regrowth', 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 }, }, [4] = { resto = { type = 'header', label = 'Defensives' } }, [5] = { bark1 = { type = 'checkbox', label = 'Barkskin', column = 6, order = 1, initialValue = myconf:Read('barkskin', false), onValueChanged = function(_, flag) myconf:Write('barkskin', flag) end }, bark2 = { type = 'slider', label = 'Player Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('barkskinpercent', 35), onValueChanged = function(_, value) myconf:Write('barkskinpercent', value) end }, }, }, } local tab3 = { layoutConfig = { padding = { top = 40 } }, rows = { [1] = { incombat = { type = 'checkbox', label = 'In Combat Healing', column = 6, order = 1, initialValue = myconf:Read('groupicheal', false), onValueChanged = function(_, flag) myconf:Write('groupicheal', flag) end }, outcombat = { type = 'checkbox', label = 'Out of Combat Healing', column = 6, order = 2, initialValue = myconf:Read('groupoocheal', false), onValueChanged = function(_, flag) myconf:Write('groupoocheal', flag) end }, }, [2] = { lifebloom1 = { type = 'dropdown', label = 'Lifebloom on', column = 6, order = 1, options = { { text = 'Tank Only', value = 'tank'}, { text = 'All Party', value = 'party'}, { text = 'Player', value = 'player'}, { text = 'None', value = 'none'}, }, initialValue = myconf:Read('lifebloomtarget', 'tank'), onValueChanged = function(_, value) myconf:Write('lifebloomtarget', value) end }, }, [3] = { resto = { type = 'header', label = 'AOE Heals' } }, [4] = { tranq1 = { type = 'checkbox', label = 'Tranquility', column = 6, order = 1, initialValue = myconf:Read('grptranq', false), onValueChanged = function(_, flag) myconf:Write('grptranq', flag) end }, }, [5] = { tranq2 = { type = 'slider', label = 'Number of Targets', column = 6, order = 2, min = 1, max = 10, precision = 0, initialValue = myconf:Read('tranqtargets', 3), onValueChanged = function(_, value) myconf:Write('tranqtargets', value) end }, tranq3 = { type = 'slider', label = 'Target Health', column = 6, order = 1, min = 1, max = 100, precision = 0, initialValue = myconf:Read('tranqpercent', 50), onValueChanged = function(_, value) myconf:Write('tranqpercent', value) end }, }, [6] = { flourish1 = { type = 'checkbox', label = 'Flourish', column = 6, order = 1, initialValue = myconf:Read('flourish', false), onValueChanged = function(_, flag) myconf:Write('flourish', flag) end }, }, [7] = { flourish2 = { type = 'slider', label = 'Number of Targets', column = 6, order = 2, min = 1, max = 10, precision = 0, initialValue = myconf:Read('flourishtargets', 3), onValueChanged = function(_, value) myconf:Write('flourishtargets', value) end }, flourish3 = { type = 'slider', label = 'Target Health', column = 6, order = 1, min = 1, max = 100, precision = 0, initialValue = myconf:Read('flourishpercent', 50), onValueChanged = function(_, value) myconf:Write('flourishpercent', value) end }, }, [8] = { convoke1 = { type = 'checkbox', label = 'Convoke The Spirits', column = 6, order = 1, initialValue = myconf:Read('convoke', false), onValueChanged = function(_, flag) myconf:Write('convoke', flag) end }, }, [9] = { convoke2 = { type = 'slider', label = 'Number of Targets', column = 6, order = 2, min = 1, max = 10, precision = 0, initialValue = myconf:Read('convoketargets', 3), onValueChanged = function(_, value) myconf:Write('convoketargets', value) end }, convoke3 = { type = 'slider', label = 'Target Health', column = 6, order = 1, min = 1, max = 100, precision = 0, initialValue = myconf:Read('convokepercent', 50), onValueChanged = function(_, value) myconf:Write('convokepercent', value) end }, }, [10] = { wild1 = { type = 'checkbox', label = 'Wild Growth', column = 6, order = 1, initialValue = myconf:Read('grpwildgrowth', false), onValueChanged = function(_, flag) myconf:Write('grpwildgrowth', flag) end }, }, [11] = { wild2 = { type = 'slider', label = 'Number of Targets', column = 6, order = 2, min = 1, max = 10, precision = 0, initialValue = myconf:Read('wildgrowthtargets', 3), onValueChanged = function(_, value) myconf:Write('wildgrowthtargets', value) end }, wild3 = { type = 'slider', label = 'Target Health', column = 6, order = 1, min = 1, max = 100, precision = 0, initialValue = myconf:Read('wildgrowthpercent', 80), onValueChanged = function(_, value) myconf:Write('wildgrowthpercent', value) end }, }, [12] = { incarnationtree1 = { type = 'checkbox', label = 'Incarnation: Tree of Life', column = 6, order = 1, initialValue = myconf:Read('incarnationtree', false), onValueChanged = function(_, flag) myconf:Write('incarnationtree', flag) end }, }, [13] = { convoke2 = { type = 'slider', label = 'Number of Targets', column = 6, order = 2, min = 1, max = 10, precision = 0, initialValue = myconf:Read('incarnationtreetargets', 3), onValueChanged = function(_, value) myconf:Write('incarnationtreetargets', value) end }, convoke3 = { type = 'slider', label = 'Target Health', column = 6, order = 1, min = 1, max = 100, precision = 0, initialValue = myconf:Read('incarnationtreepercent', 50), onValueChanged = function(_, value) myconf:Write('incarnationtreepercent', value) end }, } }, } local tab4 = { layoutConfig = { padding = { top = 40 } }, rows = { [1] = { resto = { type = 'header', label = 'AOE Heals ' } }, [2] = { ironbark1 = { type = 'dropdown', label = 'Ironbark on', column = 6, order = 1, options = { { text = 'Tank Only', value = 'tank'}, { text = 'All Party', value = 'party'}, { text = 'None', value = 'none'}, }, initialValue = myconf:Read('ironbarktarget', 'tank'), onValueChanged = function(_, value) myconf:Write('ironbarktarget', value) end }, ironbark2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('ironbarkpercent', 30), onValueChanged = function(_, value) myconf:Write('ironbarkpercent', value) end }, }, [3] = { ward1 = { type = 'dropdown', label = 'Cenarion Ward on', column = 6, order = 1, options = { { text = 'Tank Only', value = 'tank'}, { text = 'All Party', value = 'party'}, { text = 'None', value = 'none'}, }, initialValue = myconf:Read('wardtarget', 'tank'), onValueChanged = function(_, value) myconf:Write('wardtarget', value) end }, ward2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('wardpercent', 30), onValueChanged = function(_, value) myconf:Write('wardpercent', value) end }, }, [4] = { natswift1 = { type = 'checkbox', label = 'Natures Swiftness', column = 6, order = 1, initialValue = myconf:Read('grpnatswift', false), onValueChanged = function(_, flag) myconf:Write('grpnatswift', flag) end }, natswift2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('grpnatswiftpercent', 40), onValueChanged = function(_, value) myconf:Write('grpnatswiftpercent', value) end }, }, [5] = { swift1 = { type = 'checkbox', label = 'Swiftmend', column = 6, order = 1, initialValue = myconf:Read('grpswiftmend', false), onValueChanged = function(_, flag) myconf:Write('grpswiftmend', flag) end }, swift2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('grpswiftmendpercent', 60), onValueChanged = function(_, value) myconf:Write('grpswiftmendpercent', value) end }, }, [6] = { regrowth1 = { type = 'checkbox', label = 'Regrowth', column = 6, order = 1, initialValue = myconf:Read('grpregrowth', false), onValueChanged = function(_, flag) myconf:Write('grpregrowth', flag) end }, regrowth2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('grpregrowthpercent', 65), onValueChanged = function(_, value) myconf:Write('grpregrowthpercent', value) end }, }, [7] = { rejuv1 = { type = 'checkbox', label = 'Rejuvenation', column = 6, order = 1, initialValue = myconf:Read('grprejuv', false), onValueChanged = function(_, flag) myconf:Write('grprejuv', flag) end }, rejuv2 = { type = 'slider', label = 'Target Health', column = 6, order = 2, min = 1, max = 100, precision = 0, initialValue = myconf:Read('grprejuvpercent', 85), onValueChanged = function(_, value) myconf:Write('grprejuvpercent', value) end }, }, }, } local discpriestconfig = { layoutConfig = { padding = { top = 30 } }, rows = { [1] = { container = { type = 'tab', fullSize = true, tabs = { { name = 'player', title = 'Player Settings', layout = tab1 }, { name = 'playerhealing', title = 'Player Healing', layout = tab2 }, { name = 'group', title = 'Group Healing', layout = tab3 }, { name = 'group2', title = 'AOE Healing ', layout = tab4 } }, } }, }, } Bastion.settingstemplate(discpriestconfig, 'Disc Priest', 460, 780, 1.00, 0.49, 0.04)