===== About =====
ACR (Advanced Combat Routines) is a platform for highly customizable combat routines that are written in lua.
Routines built on this platform can use a custom GUI, have access to a special multi-clickable Party Interface, and the routines are not bound by the same generic rules that SkillManager routines use.
===== Features =====
=== ACR Main Interface ===
{{http://puu.sh/o21Aq/fe0475ebda.jpg}}
== Enabled ==
Enables the current profile. If this is off, FFXIVMinion uses SkillManager instead. If a profile is not listed here, it is not properly built/compiled.
== Auto-Enabled ==
Enables ACR if a profile is found for the current class. This will hold true in reverse, and it will be disabled if no valid profiles are found.
== Show Party Interface ==
Toggles the multi-clickable party interface window, discussed in the next section.
----
=== ACR Party Interface ===
{{http://puu.sh/o27pB/a9e3a2216e.jpg}}
//ACR does not include FFXIV icons, but these can be downloaded from [[http://www.filehosting.org/file/details/559401/icons.zip|this link]].
To install the icons, place the icons folder in the root of the ACR module [ACR\icons].//
The party interface is a multi-clickable display that can work in conjunction with routines via their OnClick procedure.
== Examples ==
Right-click to dispel debuffs.
Left-click to cast a small heal.
Shift+Left-click to cast a large heal.
Middle-click to use an ability such as Cover/Goad on your teammate.
OnClick API documented in Routine API below.
----
==== Routine API ====
-- Create the basic profile table.
local profile = {}
-- Create a GUI table, to hold GUI-related information.
profile.GUI = {
open = false,
visible = true,
name = "Batman",
}
-- Create a classes table, to specify which classes this profile can be used for.
profile.classes = {
[FFXIV.JOBS.NINJA] = true,
[FFXIV.JOBS.ROGUE] = true,
}
-- The Cast() function is where the magic happens.
-- Action code should be called and fired here.
function profile.Cast()
local currentTarget = MGetTarget()
if (currentTarget) then
local spinningEdge = ActionList:Get(2240,1,currentTarget.id)
if (spinningEdge and spinningEdge.isready) then
spinningEdge:Cast(currentTarget.id)
return true
end
end
return false
end
-- The Draw() function provides a place where a developer can show custom options.
function profile.Draw()
if (profile.GUI.open) then
profile.GUI.visible, profile.GUI.open = GUI:Begin(profile.GUI.name, profile.GUI.open)
if ( profile.GUI.visible ) then
ACR_MyProfile_MySavedVar = GUI:Checkbox("AOE",ACR_MyProfile_MySavedVar)
end
GUI:End()
end
end
-- Adds a customizable header to the top of the ffxivminion task window.
function profile.DrawHeader()
end
-- Adds a customizable footer to the top of the ffxivminion task window.
function profile.DrawFooter()
end
-- The OnOpen() function is fired when a user pressed "View Profile Options" on the main ACR window.
function profile.OnOpen()
-- Set our GUI table //open// variable to true so that it will be drawn.
profile.GUI.open = true
end
-- The OnLoad() function is fired when a profile is prepped and loaded by ACR.
function profile.OnLoad()
-- Set and (if necessary) create a saved variable named ACR_MyProfile_MySavedVar.
ACR_MyProfile_MySavedVar = ACR.GetSetting("ACR_MyProfile_MySavedVar",false)
end
-- The OnClick function is fired when a user clicks on the ACR party interface.
-- It accepts 5 parameters:
-- mouse /int/ - Possible values are 0 (Left-click), 1 (Right-click), 2 (Middle-click)
-- shiftState /bool/ - Is shift currently pressed?
-- controlState /bool/ - Is control currently pressed?
-- altState /bool/ - Is alt currently pressed?
-- entity /table/ - The entity information for the party member that was clicked on.
function profile.OnClick(mouse,shiftState,controlState,altState,entity)
end
-- The OnUpdate() function is fired on the gameloop, like any other OnUpdate function found in FFXIVMinion code.
function profile.OnUpdate(event, tickcount)
end
-- Return the profile to ACR, so it can be read.
return profile
==== Pushing Routines API ====
-- This code is an example of how to push routines into ACR using the new API call.
-- This isn't required anymore. Simply placing your ACR LUA file into a folder named CombatRoutines is enough for the ACR module to detect and load your ACR.
acelib.routinePath = GetStartupPath()..[[\LuaMods\AceLib\CombatRoutines\]] --this can be any subfolder, I'm using the old structure for ease
function AceLib.LoadCombatProfile(filename,alias)
if (acelib.ModuleFunctions and acelib.ModuleFunctions.ReadModuleFile) then
local fileInfo = { p = "CombatRoutines" , m = "AceLib" , f = filename }
local fileString = acelib.ModuleFunctions.ReadModuleFile(fileInfo)
if (fileString) then
local fileFunction, errorMessage = loadstring(fileString)
if (fileFunction) then
local ok, profileData = pcall(fileFunction)
if (ok and profileData ~= nil) then
ACR.AddPrivateProfile(profileData,alias)
end
end
end
else
if (filename ~= "" and FileExists(acelib.routinePath..filename)) then
local profileData,e = persistence.load(acelib.routinePath..filename)
if (ValidTable(profileData)) then
ACR.AddPrivateProfile(profileData,alias)
end
end
end
end
function AceLib.LoadCombatProfiles()
AceLib.LoadCombatProfile("Ark.lua","Ark")
end
-- Final call should be done in a ModuleInit so that all modules can finish loading other API where required.
function acelib.ModuleInit()
AceLib.LoadCombatProfiles()
end