Reply
Thread Tools Display Modes
Unread 10-22-10, 03:43 AM   #1
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,201
How To : Right click removing buff

Hello

I know that the new SecuredAuraheader is quite complicated to use, this is a helper to show you how RDX handle that.

Create a file AuraButtonTemplate.xml :
The secureAuraengine need a xml template to create buttons on the fly :

Code:
<Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.blizzard.com/wow/ui/
..\FrameXML\UI.xsd">
	<Button name="RDXAB30x30Template" inherits="SecureActionButtonTemplate" virtual="true">
		<Size x="30" y="30"/>
		<Attributes>
			<Attribute name="type" value="cancelaura"/>
		</Attributes>
		<Scripts>
			<OnLoad>
				self:RegisterForClicks("RightButtonUp");
			</OnLoad>
			<OnEnter>
				GameTooltip:SetOwner(self, "ANCHOR_BOTTOMLEFT");
				GameTooltip:SetFrameLevel(self:GetFrameLevel() + 2);
				if self:GetAttribute("target-slot") == 16 or self:GetAttribute("target-slot") == 17 or self:GetAttribute("target-slot") == 18 then
					GameTooltip:SetInventoryItem("player", self:GetID());
				else
					GameTooltip:SetUnitAura("player", self:GetID());
				end
			</OnEnter>
			<OnLeave>
				GameTooltip:Hide();
			</OnLeave>
		</Scripts>
	</Button>
</Ui>
Important tags description :
Size This will define the height and width of your buff, example: <Size x="30" y="30"/>
Attribute : indicate the button is a cancelaura type.
<Attributes>
<Attribute name="type" value="cancelaura"/>
</Attributes>


Create the SecureAuraHeader handler :

Code:
local headerAura = CreateFrame("Frame", "SAH", nil, "SecureAuraHeaderTemplate");
headerAura:SetAttribute("unit", "player"); -- to activate UNITAURA event refresh
headerAura:SetAttribute("filter", "HELPFUL");
headerAura:SetAttribute("template", "RDXAB30x30Template"); -- must be the template name of your XML
headerAura:SetAttribute("minWidth", 100);
headerAura:SetAttribute("minHeight", 100);

-- the following code create a buff bar anchor to TOPLEFT and buff orientation goes to right with 10 buttons max on two rows
headerAura:SetAttribute("point", "TOPLEFT"); 
headerAura:SetAttribute("xOffset", 30);
headerAura:SetAttribute("yOffset", 0);
headerAura:SetAttribute("wrapAfter", 10);
headerAura:SetAttribute("wrapXOffset", 0);
headerAura:SetAttribute("wrapYOffset", -30);
headerAura:SetAttribute("maxWraps", 2);

-- sorting
headerAura:SetAttribute("sortMethod", "NAME"); -- INDEX or NAME or TIME
headerAura:SetAttribute("sortDir", "+"); -- - to reverse
headerAura:Show();

-- provide a simple iterator to the header
local function siter_active_children(header, i)
	i = i + 1;
	local child = header:GetAttribute("child" .. i);
	if child and child:IsShown() then
		return i, child, child:GetAttribute("index");
	end
end
function headerAura:ActiveChildren() return siter_active_children, self, 0; end

-- The update style function
local function updateStyle()
	for _,frame in headerAura:ActiveChildren() do
		
		-- create style texture if it doesn't exist
		if not frame.tex then
			frame.tex = CreateTexture(frame);
			frame.tex:SetAllPoints(frame);
			
			frame.cd = CreateFrame("Cooldown");
			frame.cd:SetAllPoints(frame);
			
			frame.txt = CreateFontString(frame);
			frame.txt:SetAllPoints(frame);
			frame.txt:SetFont(GameFontNormal);
		end
		
		local name, _, icon, count, debuffType, duration, expirationTime = UnitAura("player", frame:GetID(), "HELPFUL");
		if name then
			frame.tex:SetTexture(icon);
			frame.cd:SetCooldown(expirationTime - duration, duration);
			if count > 1 then frame.txt:SetText(count); else frame.txt:SetText("");end
			frame.tex:Show();
			frame.cd:Show();
			frame.txt:Show();
		else
			frame.tex:Hide();
			frame.cd:Hide();
			frame.txt:Hide();
		end
	end
end
create a new handler to update the style of each button

Code:
local f = CreateFrame("Frame");
f:RegisterEvent("UNIT_AURA");

