# Mik's Scrolling Battle Text

Version: 5.3
Author: Mik
Updated: Oct 21, 2008
Official Site: http://mikord.wowinterface.com
See Credits
Table of Contents:
Installation Instructions
Return to TOC
Unzip the contents into the AddOns directory of your WoW game directory.
This is typically C:\Program Files\World of Warcraft\Interface\AddOns.
If you are upgrading the mod from a previous version, make sure to delete the old version prior to installing the new version.
Description
Return to TOC
MSBT is designed to be an extremely lightweight, efficient, and highly configurable mod that makes it easier to see combat information by scrolling the information on the screen in separate, dynamically creatable scroll areas. It is a replacement for Blizzard's Floating Combat Text and Damage output.
Features:

- Lightweight and efficient design.
- Scroll incoming damage/heals, outgoing damage/heals, and notifications in separate configurable scroll areas on the playing field.
- Add triggers that will allow you to show notifications based on a variety of conditions.
- Assign a sound file to play for events/triggers.
- Dynamically create new scroll areas and assign any event/trigger to them.
- Customize the position, size, animation style, enabled state, font style, font size, font outline, and opacity for each of the scroll areas.
- Customize each individual event's color, font style, font size, font outline, opacity, output message, enabled state, and scroll area.
- Set "Master Font" settings that will be inherited by all of the scroll areas and the events in them unless they are overridden at the scroll area or event level.
- Merge AoE data into one event with cumulative damage/healing done with number of normal and crits specified.
- Show overhealing amounts against yourself or party/raid members.
- Color damage amounts according to damage type.
- Show partial effects (resists, absorbs, vulnerabilities, etc) colored according to type.
- Filter output information with a full suite of spam controls.
- Load on demand options.
- For mod developers:
  - Output your own scrolling messages with the MikSBT.DisplayMessage function instead of having to create your own frame and animation code. You can also use your own font by first registering it with MSBT via the MikSBT.RegisterFont function.
  - Create custom animation styles.
  - See the included API.html file for reference information.

Supported Events:

- Incoming:

- Melee Damage, Misses, Dodges, Parries, Blocks, Absorbs, and Immunes
- Skill Damage, Damage Over Time (DoTs), Misses, Dodges, Parries, Blocks, Absorbs, Immunes, Reflects, and Interrupts
- Spell Resists
- Pet Melee Damage, Misses, Dodges, Parries, Blocks, Absorbs, and Immunes
- Pet Skill Damage, Damage Over Time (DoTs), Misses, Dodges, Parries, Blocks, Absorbs, and Immunes
- Pet Spell Resists
- Heals and Heals Over Time (HoTs)
- Environmental Damage

- Outgoing:

- Melee Damage, Misses, Dodges, Parries, Blocks, Absorbs, Immunes, Evades
- Skill Damage, Damage Over Time (DoTs), Misses, Dodges, Parries, Blocks, Absorbs, Immunes, Reflects, Interrupts, and Evades
- Spell Resists and Buff Dispels
- Heals and Heals Over Time (HoTs)
- Pet Melee Damage, Misses, Dodges, Parries, Blocks, Absorbs, Immunes, and Evades
- Pet Skill Damage, Damage Over Time (DoTs), Misses, Dodges, Parries, Blocks, Absorbs, Immunes, and Evades
- Pet Spell Resists and Buff Dispels

- Notification:

- Buffs / Buff Fades
- Debuffs / Debuff Fades
- Item Buffs / Item Buff Fades
- Enter/Leave Combat
- Power Gains and Losses
- Combo Point Gains
- Combo Points Full
- Honor Gains
- Reputation Gains and Losses
- Skill Gains
- Experience Gains
- Killing Blows (Player and NPC)
- Extra Attacks
- Soul Shard Creation
- Enemy Buff Gains
- Monster Emotes
- Money Gains
- Cooldown Completions

- Default Triggers:

- Backlash
- Blackout
- Bloodsurge
- Brain Freeze
- Clearcasting
- Counter Attack
- Eclipse
- Eradication
- Execute / Hammer of Wrath
- Fingers of Frost
- Frostbite
- Hot Streak
- Impact
- Kill Command
- Low Health
- Low Mana
- Low Pet Health
- Maelstrom Weapon x5
- Missile Barrage
- Molten Core
- Mongoose Bite
- Nightfall
- Overpower
- Owlkin Frenzy
- Rampage
- Revenge
- Riposte
- Sudden Death
- Sudden Doom
- Taste for Blood
- The Art of War
- Tidal Waves
- Victory Rush
- Viper Sting

Commands
Return to TOC

/msbt | Shows the options interface.
/msbt reset | Resets the current profile to the default settings.
/msbt disable | Disables the mod.
/msbt enable | Enables the mod.
/msbt version | Shows the current version.
/msbt help | Shows the command usage.

Trigger Guide
Return to TOC
The trigger system is a powerful and flexible system that allows you to specify custom events to be displayed based on specific game events that are not already handled by default. There are several mechanisms in place to ensure triggers are efficient as possible so they are not needlessly wasting CPU cycles checking conditions that aren't relevant. Due to this optimization, several common triggers are included by default.
Basic Concepts:
Every time almost anything happens in the game, a combat log entry is generated for it. While it is not readily visible, each of these combat log entries is categorized by Blizzard according to specific event types. It is these event types that drive triggers. Triggers are really just definitions of a specific set of circumstances that must occur before they will fire.
Aside from being categorized into an event type, each event that occurs in game has several other pieces of information associated with it such as who the source of the event was, how much the event hit or healed for, and whether or not the event was a crit. Obviously this additional information varies according to the type of event it is since, for example, an aura application can't crit.
The trigger system refers to these event types as main events and the additional pieces of information as conditions, since ultimately it is these additional pieces of information that define the specific circumstances of interest.
Let's consider an example event to better understand how the pieces fit together. Assume that you were just hit by a fireball. The damage caused to you by the fireball generated an event of type "Skill Damage". The event also has many of other pieces of information associated with it like the name of the unit who cast the fireball, how much the fireball hit you for, whether or not it crit, whether the unit who cast the fireball is a player or an NPC, etc.
Putting the above fireball example in terms of the trigger system, the fireball hitting you was a main event of type "Skill Damage", and the conditions were the name of the unit who cast the fireball, how much it hit you for, and so on.
While the main events and their conditions offer a wealth the information, there is other non-event related "state" information available such as the current zone your character is in, whether or not certain buffs are active, and whether or not certain skills are available. This "state" information forms the basis for what the trigger system refers to as exceptions. An exception will prevent a trigger from being displayed when it applies.
Trigger Mechanics:
Now that it is clear what main events, conditions, and exceptions are, we can explore how triggers make use of them and consequently how they are defined.
The following list summarizes the stages a trigger follows to determine whether or not it fires:

