parent
a26433aec5
commit
3f6bf3ef64
@ -0,0 +1,225 @@ |
|||||||
|
local Tinkr, Bastion = ... |
||||||
|
|
||||||
|
local RestoModule = Bastion.Module:New('RestoDruid') |
||||||
|
local Player = Bastion.UnitManager:Get('player') |
||||||
|
local Target = Bastion.UnitManager:Get('target') |
||||||
|
local lastEfflorescenceCast = 0 |
||||||
|
|
||||||
|
|
||||||
|
-- Initialize SpellBook |
||||||
|
local SpellBook = Bastion.SpellBook:New() |
||||||
|
|
||||||
|
-- Spells |
||||||
|
local Efflorescence = SpellBook:GetSpell(145205) |
||||||
|
local Lifebloom = SpellBook:GetSpell(33763) |
||||||
|
local Innervate = SpellBook:GetSpell(29166) |
||||||
|
local Swiftmend = SpellBook:GetSpell(18562) |
||||||
|
local WildGrowth = SpellBook:GetSpell(48438) |
||||||
|
local Rejuvenation = SpellBook:GetSpell(774) |
||||||
|
local Tranquility = SpellBook:GetSpell(740) |
||||||
|
local Ironbark = SpellBook:GetSpell(102342) |
||||||
|
local NaturesSwiftness = SpellBook:GetSpell(132158) |
||||||
|
local Regrowth = SpellBook:GetSpell(8936) |
||||||
|
local Flourish = SpellBook:GetSpell(197721) |
||||||
|
local IncarnationTreeOfLife = SpellBook:GetSpell(33891) |
||||||
|
local CenarionWard = SpellBook:GetSpell(102351) |
||||||
|
local ConvokeTheSpirits = SpellBook:GetSpell(391528) |
||||||
|
local GroveGuardians = SpellBook:GetSpell(341523) |
||||||
|
local SoulOfTheForest = SpellBook:GetSpell(114108) |
||||||
|
local NaturesCure = SpellBook:GetSpell(88423) |
||||||
|
|
||||||
|
-- Buffs |
||||||
|
local SoulOfTheForestBuff = SpellBook:GetSpell(114108) |
||||||
|
local ClearcastingBuff = SpellBook:GetSpell(16870) |
||||||
|
local ReforestationBuff = SpellBook:GetSpell(392160) |
||||||
|
|
||||||
|
-- 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) |
||||||
|
|
||||||
|
-- APLs |
||||||
|
local DefaultAPL = Bastion.APL:New('default') |
||||||
|
local CooldownAPL = Bastion.APL:New('cooldown') |
||||||
|
|
||||||
|
-- Helper Functions |
||||||
|
local function GetRejuvCount() |
||||||
|
local count = 0 |
||||||
|
Bastion.UnitManager:EnumFriends(function(unit) |
||||||
|
if unit:GetAuras():FindMy(Rejuvenation):IsUp() then |
||||||
|
count = count + 1 |
||||||
|
end |
||||||
|
end) |
||||||
|
return count |
||||||
|
end |
||||||
|
|
||||||
|
local function ShouldUseFlourish() |
||||||
|
return GetRejuvCount() >= 3 and WildGrowth:GetTimeSinceLastCast() <= 6 |
||||||
|
end |
||||||
|
|
||||||
|
-- Default APL |
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Efflorescence:CastableIf(function(self) |
||||||
|
local currentTime = GetTime() |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (currentTime - lastEfflorescenceCast) > 10 |
||||||
|
end):SetTarget(Bastion.UnitManager:Get('none')):OnCast(function(self) |
||||||
|
local loc = Bastion.UnitManager:FindFriendsCentroid(10, 40) |
||||||
|
self:Click(loc) |
||||||
|
lastEfflorescenceCast = GetTime() |
||||||
|
end) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Lifebloom:CastableIf(function(self) |
||||||
|
return Tank:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (not Tank:GetAuras():FindMy(Lifebloom):IsUp() or |
||||||
|
Tank:GetAuras():FindMy(Lifebloom):GetRemainingTime() <= 4.5) |
||||||
|
end):SetTarget(Tank) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Rejuvenation:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() <= 90 and not Player:GetAuras():FindMy(SoulOfTheForestBuff):IsUp() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Swiftmend:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() <= 60 |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
WildGrowth:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and (Player:GetAuras():FindMy(SoulOfTheForestBuff):IsUp() or |
||||||
|
Player:GetPartyHPAround(30, 90) >= 3) |
||||||
|
and not Player:IsMoving() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
Regrowth:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 70 and |
||||||
|
(Player:GetAuras():FindMy(ClearcastingBuff):IsUp() or |
||||||
|
NaturesSwiftness:GetTimeSinceLastCast() < 2) |
||||||
|
and not Player:IsMoving() |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
CenarionWard:CastableIf(function(self) |
||||||
|
return Tank:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Tank:GetHP() <= 90 |
||||||
|
end):SetTarget(Tank) |
||||||
|
) |
||||||
|
|
||||||
|
DefaultAPL:AddSpell( |
||||||
|
NaturesCure:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetAuras():HasAnyDispelableAura(NaturesCure) |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
-- Cooldown APL |
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Tranquility:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 70) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Innervate:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPP() <= 80 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Ironbark:CastableIf(function(self) |
||||||
|
return Tank:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Tank:GetHP() <= 70 |
||||||
|
end):SetTarget(Tank) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
NaturesSwiftness:CastableIf(function(self) |
||||||
|
return Lowest:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Lowest:GetHP() < 50 |
||||||
|
end):SetTarget(Lowest) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
Flourish:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and ShouldUseFlourish() |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
IncarnationTreeOfLife:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetPartyHPAround(40, 80) >= 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
ConvokeTheSpirits:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and Player:GetAuras():FindMy(ReforestationBuff):GetCount() == 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
CooldownAPL:AddSpell( |
||||||
|
GroveGuardians:CastableIf(function(self) |
||||||
|
return Player:Exists() and self:IsKnownAndUsable() and not Player:IsCastingOrChanneling() |
||||||
|
and self:GetCharges() == 3 |
||||||
|
end):SetTarget(Player) |
||||||
|
) |
||||||
|
|
||||||
|
-- Module Sync |
||||||
|
RestoModule:Sync(function() |
||||||
|
if Player:IsAffectingCombat() then |
||||||
|
CooldownAPL:Execute() |
||||||
|
DefaultAPL:Execute() |
||||||
|
end |
||||||
|
end) |
||||||
|
|
||||||
|
Bastion:Register(RestoModule) |
Loading…
Reference in new issue