6.0 UI Add-On Changes - Updated Aug 4

Forum Avatar
Community Manager
#1 - July 10, 2014, 9:39 p.m.
Blizzard Post
Note: For a list of changes in previous patches, please see thread titled: UI Add-On Changes Compilation.

Edit Aug 4: Added information on changes pertaining to dismissing pets to the bottom of the list.


In a pre-Warlords of Draenor patch, there will be a number of updates and changes to functions that affect how User Interface Add-Ons will work. Add-Ons in the Beta client has been enabled and will allow UI Add-On authors will have a chance to work on updating their Add-Ons and test these changes out.

To help keep things organized, please specify the section you’re referencing when providing feedback.

== Saving Keybinds/Macros/UI Settings ==

Saving keybinds/macros/UI settings has changed a little. Most of the changes were on the backend to make things more in-line with our current architecture.

The main is difference is we no longer compare local versions with the server versions of keybinds/macros/UI settings to determine which ones to load on the client. Instead, we have local CVars that toggle looking at local files or server files. All clients default to server side storage. If you don’t want that, you can change the following CVars to only look at local files instead.

    “synchronizeConfig” [0/1] – defaults to 1 which will save character & account UI configurations (i.e. CVars) to the server.
    “synchronizeBindings” [0/1] – defaults to 1 which will save character & account keybindings to the server.
    “synchronizeMacros” [0/1] – defaults to 1 which will save character & account macros to the server.
    “synchronizeSettings” [0/1] – defaults to 1 which will save all character & account information to the server (this is exactly like setting the previous three to 1 or 0).

== Add-On Communications ==

Add-on communication is now available through custom chat channels.

    SendAddonMessage() where Type is "CHANNEL", and target is the channel name.

== KeyValues ==

To enable the creation of better self-contained templates that are easier to configure, (i.e. you don’t have to remember to override the OnLoad and call the original) we’re allowing both key and value types to be modified using “keyType” and “type” respectively. The default for both is “string”. Other available options are: string, boolean, number, global (where the value is looked up in the global table).

When we make templates that make use of this sort of option, we plan to add a commented out KeyValues section listing all available options so you don’t have to go digging through the code.

Example:
<Frame name="RoleButtonTemplate" virtual="true">
<!-- Available options
<KeyValues>
<KeyValue key="role" value="tank"/>
<KeyValue key="tooltip" value="TALENT_SPEC_TANK_TOOLTIP" type="global"/>
<KeyValue key="roleID" value="1" type="number"/>
</KeyValues>
-->
<OnLoad>
self.Texture:SetTexture(GetTextureForRole(self.role));
</OnLoad>

<OnClick>
DoSomethingWithRole(self.role);
DoSomethingWithRoleID(self.roleID);
</OnClick>

<OnEnter>
GameTooltip:SetText(self.tooltip);
GameTooltip:SetOwner(self, "ANCHOR_RIGHT");
GameTooltip:Show();
</OnEnter>

<OnLeave function="GameTooltip_Hide"/>
</Frame>

<Frame name="TankButton" inherits="RoleButtonTemplate">
<KeyValues>
<KeyValue key="role" value="tank"/>
<KeyValue key="tooltip" value="TALENT_SPEC_TANK_TOOLTIP" type="global"/>
<KeyValue key="roleID" value="1" type="number"/>
</KeyValues>
</Frame>

<Frame name="HealerButton" inherits="RoleButtonTemplate">
<KeyValues>
<KeyValue key="role" value="healer"/>
<KeyValue key="tooltip" value="TALENT_SPEC_HEALER_TOOLTIP" type="global"/>
<KeyValue key="roleID" value="2" type="number"/>
</KeyValues>
</Frame>

== Atlas ==

Atlases are textures with mappings onto standard textures that include normalized texture coordinates.

    useAtlasSize - Use the actual pixel size of the sub-texture as the in-game rectangle size.

Example:
XML
<Texture atlas="_Garr_InfoBox-Top" horizTile="true" useAtlasSize="true">
<Anchors>
<Anchor point="TOPLEFT" y="7"/>
<Anchor point="TOPRIGHT" y="7"/>
</Anchors>
<!--This uses the top-left quarter of this atlas entry, not the top-left quarter of the whole texture-->
<TexCoords left="0" right="0.5" top="0.0" bottom="0.5"/>
</Texture>

Lua
filename, width, height, left, right, top, bottom, tilesHoriz, tilesVert = GetAtlasInfo("name")
someTexture:SetAtlas("_Garr_InfoBox-Top");
atlas = someTexture:GetAtlas()

== New Timer System ==

There is a new timer system being added in. Documentation is available in C_TimerAugment.lua

Functions:

    C_Timer.After(duration, callback) – Calls the callback cafter duration seconds.
    timer = C_Timer.NewTimer(duration, callback) – Calls callback after duration seconds. This is more expensive than C_Timer.After, so this only should be used if you need it to be cancellable.
    timer:Cancel() – Cancels a timer
    ticker = C_Timer.NewTicker(duration, callback, iterations) – Calls callback every duration seconds (up to iterations times)
    ticker:Cancel() – Cancels a ticker

