An open-source suite of rotations for the Caffeine Quest, Grind, and Gather bots. Intended for leveling and open-world content.
https://caffeine.cx/
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.
119 lines
4.0 KiB
119 lines
4.0 KiB
1 year ago
|
local Unlocker, Caffeine = ...
|
||
|
|
||
|
local OpenArms = Caffeine.Module:New('OpenArms')
|
||
|
|
||
|
-- Units
|
||
|
local player = Caffeine.UnitManager:Get('player')
|
||
|
local target = Caffeine.UnitManager:Get('target')
|
||
|
local none = Caffeine.UnitManager:Get('none')
|
||
|
|
||
|
-- Spells
|
||
|
local rend = Caffeine.Globals.SpellBook:GetSpell(772)
|
||
|
local thunder_clap = Caffeine.Globals.SpellBook:GetSpell(396719)
|
||
|
local avatar = Caffeine.Globals.SpellBook:GetSpell(107574)
|
||
|
local sweeping_strikes = Caffeine.Globals.SpellBook:GetSpell(260708)
|
||
|
local colossus_smash = Caffeine.Globals.SpellBook:GetSpell(167105)
|
||
|
local thunderous_roar = Caffeine.Globals.SpellBook:GetSpell(384318)
|
||
|
local execute = Caffeine.Globals.SpellBook:GetSpell(5308)
|
||
|
local mortal_strike = Caffeine.Globals.SpellBook:GetSpell(12294)
|
||
|
local overpower = Caffeine.Globals.SpellBook:GetSpell(7384)
|
||
|
local slam = Caffeine.Globals.SpellBook:GetSpell(1464)
|
||
|
|
||
|
-- Auras
|
||
|
local colossus_smash_aura = Caffeine.Globals.SpellBook:GetSpell(208086)
|
||
|
local sudden_death = Caffeine.Globals.SpellBook:GetSpell(52437)
|
||
|
|
||
|
-- APLs
|
||
|
local default_apl = Caffeine.APL:New('default')
|
||
|
|
||
|
|
||
|
-- Cast Rend when less than 4 seconds remaining, if multiple targets, use thunder clap
|
||
|
default_apl:AddSpell(
|
||
|
rend:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and target:GetAuras():FindMy(rend):GetRemainingTime() < 4 and player:GetEnemies(8) == 1
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
default_apl:AddSpell(
|
||
|
thunder_clap:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and target:GetAuras():FindMy(rend):GetRemainingTime() < 4 and player:GetEnemies(8) > 1
|
||
|
end):Settarget(none)
|
||
|
)
|
||
|
|
||
|
-- Avatar
|
||
|
default_apl:AddSpell(
|
||
|
avatar:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable()
|
||
|
end):Settarget(none)
|
||
|
)
|
||
|
|
||
|
-- Sweeping Strikes if 2+ targets
|
||
|
default_apl:AddSpell(
|
||
|
sweeping_strikes:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and player:GetEnemies(8) > 1
|
||
|
end):Settarget(none)
|
||
|
)
|
||
|
|
||
|
-- Colossus Smash on CD
|
||
|
default_apl:AddSpell(
|
||
|
colossus_smash:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable()
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
-- Thunderous Roar while enemy has Colossus Smash or you have Test of Might
|
||
|
default_apl:AddSpell(
|
||
|
thunderous_roar:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and (target:GetAuras():FindMy(colossus_smash_aura):IsUp() or player:GetAuras():FindMy(test_of_might):IsUp())
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
-- Execute if 35% hp or Sudden Death proc
|
||
|
default_apl:AddSpell(
|
||
|
execute:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and target:GetHP() < 35 or player:GetAuras():FindMy(sudden_death):IsUp()
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
-- Mortal Strike on CD
|
||
|
default_apl:AddSpell(
|
||
|
mortal_strike:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable()
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
-- Overpower
|
||
|
default_apl:AddSpell(
|
||
|
overpower:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable()
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
-- Slam above 35% hp
|
||
|
default_apl:AddSpell(
|
||
|
slam:CastableIf(function(self)
|
||
|
return self:IsKnownAndUsable() and target:GetHP() >= 35
|
||
|
end):Settarget(target)
|
||
|
)
|
||
|
|
||
|
local move_to_timer = 0
|
||
|
OpenArms:Sync(function()
|
||
|
if not player:IsFacing(target) and target:Exists() and not target:IsDead() then
|
||
|
Caffeine.Util:FaceUnit(target)
|
||
|
end
|
||
|
|
||
|
if not player:InMelee(target) and target:Exists() and not target:IsDead() and target:IsHostile() then
|
||
|
local tx, ty, tz = ObjectPosition('target')
|
||
|
local px, py, pz = ObjectPosition('player')
|
||
|
if GetTime() - move_to_timer > 0.5 and FastDistance(px, py, pz, tx, ty, tz) > 5 then
|
||
|
MoveTo(tx, ty, tz)
|
||
|
move_to_timer = GetTime()
|
||
|
end
|
||
|
end
|
||
|
|
||
|
if player:IsAffectingCombat() and target:Exists() and target:IsHostile() and not target:IsDead() and player:IsFacing(target) then
|
||
|
default_apl:Execute()
|
||
|
end
|
||
|
end)
|
||
|
|
||
|
Caffeine:Register(OpenArms)
|