1. One of the main events that a trigger has defined occurs.
2. The specific conditions defined for the main event for the trigger are tested. If any of the conditions do not apply, the trigger will not fire and all processing for the trigger stops.
3. The exceptions defined for the trigger are tested. If any of the exceptions apply, the trigger will not fire and all processing for the trigger stops.
4. The trigger fires thus displaying the specified output message and event settings.

As mentioned in the "Basic Concepts" section above, triggers are driven by main events. Each trigger can be based on one or more of these main events each with unique conditions. These main events are treated as an "or" relationship meaning that when ANY one of them occurs, the trigger will move to the next stage of testing the conditions.
The conditions defined for a given main event are treated as an "and" relationship meaning that ALL of them must be true for the trigger to move to the next stage of testing exceptions.
During the final stage, the exceptions defined for a trigger are treated as an "or" relationship meaning that when ANY one of them is true, the trigger will not fire.
Advanced Concepts:
Most common triggers won't need to delve into any of the concepts presented in this section, but using some of the more advanced capabilities can lead to triggers for highly complex events or single triggers capable of handling multiple events.
Here is an overview of the main points that will be covered:

- Each main event can be used multiple times for a single trigger
- Each condition can be used multiple times for a given main event.
- Triggers will try to choose an appropriate icon based on the main event that fired it.
- Substitution codes for skill names are available.
- Skill IDs can be used to discern which rank of a skill was used.

Recall from the "Trigger Mechanics" section that each trigger can have multiple main events treated as an "or" relationship, and that each main event can have its own unique conditions. Combining that with the capability to use a main event multiple times for a single trigger means you can effectively cover a set of common scenarios all with a single trigger. For example, imagine you want to see when both Mace Stun and Improved Hamstring proc. Both cases are an aura application, but they have different skill names. By adding the same main event twice, but specifying a different skill name condition for each one, you are effectively saying when Mace Stun or Improved Hamstring proc this trigger should fire. Naturally the other conditions such as affiliation and reaction would need to also be set for each event.
The astute reader will say "Wait a second! How will I be able to tell which one procced if the output message is the same?". This problem is solved with substitution codes. Depending on which event actually caused the trigger to fire, %s will be replaced the appropriate skill name. Also, the correct icon would be displayed since triggers attempt to choose an appropriate icon based on the main event that fired them.
The capability of using the same condition multiple times for a given main event with different relationships means that things such as ranges and complex pattern matching can be implemented. For example, imagine you are trying to create a trigger that will fire when an amount is between two values. The first condition could be "Amount - Is Greater Than - X" and the second could be "Amount - Is Less Than - Y".
Another advanced capability is using skill IDs to detect when specific ranks, such as rank 1, are being used. Most online databases can be used to ascertain what the skill ID is for the ranks of each skill. By adding conditions that specify these specific skill IDs, it is possible to only trigger on specific skill ranks.
Example Triggers:
Since the point of the trigger system is to allow for custom events that are not already available, there is no way to cover all of the possibilities. However, most commonly requested triggers fall within the following categories. An example trigger or two for each category is provided and can be used as a guide to creating your desired trigger.
Please note these examples don't make use of advanced capabilities in order to keep the examples easy to understand.

CC Breaks: | A common request for triggers is to be notified when crowd control skills like sheep, sap, and blind break from your focus target while in the arena. Nearly all of these effects involve removing an aura and therefore the main event type will usually be "Aura Removal". The most common conditions used for this category of triggers are "Skill Name", "Recipient Unit Affiliation", and "Recipient Unit Reaction". Polymorph Broke Output Message: Poly Broke - %r! Main Events: Aura Removal Skill Name - Is Equal To - Polymorph Recipient Unit Affiliation - Is Equal To - Focus Recipient Unit Reaction - Is Equal To - Hostile Exceptions: Zone Type - Is Not Equal To - Arena
Procs: | Another common request for triggers is to be notified when certain procs such as Mace Stun, Improved Wing Clip, or item-based haste effects occur. Nearly all of the effects apply an aura of some sort and as such the main event type will usually be "Aura Application". The most common conditions used for this category of triggers are "Skill Name", "Recipient Unit Affiliation", and "Recipient Unit Reaction". Mace Stun Output Message: Mace Stun! Main Events: Aura Application Skill Name - Is Equal To - Mace Stun Effect Recipient Unit Affiliation - Is Equal To - Target Recipient Unit Reaction - Is Equal To - Hostile Exceptions: None Focus (from Mystical Skyfire Diamond) Output Message: Focus! Main Events: Aura Application Skill Name - Is Equal To - Focus Recipient Unit Affiliation - Is Equal To - You Exceptions: None
Key Skill Usage: | Many players find it useful to create a trigger for when certain key abilities such as Blessing of Freedom or Blessing of Protection are used while in the arena. Most of these effects involve successfully casting a spell and so the main event type will usually be "Cast Success". The most common conditions used for this category of triggers are "Skill Name" and "Source Unit Reaction". Blessing of Protection Used Output Message: Melee Bubble! Main Events: Cast Success Skill Name - Is Equal To - Blessing of Protection Source Unit Reaction - Is Equal To - Hostile Exceptions: Zone Type - Is Not Equal To - Arena Priest Fear Used Output Message: Priest Fear Down! Main Events: Cast Success Skill Name - Is Equal To - Psychic Scream Source Unit Reaction - Is Equal To - Hostile Exceptions: Zone Type - Is Not Equal To - Arena

Trigger Reference
Return to TOC
This section provides a reference for each of the main events, conditions, and exceptions that triggers may utilize.
The following is a description of the fields unique to the trigger system interface:

Output Message: | This is the message that will be displayed when the trigger fires. Most main events allow the following substitution codes: %n - The name of the source of the event. %r - The name of the recipient of the event. %a - The amount associated with the event. %s - The skill name associated with the event. In addition, certain main events that involve two different skill names like dispels (the name of skill performing the dispel and the name of the skill being dispelled) allow the following substitution code: %e - The extra skill name associated with the event.
Trigger Classes: | This allows you to set the classes that you want the trigger to apply to. NOTE: THIS IS YOUR CLASS NOT THE TARGET CLASS. You may look at the Execute trigger for an example. Since Warrior is selected, the trigger will only apply when you are playing on a warrior.
Main Events: | This allows you to define which main events should begin the process of testing the trigger. When ANY (or relationship) of these main events occur and their conditions are true, the trigger will then make sure none of the exceptions are true before firing. The main events reference table details the purpose of each event.
Trigger Exceptions: | This allows you define exceptions to prevent the trigger from firing. They are only checked if one of the main events has occurred and all its conditions are true. The trigger exceptions reference table below details the purpose of each exception.

Trigger Main Events:

Aura Application: | Fired when an aura is applied to a unit.
Aura Dispel: | Fired when an aura is dispelled from a unit.
Aura Removal: | Fired when an aura is removed from a unit.
Aura Stolen: | Fired when an aura is stolen from a unit.
Cast Failure: | Fired when a cast fails.
Cast Start: | Fired when a cast begins.
Cast Success: | Fired when a cast successfully completes.
Create: | Fired when items are created. This is typically for conjured items.
Damage Shield Damage: | Fired when damage is done from a damage shield like thorns.
Damage Shield Miss: | Fired when damage from a damage shield like thorns is resisted, absorbed, etc.
Dispel Failed: | Fired when a dispel attempt fails.
Enchant Application: | Fired when an enchant is applied to an item.
Energy Change: | Fired when an energy value changes for the one of the supported units.
Environmental Damage: | Fired when damage is done as the result of an environmental effect like falling and drowning.
Extra Attacks: | Fired when extra attacks occur from abilities like Windfury.
Heal: | Fired when a unit is healed.
Health Change: | Fired when a health value changes for one of the supported units.
Killing Blow: | Fired when a unit gets a killing blow.
Mana Change: | Fired when a mana value changes for one of the supported units.
Periodic Skill Damage (DoT): | Fired when damage from a periodic source is done.
Periodic Skill Miss: | Fired when damage from a periodic source is resisted, absorbed, etc.
Periodic Heal (HoT): | Fired when a unit is healed by a periodic source.
Periodic Power Drain: | Fired when power is drained as the result of a periodic source.
Periodic Power Gain: | Fired when power is gained from a periodic source.
Periodic Power Leech: | Fired when power is leeched as the result of a periodic source.
Power Drain: | Fired when power is drained from a unit.
Power Gain: | Fired when power is gained by a unit.
Power Leech: | Fired when power is leeched from a unit.
Rage Change: | Fired when a rage value changes for one of the supported units.
Range Damage: | Fired when damage from a ranged source like wands/bows is done.
Range Miss: | Fired when damage from a ranged source like wands/bows is dodged, absorbed, etc.
Skill Cooldown Complete: | Fired when a skill cooldown completes.
Skill Damage: | Fired when damage from a skill was done to a unit.
Skill Interrupt: | Fired when a skill is interrupted (not pushed back).
Skill Miss: | Fired when damage from a skill is resisted, absorbed, etc.
Split Damage: | Fired when damage is being split between the source and recipient units.
Swing Damage: | Fired when damage from normal melee swings is done to a unit.
Swing/Range/Skill Damage: | Fired when any form of non-periodic damage is done to a unit.
Swing Miss: | Fired when damage from normal melee swings is dodged, absorbed, etc.
Swing/Range/Skill Miss: | Fired when any form of non-periodic damage is dodged, resisted, absorbed, etc.
Summon: | Fired when a creature is summoned.
Unit Death: | Fired when a unit dies.
Unit Destroy: | Fired when a mechanical unit is destroyed.

Main Event Conditions:

Absorb Amount: | The amount of damage absorbed.
Amount: | The amount of damage, health, power, etc generated by the event.
Aura Type: | The type of aura (buff, debuff) generated by the event.
Block Amount: | The amount of damage blocked.
Crit: | Whether or not the event is a critical event.
Crushing Blow: | Whether or not the hit was a crushing blow.
Damage Type: | The type of damage (arcane, fire, holy, etc) associated with the event.
Extra Amount: | Secondary amount used for events that have more than one amount value.
Extra Skill ID: | The ID of the secondary skill associated with the event.
Extra Skill Name: | The name of the secondary skill associated with the event.
Extra Skill School: | The school (arcane, fire, holy, etc) of the secondary skill associated with the event.
Glancing Hit: | Whether or not the hit was a glancing hit.
Hazard Type: | The type of hazard (falling, drowning, etc) that caused environmental damage.
Miss Type: | The type of miss (block, dodge, parry, resist, etc) that occurred.
Power Type: | The type of power (energy, mana, rage, etc) that was affected.
Recipient Unit Affiliation: | The affiliation (mine, target, focus, you, party member, etc) of the unit that was the recipient of the event.
Recipient Unit Control: | The controlling mechanism (server, human) of the unit that was the recipient of the event.
Recipient Unit Name: | The name of the unit that was the recipient of the event.
Recipient Unit Reaction: | The reaction (hostile, friendly, neutral) of the unit that was the recipient of the event.
Recipient Unit Type: | The type of the unit (player, pet, NPC, etc) that was the recipient of the event.
Resist Amount: | The amount of damage resisted.
Skill ID: | The ID of the skill associated with the event.
Skill Name: | The name of the skill associated with the event.
Skill School: | The school (arcane, fire, holy etc) of the skill associated with the event.
Source Unit Affiliation: | The affiliation (mine, target, focus, you, party member, etc) of the unit that was the source of the event.
Source Unit Control: | The controlling mechanism (server, human) of the unit that was the source of the event.
Source Unit Name: | The name of the unit that was the source of the event.
Source Unit Reaction: | The reaction (hostile, friendly, neutral) of the unit that was the source of the event.
Source Unit Type: | The type of the unit (player, pet, NPC, etc) that was the source of the event.
Threshold: | Percentage value that must be crossed when dealing with changes in energy, health, mana, etc.
Unit ID: | The ID of the unit affected. Use this condition to test specific units for changes in energy, health, mana, etc.
Unit Reaction: | The reaction of the unit affected by changes in energy, health, mana, etc.