-- in the OnEvent UNIT_AURA : 
-- depending of the framework you are using, delay the update to the next frame. I suppose there is a similary function in ace. The example here use our VFL framework
VFLT.NextFrame(math.random(10000000), function() updateStyle() end);
I hope this will help you in your addons.

Cheers
Sigg
sigg is offline   Reply With Quote
Unread 10-22-10, 04:38 AM   #2
Sideshow
A Warpwood Thunder Caller
 
Sideshow's Avatar
AddOn Author - Click to view addons
Join Date: Jan 2010
Posts: 99
Nice post ! I need that
__________________
Sideshow is offline   Reply With Quote
Unread 10-22-10, 05:25 AM   #3
Kurak
A Murloc Raider
Join Date: Feb 2010
Posts: 6
Great, but you could even pray for people like me who have not much idea of it, explain in what folder is it?
Kurak is offline   Reply With Quote
Unread 10-22-10, 06:44 AM   #4
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,201
this is a sample code for developer LUA.

sigg is offline   Reply With Quote
Unread 10-22-10, 07:43 AM   #5
Luzzifus
A Warpwood Thunder Caller
 
Luzzifus's Avatar
AddOn Author - Click to view addons
Join Date: Aug 2007
Posts: 94
I'm trying to set up your example code as a standalone addon right now. I had to change some of these CreateTexture/CreateFontString calls. Also the events fire and call the updateStyle function. However I don't see any buffs ingame. Am I missing something?

-- the following code create a buff bar anchor to TOPLEFT and buff orientation goes to right with 10 buttons max on two rows
headerAura:SetAttribute("point", "TOPLEFT");
headerAura:SetAttribute("xOffset", 30);
headerAura:SetAttribute("yOffset", 0);
headerAura:SetAttribute("wrapAfter", 10);
headerAura:SetAttribute("wrapXOffset", 0);
headerAura:SetAttribute("wrapYOffset", -30);
headerAura:SetAttribute("maxWraps", 2);
Which one of these lines would do that red thing?

Also I did a quick search for any documentation on the SecureAuraHeaderTemplate, like.. eh.. usage maybe. ^^ Came up with basically nothing, I can't even find it in the Blizz UI Source Code..

**edit: After your example and explanation it really doesn't sound so complicated anymore, thank you for that! If only I could see my buffs.

Last edited by Luzzifus : 10-22-10 at 07:49 AM.
Luzzifus is offline   Reply With Quote
Unread 10-22-10, 07:43 AM   #6
Maul
Ion Engines, Engage!
 
Maul's Avatar
AddOn Author - Click to view addons
Join Date: Mar 2005
Posts: 401
Woot, thanks
__________________

Twitter: @IonMaul | Windows Live: trinityui@live.com | Google Talk: trinityui@gmail.com
Maul is offline   Reply With Quote
Unread 10-22-10, 07:50 AM   #7
Ailae
A Rage Talon Dragon Guard
 
Ailae's Avatar
AddOn Author - Click to view addons
Join Date: Dec 2007
Posts: 317
Originally Posted by Luzzifus View Post
I can't even find it in the Blizz UI Source Code..
http://github.com/tekkub/wow-ui-sour...oupHeaders.xml
http://github.com/tekkub/wow-ui-sour...oupHeaders.lua

Thanks for the code, gonna play around with it a bit. But why does the update have to happen "on next frame"?
__________________
Oh, the simulated horror!
Ailae is offline   Reply With Quote
Unread 10-22-10, 07:52 AM   #8
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,201
Hello

About the style function, you have to call it in the next frame call, because the engine auraheader also use the event "UNIT_AURA" to update itself.

What I saw, was the style function is called before the auraheader update.

Goes to right :
headerAura:SetAttribute("xOffset", 30);
headerAura:SetAttribute("yOffset", 0);

Goes to left :
headerAura:SetAttribute("xOffset", -30);
headerAura:SetAttribute("yOffset", 0);

Goes to down :
headerAura:SetAttribute("xOffset", 0);
headerAura:SetAttribute("yOffset", -30);

Goes to up:
headerAura:SetAttribute("xOffset", 0);
headerAura:SetAttribute("yOffset", 30);

You should be able to move your mouse on the button and see the gametooltip.
sigg is offline   Reply With Quote
Unread 10-22-10, 08:10 AM   #9
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,201
the SecureAuraHeaderTemplate is located in the SecureGroupHeaders.lua
sigg is offline   Reply With Quote
Unread 10-22-10, 08:28 AM   #10
Luzzifus
A Warpwood Thunder Caller
 
