H.H.T.D.
H.H.T.D.
In World of Warcraft healers have to die (H.H.T.D). This is a cruel truth that you're taught very early in the game. This add-on helps you influence this unfortunate destiny in a way or another depending on the healer's side...
This add-on is now known as H.H.T.D.
I originally chose the original name as a provocation to make one of the basic cruel truths of World of Warcraft perfectly obvious to everyone. Now I find this name too harsh, too long and mostly not specific enough to WoW.
As an author I could not stand that name anymore. This add-on does have an existence (and meaning) both in WoW and in the real world where obviously we don't want the death of our beloved healers...
While H.H.T.D is just an acronym of the original name, it will stay in World of Warcraft where it belongs.
Current features:
HHTD automatically adds healer symbols on top of players nameplate indicating their class and healing rank. Unlike other add-ons it only takes into account actively healing players. (It uses different symbols for friends and foes).
HHTD lets you apply custom marks on top of any unit's nameplate. These are the same marks as the default raid markers but you can set as many as you want and customize their look. These marks persist across game sessions. (They are only visible to you)
IMPORTANT NOTE: You have to enable nameplates, else you won't see any healer symbol!
HHTD lets you announce through a customizable message who the enemy and friendly healers are (using the Raid Warning channel if possible).
It will also help you protect the healers who are on your side alerting you when they are being attacked (check the option panel for details).
Helps you target healers easily when they are in a pack.
All of this applies to PVP and PVE.
NOTE: Type /HHTDG to open the configuration panel. There are many settings to check!
HHTD's options are not directly available in the "Interface" panel due to ongoing tainting issues Blizzard is not willing to fix.
That player is not a healer?
If you see a player marked as healer that should not be:
If their mark's background is NOT grey, check the 'Logging' option in the option panel (/HHTDG) ; then when you see such a player, reopen the option panel and check the content of the 'Logs' tab and report to me by opening a ticket. Please avoid comments on Curse.com as it's impossible to follow what happens there).
If their mark's background is grey then enable the 'Healer specialization detection' option so as to only report specialized healers ignoring others.
Also note that the healer's rank is displayed as a number in the center of the displayed mark so you can judge the importance of that player in the healing currently being done (the lower the number, the better the healer).
How it works
HHTD uses the combat log events to detect friendly and enemy healers who are currently healing other players (during the last 60s). HHTD detects specialized healers spells (for human players only) and differentiates specialized healers from hybrid ones.
HHTD also lets you choose a specified amount of healing healers have to reach before being marked as such (50% of your own health by default). This threshold is the only criterion used for NPCs.
When a healer is identified it will be marked with a healer symbol above their nameplate. If the healer is specialized, the symbol's background will be colored according to their class. In other cases the background will be grey.
In all cases a number in the center of the symbol indicates the rank of the healer, the lowest the number the better the healer (ie: '1' represents the most effective healer while '9' is the least effective).
You can force HHTD to only report specialized healers through HHTD's options (/hhtdg).
Needless to say that self-heals and heals to pets are filtered out.
Commands
/HHTDP (or /hhtdp) posts healers name to the raid channel ordered by effectiveness for all to see (Will use the Raid Warning channel if possible).
You need to configure the messages in the announce module options first.
You can bind the above command to a key (WoW key-bindings interface)
/HHTDG opens option panel
/HHTD gives you access to the command line configuration interface (useful for changing settings through macros...)
Planned features
- Detection when a friendly healer is being attacked and alert others through /yell, /say and emote.
Compatibility
HHTD is only compatible with nameplate add-ons which have been coded responsibly and do not modify internal parts of Blizzard nameplates (a very selfish behaviour as it prevents any other add-on from re-using them).
HHTD will detect these incompatibilities and report to you so that you can ask the culprit add-on authors to fix their code and make it compatible with ALL nameplate add-ons.
Guidelines for other add-on authors:
Do not call :Hide() or :Show() on nameplates' base frame. This breaks nameplate tracking for other add-ons by unduly firing OnHide/OnShow hooks...
Instead, make its sub-frames invisible by changing their size and/or setting them to the empty (not nil) texture. (check out how TidyPlates does)
Do not call :SetParent() on nameplates' subframes, this would prevent other add-ons from finding and hooking nameplate elements.
Do not use SetScript() EVER. You don't need it. :SetScript() shall only be used on frames YOU create. You can simply replace all your SetScript() calls by HookScript().
Videos
Here is a video by Hybridpanda featuring HHTD in the Eye of the Storm battleground:
YouTube - This makes me a sad Panda
Articles
Here are two excellent articles about HHTD by Cynwise (A must read if you have some doubts about the fairness of this add-on!) :
HHTD and the PvP Addons Arms Race
Using HHTD to Protect Friendly Healers
Here is another article written by Gevlon (a PVP healer).
type /hhtdg to open the configuration interface, or /hhtd for command-line access
Comments and suggestions are welcome :-)
To report issues or ask for new features, use the ticket system.
Bitcoin donation address: 1JkA5Ns1dMQLM4D8HUsbXyka6yhp312KnN
can't play without it!! but i'm wondering if there's a way to either move the announcement box "healer friend is being attacked" at the top of the screen, or to change the size of the text? it's overwriting an important HUD that i have in that position.
thanks so much for the addon!
I'm getting this error when I login (newest patch)
2489x ...ibNameplateRegistry-1.0/LibNameplateRegistry-1.0-20.lua:620: attempt to call upvalue 'GetMouseFocus' (a nil value)
[string "@HHTD/Libs/LibNameplateRegistry-1.0-20/LibNameplateRegistry-1.0.lua"]:620: in function `?'
[string "@HHTD/Libs/LibNameplateRegistry-1.0-20/LibNameplateRegistry-1.0.lua"]:892: in function <...ibNameplateRegistry-1.0/LibNameplateRegistry-1.0.lua:891>
Locals:
self = <table> {
callbacks = <table> {
}
UsedCallBacks = 8
EventFrame = Frame {
}
mixinTargets = <table> {
}
}
unitName = ""
mouseoverNameplate = nil
data = nil
(*temporary) = nil
(*temporary) = "attempt to call upvalue 'GetMouseFocus' (a nil value)"
GetMouseFocus = nil
WorldFrame = WorldFrame {
}
ActivePlates_per_frame = <table> {
}
HighlightFailsReported = false
INFO2 = 4
WARNING = 2
In reply to Mythris:
This is fixed in the latest release
Hi there
Just wanted to say that I love your addon and that it has made a big difference to my PvP. Thank you!
Just FYI some bug notifications have been popping up recently:
H.H.T.D.: Debug:[3785.547]: RequestBattlefieldScoreData()
H.H.T.D.: Debug:[4428.280]: (HHTD update required) Bad spell class for: Penance (removed) detected: PRIEST real: WARRIOR
H.H.T.D.: Debug:[4428.280]: (HHTD update required) Invalid healer spec spell (spell removed): Penance DAMAGER Arms
Once again, thanks for the addon!
In reply to eschaton:
Thank you for the information. Can you tell me on which version of WoW you saw those messages?
In reply to archarodim: No problem. Anything I can do to assist, I will.
That was in Retail.
I had some more error reports yesterday in an epic BG (it was Alterac Valley but I didn't copy them as you hadn't yet responded to the first few posted above).
Will make sure to keep a record of any that pop up from now on and post them here, if that's something that would be helpful to you.
So far:
H.H.T.D.: Debug:[2123.537]: RequestBattlefieldScoreData() in Ashran
H.H.T.D.: Debug:[1811.674]: RequestBattlefieldScoreData() in Alterac Valley
H.H.T.D.: Debug:[4090.352]: RequestBattlefieldScoreData() in Deepwind Gorge (battleground blitz)
In reply to eschaton:
In reply to eschaton:
This is shown because of the alpha version where debug is enabled at the warning level.
Since 10.2.5 on macOS Wow Retail Client, this one add-on is failing and causing all my addons to not display class colors.
`
function HHTD:CreateClassColorTables () -- {{{
if RAID_CLASS_COLORS then
local class, colors;
for class in pairs(RAID_CLASS_COLORS) do
if LC[class] then -- thank to a wonderful add-on that adds the wrong translation "Death Knight" to the global RAID_CLASS_COLORS....
HHTD:GetClassHexColor(class);
elseif not (HHTD_C.WOWC and NON_CLASSIC_CLASSES[class]) then
RAID_CLASS_COLORS[class] = nil; -- Eat that!
self:Print("|cFFFF0000Stupid value found in _G.RAID_CLASS_COLORS table|r\nThis will cause many issues (tainting), HHTD will display this message until the culprit add-on is fixed or removed, the Stupid value is: '", class, "'");
end
end
else
HHTD:Debug(ERROR, "global RAID_CLASS_COLORS does not exist...");
end
end -- }}}
`
local LC = _G.LOCALIZED_CLASS_NAMES_MALE; is defined elseware and seems to the source of other addon's failing since Dragonflight 10.2.5. I do not have those offending addon's installed. When I run without H.H.T.D, class colors (text, maps dots, raid frames, nameplates) return.
In reply to dannyjm777:
I look into this problem, just saw your comment, you should have created an issue there: https://www.wowace.com/projects/h-h-t-d/issues I would have noticed it earlier
In reply to dannyjm777:
I couldn't reproduce this problem with the current version of WoW... I've nonetheless released a new alpha version of HHTD were it no longer removes bad entries from the RAID_CLASS_COLORS. I'm not sure what the problem is but it's probably a conflict with another add-on...
Both these come up together not sure if they are connected (Battleground enemies and HHTD)
1x [ADDON_ACTION_BLOCKED] AddOn 'BattleGroundEnemies' tried to call the protected function 'IsItemInRange()'.
[string "@!BugGrabber/BugGrabber.lua"]:481: in function <!BugGrabber/BugGrabber.lua:481>
[string "=[C]"]: ?
[string "@BattleGroundEnemies/Main.lua"]:523: in function `UpdateAll'
[string "@BattleGroundEnemies/Main.lua"]:2830: in function <BattleGroundEnemies/Main.lua:2825>
Locals:
_ = Frame {
RegisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
0 = <userdata>
UnregisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
SetScript = <function> defined @!BugGrabber/BugGrabber.lua:487
}
event = "ADDON_ACTION_BLOCKED"
events = <table> {
ADDON_ACTION_BLOCKED = <function> defined @!BugGrabber/BugGrabber.lua:553
ADDON_ACTION_FORBIDDEN = <function> defined @!BugGrabber/BugGrabber.lua:553
PLAYER_LOGIN = <function> defined @!BugGrabber/BugGrabber.lua:547
LUA_WARNING = <function> defined @!BugGrabber/BugGrabber.lua:562
ADDON_LOADED = <function> defined @!BugGrabber/BugGrabber.lua:507
}
--------------------------------------------------------------------
1x [ADDON_ACTION_BLOCKED] AddOn 'HHTD' tried to call the protected function 'CheckInteractDistance()'.
[string "@!BugGrabber/BugGrabber.lua"]:481: in function <!BugGrabber/BugGrabber.lua:481>
[string "=[C]"]: ?
[string "@HHTD/Core.lua"]:1702: in function `?'
[string "@DataStore/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:109: in function <...ore/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:109>
[string "=[C]"]: ?
[string "@DataStore/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:19: in function <...ore/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:15>
[string "@DataStore/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:54: in function `Fire'
[string "@DataStore/libs/AceEvent-3.0-4/AceEvent-3.0.lua"]:120: in function <DataStore/libs/AceEvent-3.0/AceEvent-3.0.lua:119>
Locals:
_ = Frame {
RegisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
0 = <userdata>
UnregisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
SetScript = <function> defined @!BugGrabber/BugGrabber.lua:487
}
event = "ADDON_ACTION_BLOCKED"
events = <table> {
ADDON_ACTION_BLOCKED = <function> defined @!BugGrabber/BugGrabber.lua:553
ADDON_ACTION_FORBIDDEN = <function> defined @!BugGrabber/BugGrabber.lua:553
PLAYER_LOGIN = <function> defined @!BugGrabber/BugGrabber.lua:547
LUA_WARNING = <function> defined @!BugGrabber/BugGrabber.lua:562
ADDON_LOADED = <function> defined @!BugGrabber/BugGrabber.lua:507
}
------------------------------------------------------------
1x FrameXML/AuraUtil.lua:46: script ran too long
[string "@FrameXML/AuraUtil.lua"]:46: in function <FrameXML/AuraUtil.lua:38>
[string "@FrameXML/AuraUtil.lua"]:65: in function `ForEachAura'
[string "@BattleGroundEnemies/Main.lua"]:1263: in function `UNIT_AURA'
[string "@BattleGroundEnemies/Main.lua"]:519: in function `UpdateAll'
[string "@BattleGroundEnemies/Main.lua"]:2830: in function <BattleGroundEnemies/Main.lua:2825>
Locals:
unit = "raid4target"
filter = "HARMFUL"
func = <function> defined @BattleGroundEnemies/Main.lua:1263
usePackedAura = true
continuationToken = nil
n = 17
(for index) = 16
(for limit) = 17
(for step) = 1
i = 16
slot = 145
done = nil
auraInfo = <table> {
spellId = 374557
isBossAura = false
duration = 5
expirationTime = 252454.921000
isFromPlayerOrPlayerPet = true
points = <table> {
}
icon = 1117877
nameplateShowPersonal = false
nameplateShowAll = false
auraInstanceID = 1167658
timeMod = 1
isRaid = false
isHarmful = true
canApplyAura = false
name = "Brittle"
isHelpful = false
applications = 0
isNameplateOnly = false
sourceUnit = "raid9"
isStealable = false
}
(*temporary) = <table> {
spellId = 374557
isBossAura = false
duration = 5
expirationTime = 252454.921000
isFromPlayerOrPlayerPet = true
points = <table> {
}
icon = 1117877
nameplateShowPersonal = false
nameplateShowAll = false
auraInstanceID = 1167658
timeMod = 1
isRaid = false
isHarmful = true
canApplyAura = false
name = "Brittle"
isHelpful = false
applications = 0
isNameplateOnly = false
sourceUnit = "raid9"
isStealable = false
}
(*temporary) = "raid4target"
(*temporary) = 145
(*temporary) = "script ran too long"
In reply to sunnnshine2:
fixed in the latest release, thanks for reporting
hi same i got this error specially when alot of mobs pulled
20x [ADDON_ACTION_BLOCKED] AddOn 'HHTD' tried to call the protected function 'CheckInteractDistance()'.
[string "@!BugGrabber/BugGrabber.lua"]:481: in function <!BugGrabber/BugGrabber.lua:481>
[string "=[C]"]: ?
[string "@HHTD/Core.lua"]:1702: in function `?'
[string "@TomTom/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:109: in function <...Tom/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:109>
[string "=[C]"]: ?
[string "@TomTom/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:19: in function <...Tom/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:15>
[string "@TomTom/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:54: in function `Fire'
[string "@TomTom/libs/AceEvent-3.0-4/AceEvent-3.0.lua"]:120: in function <...aceTomTom/libs/AceEvent-3.0/AceEvent-3.0.lua:119>
Locals:
_ = Frame {
RegisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
0 = <userdata>
UnregisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
SetScript = <function> defined @!BugGrabber/BugGrabber.lua:487
}
event = "ADDON_ACTION_BLOCKED"
events = <table> {
ADDON_ACTION_BLOCKED = <function> defined @!BugGrabber/BugGrabber.lua:553
ADDON_ACTION_FORBIDDEN = <function> defined @!BugGrabber/BugGrabber.lua:553
PLAYER_LOGIN = <function> defined @!BugGrabber/BugGrabber.lua:547
LUA_WARNING = <function> defined @!BugGrabber/BugGrabber.lua:562
ADDON_LOADED = <function> defined @!BugGrabber/BugGrabber.lua:507
}
In reply to oxed:
fixed in latest release, thanks for reporting
Hello. In 10.2, an error started to be issued:
12x [ADDON_ACTION_BLOCKED] Модификация 'HHTD' пыталась вызвать защищенную функцию 'CheckInteractDistance()'.
[string "@!BugGrabber/BugGrabber.lua"]:481: in function <!BugGrabber/BugGrabber.lua:481>
[string "=[C]"]: ?
[string "@HHTD/Core.lua"]:1702: in function `?'
[string "@AdiBags/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:109: in function <...ags/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:109>
[string "=[C]"]: ?
[string "@AdiBags/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:19: in function <...ags/libs/CallbackHandler-1.0/CallbackHandler-1.0.lua:15>
[string "@AdiBags/libs/CallbackHandler-1.0-8/CallbackHandler-1.0.lua"]:54: in function `Fire'
[string "@DataStore/libs/AceEvent-3.0-4/AceEvent-3.0.lua"]:120: in function <DataStore/libs/AceEvent-3.0/AceEvent-3.0.lua:119>
Locals:
_ = Frame {
RegisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
0 = <userdata>
UnregisterEvent = <function> defined @!BugGrabber/BugGrabber.lua:487
SetScript = <function> defined @!BugGrabber/BugGrabber.lua:487
}
event = "ADDON_ACTION_BLOCKED"
events = <table> {
ADDON_ACTION_BLOCKED = <function> defined @!BugGrabber/BugGrabber.lua:553
ADDON_ACTION_FORBIDDEN = <function> defined @!BugGrabber/BugGrabber.lua:553
PLAYER_LOGIN = <function> defined @!BugGrabber/BugGrabber.lua:547
LUA_WARNING = <function> defined @!BugGrabber/BugGrabber.lua:562
ADDON_LOADED = <function> defined @!BugGrabber/BugGrabber.lua:507
}
In reply to Iluvatarglk: I've seen this too. CheckInteractDistance() can no longer be called during combat.
NOTE TO DEVELOPER: I've seen other addons fix this by replacing that call with UnitInRange(). However, in this case, that means the "in range" distance will be increased from 27 yards to 40. Not sure if that would cause a different problem.
In reply to UppyDan:
Thanks for the tip. Well the feature being blocked is the alert displayed when a nearby friendly healer is under attack, UnitInRange() will be ok since it adapts to the player's abilities but the problem is that it only works for units in the player's party or raid... So this might have side effects on this feature depending on how people were using it.
Do we know why Blizzard did that?
I've released a new alpha version that fixes this issue. If you could test it and report if you still see alerts when a friendly healers is being attacked that would be great.
In reply to archarodim: with the new alpha version, no error messages have been issued yet. Thanks! In addition, Decursive stopped giving out a window about a bunch of bugs found, which led to friezes during battles)
Thank you for updating!