Trigger Exceptions:

Buff Active: | Examines if the specified buff is currently active on you.
Current Combo Points: | The current number of combo points you have.
Current Power: | The current amount of power you have.
Trigger Recently Fired: | The number of seconds since the last time the trigger fired.
Trivial Target: | Examines if the current target is trivial (grey).
Unavailable Skill: | Examines if the specified skill is unknown or on cooldown. It does not cover other facets such as necessary reagents, appropriate range, etc.
Warrior Stance: | The current stance your warrior is in. Only works correctly if you are playing a warrior.
Zone Name: | The zone you are currently in.
Zone Type: | The type of zone you are currently in.

Search Pattern Reference
Return to TOC
Here is the official lua reference for patterns:
Character Class:
A character class is used to represent a set of characters. The following combinations are allowed in describing a character class:

- x: (where x is not one of the magic characters ^$()%.[]*+-?) represents the character x itself.
- .: (a dot) represents all characters.
- %a: represents all letters.
- %c: represents all control characters.
- %d: represents all digits.
- %l: represents all lowercase letters.
- %p: represents all punctuation characters.
- %s: represents all space characters.
- %u: represents all uppercase letters.
- %w: represents all alphanumeric characters.
- %x: represents all hexadecimal digits.
- %z: represents the character with representation 0.
- %x: (where x is any non-alphanumeric character) represents the character x. This is the standard way to escape the magic characters. Any punctuation character (even the non magic) can be preceded by a '%' when used to represent itself in a pattern.
- [set]: represents the class which is the union of all characters in set. A range of characters may be specified by separating the end characters of the range with a '-'. All classes %x described above may also be used as components in set. All other characters in set represent themselves. For example, [%w_] (or [_%w]) represents all alphanumeric characters plus the underscore, [0-7] represents the octal digits, and [0-7%l%-] represents the octal digits plus the lowercase letters plus the '-' character.
  The interaction between ranges and classes is not defined. Therefore, patterns like [%a-z] or [a-%%] have no meaning.
- [^set]: represents the complement of set, where set is interpreted as above.

For all classes represented by single letters (%a, %c, etc.), the corresponding uppercase letter represents the complement of the class. For instance, %S represents all non-space characters.
The definitions of letter, space, and other character groups depend on the current locale. In particular, the class [a-z] may not be equivalent to %l.
Pattern Item:
A pattern item may be:

- a single character class, which matches any single character in the class;
- a single character class followed by '*', which matches 0 or more repetitions of characters in the class. These repetition items will always match the longest possible sequence;
- a single character class followed by '+', which matches 1 or more repetitions of characters in the class. These repetition items will always match the longest possible sequence;
- a single character class followed by '-', which also matches 0 or more repetitions of characters in the class. Unlike '*', these repetition items will always match the shortest possible sequence;
- a single character class followed by '?', which matches 0 or 1 occurrence of a character in the class;
- %n, for n between 1 and 9; such item matches a substring equal to the n-th captured string (see below);
- %bxy, where x and y are two distinct characters; such item matches strings that start with x, end with y, and where the x and y are balanced. This means that, if one reads the string from left to right, counting +1 for an x and -1 for a y, the ending y is the first y where the count reaches 0. For instance, the item %b() matches expressions with balanced parentheses.

Pattern:
A pattern is a sequence of pattern items. A '^' at the beginning of a pattern anchors the match at the beginning of the subject string. A '$' at the end of a pattern anchors the match at the end of the subject string. At other positions, '^' and '$' have no special meaning and represent themselves.
Captures:
A pattern may contain sub-patterns enclosed in parentheses; they describe captures. When a match succeeds, the substrings of the subject string that match captures are stored (captured) for future use. Captures are numbered according to their left parentheses. For instance, in the pattern "(a*(.)%w(%s*))", the part of the string matching "a*(.)%w(%s*)" is stored as the first capture (and therefore has number 1); the character matching "." is captured with number 2, and the part matching "%s*" has number 3.
As a special case, the empty capture () captures the current string position (a number). For instance, if we apply the pattern "()aa()" on the string "flaaap", there will be two captures: 3 and 5.
Frequently Asked Questions
Return to TOC

1. I don't like any of the fonts supplied with MSBT. How do I use my own fonts?
   WARNING: ALL FONT MODIFICATION WILL REQUIRE THAT YOU COMPLETELY QUIT THE GAME AND RESTART IT. RELOADING THE CONSOLE ALONE WILL NOT WORK.
   NOTE: Keep in mind that if you use your own font files that you need to make sure the font supports the characters that will be displayed. For example the typical way to display buff gains is [BuffName]. If the font you use does not have a character glyph for the [ or ] characters you will likely see a big ugly block (or nothing at all) instead of the intended characters. This is especially important with non-English clients since a lot of characters aren't supported by English fonts.
   There are a few ways to use custom fonts:
   - The first, and easiest, method is to simply replace one of the font files in the MikScrollingBattleText\Fonts directory with the truetype font (.ttf) that you want. The drawback to this approach is that the mod's option screen will still reference the font with the old font's name.
     For example, if you had a truetype font file "MyUberFont.ttf" you wanted to use. Rename MyUberFont.ttf to Adventure.ttf and replace the Adventure.ttf font file in the MikScrollingBattleText\Fonts directory. In the MSBT options interface it would still be called "Adventure," but it would actually be using the new font.
   - The second method is to open the file MSBTFonts.lua in the MikScrollingBattleText directory and find the FONT_FILES entry. Add your font with the appropriate name and path following the same pattern as the sample entries. One thing to keep in mind with this approach is that due to the way WoW loads its data, I would suggest you put the new fonts you want to add in the same place as the current fonts for the mod (MikScrollingBattleText\Fonts) to avoid problems with loading.
   - The third method is aimed more at mod developers that want to display information using MSBT. You can call the MikSBT.RegisterFont function to register a custom font that you may then specify in your call to MikSBT.DisplayMessage. See the included API.html file for reference information.
