2.4 Changes - Concise List
by Iriel | 20/11/2007 01:31:47![]() This is a consolidated list of the announced (and sometimes observed) changes in the User Interface API's and functionality for the 2.4 release. Please note that this thread is to discuss the upcoming changes and any clarifications or features that are a direct result of those changes, or things which we've been asked to remind slouken of. IMPORTANT: Off-topic or entirely redundant posts are liable to get deleted. It is however in everyone's best interest to not post them in the first place - We'd rather slouken could spend his time coding us cool things than moderating this thread! Significant Changes * The combat logging mechanism is completely overhauled with explicit data instead of text strings delivered to the UI. See slouken's post below for a sneak-peak at some of the current details. Highlights include detailed flags indicating relationship of involved units to player, unique identifiers for units with the same name within the combat log -- great for log analysis. 2.4 Changes - Concise List 2.4 Changes - Concise List 2.4 Changes - Concise List 2.4 Changes - Concise List * The combat log range is now everything you can see. * The In-game Interface Options screen is being revamped and the new architecture should allow AddOn authors to modify its contents without the taint issues presented by the current system. Additionally this system will contain an area for AddOn authors to present their own configuration options. Authors interested in this feature should be sure to experiment on the PTRs before patch 2.4 is released so that any issues can be surfaced and discussed. Basic details on how to use this system can be found in code comments in the 2.4 UIOptionsPanel.lua. 2.4 Changes - Concise List 2.4 Changes - Concise List Font String Display * Textures can now be included in FontStrings locally using a new | escape code: |T<path>:<width>[:<height>:<xOffset>:<yOffs * Selected textures can also be included in Chat messages and sent to other users, the current available textures are represented in a form like: {star} 2.4 Changes - Concise List Visual Settings * There's a new cVar unitHighlights; 0 = no model highlighting with Alt-Z, 1 = model highlighting on with Alt-Z. (e.g. /console unitHighlights 1) * Players can now toggle the display of Friendly and Enemy player names, as well as their pets and creations. You can toggle cosmetic pet names too. :) (Continued...) [ Post edited by Iriel ] UI and Macros Forum MVP - Understand GC! |
by Slouken | 20/11/2007 01:39:31![]() There is a new console variable in 2.4: unitHighlights 0 = no model highlighting with Alt-Z 1 = model highlighting on with Alt-Z e.g. /console unitHighlights 0 /console unitHighlights 1 |
by Slouken | 20/11/2007 01:43:10![]() Combat Log Revamp! In 2.4 the combat log is being completely reimplemented so that it sends events with arguments instead of text strings to the UI code. It's still in development, so nothing is final, but here is a raw sneak preview:
|
by Slouken | 20/11/2007 02:00:01![]() There is a new console variable in 2.4: unitHighlights 0 = no model highlighting with Alt-Z 1 = model highlighting on with Alt-Z e.g. /console unitHighlights 0 /console unitHighlights 1 |
by Slouken | 20/11/2007 02:11:43![]()
Mostly for clarity, since this this is just sample code. |
by Slouken | 20/11/2007 02:12:26![]()
The old combat events are no longer generated. All existing combat log AddOns will need to be rewritten. |
by Slouken | 20/11/2007 02:13:21![]()
You'll have to work that out with my beautiful and pregnant wife. :)
Not at the moment, although you'll notice that the name comes with it in the event. |
by Slouken | 20/11/2007 03:08:55![]()
The combat log ranges are the same. You'll find that the GUID decodes into the type of creature, which can then be matched against data in the WDB cache ... not that anyone would ever try to decode that data. :) |
by Slouken | 20/11/2007 03:09:43![]()
*grin* You'll have to thank AlexanderYoshi who convinced me it was a good idea. :) |
by Slouken | 20/11/2007 03:40:21![]() *laugh* I replied, but figured I oughtn't. :) |
by Slouken | 20/11/2007 03:51:53![]() Oh, the combat log text file format changed as well, dumping the text format in favor of a comma separated event format for easy post-processing and analysis. |
by Slouken | 20/11/2007 15:29:58![]() Remember, this is a moderated thread for discussing upcoming scripting API changes in the 2.4. patch. Off topic posts will be deleted. |
by Slouken | 24/11/2007 18:24:15![]() I'm not sure why everyone is concerned about the "possession" stance. If I remember correctly, it's simply an actionbar page change, right? |
by Slouken | 24/11/2007 22:51:16![]() Oh, right, so it's a bonus bar. There isn't already a state driver for the bonus bar? It seems like there should be... :) |
by Zootfizzle | 19/12/2007 22:06:28![]()
Hey Nayala, thanks for the suggestions. We’ll no longer be adding GetContainerItemFamily and GetInventoryItemFamily. Instead we’ve added the following: bagType = GetItemFamily(itemID | "name" | "itemLink"); When used with a container, this returns the type of container. When used with an item, it returns the type of container the item can go in. Currently there isn't anything allowed in multiple types of bags. However, bagType is a bitflag, so GetItemFamily for something that could go in a quiver (bagType 1) and an ammo pouch (bagType 2) would return 3. A bag that can hold both arrows and bullets would also return 3. --Zootfizzle |
by Slouken | 20/12/2007 05:44:17![]() The content of the logs aren't changing, just the way the information is delivered. The person with Lifebloom really is healing themselves. :) |
by Slouken | 03/01/2008 21:03:28![]() As of 2.4, PARTY_MEMBER_ENABLE and PARTY_MEMBER_DISABLE no longer provide information about which party member was enabled or disabled. |
by Slouken | 26/01/2008 00:12:30![]()
These are planned features for WotLK, but haven't been started yet, so no promises. :) |
by Slouken | 30/01/2008 18:55:52![]() Since the combat log filter is global, there is a new event that AddOns can register for: COMBAT_LOG_EVENT_UNFILTERED If you register for this event, you will receive the event regardless of whether it matches the current filter. There is also a new optional ignoreFilter parameter for the following functions: CombatLogGetNumEntries() CombatLogSetCurrentEntry() CombatL Passing true as the last parameter allows you to iterate over combat log entries ignoring the filter. |
by Zootfizzle | 30/01/2008 21:47:44![]() Interface Options Revamp Along with Patch 2.4 we will be releasing a revamped in-game Interface Options screen. Most of the systems that interact with the current Interface Options screen have seen some code changes as a result. The new architecture for the system should allow AddOn authors to modify its contents without the taint issues presented by the current Interface Options system. Additionally, this new system will contain an area for AddOn authors to present their own configuration options to players with a custom heading, subcategories, and frames. I'd like to encourage authors interested in utilizing these features to try the new system on the PTRs before Patch 2.4 is released. Basic details on how to use this system can be found in code comments in Blizzard_InterfaceUI.lua. Please be aware that AddOns that interact with the Interface Options screen, modify it, or change the way that its options affect other systems within the game will need to be updated with the release of Patch 2.4. |
by Slouken | 31/01/2008 17:37:20![]() FYI, this is a moderated thread for technical discussion of upcoming features. Off topic posts will be deleted. :) |
by Slouken | 04/02/2008 22:47:49![]() 2.4.0 Guide to the New Combat Log Hello Fellow UI Modders, With the release of patch 2.4.0, we’ve made some enormous changes to the existing combat log. While this will result in some hard work now, it should be easier to maintain your AddOns in the future. The feature we’re most proud of is the ability to filter your combat log. The combat log stores the last five minutes worth of raw combat events. Filters can be setup on multiple criteria, affiliation, ownership, etc. Any events that match the current filter are passed through the client via the COMBAT_LOG_EVENT message. The combat log filter is global. However, AddOns which want to parse all events the moment they happen can register for the COMBAT_LOG_EVENT_UNFILTERED message. This should allow all existing AddOns to still respond to combat events without a complicated middle-manager AddOn. While the default combat log will only be setting 1-2 filters at a time, the WoW client supports many simultaneous filters. It’s possible to setup multiple filters to filter very specific source-target-event combinations. If a combat log event passes any of the filters, the COMBAT_LOG_EVENT event fires. This allows AddOns to define extremely specific settings we chose not expose in the base UI. The new combat log will be coming with two text formats. One is the familiar, grammatically correct sentences with substitutions. The other is a terse format, containing the source, target, spell, action and result. There will be a number of ways to manipulate the formatting, from unit name coloring to coloring the damage numbers by their magic school. The settings used for these formats are stored in the Blizzard_CombatLog_Filters variable. The result of the new terse format is that it’s very easy to write AddOns to modify or extend the format which ships with 2.4.0. In the formatting section, you can read up on a quick demonstration of how to convert the combat log to a “Nurfed” style combat log. While you can do a lot by just adjusting the settings within WoW, it’s also possible to provide an AddOn that changes the strings used to generate the Combat Log messages. This allows for more extensive formatting changes without re-writing the entire parsing engine. See the Formatting Section for an example. The whole combat log also supports a new coloring model, based on context. While by default, entire lines are a single color, highlighting the most important details. The combat log also supports coloring just unit names, spells, actions and damage numbers. Spells and damage can also be colored by school. However, there are several features not exposed in the base UI that AddOns can use right away. These are event-specific coloring, unit coloring with greater granularity and the ability to customize the list of highlighted events. There are several other formatting related features. You can enable timestamps which show the time that spell or attack happened. You can show or hide square braces, change formatting without refreshing the combat log and disable the display of raid icons. These features were too niche to go into the base UI, but can be easily exposed for power users. By now you’ve already thought of some features of your own and are ready to get to coding. So let’s jump straight to some examples. |
by Slouken | 05/02/2008 18:14:27![]() From the designer: Q: Does the new log system give us a way to distinguish between: - Physical Melee. Autoattacks that deal physical damage that can be dodged, blocked, and parried but not resisted (e.g. autoattacks from some guy with a sword); Yes. These are logged under the SWING_DAMAGE event with a school mask of 1 (Physical). - Elemental Melee. Autoattacks that deal elemental damage that can be dodged, parried, and resisted but not blocked (e.g. autoattacks from Hydross the Unstable); Yes. These are logged under the SWING_DAMAGE event with a school mask greater than 1 (Magical). - Pure Spells. Elemental damage that can be resisted but not dodged, blocked or parried (e.g. Fireball); and Yes. These are logged under the SPELL_DAMAGE event with a school mask greater than 1 (Magical). - Melee Spells. Physical or elemental damage that counts as a spell but may be dodged, blocked, and parried; may or may not be resistable (e.g. Heroic Strike) ? Yes. These are logged under the SPELL_DAMAGE event with a school mask of 1. Q: How is the Water Elemental flagged in the summoner’s combat log? A: The Water Elemental is flagged 0x1111. Mine | Friendly | Player-Owned | Pet. This means that if all Frost mages submit their combat logs, then the specific GUIDs for each Mage’s water elemental can be determined. Other Mage’s Water Elementals in the same raid are flagged 0x1112 (Same Party) or 0x1114 (Same Raid). |
by Slouken | 06/02/2008 16:24:40![]()
A monster has a single GUID from spawn until death (or despawn). When it respawns it gets a new GUID. Pets get a new GUID each time they are summoned. Monster and pet GUIDs can be recycled after server (or instance) restart. Players keep their GUID forever, and are unique even in cross-server battlegrounds. |
by Rislyn | 06/02/2008 22:18:02![]() Additional change in 2.4.0: The Raid UI now can display the range of players relative to you. The option to enable this is in the Party & Raid section of the UI Options. |
by Rislyn | 07/02/2008 17:40:29![]()
Yes, but IsSpellInRange requires a spell action to be ready on a cursor before actually being able to give you the data. CheckInteractDistance is also for game objects. Alexander is correct, there's a function called UnitInRange(unit) that returns a boolean based upon a static value (because we can't predict what spell you might want to cast) that is based upon Flash Heal/Cure range. So yes, it could return true incorrectly. We haven't quite built the AI that will predict the action of any player in every game situation... yet! Kaythedree, this functionality is not in the Party UI. You, however, can make it yourself! =D |
by Rislyn | 07/02/2008 18:39:54![]()
This is a static value set within code. Though it would be cool to let you pass in a value, it might make writing bots that much easier. :) |
by Rislyn | 07/02/2008 21:38:51![]() New for 2.4.0 * Players can now toggle the display of Friendly and Enemy player names, as well as their pets and creations. You can toggle cosmetic pet names too. :) |
by Slouken | 07/02/2008 21:56:14![]() New in 2.4: icon = GetItemIcon(item) This information is available if the item exists, even if GetItemInfo() returns nil. |
by Rislyn | 08/02/2008 01:16:17![]()
It's been driving me nuts for years. So, you're welcome. :P |
by Zootfizzle | 09/02/2008 03:01:55![]() Embedded Textures in FontStrings A new feature in 2.4 is the ability to embed textures inside FontStrings. This functionality works similar to embedding a hyperlink, and should allow AddOn authors a great deal more flexibility in using textures in conjunction with FontStrings. The format for placing a texture inside a FontString is as follows: |T<path>:<width>[:<height>:<xOffset> If the height argument is omitted, the width will be used, resulting in a square texture. Example: ChatFrame1:AddMessage(“\124TInterface\\Icon This will add a message to ChatFrame1 with a 64x64 texture for Power Word: Fortitude, along with the text “ is the icon for Power Word: Fortitude”. Limitations: At this time, to prevent potential abuse, raw texture links cannot be sent to other players. In order to allow players to send each other textures, we have added support for texture tags to ChatFrames and the Raid Warning frame. Texture tags are parsed out of messages added to these frames and replaced with appropriate textures. Texture tags use the following format: {star} Currently there are only texture tags for raid icons. We may add more texture tags in the future. Available texture tags: {star}, {rt1} - Star icon {circle}, {rt2} - Circle icon {diamond}, {rt3} - Diamond icon {triangle}, {rt4} - Triangle icon {moon}, {rt5} - Moon icon {square}, {rt6} - Square icon {cross}, {rt7} - Cross icon {skull}, {rt8} - Skull icon |
by Zootfizzle | 09/02/2008 03:05:28![]() HOWTO: Add new categories of options The new Interface Options frames allows authors to place their configuration frames (aka "panels") alongside the panels for modifying the default UI. Adding a new panel to the Interface Options frame is a fairly straightforward process. Any frame can be used as a panel as long as it implements the required values and methods. Once a frame is ready to be used as a panel, it must be registered using the function InterfaceOptions_AddCategory, i.e. InterfaceOptions_AddCategory(panel) Panels can be designated as sub-categories of existing options. These panels are listed with smaller text, offset, and tied to parent categories. The parent categories can be expanded or collapsed to toggle display of their sub-categories. When players select a category of options from the Interface Options frame, the panel associated with that category will be anchored to the right hand side of the Interface Options frame and shown. The following members and methods are used by the Interface Options frame to display and organize panels. panel.name - string (required) The name of the AddOn or group of configuration options. This is the text that will display in the AddOn options list. panel.parent - string (optional) Name of the parent of the AddOn or group of configuration options. This identifies "panel" as the child of another category. If the parent category doesn't exist, "panel" will be displayed as a regular category. panel.okay - function (optional) This method will run when the player clicks "okay" in the Interface Options. panel.cancel - function (optional) This method will run when the player clicks "cancel" in the Interface Options. Use this to revert their changes. panel.default - function (optional) This method will run when the player clicks "defaults". Use this to revert their changes to your defaults. EXAMPLE -- Use XML to create a frame, and through its OnLoad function, make the frame a panel. MyAddOn.xml <Frame name="ExamplePanel"> <Scripts> <OnLoad> ExamplePanel_OnLoad(self); </OnLoad> </Scripts> </Frame> MyAddOn.lua function ExamplePanel_OnLoad (panel) panel.name = "My AddOn" InterfaceOptions_AddCategory(panel); end EXAMPLE -- Dynamically create a frame and use it as a subcategory for "My AddOn". local panel = CreateFrame("FRAME", "ExampleSubCategory"); panel.name = "My SubCategory"; panel.parent = "My AddOn"; InterfaceOptions_AddCategory(panel); EXAMPLE -- Create a frame with an okay and a cancel method --[[ Create a frame to use as the panel ]] -- local panel = CreateFrame("FRAME", "ExamplePanel"); panel.name = "My AddOn"; -- [[ When the player clicks okay, set the original value to the current setting ]] -- panel.okay = function (self) self.originalValue = MY_VARIABLE; end -- [[ When the player clicks cancel, set the current setting to the original value ]] -- panel.cancel = function (self) MY_VARIABLE = self.originalValue; end -- [[ Add the panel to the Interface Options ]] -- InterfaceOptions_AddCategory(panel); |
by Zootfizzle | 11/02/2008 22:58:22![]() Tivs and Maul: Thanks for the reports! These have been fixed for 2.4 release. |
by Zootfizzle | 12/02/2008 23:59:51![]() In 2.4, the behavior of the SetParent() function has changed. Previously, changing a frame’s parent would update its FrameLevel, but not change its children's FrameLevels. With the release of patch 2.4, changing a frame’s parent will update all its children's frame levels as well. For example, Frame A is on FrameLevel 0. Frame B is a child of Frame A and is on FrameLevel 1. Frame C is a child of UIParent and is on FrameLevel 2. Running Frame A:SetParent(Frame C) will now change Frame A’s FrameLevel to 3 (one higher than its parent, Frame C) and will change Frame B’s FrameLevel to 4 (one higher than its parent, Frame A). |
by Zootfizzle | 13/02/2008 01:02:47![]()
Shefki, thanks for bringing this to our attention. The behavior of this function has been changed for 2.4 release. If the client does not have information for an item, it will now return nil instead of 0. |
by Slouken | 19/02/2008 18:51:34![]()
Nope, this was a bug that is fixed for the next test realm update. |
by Slouken | 19/02/2008 18:52:55![]()
Can you post specific examples? Environmental damage is already fixed for the next test realm update, are there any others? Thanks! |
by Slouken | 23/02/2008 00:08:32![]() The combat log range is now everything that you can see. |
by Slouken | 23/02/2008 00:22:36![]() Added for 2.4: guid = UnitGUID("unit") Returns a string representing a unique identifier for the given unit. This is the same string that is used in the combat log to identify a unit. |
by Slouken | 23/02/2008 00:46:18![]()
I have plenty already, thanks! :) |
by Slouken | 23/02/2008 01:19:33![]()
Hmm, I thought it was a little chilly on the way to the office today... |
by Zootfizzle | 25/02/2008 21:55:35![]() With the release of patch 2.4 we’re adding a new event, UPDATE_INVENTORY_DURABILITY. This event will fire whenever the durability of an item in your inventory changes. UPDATE_INVENTORY_ALERTS has not changed, and is sent in conjunction with UPDATE_INVENTORY_DURABILITY when appropriate. |
by Slouken | 27/02/2008 02:41:11![]()
This is already implemented, and I believe was posted to this changes thread already...
This is a little tricky, since the filter is actually a set of filters. :) The intent with the "unfiltered" combat log is that you would run your own filtering on the return values from the function in the same way you handle them in the COMBAT_LOG_EVENT_UNFILTERED event. You'll notice that the return values from the API function exactly match the arguments to the event. |
by Slouken | 27/02/2008 02:41:46![]()
Yes, auras don't currently have a spell cast success message, but this is planned for a future patch. |
by Slouken | 01/03/2008 23:55:12![]() There are two new combat log events for the next test realm update: SPELL_SUMMON SPELL_CREATE These are sent with the guid and name of the creature or object that is created by a spell (along with who cast it, naturally) |
by Slouken | 02/03/2008 00:18:01![]() You're welcome! :) |
by Slouken | 07/03/2008 03:14:41![]() In this case nil and 0 are interchangeable. I went ahead and converted nil to 0 for text log output. |
by Slouken | 07/03/2008 14:54:00![]()
Not at the moment, the client doesn't have access to that information. |
by Slouken | 27/03/2008 20:04:24![]()
This is fixed for 2.4.2. Thanks! |
by Slouken | 27/03/2008 20:13:05![]()
It's a player if the upper bits masked with 0x00f = 0x000 It's a creature if the upper bits masked with 0x00f = 0x003 It's a pet if the upper bits masked with 0x00f = 0x004 |
by Slouken | 11/04/2008 17:59:14![]()
No, and there are currently no plans for this. The scripting system is not intended to have complete knowledge of the surrounding area, only with units that you are directly interacting with. |









Recent Blizzard Announcements