3.1.0 API Changes - Animation System
by Zootfizzle | 26/02/2009 18:40:09![]() This is the official list of changes to the UI API for the upcoming 3.1.0 patch. This thread will also contain detailed documentation for the new systems we are adding. Information here will be updated periodically, and this may not necessarily be a complete list. A sprocket here, a sprocket there, and soon there's sprockets everywhere! |
by Zootfizzle | 26/02/2009 19:08:20![]() Purpose A new animation system has been added to the WoW UI framework for patch 3.1.0. This system supports the XML specification of animation behaviors and it runs as efficiently as possible. Previously, animations could only be simulated by iteratively repositioning UI elements in Lua (via calls to SetPoint). The problems with that method were that it slowed the framerate of the game, it frequently led to code duplication, and it was not easy to develop new custom animation behaviors. In addition, rotation could not be accomplished by directly rotating frames. Instead, Scripters had to rotate texture coordinates within a texture to accomplish rotation. The new animation system addresses these problems. However, in its current state, the animation system causes UI elements to go through what can best be described as an out of body experience. For example, if a button is positioned at coordinates (50,50) and an animation moves it 50 pixels to the right (50,0), you would not be able to highlight the button by mousing over the button's position on the screen (100, 50). To highlight the button, you would instead have to mouse over the button's original position (50, 50) to highlight it. In other words, the Anchor system positions Regions and the Animation system makes them run around the screen until they're told to Stop. Animations may stop either by the programmer stopping them explicitly (via calls to animation Stop functions) or as a side effect of the Anchor system altering a Region's points (SetPoint, SetAllPoints, ClearAllPoints, OnDragStart) Tech Overview Animations operate on any UI element of type Region. At this time, Regions consist of Frames, FontStrings, and Textures. The abstract base type UIObject has subsumed the GetParent function of Region. The two new types Animation and AnimationGroup are both derived from UIObject. The new animation system is offset-based. This means that any animation applied to a Region will modify the Region's current values by an offset. What the offset is depends on the type of animation. For example, if you have a Translation animation with an offset of (5,5) and you play the animation on the Frame at position (25,30), the Frame will end up at position (30,35). The offset-based nature of this system means that multiple animations that play at the same time will stack. Using the previous example, if you have another Translation with an offset of (10,15) and you play the animation at the same time as the previous animation, then the Frame will smoothly travel from position (25,30) to position (40,45). [ Post edited by Zootfizzle ] A sprocket here, a sprocket there, and soon there's sprockets everywhere! |
by Zootfizzle | 26/02/2009 19:22:00![]() An entirely new set of tags have been introduced to support Animations in XML. You can start with one of the existing UI element tags: <Frame>, <Texture>, or <FontString>. Under one of these elements, you can make an <Animations> tag, which can contain any number of <AnimationGroup> tags, which can subsequently contain any number of specific Animation tags. <Animations> Note: This is the opening tag you use to attach animations to a Region. Only one of these can be the child of any Region tag (<Frame>, <Texture>, <FontString>). Attributes
Note: Any number of these can be placed under an <Animations> tag. These control the playback and looping of groups of Animations. There are currently two looping types: one that can make the group repeat itself and one that can make the group play in reverse when it finishes. The order that animations play in is determined by the order attribute of the child animations. Animations are played in ascending order. If more than one animation specifies the same order, they will play simultaneously. Attributes
inherits
looping
REPEAT replays the group when it finishes playing. BOUNCE plays the group in reverse when it finishes playing. This produces a bouncing effect.
OnPause
OnStop
requested - true if the Stop function was called on this group OnUpdate
Passes a number parameter which stores the number of seconds since the last update. OnFinished
requested - true if the "Finish" function was called on this group OnLoop
loopState - The loop state that this animation is transitioning to
[ Post edited by Zootfizzle ] A sprocket here, a sprocket there, and soon there's sprockets everywhere! |
by Zootfizzle | 26/02/2009 19:41:34![]() <Animation> Note: Base animation type. This type is not abstract even though it does not modify its parent UI elements by default. This type is for making custom animations via the OnUpdate script. Attributes
inherits
startDelay
endDelay
duration
maxFramerate
order
smoothing
OnPause
OnStop
requested - true if the Stop function was called on this group. OnUpdate
elapsed - number of seconds applied to the current animation update OnFinished
<Translation> Note: Inherits all attributes and scripts from <Animation>. Translates a Region from its current position by an offset. Attributes
offsetY
<Rotation>
degrees
<Scale> Note: Inherits all attributes and scripts from <Animation>. Scales a Region by an amount. The Scale can be non-uniform. Attributes
scaleY
<Alpha> Note: Inherits all attributes and scripts from <Animation>. Changes the normalized [0,1] alpha value of a Region by an amount. Attributes
[ Post edited by Zootfizzle ] |
by Slouken | 08/08/2007 19:40:50![]()
Maybe "Macro Commands"?
Yes, it works just like /petautocaston and /petautocastoff which also take a spell name. |
by Zootfizzle | 26/02/2009 20:10:06![]() <Ui xmlns="http://www.blizzard.com/wow/ui/" xmlns:xsi="http://www.w3.org/1801/XMLSchema-instance" [ Post edited by Zootfizzle ] |
by Slouken | 08/08/2007 19:42:02![]()
Yes, the first call is faster, since the internal code already checks to see if the frame is already registered. |
by Zootfizzle | 26/02/2009 20:37:01![]() Changes to Existing Types Region
Object This is a new abstract type. Animations and Regions both derive from this type.
This manages playback, order, and looping of its child Animations. Animations in a group will play in ascending order according to their order fields (accessible via SetOrder and GetOrder). If two or more Animations have the same order value, then they will play simultaneously. The next animation will not play until all Animations with that order value are done.
[ Post edited by Zootfizzle ] |
by Zootfizzle | 26/02/2009 20:58:56![]() Animation This is a base animation type. This handles all animation timing and bookkeeping. An animation tag must always be parented by an AnimationGroup tag.
|
by Slouken | 09/08/2007 02:47:21![]() Changed IsCurrentCast() to IsSelectedSpell() Added IsCurrentSpell() and IsConsumableSpell() corresponding to IsCurrentAction(), and IsConsumableAction() |
by Zootfizzle | 26/02/2009 20:59:34![]() Translation This is an affine transformation that moves a parent Region by an offset. Translation has all of the methods of Animation, plus the following:
This is an affine transformation that rotates a parent Region about an origin. Rotation has all of the methods of Animation, plus the following:
This is an affine transformation that scales a parent Region about an origin. The scale can be non-uniform. Scale has all of the methods of Animation, plus the following:
This animation changes the alpha value of its parent region. Alpha has all of the methods of Animation plus the following:
|
by Slouken | 27/08/2007 23:51:21![]() Added for 2.3: item, link = GetMacroItem(macro) spell, rank = GetMacroSpell(macro) |
by Slouken | 27/08/2007 23:53:00![]()
Yes, this is intentional. |
by Slouken | 30/08/2007 22:25:46![]() Yes. |
by Slouken | 02/09/2007 00:35:34![]() That's not a bug. That part of the link is optional, but refers to a specific item if speciffied. |
by Slouken | 07/09/2007 21:32:14![]() New in 2.3: FontString:SetFormattedText(format, ...) Button:SetFormattedText(format, ...) This allows you to skip the format step in doing something like this: text:SetText(format("%.1f", GetFramerate())) e.g. text:SetFormattedText("%.1f", GetFramerate()) ... and in doing so reduce the amount of garbage that is generated. |
by Slouken | 07/09/2007 23:11:45![]() Oh, whoops! :) |
by Slouken | 08/09/2007 01:08:18![]() I considered that, but GameTooltip has an optional parameter to SetText(), and mixing variable arguments with optional arguments gets really messy, especially when those variable arguments can be positional. :) If there's a specific spot that's creating lots of garbage in the default UI, let me know and I'll take a look. |
by Slouken | 18/09/2007 18:31:57![]() Auction API Changes QueryAuctionItems - New argument (bool), setting it to true will retrieve all auction house data (not just 50 items). This can only be used once every 15 minutes. This is intended to reduce our load from add-ons such as auctioneer that are going to download the entire auction house anyways. CanSendAuctionQuery() - Now returns two results. First (bool) is if you can send a regular query, second (bool) is if you can ask for all auction house data. IsAuctionSortReversed() - Now returns two results. First (bool) is true if the sort is reversed, second (bool) is true if we’re actually using this sort. sort, reversed = GetAuctionSort(type, index) - New function, allows enumeration of what sorts are being currently used on the table and in what order. o 'type' – string – which table to retrieve the sort for (ie. “owner”, “bidder” or “list”). o 'index' - number – the index of the sort to retrieve (1 for the first sort, 2 for the second sort, etc). o 'sort' – string - the sort being used (nil if there isn’t a sort at this index) o 'reversed' – bool – true if the sort is reversed SortAuctionClearSort(type) - New function, allows the caller to clear all previous sorts for a table. o 'type' – string – which table to clear the sorts on (ie. “owner”, “bidder”, or “list”). SortAuctionSetSort(type, sort, reverse) - New function, allows the caller to add a sort to a table. The sort is added to the beginning of the sort list (not the end), pushing all other sorts down. o 'type' – string – which table to clear the sorts on (ie. “owner”, “bidder”, or “list”). o 'sort' – string – the sort to add (ie. “quality”, “level”, “duration”, “status”, “bid”, “name”, “buyout”, “seller”, “buyoutthenbid”, “quantity”). o 'reverse' – bool – true if this sort should be applied in reverse order. SortAuctionApplySort(type) - New function, performs the sort that was built up using SortAuctionClearSort, SortAuctionSetSort o 'type' – string – which table to clear the sorts on (ie. “owner”, “bidder”, or “list”). There is a new sort type “quantity”, which allows sorts by the number of items. |
by Slouken | 18/09/2007 18:39:33![]() Mail API Changes When composing mail, there are now “slots”, that you can drag items into (1 is the first slot, 2 is the second slot, etc). Once the mail arrives, you use an “index” to refer to each attachment. ClickSendMailItemButton(attachSlot) - Added an additional “attachSlot” argument to this existing function o 'attachSlot' – number – indicates which attachment slot the user clicked on when composing mail. GetSendMailItem(attachSlot) - Added an additional “attachSlot” argument to this existing function o 'attachSlot' – number – indicates which attachment slot to get information about when composing mail GetSendMailItemLink(attachSlot) - Added an additional “attachSlot” argument to this existing function o 'attachSlot' – number – indicates which attachment slot to get information about when composing mail GetSendMailPrice() - No change for parameters, but note that the cost of sending mail now changes depending on how many items have been attached. GetInboxItem(messageIndex, attachIndex) - Added an additional “attachIndex” argument to this existing function o 'messageIndex' – number – indicates which message to get info about the item from o 'attachIndex' – number – indicates which message attachment to get info about GetInboxItemLink(messageIndex, attachIndex) - Added an additional “attachIndex” argument to this existing function o 'messageIndex' – number – indicates which message to get info about the item from o 'attachIndex' – number – indicates which message attachment to get info about TakeInboxItem(messageIndex, attachIndex) - Added an additional “attachIndex” argument to this existing function o 'messageIndex' – number – indicates which message to get info about the item from o 'attachIndex' – number – indicates which message attachment to get info about |
by Slouken | 18/09/2007 18:48:07![]() FYI, in 2.3 the game will be performing extra garbage collection outside of combat to keep memory use down. As always, the game will perform better if you don't generate any garbage, and here are some tips to do that: * If you're composing a formatted string to display in a button or font string, use the new FontString:SetFormattedText(fmt, ...) API * If you write a function that returns many values, consider returning them directly instead of creating a table and returning that table. * If returning a table from a function really is most convenient, have the caller of that function pass in the table to be filled out instead of creating a new table inside the function. |
by Slouken | 19/09/2007 01:31:16![]()
The maximum number of slots is 12. |
by Slouken | 20/09/2007 18:30:45![]() Coming in 2.3: Added FontString:GetStringHeight() Added a parameter to :GetWidth() and :GetHeight() to ignore the rect and return 0 if no width and height have been explicitly set. This parameter defaults to false. |
by Slouken | 20/09/2007 18:33:21![]() Coming in 2.3: Added 'form' as a synonym for 'stance' in the macro options. |
by Slouken | 21/09/2007 23:24:23![]() In 2.3 you should no longer need to call :UpdateScrollChildRect(). If a child frame, texture or fontstring has changed, the scroll parent will automatically recalculate it's scroll rect and dispatch events appropriately. Of course, please test this out on the test realm when it goes live, and report any bugs. |
by Slouken | 03/10/2007 20:53:22![]() Added in 2.3: EditBox:SetCursorPosition(position) position = EditBox:GetCursorPosition() |
by Slouken | 12/10/2007 04:39:12![]() Any particular reason you need to override tostring()? |
by Slouken | 12/10/2007 21:26:13![]() Coming in 2.3 is a way to log taint spreading through global variables. To turn taint logging on: /console taintLog 1 To turn taint logging off: /console taintLog 0 The taint log is saved in Logs\taint.log, and contains entries for every global that is tainted, and each time Blizzard code becomes tainted by reading a tainted global variable. It also has an entry for every action that is blocked by taint, including what frame the action was trying to affect. If you're running into problems with actions being blocked in combat, please turn taint logging on, and post a link to the log file generated during that session. Keep in mind that taint is normally fine, it only becomes a problem when it's introduced into the code path of secure code. [ Post edited by Slouken ] |
by Slouken | 13/10/2007 02:15:38![]()
Yep, that's exactly what it's for. |
by Slouken | 13/10/2007 02:20:45![]() BTW, here's some sample output from this test case: 1. Run this macro: /script PetActionBarFrame = PetActionBarFrame 2. Bring out a pet 3. Mount up 4. Enter combat and dismount Logs\taint.log: 10/12 17:01:03.292 Global variable PetActionBarFrame tainted by MACRO_TAINT - PetActionBarFrame = PetActionBarFrame:1 10/12 17:01:08.379 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:128 PetActionBar_Update() 10/12 17:01:08.379 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:128 PetActionBar_Update() 10/12 17:01:08.379 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:128 PetActionBar_Update() 10/12 17:01:08.391 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:128 PetActionBar_Update() 10/12 17:01:15.240 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\UIParent.lua:2203 UIParent_ManageFramePositions() 10/12 17:01:15.240 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 MultiBarRight:SetPoint() 10/12 17:01:15.240 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 ShapeshiftBarFrame:SetPoint() 10/12 17:01:15.240 Global variable PETACTIONBAR_YPOS tainted by MACRO_TAINT - Interface\FrameXML\UIParent.lua:2291 setglobal() 10/12 17:01:15.240 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 VoiceChatTalkers:SetPoint() 10/12 17:01:15.240 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 MultiBarBottomLeft:SetPoint() 10/12 17:01:15.240 Global variable BATTLEFIELD_TAB_OFFSET_Y tainted by MACRO_TAINT - Interface\FrameXML\UIParent.lua:2291 setglobal() 10/12 17:01:15.240 Global variable CONTAINER_OFFSET_Y tainted by MACRO_TAINT - Interface\FrameXML\UIParent.lua:2291 setglobal() 10/12 17:01:15.240 Global variable CONTAINER_OFFSET_X tainted by MACRO_TAINT - Interface\FrameXML\UIParent.lua:2289 setglobal() 10/12 17:01:15.247 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 PossessBarFrame:SetPoint() 10/12 17:01:15.449 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:341 UnlockPetActionBar() 10/12 17:01:15.451 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:341 UnlockPetActionBar() 10/12 17:01:15.451 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:341 UnlockPetActionBar() 10/12 17:01:15.654 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:184 HidePetActionBar() 10/12 17:01:15.654 Execution tainted by MACRO_TAINT while reading PetActionBarFrame - Interface\FrameXML\PetActionBarFrame.lua:162 ShowPetActionBar() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\PetActionBarFrame.lua:163 PetActionBarFrame:Show() 10/12 17:01:15.654 Global variable PETACTIONBAR_XPOS tainted by MACRO_TAINT - Interface\FrameXML\PetActionBarFrame.lua:174 ShowPetActionBar() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 MultiBarRight:SetPoint() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 ShapeshiftBarFrame:SetPoint() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 VoiceChatTalkers:SetPoint() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 MultiBarBottomLeft:SetPoint() 10/12 17:01:15.654 An action was blocked in combat because of taint from MACRO_TAINT - Interface\FrameXML\UIParent.lua:2297 PossessBarFrame:SetPoint() 10/12 17:01:15.732 Execution tainted by MACRO_TAINT while reading CONTAINER_OFFSET_X - Interface\FrameXML\GameTooltip.lua:75 GameTooltip_SetDefaultAnchor() 10/12 17:01:15.821 Execution tainted by MACRO_TAINT while reading CONTAINER_OFFSET_X - Interface\FrameXML\GameTooltip.lua:75 GameTooltip_SetDefaultAnchor() |
by Slouken | 13/10/2007 02:35:13![]() The limit is 50 yards, I believe. |
by Slouken | 14/10/2007 04:59:06![]() I'm not sure. It's on my list to look at next week. |
by Slouken | 17/10/2007 07:47:23![]() Yep, it should be in the next test realm update in a few days. |
by Slouken | 18/10/2007 03:58:37![]() No promises, but it's looking like /cancelform followed by a spell cast will not be needed in 2.3. By default any spell that requires you to leave your current form will automatically cancel your form before casting. This applies to shadowform and stealth as well. You can disable this with /console autoUnshift 0 Barring unforseen complications, this should be on the test realm after next week's update, so please test it out thoroughly at that time. [ Post edited by Slouken ] |
by Slouken | 18/10/2007 07:59:37![]()
I'm not sure what you mean. /cancelform doesn't have functionality to allow you to shapeshift back into the same form... But, you could do something like this: /use Super Healing Potion /cast Dire Bear Form and it would switch to caster form, use a potion and put you back into bear form, assuming that you had enough mana to return to bear form. |
by Slouken | 19/10/2007 01:46:49![]() The Interface AddOn Kit has been updated to work with the 2.3 test realm: http://www.worldofwarcraft.com/ui/ |
by Slouken | 19/10/2007 18:51:26![]() No, the 1.5 second cooldown is by design. You can't start casting again until that client-side cooldown has elapsed, and you'll notice that, because it's client side, latency doesn't affect it. [ Post edited by Slouken ] |
by Slouken | 19/10/2007 20:47:48![]() No, it starts immediately when the cast is sent to the server. There's a bug currently where this doesn't happen on the test realm, but that's fixed either for this weekend or next week's test realm update. |
by Slouken | 20/10/2007 03:05:53![]()
The failure response from the server cancels the client's GCD. |
by Slouken | 20/10/2007 03:12:10![]() The test server update should be up. Please try out the taint log! If you get a message "Interface action failed because of an AddOn", this means that an AddOn interfered with the Blizzard UI in some way. Instructions on turning on taint logging and posting the resulting log can be found here: Interface action failed because of an AddOn [ Post edited by Slouken ] |
by Slouken | 21/10/2007 02:06:42![]() Yes, the global cooldown fix will be in next week's PTR update. Also note that once the global cooldown is fixed, it's still a bad idea to spam cast, since as noted you have to wait for the server to tell you that you cast too early to be able to cast again. Nothing in this has changed from previous patches. You can simply try to cast early now where you had to abort casting previously. Previously the cost of casting too early was that you interrupted your cast nearly completed, now the cost is that you wait latency for the error from the server. The designers aren't planning on adding a spell queue, since that destroys the immediate response between input and action. The current thought is also that we won't be sending casts to the server during the global cooldown, both to reduce bandwidth (and flood disconnections) and to lessen the incentive to spam cast. Of course everything is still in development, and we may decide to pull the change entirely. If you would like to contribute your opinion, please create a thread in the suggestions forum. [ Post edited by Slouken ] |
by Slouken | 21/10/2007 17:50:44![]()
Can you show a timeline of how this is would be worse than the current situation in practice? Things to take into consideration: * The client can't initiate casts more often than the global cooldown, so it's only a problems for spells with longer cast times than the global cooldown. * in 2.2 you couldn't initiate a cast on the client before the client received notification from the server that the previous cast had completed. * This discussion doesn't really involve people using /stopcasting, because they aren't the ones spam casting. In 2.2 they would interrupt their previous cast, losing the time already spent casting, and in 2.3 they wait the round trip latency for the error message from the server, both of which are less efficient than getting the timing right. The goal is simply to allow people to do the same sort of "advance casting" in 2.3 as they do in 2.2, but without requiring /stopcasting macros. |
by Slouken | 21/10/2007 18:06:50![]()
Nope, assuming constant latency your 1.5 second Flash of Light can be cast back to back. 0.0s: Client starts casting Flash of Light, starts 1.5 second global cooldown 0.25s: Server starts casting Flash of Light 0.5s: Client sees Flash of Light start casting 1.5s: Client finishes global cooldown, starts casting Flash of Light, starts global cooldown 1.75s: Server completes casting Flash of Light, starts casting new Flash of Light 2.0s: Client sees Flash of Light complete and new cast start
Yep, now you don't need stop casting.
Yes.
No. |
by Slouken | 21/10/2007 18:35:30![]()
Yes, but remember this overlaps the casting time for the previous cast, so it's not quite as bad as it sounds. |
by Slouken | 21/10/2007 18:43:20![]()
Exactly. The goal was to allow the same sort of advance casting that was previously done with /stopcasting macros, for all spells. As far as I can tell the behavior is always better than 2.2, but still occasionally causes delays roughly equivalent to your latency if your latency is variable or the server is heavily loaded. This is something we're currently discussing. [ Post edited by Slouken ] |
by Slouken | 22/10/2007 18:31:45![]() For 2.3: Added an insert mode to ScrollingMessageFrame, defaulting to BOTTOM Xml tag: insertMode=”TOP” (or “BOTTOM”) functions: ScrollingMessageFrame:SetInsertMode( mode = ScrollingMessageFrame:GetInsertMode() ScrollingMessageFrame:SetScrollFromBottom(offset) renamed to: ScrollingMessageFrame:SetScrollOffset(offset) [ Post edited by Slouken ] |
by Slouken | 22/10/2007 20:35:08![]() Yes, this is actually what we're going to be evaluating for the next test realm update. The casting latency discussion is hereby closed in this thread. If you want to continue discussion please create a new thread for it. |
by Slouken | 23/10/2007 05:41:33![]() There's a GCD fix in the next test realm update, can you retest when that gets there? |
by Slouken | 23/10/2007 05:44:25![]() In the next test realm update there's an update to the way taint works: * While an AddOn function is running, the taint is set to the AddOn that defined the function. This is much more intuitive and should help make the logs more useful. Edit: I also added stack trace information to the taint log, so you can see what AddOns are involved, not just the last one executing. [ Post edited by Slouken ] |
by Slouken | 23/10/2007 15:51:41![]() That sounds great, thanks! |
by Slouken | 24/10/2007 02:43:20![]() In an upcoming test realm update, taintLog can be set to 0, 1, or 2. 0 = Do not log any taint messages 1 = Log action blocked messages along with relevant global variable messages where possible 2 = Log each time a global variable is tainted and each time Blizzard code is tainted The format for the logging in mode 1 is pretty nice:
[ Post edited by Slouken ] |
by Slouken | 25/10/2007 22:55:40![]() Added for 2.3: durability, maximum = GetInventoryItemDurability(slotid) durability, maximum = GetContainerItemDurability(bagid, slotid) [ Post edited by Slouken ] |
by Slouken | 28/10/2007 04:01:14![]() Thats the extent of the functionality, yes. |
by Slouken | 28/10/2007 09:34:16![]() I don't know if this matters for your problem, but in 2.3 the scroll child rect is automatically updated when the children are shown/hidden/resized. |
by Slouken | 28/10/2007 20:40:21![]() That's really weird. Can you make a macro that shows this problem with no AddOns loaded? |
by Slouken | 29/10/2007 19:23:15![]()
Got it, this is fixed for the next test realm update. It only affects code that triggers taint log messages. Thanks! |
by Slouken | 30/10/2007 21:41:14![]() It's not a bug, cast sequences always reset at the end of their sequence. The reset syntax is simply additional conditions that may cause the sequence to reset. |
by Slouken | 30/10/2007 21:50:09![]() No problem. :) |
by Slouken | 30/10/2007 23:56:04![]() From the taint expert: Using UIDropDownMenu_CreateInfo() should no longer cause taint issues to spread to other dropdowns. |


Recent Blizzard Announcements