Code:
-- Create a new table for our code:
mymodule= { }
-- Some local variables we use in our module:
mymodule.running = true
mymodule.lastticks = 0
mymodule.lastchannelid = 0
mymodule.lastchanneltargetid = 0
mymodule.lastchannelticks = 0
-- Initializing function, we create a new Window for our module that has 1 button and 1 field to display data:
function mymodule.ModuleInit()
GUI_NewWindow("MyNewWindow",50,50,100,50);
GUI_NewButton("MyNewWindow","Toggle","MYMODULE.TOGGLE");
end
-- The function that gets called when the button is pressed:
function mymodule.ToggleRun()
mymodule.running = not mymodule.running
end
-- The Mainloop function, gets called all the time by FFXIVMinion:
function mymodule.OnUpdateHandler( Event, ticks )
if ( mymodule.running and ticks - mymodule.lastticks > 200 ) then
mymodule.lastticks = ticks
--Track last thing it saw me doing and when.
if (Player.castinginfo and Player.castinginfo.channelingid ~=0 ) then
mymodule.lastchannelid = Player.castinginfo.channelingid
mymodule.lastchanneltargetid = Player.castinginfo.channeltargetid
mymodule.lastchannelticks = ticks
end
--See if I need aetherflow and do it
local afbuff = false
if ( Player.buffs ) then
for i, buff in pairs(Player.buffs) do
if (buff.id == 304) then
afbuff = true
end
end
end
if (not afbuff) then
local afspell = ActionList:Get(166)
if (afspell.isready) then
afspell:Cast()
end
end
if ( MeshManager:IsKeyPressed(4)) then
local target = Player:GetTarget()
local ruin = ActionList:Get(163)
local bio = ActionList:Get(164)
local miasma = ActionList:Get(168)
local bio2 = ActionList:Get(178)
local bioduration = 0
local miasmaduration = 0
local bio2duration = 0
--todo, make this account for spell speed
local gcd = ruin.casttime
-- Scan buffs on target and their remaining duration
for i, buff in pairs(target.buffs) do
if (buff and buff.id == 179 and buff.ownerid == Player.id) then
bioduration = buff.duration
end
if (buff and buff.id == 180 and buff.ownerid == Player.id) then
miasmaduration = buff.duration
end
if (buff and buff.id == 189 and buff.ownerid == Player.id) then
bio2duration = buff.duration
end
end
--Don't use this if I was seen channeling this attack in the last second on the same target
if (miasma.isready and (miasmaduration < (gcd + miasma.casttime)) and not
( mymodule.lastchannelid == 168 and mymodule.lastchanneltargetid == target.id and (ticks - mymodule.lastchannelticks) < 1000)) then
miasma:Cast(target.id)
return
end
d(tostring(bio2duration).. " < ".. tostring(gcd).. " + ".. bio2.casttime)
if (bio2.isready and (bio2duration < (gcd + bio2.casttime)) and not
( mymodule.lastchannelid == 178 and mymodule.lastchanneltargetid == target.id and (ticks - mymodule.lastchannelticks) < 1000)) then
bio2:Cast(target.id)
return
end
if (bio.isready and bioduration < gcd) then
bio:Cast(target.id)
return
end
if (ruin.isready) then
ruin:Cast(target.id)
return
end
end
end
end
-- Registering the Events
RegisterEventHandler("Gameloop.Update",mymodule.OnUpdateHandler) -- the normal pulse from the gameloop
RegisterEventHandler("MYMODULE.TOGGLE", mymodule.ToggleRun) -- the function that gets called when our button is pressed
RegisterEventHandler("Module.Initalize",mymodule.ModuleInit) -- the initialization function, gets called only once at startup of the game