2. How do I create a new trigger?
   The first step is to read the Trigger Guide and Trigger Reference sections above.
   Among other things, the guide explains how triggers work, what the various components of the trigger system are, and provides example triggers for common categories. The reference section provides specific information about the various components such as the available substitution codes, main events, conditions, and exceptions.
   Once you've read those sections, we can continue on to the process for creating triggers.
   We will be creating a trigger that notifies us when Polymorph breaks from a hostile unit when we are playing on a mage in the arena.
   1. Since a new trigger is being created, click the Add New Trigger button, enter "Poly Broke - %r!" for the output message, and click Okay.
   2. Click the trigger conditions icon button (the gear) next to the newly added trigger at the bottom of the list.
   3. Click the edit Trigger Classes icon button and uncheck "All" classes. Check Mage for the class the trigger will apply to. It is better to select the specific classes the trigger applies to instead of selecting all classes since by specifying classes, the mod can completely ignore the trigger and save resources for the classes to which it does not apply.
   4. Click the Add Event button next to the Main Events label to add a new main event.
   5. Select Aura Removal for the Main Event.
   6. Modify the first condition to "Recipient Unit Reaction - Is Equal To - Hostile" because we don't want to see when poly fades from our teammates.
   7. Modify the second condition to "Skill Name - Is Equal To - Polymorph". It is case-sensitive, so make sure you use a capital P.
   8. Click the Save button to save the new main event and its conditions.
   9. Click the Add Exception button next to the Trigger Exceptions label to add a new exception.
   10. Select "Zone Type - Is Not Equal To - Arena" for the Exception. This makes it so the trigger will not fire when we aren't in the arena.
   11. Click the Save button to save the new exception.
   12. Click the Save button on the trigger frame to save the trigger's new conditions.
   The %r used in step a is a substitution code for the name of the unit that the debuff (polymorph in this case) faded from. You already knew that though because you read the Trigger Guide and Trigger Reference!
   The color, font settings, sticky state, sound, and output scroll area for the trigger can be set like any other event.
3. How do I add my own custom sounds?
   WARNING: NEW SOUND FILES WILL REQUIRE THAT YOU COMPLETELY QUIT THE GAME AND RESTART IT BEFORE THEY WILL BE PLAYED. RELOADING THE CONSOLE ALONE WILL NOT WORK.
   There are a few methods that can be used to add custom sounds.
   - The first, and easiest, method is to simply place a .wav file or .mp3 file in the MikScrollingBattleText\Sounds folder before you start World of Warcraft. You may now click the event settings icon for any event/trigger and then click the icon next to the sound dropdown. Enter the name of the file you placed in the folder.
   - The second method is to open the file MSBTSounds.lua in the MikScrollingBattleText directory and find the SOUND_FILES entry. Add your sound with the appropriate name and path following the same pattern as the other entries. One thing to keep in mind with this approach is that due to the way WoW loads its data, I would suggest you put the new sounds you want to add in the same place as the current sounds for the mod (MikScrollingBattleText\Sounds) to avoid problems with loading.
   - The third method is aimed more at mod developers. You can call the MikSBT.RegisterSound function to register a custom sound. See the included API.html file for reference information.
4. Is it possible to prevent Mutilate from being merged?
   Yes. Add it to the merge exclusions list under the Spam Controls tab in the options interface.
5. How do I suppress Vampiric Embrace?
   This can be accomplished a couple of different ways.
   - The preferred method is to add it to the skill suppressions list under the Spam Controls tab.
   - Another way is to use the heal threshold slider under the Spam Controls tab.
     The drawback to this approach is that all heals under the specified value will be suppressed and not specifically Vampiric Embrace, which may or may not be your desired behavior.
6. I want to see skill names even when there is an icon. Is that possible?
   Yes. Uncheck "Exclusive Skill Names" under the Skill Icons tab.
7. Does MSBT support fonts and sounds from Shared Media?
   Not directly, but you can download MSBTSharedMedia to add support for it.
8. Is there a way to show the damage above the target's heads like the default damage text?
   The only way this is possible is using the built-in game damage. The "Game Damage" option on the General tab will reenable it, but keep in mind you will lose all customization capabilities for outgoing damage if you choose to use the game's built-in damage. WoW's API does not provide a method to get the position of 3D game objects such as players and mobs. This is intentional on their part and will likely never change.
   I do not recommend using the built-in game damage option. If you take the time to get used to having the damage in a consolidated area, you will likely find it superior in many ways. Aside from the obvious visual customization capabilities of using MSBT's damage display, there are many other benefits such as being able to see the damage and healing being done to targets that are not in your viewport, merging of AoE with cumulative amounts, throttling of DoT spam, damage thresholds, per skill suppressions for things you don't care about, icons annotating which skill caused the damage or healing, and more.
9. Can I create a trigger to notify me when a player uses a PvP trinket?
   Unfortunately, there is no combat log event generated when a player uses a PvP trinket. As a result, there is no event to drive a trigger for it. If Blizzard decides to add a combat log event for it, at that point a trigger would be possible.
10. Is MSBT efficient?
    Absolutely. MSBT 5.0 was completely re-designed from the ground up using Blizzard's new mod statistics API tools with the #1 priority of optimization for reduced memory usage and CPU efficiency. As a result, it is both lightweight (low memory usage) and efficient (low CPU usage), which, sadly, is frequently ignored in performance discussions. Performance entails both memory usage and CPU usage. Unless you don't have enough RAM available, CPU usage is almost always more of a factor on your FPS than raw memory usage is.
    Please don't just take my word for it though. Test it out for yourself. Blizzard has made it simple to see statistics about mod usage with the GetAddOnMemoryUsage and GetAddOnCPUUsage API calls. Testing a mod will give you a true picture of its performance.
    One thing to keep in mind during your testing is that MSBT is written to be completely dynamic. It will only create exactly what objects it needs when it needs them and then reuse them from that point forward. This means during the first few combat cycles you will see a slightly higher increasing rate than you might expect as the first set of objects is created. The rate will quickly stabilize to typically less than 1 KiB/s as the objects begin to be reused. The main benefits to this approach are less overall memory usage and very little memory churn.
    Also, don't forget to look at CPU utilization. As I said above, it is frequently ignored, but it is also important. Would you rather have your CPU spending extra time on the game engine, or wasting cycles on an inefficient mod?