Luzzifus's Avatar
AddOn Author - Click to view addons
Join Date: Aug 2007
Posts: 94
Thanks to both of you (Ailae and sigg)!

The reason why I didn't see anything was because I forgot to call :SetPoint on the header.. *cough* It's working now.
Luzzifus is offline   Reply With Quote
Unread 10-22-10, 08:51 AM   #11
sigg
Featured Artist
 
sigg's Avatar
Featured
Join Date: Aug 2008
Posts: 1,201
Now let's talk about the weapon enchant.

The system is still buggy and Blizzard has not finished it.
- Rightclick on the weapon enchant is not working (bug blizzard SecureTemplates.lua:395: attempt to call global 'CancelItemTempEnchant' (a nil value)).
- The gametooltip of the second enchant always show the main hand. (file SecureGroupHeaders.lua, line 777, local slot = GetInventorySlotInfo("MainHandSlot");, replace MainHandSlot by SecondaryHandSlot)
- The third weapon enchant button is not implemented yet in the new securedauraheader

Add this in the header :

Code:
headerAura:SetAttribute("includeWeapons", 1);
headerAura:SetAttribute("weaponTemplate", "RDXAB30x30Template");
In the style function :

Code:
local tempEnchant1 = headerAura:GetAttribute("tempEnchant1");
if tempEnchant1 then
	if not tempEnchant1.tex then
		-- create your style
	end
	local hasMainHandEnchant, mainHandExpiration, mainHandCharges = GetWeaponEnchantInfo();
	if hasMainHandEnchant then
		local slotid = GetInventorySlotInfo("MainHandSlot");
		local icon = GetInventoryItemTexture("player", slotid);
		tempEnchant1.tex:SetTexture(icon);
		if mainHandCharges > 1 then tempEnchant1.txt:SetText(mainHandCharges); else tempEnchant1.txt:SetText("");end
		tempEnchant1.tex:Show();
		tempEnchant1.txt:Show();
	else
		tempEnchant1.tex:Hide();
		tempEnchant1.txt:Hide();
	end
end
sigg is offline   Reply With Quote
Unread 10-22-10, 09:06 AM   #12
Dargen
A Fallenroot Satyr
AddOn Author - Click to view addons
Join Date: Jan 2006
Posts: 22
These are the issues that I've encountered so far with the current implementation of the SecureAuraHeader:

SecureTemplates.lua:
- You cannot cancel a weapon enchantment since the CancelTempEnchantment() function is spelled incorrectly.

SecureGroupHeaders.lua:
- Does not update the buttons if using a unit like "target" and the target changes, etc.
- The "consolidateDuration" attribute mentioned in comments never gets used.
- The "sortDir" attribute mentioned in the comments is spelled as "sortDirection" in the actual code.
- The comments for the xOffset attribute say the default is width, however the code sets the default to 0.
- The comments for the yOffset attribute say the default is height, however the code sets the default to 0.
- sortFactory(): If the "separateOwn" attribute is 0 it will be handled as if it were -1.
- configureAuras(): Setting the "wrapAfter" attribute to nil or 0 results in a divide by nil or 0 error.
- configureAuras(): Cannot use a string template name for the "consolidateProxy" attribute or "consolidateHeader" attribute because the code tests the return value of type() for an uppercase 'STRING'.
- configureAuras(): Assigns the slot number for the MainHandSlot to the off hand enchant button's "target-slot" attribute and :SetID(). You can work around this by comparing the child frame's value to header:GetAttribute("tempEnchant2") and supplying your own inventory slot number.
- extractTemplateInfo(): Does not properly separate a template name from a widget type when both are specified in a template name string.
- SecureAuraHeader_OnUpdate(): Does not track consolidated buffs in order to move them out of consolidation when time remaining is short.
- SecureAuraHeader_Update(): Setting the "includeWeapons" attribute to 0 will cause weapon buttons to be displayed if they have previously been created.
- SecureAuraHeader_Update(): The logic that decides which buffs to add to the consoliation frame is adding buffs with short rather than long time remaining values.
- SecureAuraHeader_Update(): Due to a bug in the loop that parses the "groupBy" attribute, only the last filter in a comma separated list will be used.
Dargen is offline   Reply With Quote
Unread 10-22-10, 10:29 AM   #13
Dargen
A Fallenroot Satyr
AddOn Author - Click to view addons
Join Date: Jan 2006
Posts: 22
Blizzard updates the aura header anytime it is shown, it receives a UNIT_AURA event, or an attribute is assigned to it.

