===== 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