First of all, what is HealComm?
HealComm is a library for World of Warcraft Classic developed to send information about healing prediction to other players. Unlike retail, the classic API does not allow for us to retrieve this information. To solve this a library called LibHealComm was developed that attempts to work around this. It does so by broadcasting this prediction information to other players to replicate what the retail API can do.
So retail prediction in classic: Sounds amazing, right?
So how do I get this sorcery?
First of all you need unit frames that have support for HealComm.
A few examples are: ElvUI, HealCommClassic, VuhDo, Shadowed Unit Frames, Luna Unit Frames, and many more.
Keep in mind that even though the frames might support it, that does not mean that HealComm is included. This means that while the healing prediction will work with HealComm installed, it is not a part of the addon. As of writing I can say that the addons marked in bold have included it and will allow such that other addons can use it.
If you don't have the library installed then you have to grab the dedicated addon LibHealComm-4.0.
If you're uncertain as to if you have it or not, then note that installing the dedicated addon doesn't break anything. In fact it is highly encouraged to install as the dedicated addon is updated each time the library is. Because of this you'll always have the latest version.
Just hours after I originally wrote this post, they updated the library to fix a minor mistake that made it such that healing prediction didn't work in battlegrounds. Because of the way the library works it'll only help others who have updated the library. As such everyone who solely relies on their unit frames to include it and update it, will not be able to take advantage of the fix as quickly.
Technical Mumbo Jumbo
If you're interested in some of the technical aspects of all of this, below are some brief explanations.
How does it communicate?
It works the same way as addons such as RCLootCouncil, which can send loot council information to other players.
This is done using SendAddonMessage and listening for this information using the CHAT_MSG_ADDON event.
By calculating healing averages of different heals and taking spell power into account, it broadcasts information each time you heal a person, with information about who you're healing, what kind and how much. This means it's half guess work, and it also cannot (at the moment anyways) take spell batching into account, so you might be able to see the prediction disappear but the health not yet changing.
When I previously used the word broadcasting, then it's because the game has addon chat channels. How the addon is communicating is similar to this:
A list of the different addon channels are listed below, these can also be found on Gamepedia.
- "PARTY" - Self explanatory
- "RAID" - To the raid if applicable, or automatically downgraded to "PARTY"
- "INSTANCE_CHAT" - Communication between grouped players in instanced content such as dungeons, raids and battlegrounds
- "WHISPER" - To a single player who is on the same or connected realm.
- "GUILD" / "OFFICER" - Self explanatory
- "CHANNEL" (retail only) - This is a custom channel that can be used globally, it is disabled for classic to avoid having things like LFG addons. Interestingly enough this limitation didn't actually exist in vanilla.
- "SAY" / "YELL" (classic only) - Self explanatory; implemented as an alternative to "CHANNEL"
The actual payload is obviously different in practice, so the text is not easily humanly readable, but the picture should give a good idea of how it works.
What about the LibHealComm addon?
As for the programming side of things, then here's a brief explanation.
When making libraries for World of Warcraft you often use a library called LibStub that handles dependency management. When you define the library you define both the name of your library and a version number.
local MyLib = LibStub:NewLibrary("MyLibrary", 2)
The version number is used for checking if you're trying to define a newer version of the library, in which case it will overwrite it and use that one instead. This is what makes it possible for the dedicated library to work with your existing addons.
Here's an example of how a library definition that with a higher priority would look like:
local MyLib = LibStub:NewLibrary("MyLibrary", 3)
The second one in this case has a higher version number and will therefore take priority. That is if you check the return type of the definition and make sure it's not false / null. If that is the case then it's because a library is already defined and the library is newer or equals to what you're trying to define.
local MyLib = LibStub:NewLibrary("MyLibrary", 3)
if( not MyLib ) then return end