User Tools

Site Tools

en


acr

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

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

puu.sh_o27pb_a9e3a2216e.jpg

ACR does not include FFXIV icons, but these can be downloaded from 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
 
-- 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.
 
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
acr.txt · Last modified: 2021/06/22 18:26 by ace