When setting a number of attributes in the header you can minimize the number of times Blizzard updates the header by setting the "_ignore" attribute first (or you can hide the header since the OnAttributeChanged script also ignores attribute updates when the header is not visible).

As long as the "_ignore" attribute is set, Blizzard will not update the header. When you're finished changing attributes, restore the original "_ignore" attribute value. To force a header update you can then set any other attribute.

Code:
local oldIgnore = header:GetAttribute("_ignore");
header:SetAttribute("_ignore", "attributeChanges");
-- Set all your header attributes here
header:SetAttribute("_ignore", oldIgnore);
header:SetAttribute("_update", header:GetAttribute("_update"));

Last edited by Dargen : 10-22-10 at 10:33 AM.
Dargen is offline   Reply With Quote
Unread 10-22-10, 03:18 PM   #14
Luzzifus
A Warpwood Thunder Caller
 
Luzzifus's Avatar
AddOn Author - Click to view addons
Join Date: Aug 2007
Posts: 94
I just uploaded a first version of a very lightweight buff frame replacement using SecureAuraHeaders:

http://www.wowinterface.com/download...-nivBuffs.html

Rightclicking buffs off works like a charm (except for weapon enchants, as already said). If something doesn't work, feel free to flame me.

(No seriously, don't. )
Luzzifus is offline   Reply With Quote
Unread 10-23-10, 12:53 AM   #15
Rilgamon
Premium Member
 
Rilgamon's Avatar
Premium Member
AddOn Author - Click to view addons
Join Date: Sep 2009
Posts: 546
This is a great guide to help me understand what I need to learn ... BIG THANK YOU!!

For my addon ProcWatch I have one bar that shows certain buffs on more than one unit (player, target, focus). From reading your guide I guess this will no longer work when I want cancleaura to work. Am I right ?
__________________
The cataclysm broke the world ... and the pandas could not fix it!
Rilgamon is offline   Reply With Quote
Unread 10-23-10, 01:39 AM   #16
Grimsin
A Molten Giant
 
Grimsin's Avatar
AddOn Author - Click to view addons
Join Date: Sep 2006
Posts: 969
Someone make sure Elkano sees this, ElkBB!
__________________
"Are we there yet?"

GrimUI
[SIGPIC][/SIGPIC]
Grimsin is offline   Reply With Quote
Unread 10-24-10, 02:13 PM   #17
Luzzifus
A Warpwood Thunder Caller
 
Luzzifus's Avatar
AddOn Author - Click to view addons
Join Date: Aug 2007
Posts: 94
You don't need those calls to Show() and Hide() for buttons in the updateStyle() function. The headers do that on their own and the calls cause taint errors in combat.

Btw. how would I make it work with the consolidation feature, when Blizzards code to create the consolidation button from a template is broken?

Last edited by Luzzifus : 10-24-10 at 02:16 PM.
Luzzifus is offline   Reply With Quote
Unread 10-27-10, 02:17 PM   #18
Rilgamon
Premium Member
 
Rilgamon's Avatar
Premium Member
AddOn Author - Click to view addons
Join Date: Sep 2009
Posts: 546
I'm playing with cancelaura ... why on earth do I have to set "unit" ?
Are there other units than player where I can cancel an aura ?
__________________
The cataclysm broke the world ... and the pandas could not fix it!
Rilgamon is offline   Reply With Quote
Unread 10-27-10, 06:31 PM   #19
v6o
An Onyxian Warder
AddOn Author - Click to view addons
Join Date: Mar 2009
Posts: 399
Originally Posted by Rilgamon View Post
I'm playing with cancelaura ... why on earth do I have to set "unit" ?
Are there other units than player where I can cancel an aura ?
You can cancel vehicle buffs, and possibly pet
__________________
I have very little time to play WoW and even less time to code addons. As such I've dropped all development of all my addons. If you want to continue any addon or make a fork then feel free to do so. This is your permission slip.

Best regards, Valle.
v6o is offline   Reply With Quote
Unread 10-27-10, 10:27 PM   #20
Rilgamon
Premium Member
 
Rilgamon's Avatar
Premium Member
AddOn Author - Click to view addons
Join Date: Sep 2009
Posts: 546
Originally Posted by v6o View Post
You can cancel vehicle buffs, and possibly pet
ups, never thought of that or tried it thanks for the tip
__________________
The cataclysm broke the world ... and the pandas could not fix it!
Rilgamon is offline   Reply With Quote
Reply

Go BackWoWInterface » Developer Discussions » Tutorials & Other Helpful Info. » How To : Right click removing buff

Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is On
HTML code is Off