Version History
Return to TOC

Latest | Modified the angled animation style to maintain consistent movement speed. The reflect event will no longer show the %a event code. Added default trigger for The Art of War. Fixed issue with animation speed not scaling certain styles correctly.
5.3.25 | Modified the internal media handling to avoid issues induced by other mods via LibSharedMedia. Reworked the animation system to help alleviate some "jerkiness" due to rounding. Added an angled animation style with customizable directions and behaviors. Made some minor optimizations in substitution code handling. Removed Mongoose Bite and Kill Command triggers since they no longer apply. Added default triggers for Sudden Death and Taste for Blood.
5.3.24 | Updated for Patch 3.0.1 / Wrath of the Lich King Beta. Added several default triggers for new abliities of various classes. Updated supported power types to include runes and runic power. Added support for new damage types. Added coloring for frostfire damage. Death Knight is now an available class for triggers. Runic Power Change and Rune Cooldown are now available main events for triggers. Added throttling for heals from Blood Presence. Added the amount absorbed for fully absorbed events with damage color capability. Modified all partial effects to use the same bracket style as overheals. Updated combo point handling to work with WotLK. Modified power gains from leeches to show the correct amount gained instead of the amount leeched. Performance enhancements: Removed delays from the animation system that should make the animations a little smoother on fast systems. Events that are capable of being merged will now appear more quickly than previously. Made some minor optimizations in substitution code handling. Realm names are no longer shown as a part of name based substitutions for cross-realm players. Rewrote media handling system to provide native Shared Media support. Physical damage coloring is now ignored for outgoing skills that are not "auto attacks." The temporary icon (the little face) will no longer be shown. Zephyr font removed since it doesn't support some glyphs.
5.2.14 | The hostile condition check for health and power changes will now function properly. The damage amount of hunter autoshots will now be colored according to the physical damage color if it is enabled (White by default). Added Russian localization.
5.2.11 | Fixed issue with triggers that set a unit id to all party members.
5.2.10 | Added a button to test the selected sound in the event settings dialog. Dark Pact and other power leech events will now correctly display the amount of mana leeched. Added missing Traditional Chinese localization files.
5.2.9 | Rewrote the core of the event parser to reduce its CPU usage by about 60%. The trigger system was completely redesigned with the main focus on flexibility. Triggers now make extensive use of "short-circuiting" to cut down the number of tests needed thereby increasing performance. Anything that has a patch 2.4 style combat log entry (COMBAT_LOG_EVENT_UNFILTERED) can now be used for a trigger. The number of available conditions per main event has been substantially increased. Each parameter for a main event type can now specify various relationships. Parameters involving strings like skill names and unit names can now choose between an exact match or a search pattern in most cases. Added a new main event for skill cooldown completions. Full paths may now be entered for sounds. This includes path to sound files internal to WoW. Added Traditional Chinese localization. Moved font definitions to localization files so they can be unique per language. MSBTFonts.lua can still be used to add custom fonts. Updated spell dispel/stolen events to the new values implemented by Blizzard in Patch 2.4.3.
5.13 | The threshold based triggers such as "Low Mana" and "Low Health" will once again display the current amount.
5.12 | Fixed the error when looting money induced in patch 2.4.2. Fixed the erroneous "Low Mana" warnings when in druid forms.
5.11 | Redesigned the trigger system to work with the new combat log mechanics and improve flexibility: The old main conditions have been replaced with main events that can have several conditions for greater control over things such as affected units (target, focus, etc), applications, etc. The old secondary conditions has been replaced with exceptions. Exceptions will cause the trigger not to fire when they are true. In addition, most exceptions has a "reverse logic" option that causes them to behave as their opposite for high flexibility. Triggers now try to choose an appropriate icon based on the main event that fired it. It is still possible to specify an icon that will override the default. All of the default triggers will now work on non-English clients without the need for localization. Any additional triggers you may have created in previous versions will have to be recreated under the new system. Added a default trigger for Viper Sting. Added the default clearcasting trigger to druids. Skills like "Mangle (Bear)()" will now be displayed as "Mangle" in the cooldown area. Animations may now be as slow as 20% of normal instead of the previous 50%. Scroll areas can now have a minimum height of 50 down from 100. Increased the allowed font size range to 4-38. Threshold triggers will no longer misfire when shapeshifting. Soul Shard gains will now be displayed again. The %t event type will no longer throw an error. Added a button to the AddOns tab of Blizzard's Interface Options to launch MSBT's options.
5.1 | The optional icons module is no longer required. This is a significant memory savings for those previously using the module. Unfortunately, the ability to add and customize triggers is disabled for this release while the system is rewritten. Rewrote the parser to work with the new combat log mechanics implemented in Patch 2.4. Since manually parsing text strings is no longer required, things like pets with the same name as party/raid members will no longer cause confusion. There also should no longer be problems with non-English clients that had strange parsing issues due to ambiguous strings. Load up memory usage is now around 221 KiB. Damage from spell reflects will now be shown to the player who reflected it as if they did the damage. The horizontal animation style now has an alternating direction option. Added new events for outgoing (offensive) player and pet dispels. Internal filtering for identical monster emotes has been added to reduce potential spam. Only one five combo point notification will now be shown per combo point cycle. Overhealing will now show on heals that have been excluded from merging. Fixed an issue regarding cooldowns not being displayed for certain skills like Mangle (Bear). Added Simplified Chinese localization. Thanks to elafor and hscui for their work. Updated TOC for Patch 2.4.
5.03 | Updated LibStub in MSBTIcons to resolve incompatibilities with a newer library version. This should clear up some issues with other mod compatibility. Made icons for triggers obey the enable/disable skill icons option. Updated for Patch 2.3.
5.02 | Modified the sound system to allow custom registrations for easier sound selection. Triggers may now specify a skill name to use for displaying an icon. Added suitable icons to most of the default triggers. Added parsing for mana gains from sources like Mana Spring totems now that they can be suppressed, if desired. Mana gains during Innervate are now shown if the "Hyper Regen" option is set. Damage from totems and other miscellaneous "pets" will now be displayed. Changed the minimum scroll area width to 10. Fixed a problem that was causing all periodic enemy heals and power gains to be shown instead of only buff gains. Fixed an issue where delayed cooldowns such as combustion were completing before they should.
5.01 | DoTs and HoTs may now have independent throttle times. Power gains can now be throttled and there is a default Vampiric Touch throttle entry. Power gains now have icons when possible. Added a "Move All" button to the Events tab to allow the whole category to be moved to a new scroll area quickly. Added some logic to counteract ill behaved mods such as Recount and SW_Stats modifying global strings. Fixed some issues with the options interface not saving certain fields properly. Made search pattern triggers also check secondary conditions to match the behavior of the other condition types. Updated the MSBTIcons module .toc file to prevent certain cases where it wasn't being loaded in the correct order (Thanks dylanm).
5.0 | Complete code rewrite to further reduce memory usage and CPU utilization. Blizzard's addition of memory and CPU tracking tools to the API were used to help achieve this. The CPU utilization is about 55% less, and the load up memory usage is now around 258 KiB. Redesigned the profile system to use a full master/diff approach. This leads to a substantial memory savings when using multiple profiles. It also adds the benefit of allowing future changes to defaults to take place without having to completely reset user profiles. The options interface was streamlined and rewritten using pure lua. All the tabs and popup frames are now dynamically created only when needed. The options are still load on demand and use no resources when not loaded. Created a new set of spam controls: Show ALL power gains WARNING: This can and will spam you! Show hyper regen (mana gains during Evocation and Spirit Tap) Thresholds for Healing, Damage, and Power Gains Skill name substitution Skill suppression (e.g. Vampiric Embrace) Skill abbreviation option with new %sl event code to override at the event level Independent throttle times per skill Merge exclusion list (e.g. avoid merging mutilate) New font opacity setting that follows the same inheritance mechanics as the other font settings, so each individual scroll area and event can have a custom opacity. Added some "high level" controls to the options interface such as a "Toggle All" button to quickly toggle the enable state of all events in the selected category. This allows you to disable all incoming pet events with one click for example. Another example is a "Disable Skill Names" checkbox which quickly allows you to stop all skill names from being displayed without having to modify every single event and remove the %s. Added built-in customizable cooldown notifications. Crits are now separate events so they can be individually controlled. Each scroll area may now have its own independent animation speed. Scroll areas now have a customizable width that the animation styles obey when it makes sense. New horizontal and static animation styles. Created a new default scroll area using the new static animation style. Implemented behaviors in the animation system which allow more customization of animation styles. Added a new selectable behavior (Normal) to the Pow sticky animation style that will not perform the jiggle effect. Added enemy buff gain and monster emote events (spell alert). New money gains notification event. There is now a full set of incoming pet events. Added outgoing pet DoTs. Every event can now be assigned a custom sound. (e.g. full combo points) Several trigger conditions such as Self Buff Gains can now have multiple entries per trigger. Added a debuff application number secondary trigger condition. Added a spell usable secondary trigger condition. Added several new fonts. Added an optional skill icons module. Made some minor tweaks to the default display and throttle settings to improve readability. Fixed a few parsing issues.
4.13 | Added temporary fix for PlaySoundFile() bug in Patch 2.2.2. Updated for Patch 2.2.
4.12 | Added the option to disable/enable Blizzard's new built-in healing display above the target's head. Updated for Patch 2.1.
4.11 | Fixed the issue where crits were being improperly displayed on some non-English clients. Modified the outgoing crit/block/dodge/parry trigger conditions to only apply to the player and not any pets. Added a "Trigger Cooldown" secondary condition.
4.1 | Rewrote the trigger system to allow for multiple conditions while maintaining efficiency. In addition several commonly requested triggers were added. Triggers may now have a custom sound assigned to them. Added parsing for some new TBC patterns that will fix a few issues where certain events were not showing up. Made several parsing optimizations. Created an event for incoming and outgoing Spell Interrupts. Added Shadowmend to the list of throttled HoTs.
4.03 | Recharacterized some damage based spells into DoTs so they will now follow the throttling mechanics. Added damage types to environmental damage so it will now have the damage type colors applied. Updated for Patch 2.0.3 / Burning Crusade.
4.02 | Fixed parsing order error with Foreign languages which resolves a lot of issues on foreign clients with substitution codes showing up instead of the actual data. The soul shard notification event should now work again. The mana gained form the warlock Dark Pact talent will now be displayed. Recharacterized healing from some damage based spells (most notably Vampiric Embrace) into HoTs so they will now follow the throttling mechanics. Basically this means those spells should no longer spam you with healing if you have HoT and DoT throttling enabled (it's on by default). Added parsing for damage taken from the tornado in the arenas. Added French localization. Added more German localization.
4.01 | Fixed the problem induced by the 2.0 patch where wand damage was not showing up.
4.0 | Complete code rewrite for even better performance and features. Major Optimizations: Rewrote the combat parsing engine to significantly increase performance and lower the memory footprint. Redesigned the suppression system to use a hash table searching algorithm so that any number of suppressions may be added without any appreciable slowdown. Optimized the default profile handling. Due to the large number of options, the default profile table takes up a decent chunk of memory (around 90 KiB). In the previous versions, the table was always memory resident - even when it wasn't needed. It is now created dynamically only when it's needed, which is the first time you load a new version of the mod or reset a profile to its defaults. Redesigned the underlying options tables such that shared information amongst the events is only stored once instead of separately for each event. This saves quite a bit of memory, especially when there are multiple profiles. Created a single pool of dynamically created font strings to be shared by the various scroll areas. Previously a set number of font strings were created for every scroll area. Load up memory usage is now around 450 KiB. Minor Optimizations: Trigger system will no longer listen for events that there are no triggers for. Previously it received the same events the mod was already parsing and ignored the ones with no triggers. Reduced the amount of information that needs to be passed around to lower memory usage during operation. Rewrote the animation code to work using scaled timing. Previously the animation was created by moving the text a set amount of pixels each update. This had the effect of causing the animation speed to vary greatly depending on system performance. The animations should now keep the same speed regardless of large performance hits, such as those incurred while recording a video or during extreme lag. Each character will now load the last selected profile for that character by default. Changed the default font to Porky, which has glyphs for most common German, French, and Spanish special characters. In addition, most of the fonts were replaced with new versions that support them as well. However, the old Adventure font is still available for those who want to use it. Added an option (enabled by default) to throttle DoTs and HoTs so that only one event for each ability will be displayed within the time period specified (2.5 seconds by default). Any additional DoT/HoT abilities that occur while being throttled are merged into one event to be shown once the throttle period has passed. This will reduce the spam when you have HoTs and/or DoTs on multiple targets. Made scroll areas dynamically creatable and made events/triggers assignable to them. Ability/Spell damage amounts now use a custom color according to their damage type by default. The rest of the message will still show up with the event's selected color. This behavior can be disabled. Partial effects (absorbs, resists, glancing, crushing, overheals, etc) can now be individually enabled, disabled, and color coded. Separated Debuff and Item Buff Fades from Buff Fades into new notification events. Totem buffs are now also handled as buff gains and fades. Added an Extra Attacks notification event which will give notifications for Windfury, Thrash, Sword Spec, etc. Added a Soul Shard Created notification event. Overhauled the interface to include the new features. Added a font registration function so other mod developers can choose to display their custom messages in their own font. Added an animation style registration function so other mod developers can easily provide custom animation styles for MSBT. Provided an additional file named API.html that is a reference for the publicly accessible functions that other mod developers can use to display messages through MSBT and register custom animation styles.
3.11 | Fixed the bug where in certain circumstances the trigger interface would give an error when trying to setup a new search pattern trigger. Made newly created triggers inherit all font settings instead of specifying a font size by default.
3.1 | Added support for power gains to yourself from other people. Increased the number of available event types for the trigger system to allow for greater flexibility. Due to the way the trigger system is designed this will not add much overhead since triggers are only parsed against the selected event types. Alphabetized the list of available trigger events to make finding the one you want easier. Removed the default Blessing/Judgement of Wisdom suppression. The user can choose to add one in for it if they prefer.
3.01 | Fixed the bug where you could only add one suppression and adding a new one was overwriting it.
3.0 | Implemented a low overhead trigger system. See documentation above. Implemented a suppression system that allows you to suppress particular messages you don't want to see. Made significant changes to the scroll area settings interface. The new interface shows all three scroll areas at the same time. Each scroll area is now titled with its coordinates and there are editboxes to enter specific coordinates in addition to being able to drag the scroll areas around. Changed the core animation routines to use function pointers in order to eliminate the need for a ton of conditional testing. Previously, every time the animation routine was called (typically 60-70 times per second for every scrolling item), the animation style and scroll direction were checked to calculate how to move the text. Now those items are only checked during the initial animation object setup phase. This should help performance on slower PCs. Added the command "/msbt search pattern" to enable an event searching mode which helps identify event types used in the trigger system. See documentation above for more info. Moved the Low Health, Low Mana, and Execute events into the trigger system. Due to this change the Low Mana and Execute triggers will no longer waste resources checking on classes that don't use mana or have an execute ability. Also moving them into the trigger system made the thresholds at which to show the Low Health, and Low Mana warnings selectable. Made a few minor code performance tweaks to the animation setup "pipeline." Added Killing Blow notification events for both players and NPCs. Added crushing and glancing hit partial effects. The font settings frame can now be moved. Fixed a bug where messages added via the MikSBT.DisplayMessage function were being shown even if the scroll area was set to not show messages.
2.11 | Disabled Blizzard's new floating text in Patch 1.12 when MSBT is enabled. Updated for Patch 1.12.
2.1 | Reduced memory usage a little by removing the underlying tables used to store crit information for events that can never be crits. (Down to around 477 KiB) To go along with the above change, the font settings interface for events was reworked so that you can no longer set crit information for events that don't support them. Added a title at the top of the font settings frame to help distinguish what is being modified. Added an Experience Gains notification event. Added the capability for notifications to be displayed "sticky" style. Fixed the bug induced by patch 1.11 where reputation gains and losses weren't being displayed.
2.0 | MAJOR optimization code rewrite: Made options load on demand to significantly reduce memory usage and start up time. Implemented a table recycling system to reuse tables created during combat instead of creating new ones and allowing them to be garbage collected. The net effect is that a ton of garbage collection churn has been eliminated. Thanks go to kergoth and Wobin for tips on how to achieve this. The combat event parser has been changed to reuse one single table for storing the results of the parsed data. Streamlined the combat event to screen animation "pipeline." Namespaced all code to reduce global namespace pollution. Load up KiB Usage in v1.03 was approximately 1050 KiB. This has been reduced to around 488 KiB. In addition, due to the table recycling system, memory usage during operation is much more consistent instead of continuously increasing until the next garbage collection cycle. Added a function to allow messages to be easily displayed through MSBT from external sources. This function is MikSBT.DisplayMessage and is detailed in the included API.html file. Added the command "/msbt stats" to report statistics about the table recycling system. Changed the functionality of AoE merges so that the name reported is "Multiple" instead of the last affected unit. Added the option to disable "game damage" instead of just always doing it. Added the option to disable "sticky crits." Added Execute/Hammer of Wrath notification event. Separated Heals over time (HoTs) and Damage over time (DoTs) into their own events. Added the option to display overhealing. Fixed a bug where crits were not being recognized in non-English clients.
1.03 | Fixed a bug where options set with a checkbox were not being properly saved on logout.
1.02 | Fixed a bug where the global string parser wasn't appropriately accounting for the argument order of non-English clients.
1.01 | Updated for Patch 1.11.
1.0 | Initial version.

Credits
Return to TOC
Thanks to:

- Grayhoof, the author of SCT, for the original mod which inspired this mod.
- Kergoth and Wobin for their suggestions on optimizations via reduced GC churn and namespacing tips.
- Farook for the German localizations.
- Calthas for the French localizations.
- Hscui and Netcookies for the Simplified Chinese localizations.
- Whitepaw for the Traditional Chinese localizations.