Gnosis (Castbars and Timers)
Gnosis is a highly configurable castbar and single timer addon. Gnosis can show ticks of channeled spells, detect unintentional clipping while channeling and combine data of channeled spells to combat text addons (MSBT, SCT, Parrot). It also allows to create buff, debuff, and cooldown (spell, rune, item) timers with a similar set of options castbars have.
To visit Gnosis' development site or to grab alpha&nolib files go to Gnosis @ CurseForge
If you find any bugs or have suggestions create a ticket here
PDF documents containing a general introduction to timer bars as well as an overview of Gnosis timer configuration commands and options can be found within the Gnosis addon folder.
Gnosis allows to create as many bars as you like and does not force predefined bars onto the user. The "casts" of following "units" can be shown:
- Player, Target, Focus, Pet (= Vehicle)
- Arena Opponents, Party, Mouseover, Bosses
- Mirror bar (Fatigue, Feign Death, Breath)
- Global Cooldown Indicator
- Swings timers (one handed melee and ranged, single and combined versions)
- Most ...'s Target Units are selectable (e.g. Target's Target's Target = targettargettarget), though those units require additional resources (scanning) if bars for those units are created
Main features
- unlimited amount of castbars
- single bar buff, debuff, cooldown and item cooldown timers
- horizontal & vertical bars, invertable bar growth direction
- customizable look (alignments, colors, size, font, casticon, ...)
- full control of castname and casttime strings
- black-/whitelisting (i.e. show castbars not/only for specific spells)
- support for all channeled spells (show tick markers including spellpushback support for those markers, configurable)
- combine dps of channeled spells and output via combat text
- anchor bars to frames or the mouse cursor
If you want to help localize Gnosis please visit Gnosis Localization @ Curseforge
Following shadow priest related example configuration might help you understand Gnosis' timer-bar options and possibilities a little better. For more information about timer bars and the addon in general see the description below. Importing all bars at once will cause lag (just wait, your client has not crashed).
Bigtitgothgf instructional guide
Bigtitgothgf profile download (if you don't want to make your own)
Please watch the introduction videos:
First steps introduction video (v1.80)
Slash Commands
The slash command for Gnosis is /gnosis. Gnosis has full GUI configuration support.
/gnosis reanchor will force Gnosis to reanchor all bars
/gnosis load configuration name will load the castbars of given configuration. Careful: Your current castbar setup will be lost.
/gnosis bar="name of existing bar" text="Text to display" time=12 spell="Shadow Word: Death" cast|channel starts a timer manually (spell and cast|channel keywords are optional).
Multi-Spell Timers
Gnosis also allows to create so called Multi-Spell Timers. A single bar can handle as many spells/cooldowns as you like, though it can only display one at a time (chosen by the given priority or sorting criterion).
To create timer bars, select "Multi-Spell Timer" as Bartype and add items to track to the black-/whitelist found under the "Hide castbar" section. The format of entries basically is cmds:spell. Following commands are available.
Auras (Buffs=Hots & Debuffs=Dots)
buff, debuff, hot, dot, aura
aura with the additional keyword harm is the same as debuff/dot
aura with the additional keyword help is the same as buff/hot
also add the mine keyword to only display player's auras
Aura subcommands:
aurastacks=# and auraeffect=# will display the aura stack count/aura effect value instead of the aura's duration.
The user has to manually supply a maximum value for stack count/effect value (replace with the # sign).
Group/Raid-wide Auras (Buffs=Hots & Debuffs=Dots)
groupbuff, groupdebuff, grouphot, groupdot, groupaura, harm, help, mine
Cooldowns
cd (for spells), itemcd (for items), runecd (for DK runes, pass 1..6 as spell)
Global Cooldown
gcd:any or gcd:spell(id) (shows general global cooldown or of specific spell)
Durations
totemdur (for Shaman totem durations, pass 1..4 as spell)
enchmh and enchoh (main and offhand imbues/poisons, e.g. enchmh : Instant Poison)
Procs
icd, innercd, proc (display timer of length staticdur=x when the proc occurs, useful for tracking proc length or inner cooldown)
e.g. icd staticdur=12 : Rapture (displays inner cooldown of Discipline Priest's Rapture ability)
optionally pass the norefresh option to disable timer refresh due to new proc (or similar effect)
Spellcasts
cast:any or cast:spell(id) of spell casts which should be shown
Resources
Syntax: resource : type, e.g. resource : health
type | description |
---|---|
health | displays unit's health |
power | powerbar (mana/energy/rage/focus/...) |
combopoints | rogue and feral druid combo points |
range | range between yourself and the given unit |
altpower | alternative power (boss encounter specific) |
heal | incoming heal |
threat | units threat towards your target |
soulshards | Warlock's Soul Shards |
eclipse | Moonkin Druid's Eclipse |
holypower | Holy Paladin's Holy Power |
chi | Monk's Chi |
shadoworbs | Shadow Priest's Shadow Orbs |
burningembers | Warlock's Burning Embers |
demonicfury | Warlock's Demonic Fury |
xp | player's experience |
rested | player's rested experience bonus |
<sub>threat remark: the "stacks" value denotes: 3: tanking - 2: insecurely tanking - 1: higher threat than tank - 0: lower threat than tank
</sub>
Miscellaneous
fixed : spellname or spell id (create a fixed timer using the icon of the given spell or spell id)
exit : 0 (end execution, do not activate bar)
unitname : any or unitname : exact name of unit (shows unitname of given unit in case of any or when there is an exact match with the given name)
npc : any or npc : exact name of unit/npc id (shows the npc id the of given unit in case of any or when there is an exact match with the given name or npc id)
spellknown : spell(id) (shows spell if currently known)
equipped : item(id) (shows item if currently equipped)
example:
unitname unit=boss1 : Garrosh Hellscream
& fixed portrait=boss1 nfs="Kill Garrosh!!!" : 0
Optional commands
subcmd | usage | description |
---|---|---|
unit | unit=unitid or friendly player name | unit override (see http://wowpedia.org/UnitId) |
nfs | nfs="overwrite name format string" | see description of name format string |
tfs | tfs="overwrite time format string" | see description of time format string |
icon | icon="spell(id)" | overrides shown icon |
portrait | portrait="unit" | overrides shown icon with portrait of given unit |
shown | shown="barname" | timer entry only valid if bar "barname" is currently active/shown |
hidden | hidden="barname" | entry only valid if bar "barname" is currently not active/shown |
lag | lag | display latency information |
casttime | casttime | display casttime information |
recast | recast=3.0 | give recast advice, given remaining duration will be marked, 3.0s in this example |
sort | sort:criterion | minrem, maxrem (min/max remaining); mindur, maxdur (min/max duration) |
not | not | will show auras/cooldowns if they are not present or not on cooldown as a static bar |
staticdur | staticdur=30 | forces the timer to always display 30 seconds or more |
zoom | zoom=5 | zoom into the timer when less than 5 seconds duration remain |
spec | spec=1 or 2 | timer entry will only be active for the given talent specialization |
sbcol | sbcol="r,g,b,alpha" | override statusbar color, e.g. cd sbcol="1.0,1.0,0.0,0.8" : Dispersion |
hideicon | hideicon | hides the icon |
hidespark | hidespark | hides the castbar spark |
plays | plays="x-sound" | plays given sound every x seconds |
playm | playm="x-music" | plays given music every x seconds |
playf | playf="x-audio file" | plays given audio file every x seconds |
mcnt/msize | mcnt=# and msize=#.# | latency tick markers are used to break up the bar into mcnt pieces, e.g. to display combo points; the default value of msize is msize=1.0 (which is the maximum value); decreasing msize will decrease the tick marker size (valid values are 0.0 < msize <= 1.0) |
<sub>The recast should work for all casters, might also work for melee classes.</sub>
You can add as many entries as you like to any given bar. Just make sure to only add one spell/item per entry. If you do not add a sorting criterion, the order of these entries is used as priority from most to least important.
Advanced options: Conditions
Sometimes it can be useful to only show a bar when the specific cd/buff/etc. has a certain value (i.e. range) or if a buff/debuff has a certain amount of stacks. Gnosis allows to handle these conditions easily. The syntax is
commands:spellname<a1,a2,b1,b2>
where a1 is the minimum, a2 the maximum current value; b1 the minimum amount and b2 the maximum amount of stacks.
Leaving a value blank will make Gnosis not use it (e.g. <,50> will be valid when the current value is below or equal 50, neither the lower bound (a1) nor the amount of stacks (b1 and b2) will be compared against since those values have not been given). a1 and a2 can be given as a value or in percent, this does not apply to stacks.
resource sbcol="1,0,0" : health<,25%>
resource sbcol="0,1,0" : health<25%,50%>
resource sbcol="0,0,1" : health
will display a red health bar below or equal 25%, a green one up to 50% or otherwise a blue one.
If you want to show/hide a bar depending on stacks the usage is similar, < , , 2> will show with at least 2 stacks, < , , , 1> will show up to one stack. You can use all four conditional statements if needed at once.
Advanced options: Logical operations
Often it is necessary to make sure a condition is true before you even consider showing a cd/buff/etc. This can be achieved by logical combination of multi-spell timer entries. Gnosis knows three logical operators, & (and), ? (relaxed and) and * (or). Logical operators have to be placed as the first character of each command (one command per line), otherwise Gnosis will ignore them.
Always start with either & or ? (mixing the two will yield undefined results) and optionally finish with * (or). You can combine as many & or ? as needed (same goes to *).
unit=target resource : health<,25%>
& not cd : Shadow Word: Death
* cd : Shadow Word: Death<,0.5>
cd : Mind Blast
will show if Shadow Word: Death is either not on cooldown or any cooldown remaining below 0.5s, if, and only if your target is at or below 25% health. Otherwise the multi-spell timer bar will show your Mind Blast cooldown. The usage of '...' is not required, I personally use it to show what belongs to the current dependencies block.
Mixed buff & cooldown example
groupbuff nfs="who: name" : Guardian Spirit
cd : Guardian Spirit
This will display the cooldown of Guardian Spirit only if Guardian Spirit is not active on either YourTank1 or YourTank2. Even if you enumerate your entries you can still enter a soring criterion to override priorities. To show on which person Guardian Spirit is active at the moment you could change the name format string to something like "GStar[ -> ]target". The bar would then show "GS -> YourTankX" when active on the given person or just "GS" when displaying the cooldown.
Sorting example
cd : Hymn of Hope
cd : Divine Hymn
cd : Lightwell
sort : minrem
Will always display the shortest remaining cooldown of Hymn of Hope, Divine Hymn and Lightwell.
Name format string override
cd nfs="CD: name" : Chakra
buff : Chakra: Serenity
buff : Chakra: Sanctuary
This will show the current Chakra cooldown with a slightly changed name text (see image above). If Chakra is not on cooldown, it will display the duration of your current Chakra state (if active).
Dots example
aura harmful mine lag casttime unit=target zoom=5 : Vampiric Touch
dot mine lag unit=target : Shadow Word: Pain
Will show the dot (= aura,harmful) including a latency+castime "box" if active, otherwise SW: Pain if active. You can combine entries targeting multiple units by using the unit=xyz command. Without a unit command the default target of the Timer (Unit below Bartype) is used for auras. If the time remaining of Vampiric Touch drops below 5 seconds the bar will zoom in (zoom=5).
Slightly changed dots example
dot unit=target recast=3.0 mine staticdur=25 : Vampiric Touch
Will show your Vampiric Touch debuff (if active on your current target). The command recast=3.0 tells Gnosis to give recast advise when to recast your dot to gain 100% uptime while not losing any casttime, i.e. start the cast when the timer is somewhere inside the "latancy box". Gnosis needs to know the unhasted time between ticks, the 3.0 in the above example is the unhasted time in seconds between Vampiric Touch ticks. Adjust this number according to the dot you want to display. staticdur=25 forces the timer to always show full 25 seconds (even though the statusbar itself will always be less).
Item cooldown example
itemcd : Medallion of the Horde
Will show the cooldown of your PVP trinket if available.
Rune cooldown example:
runecd : 1
runecd : 2
sort : minem
More or less a completely useless example, just to show the required syntax.
Resource example
resource unit=player : altpower
resource unit=player spec=1 : health
resource unit=player spec=2 : power
Shows alternative power if available, otherwise Health for talent spec 1 or Power for talent spec 2.
Health bar example
resource,unit=player,nfs="col<class>who's col<cpre>col<1,1,0>namecol<pre>",tfs="col<1,1,0>r<p>% (t<1>)col<pre>":health
This example creates a healthbar displaying the text shown in the image below.
Boss bar example
buff unit=boss1 : Double Attack
cast unit=boss1 : all
Will show the durationless Double Attack buff sometimes gained by Chimaeron, otherwise will show any cast of Boss 1.
Main configuration tab
- Enable Addon
- Hide Blizzard's castbar
- Hide Blizzard's mirror castbar
- mirror castbar shows the status of breath, fatigue and feign death, best to create one with Gnosis
- Hide Blizzard's pet/vehicle castbar
- Hide Gnosis text messages
- disable status messages from Gnosis
- Automatically create option tables on startup
- creates all GUI elements on startup. Not recommended, Gnosis GUI can use up a lot of memory.
- Select localization
- most locales are translated relatively complete, french is not
- Open first start frame
- allows the user to create default castbar set or load from already existing configurations
- Create basic castbar set (quick start)
- Import bar(s) (reloads interface)
- import one or more bars from strings exported by castbar export feature. This is a normal lua script, don't import if you are unsure whether the script is safe.
- Reset player data (reloads interface)
- resets player profile and reloads interface
Castbars tab
The castbar tab allows to create an unlimited number of castbars. You can create more than one castbar for units like "player", "focus", "target", "arenaX" and more. You can also black-/ and whitelist spells for specific castbars, i.e. you can force a castbar to not or only show while casting one or more selected spells.
Name format string
Enabling the name format string allows you to take full control of how castname & rank are shown on any given castbar.
Following table gives the options for the name format string.
Command | Description |
---|---|
name | shows the spellname |
abbr<cnt> | abbreviates spellnames if longer than cnt, e.g. Hymn of Hope will become HoH will cut single words to length cnt if the spellname is not longer than cnt abbr<cnt> is identical to the name command might not work for every locale |
arabic | arabic numeral for spell rank (if available) |
roman | roman numeral for spell rank (if available) |
rank<text> | text shown if spell rank available |
misc | miscellaneous information shown if no rank information available |
effect | aura effect value, e.g. remaining absorb value of Shield Barrier |
target | show target name (player castbar only) |
txr<text> | text shown if rank information available |
txm<text> | text shown if miscellaneous information available |
txeff<text> | text shown if effect information available |
tar<text> | text shown if target information available (player castbar only) |
tar[text] | same as above, allows usage of -> |
who | display name of casting unit |
tscur | shows remaining item count of items created (tradeskill merge) |
tstot | shows total item count of items created (tradeskill merge) |
txts<text> | show text if tradeskill merge information available |
col<type> | change color to type; type may contain valid spellschool or r,g,b[,a] e.g. col<nature> or col<1.0,1.0,0.0> col<pre> reverts to color before last col<type> col<class> changes the color the your targets class color (if available) use col<cpre> to revert to color before last col<class> |
\n | new line |
- String example (default string when creating new castbar, for this example a priest is casting the lvl80 rank of Flash Heal)
- namecol<1.0,0.0,0.0>txm< (>misctxm<)>col<pre>txts< (>tscurtxts</>tstottxts<)>
- result: Fash Heal
- default string will output name, rank or miscellaneous information and tradeskill information if available
- rank informations tags have been removed from the default name format string due to the cataclysm rank changes
Time format string
Enabling the time format string allows you to take full control of how time is shown on any given castbar.
Following table gives the options for the time format string.
Command | Description |
---|---|
r<x> | remaining casttime in seconds with x decimals |
t<x> | total casttime in seconds with x decimals |
p<x> | spell pushback in seconds with x decimals |
c<x> | (total-remaining) time |
col<type> | change color to type; type may contain valid spellschool or r,g,b[,a] e.g. col<nature> or col<1.0,1.0,0.0> col<pre> reverts to color before last col<type> |
\n | new line |
Important: replace x: s to show a sign and/or m to show time in minutes (if > 60s) ; p to show value in percent
- Default time format string
- col<1,0,0>p<2s>col<pre> r<1m> / t<2m>
- e.g. +0.50 1.0 / 1.50
Channeled Spells tab
Gnosis castbars can show the ticks of channeled spells. This is a feature Shadow Priests have been using for some time now. Gnosis can support all channeled spells as long as they are added to the list. An additional feature of Gnosis is its capability to detect unwanted clipping while channeling. Last but not least Gnosis can combine the ticks of channeled spells into one single Combat Text output. That output can hold multiple information like dps done by the channeled spell.
Special commands in the given output string will be replaced with requested information. All other text will be output as given. Commands are case sensitive.
Command | Description |
---|---|
spellname | shows the spellname |
tickscrits | outputs ticks and crits of spell that just finished to channel e.g. 3Hits 1Crit |
hits | outputs number of hits, can be much higher than the number of ticks for aoe spells |
crits | outputs number of crits |
ticks | outputs number of ticks |
dmg | outputs total damage or healing done |
eh | effective heal (= heal - overheal) |
oh | overheal |
dps | outputs dps or hps done by the spell that just finished to channel |
clipped | shows information whether unwanted clipped occured |
col<type> | change color to type; type may contain valid spellschool or r,g,b[,a] e.g. col<nature> or col<1.0,1.0,0.0> col<pre> reverts to color before last col<type> col<class> changes the color the your targets class color (if available) use col<cpre> to revert to color before last col<class> |
You also have to provide text for Hits, Ticks & Crits if used:
cliptext<your text> , hittext<your text> , crittext<your text> , ticktext<your text>
Examples (default strings):
Mind Sear:
col<shadow>dmg col<pre>col<1,1,0>(spellname) [tickscrits] col<pre>clipped dps DPScliptext<(Clipped) >hittext< Hits>crittext< Crits>ticktext< Ticks>
Healing spells:
col<0,1,0>(spellname - col<1,1,1>targetcol<pre>col<0,1,0>) [tickscrits] +eh <dmg> col<pre>dps HPShittext< Hits>crittext< Crits>ticktext< Ticks>
These are the default values for some spells in regards to the amount of ticks they posess.
Arcane Missiles: 5
Blizzard: 8
Divine Hymn: 4
Drain Life: 5
Drain Soul: 5
Evocation: 4
Health Funnel: 10
Hellfire: 15
Hurricane: 10
Mind Flay: 3
Mind Sear: 5
Penance: 3
Rain of Fire: 4
Tranquility: 4
Combattext/Clip test tab
Use this tab to configure which combat text addon to use and whether to play a sound when an unwanted clip occurs (or for a tick if 'play tick sound' is enabled under the channelled spell tab).
Configurations
Gnosis is always configured on a character basis. I.e. any change you do for one character will not change the settings of other characters. You can store castbars and channeled spells information into as many different configurations as you like and load those settings for other characters.
Localization
Gnosis does not need any special localization to work. Though configuration is localized for a number of different locales. You can select any of the available localizations on the configuration main tab.
Code | Language | Thanks to |
---|---|---|
English | ||
deDE | German | Xploder from Kil'Jaeden EU & archiv |
zhCN | simplified Chinese | wowuicn |
zhTW | traditional Chinese | wowuicn |
koKR | Korean | talkswind & yuk6196 |
ruRU | Russian | StingerSoft |
If you want to help localizing Gnosis or correct localization errors please visit Gnosis' Curseforge site (Localization tab).
Thanks
to ElĂza and Mikaela of Frostwolf EU for testing some of the stuff I'm just to lazy to do myself. Also thanks to Woaden of Proudmoore US for making people aware of Gnosis' existence on the official US forums. I really appreciate it. Special thanks to Endlesshope of Antonidas EU for testing and giving vital feedback.
FAQ
Q Gnosis eats up too much memory!
A Gnosis will eat up more memory than most other castbar addons since it has a lot of features and allows every single castbar you create to have it's own distinctive look. Gnosis has not been developed to be the most lean castbar addon, still I did not disregard memory usage. Since WoW in general does not use much memory (compared to many other games) addon memory usage is probably not a real issue. Also, do not mistake memory usage for CPU usage. Those two values do not correlate at all for Gnosis.
v2.01 decreases memory usage to about 700kB as long as you do not access Gnosis' config GUI. With created GUI tables, Gnosis memory usage will rise above 1MB.
Q How much performance does Gnosis eat up?
A Gnosis' design is quite different to that of castbar addons like Quartz or AzCastbar. All castbars you create will be stored in some sort of table (hash table). Every time the WoW client sends events for castbar creation Gnosis will have to run through that table of castbars. Every module of modular castbar addons will be called each time creation of any castbar is requested, Gnosis will be called just once. For deletion/updating of castbars Gnosis will only look through a list of currently active castbars therefore cutting performance usage down a bit. Again, every module of a modular castbar will be called by every deletion/updating request. Honestly, I doubt you will see much (if any) difference between the approaches. The Gnosis approach just makes it a lot easier to have a virtually unlimited amount of castbars.
Honestly, Gnosis will need more CPU and memory resources than most other castbar addons due to the fact that it just does a lot more. Nonetheless I was recently pleasently surprised by the actual resources consumed (see most recent performance screenshot). On top of that I had a mouseover castbar activated which requires additional constant scanning which Gnosis wouldn't need to do without one.
If you believe addons are the reason for low framerates, I recommend you download one of the addon performance measuring tools like "Broker CPU / Memory / Performance" and check if that's the case for you.
Q What about a super fancy ultra nice border texture?
A Gnosis current sleek (in my opinion obviously) look (v1.30+) is just the way it was supposed to be. Therefore I will not add any kind of border texture support to Gnosis. If you really need some sort of special look I recommend you try out one of those panel mods. Remark: Castbar borders act as an indicator for (non) interruptible spells.
Example with kgpanels (every other panel mod should do):
- Create a new panel and move it around your castbar. The castbar name in this example is Player. If the castbar is named differently replace Player with the correct name. If you encounter errors you might want to change the castbar name (newly create or copy existing castbar to new name).
- Add a similar script to the following to the panels OnLoad script handler to make sure bar is shown/hidden/faded out the way the castbar is.
- Be happy! I won't give any support if this does not work for some reason. Please don't ask.
if(Player) then Player:SetScript("OnShow", function() self:Show(); end); Player:SetScript("OnHide", function() self:Hide(); end); if(Player:IsVisible()) then self:Show(); else self:Hide(); end hooksecurefunc(Player, "SetAlpha", function(this,val) self:SetAlpha(val); end); end
Q Anchoring to a frame?
A From v1.95 onwards Gnosis allows to anchor castbars to other frames or the mouse cursor. To find out the name of a given frame hover your mouse over the frame and execute following script. The frame's name will be printed to the default chat frame.
/script print(GetMouseFocus():GetName())
Q Name format string. Huh?
A The name format string gives you the option to output text to the castbar the way you want it to be. The table of commands that are simply repalced with the information you requested can be found somewhat earlier in the description.
The default name format string (nfs) displays spellname, misc information and trade skill merge information. Rank information has been removed from the default nfs due to the cataclysm rank changes:
namecol<1.0,0.0,0.0>txm< (>misctxm<)>col<pre>txts< (>tscurtxts</>tstottxts<)>
Nfs, same as above but also showing the class colored target of your casts (only available for player castbars):
namecol<1.0,0.0,0.0>txm< (>misctxm<)>col<pre>txts< (>tscurtxts</>tstottxts<)>tar[ -> ]col<class>targetcol<cpre>
Nfs showing spellname and the unit name who is casting:
name (who)
I hope you get the idea.
Q Time format string. Again, huh?
A The time format string allows you to format displaying of remaining time, etc. individually. The tabe of commands can again be found in the description.
Default time format string (tfs) shows remaining time (one decimal, see the <1> modifier), total casttime (two decimals, see <2>) and red colored pushback time (two decimals) if available. If time exceeds one Minute the <m> modifier forces time to be displayed in minutes:
col<1,0,0>p<2s>col<pre> r<1m> / t<2m>
Modifiers: Adding a <s> modifier forces Gnosis to always add a sign to the displayed time. This is useful for pushback times, pushback can be positive and negative (additional casttime for non channeled spells, reduced channel time for channeled spells). Adding a <m> modifier forces output to display in minutes if the time is actually more than one minute. The given decimal, e.g. t<2> tells Gnosis how many decimals should be shown.
Q How to change coordinates of name and time strings, it doesn't work?
A To be able to independently change coordinates of name and time strings you have to select "Free alignment" of name to time alignment. Otherwise these strings will be glued together with a combined y-coordinate.
Q Please give us the configuration for the Shadow Priest template screenshot (v4.20)!
A See link at the top of the description for an updated example.
Q Do we still need tick markers on our castbars with 4.x (including MoP)?
A Simple answer: Yes! You can still clip channels (intentional and unintentional) and lose ticks due to spell pushback. Gaining ticks on the next cast when chain-channeling makes this feature even more important nowadays.