== Animation System ==

Animation system is receiving a few changes and various bug fixes.

    Alpha animation has fromAlpha and toAlpha. This is a variant from just a change delta.
    Scale animataion has fromScale and toScale.
    childKey is the same as targetKey with automatically pre-pending “$parent.$parent.”
    AnimGroups now have a “setToFinalAlpha” setting that will apply the animations final resulting alpha to all animating regions.

== Dismissing Pets ==

In the pre-Warlords of Draenor patch, Dismiss Pet will no longer be in the Spellbook. Players will dismiss their pets by right-clicking on the pet's frame and selecting Dismiss Pet. We'll be adding a /petdismiss command so that UI Add-Ons will continue to have a way to dismiss pets.

Reminder: To help keep things organized, please specify the section you’re referencing when providing feedback.
Forum Avatar
Community Manager
#7 - July 11, 2014, 8:02 p.m.
Blizzard Post
07/10/2014 05:45 PMPosted by Kaydeethree
== Saving Keybinds/Macros/UI Settings ==
Feature request: Can we have cross-character settings for things like the chat windows, autoloot, and the other things that are still per-character?

Unfortunately, the CVar system is only either/or. If we made them account-wide, no one would be able to make them work on a per-character basis. However, we reevaluate the CVars and their defaults from time-to-time. We’ll keep these in mind, but will likely err on the side of leaving them character based.

07/10/2014 09:27 PMPosted by Gethe
== Atlas ==
Will we be able to create our own? I would assume not since none of the one you guys are using are defined in the frameXML, but figured i'd ask.

On a tangent to the above, is there any word on png support? This would be a massive help for when working with textures that have an alpha channel.

The system doesn't support creating your own; it's tied to our internal database and editors. You only need to know about our atlas if you reuse our textures.

There's no PNG support in Warlords of Draenor, but we may reevaluate this in the future.

07/11/2014 05:34 AMPosted by Kulakai
ticker = C_Timer.NewTicket(duration, callback, iterations) – Calls callback every duration seconds (up to iterations times)


Is the call really "NewTicket" or was that a typo and "NewTicker" is the actual call?

Fixed it, thanks for letting me know. :)

I'll get a lot of use out of the <KeyValues> and the C_Timer stuff.

The synchronizeMacros cvar doesn't appear to behave how it's described on beta yet. (There is no SET synchronizeMacros "1" entry in config.wtf and its behavior is the old behavior of grabbing edits to the macros-cache.txt. Adding a SET synchronizeMacros "1" didn't alter behavior either. Didn't test the other cvars). When it's implemented I hope it continues to write out a macros-cache.txt even when its set to 1. It's a useful backup especially since the macro editbox has no undo feature. Many times I've alt-tabbed back into game to reply to a whisper and I've destroyed a macro.

UI Add-Ons haven't been enabled yet on Beta. This is just an advanced heads-up to give you guys time to prep.
Forum Avatar
Community Manager
#25 - Aug. 4, 2014, 10:54 p.m.
Blizzard Post
08/03/2014 11:34 PMPosted by Galvin
Don't think more frequently, but I imagine the accuracy of using animationgroups for timers is better than an onupdate function and less cpu usage. Onupdate being lua vs C code animationgroups.

Thing is blizzard is adding overhead with the way they're doing it. The ticker code is doing one function call for C_Timer.After, then another function call for the callback. Where as if you did an animation group it would just be one function call for your callback.

Hello Galvin, the UI team has the following to say over concerns with regards to overhead and efficiency.

In most cases, initiating a second C_Timer is still going to be cheaper than using an Animation or OnUpdate. The issue here is that both Animation and OnUpdate calls have overhead that applies every frame while they are active. For OnUpdate, the overhead lies in the extra function call to Lua. For Animations, we’re doing work C-side that allows us to support smoothing, parallel animations, and animation propagation. In contrast, the new C_Timer system uses a standard heap implementation. It’s only doing work when the timer is created or destroyed (and even then, that work is fairly minimal).

The one case where you’re better off not using the new C_Timer system is when you have a ticker with a very short period – something that’s going to fire every couple frames. For example, you have a ticker you want to fire every 0.05 seconds; you’re going to be best served by using an OnUpdate function (where about half the function calls will do something useful and half will just decrement the timer).

(As a side note, accuracy of AnimationGroups is exactly the same as that of OnUpdate calls or C_Timer calls. They are all checked once per-frame.)
Forum Avatar
Community Manager
#35 - Sept. 10, 2014, 1:50 a.m.
Blizzard Post
08/22/2014 11:01 AMPosted by Galvin
PlaySoundFile() will not play custom ogg files. I tested this on the latest beta. One easy test anyone can do is use bugsack and set it fatality. It will not play. I also tested this with my own addon, and any sound that's not built in won't play.

PlaySoundFIle() not working is a bug and should be fixed in a future Beta build.

In addition, functions that involve add-ons (GetAddonInfo, GetAddonDependances, etc.) should take the name or index.