An alternative to using Blizzard's SecureStateDriver for non-secure code. As this code is not secure, modification during combat is not an issue.
State determination is done through Blizzard's own SecureCmdOptionParse function, allowing for full use of macro-style parameters. As new parameters are encountered they are parsed, and the result cached, to determine the best way to keep their state accurate (OnEvent/OnUpdate).
CPU use is kept minimal with a couple of features:
The parameter parse can detect if a portion of the parameters will never be reached, or if the state can never change, and adjust accordingly.
Event usage is tracked to ensure that any unused event is unregistered to prevent unnecessary processing.
Example - Hide/Show a frame in/out of combat:
local frame = CreateFrame('Frame', nil, UIParent)
local function handler(object, method)
local stateDriver = LibStub('LibStateDriver-1.1'):New()
stateDriver:SetParameters("[combat] Hide; Show")
Example - Hide a frame in a raid, dim it in combat or in a party:
local frame = CreateFrame('Frame', nil, UIParent)
local function handler(object, alpha)
alpha = tonumber(alpha) or 1
if alpha == 0 then
local stateDriver = LibStub('LibStateDriver-1.1'):New(true)
stateDriver:SetParameters("[group:raid] 0; [combat][group:party] 0.5; 1")
stateDriver = lib:New([enable])
Create a new state driver object.
enable - (boolean) If true then the state driver will be enabled upon creation.
stateDriver - (table) The state driver object to be used by the calling code (see State Drivers below).
The object returned by lib:New() is an empty table with a metatable that provides several methods. The table itself is not utilized by the library and is completely at the disposal of the calling code to use as needed. The methods provided are:
Trigger an immediate state update of stateDriver. If stateDriver is enabled, or force is set, then a callback is also triggered.
force - (boolean) Indicates to treat stateDriver as enabled even if its not.
Stop stateDriver from monitoring for state changes and triggering callbacks. Upon creation stateDriver is automatically disabled unless the enable field was set.
Start stateDriver monitoring for state changes and triggering callbacks, also immediately triggers a state update and callback.
callback = stateDriver:GetCallback()
Get the callback function currently assigned to stateDriver.
callback - (function or nil) The assigned callback.
object = stateDriver:GetObject()
Get the object (first argument) that is to be passed during stateDriver's callback.
object - (any) The assigned object.
parameters = stateDriver:GetParameters()
Get the parameters currently assigned to stateDriver.
parameters - (string) The assigned parameters.
state = stateDriver:GetState()
Get the state of stateDriver as determined by the last evaluation of it's assigned parameters.
state - (string or nil) The state currently associated with stateDriver.
enabled = stateDriver:IsEnabled()
Get the enabled status of the stateDriver.
enabled - (boolean) The current status of stateDriver, true if enabled.
The inverse function to unpack(stateDriver).
... - (any) The values to be loaded into stateDriver.
Removes the metatable from stateDriver as well as removing all internal references so that it may be garbage collected.
Set the function to be called when stateDriver's state changes, defaulting to a dummy function upon creation or if set to nil. The callback function is passed: object, state.
callback - (function or nil) The function to be called when a state change occurs.
Set the object (first argument) that is to be passed to stateDriver's callback function, defaulting to stateDriver upon creation or if set to nil.
object - (any) The object to be passed.
Set the macro-style parameters that are to be evaluated for stateDriver's state changes, defaulting to "" upon creation or if set to nil. Changing parameters immediately causes the state to be re-evaluated and if it changed a callback is triggered, unless stateDriver is disabled.
parameters - (string or nil) The parameters that are to be monitored for state changes.
Switch the status of stateDriver from enabled to disabled or vice-versa.
Version 1.2.1 (09/27/2012)
- Fix for performing arithmetic on a nil value errors with macro conditionals: petbattle, possessbar, spec, stealth, vehicleui
- Changed the event used to detect gear changes to PLAYER_EQUIPMENT_CHANGED (from UNIT_INVENTORY_CHANGED)
- Slight reduction in memory use
Version 1.2 (09/02/2012)
- Updated for MoP
Version 1.1.1 (09/11/2010)
- Fix for using the methods Disable or Enable during a stateDriver update
Version 1.1 (05/24/2010)
- Parameter parsing changed slightly to allow for use of "@" and to further minimize OnEvent/OnUpdate use
- Callbacks are now executed safely via pcall
- GetArg/SetArg renamed GetObject/SetObject
- Added the stateDriver methods Recycle and Pack
- lib:New() and stateDriver() argument/behavior changed
Version 1.0.1 (09/27/2009)
- Added MMOUI Minion support to TOC file (X-WoWI-ID)
- Changed the event used to detect spec changes to ACTIVE_TALENT_GROUP_CHANGED (from PLAYER_TALENT_UPDATE)