Open Raid is a library to share the player information while playing in a group or raid.
Install:
Place the library at your addon folder/libs/LibOpenRaid/
Inside LibOpenRaid there's 5 files.
Add to your libs.xml located in the root folder of the addon or
if it is located inside the Libs folder.
Close and open the game client.
Inside your lua file, get the library object, you need to do this in order to grab a reference of the library:
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0")
With this object, you can start querying the library for information.
Functions:
local sentRequest = openRaidLib.RequestAllData()
Request to all players in the group to send infomation on: cooldowns, gear and player data.
Instants after calling this, expect to receive several callbacks.
COOLDOWNS:
--get all cooldowns from all units
local allUnitsCooldowns = openRaidLib.GetAllUnitsCooldown()
allUnitsCooldowns = {
["playerName1"] = {[cooldownSpellId] = cooldownInfo, [cooldownSpellId] = cooldownInfo, ...}
["playerName2"] = {[cooldownSpellId] = cooldownInfo, [cooldownSpellId] = cooldownInfo, ...}
["playerName3"] = {[cooldownSpellId] = cooldownInfo, [cooldownSpellId] = cooldownInfo, ...}
}
--get all cooldowns from a single unit
local unitCooldows = openRaidLib.GetUnitCooldowns(unitId [,filter])
@unittId: "player", "target", "party2", "raid12", ...
@filter: "defensive-raid", "defensive-target", "defensive-personal", "ofensive", "utility", "interrupt"
can pass more than one filter separating by comma, example: "defensive-raid, defensive-target"
unitCooldows = {
[cooldownSpellId] = cooldownInfo,
[cooldownSpellId] = cooldownInfo,
[cooldownSpellId] = cooldownInfo,
}
--get a cooldownInfo of a single spell from any unit
local cooldownInfo = openRaidLib.GetUnitCooldownInfo(unitId, spellId)
--get cooldown timers to use with progress bar or cooldown frames, percent are normalized (0 to 1), timeLeft is seconds, minValue/maxValue/currentValue are in GetTime() time space, amount of charges
--minValue is the same as startTime, maxValue is the same as expirationTime, currentValue is GetTime()
--by using unitID and spellID
local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromUnitSpellID(unitId, spellId)
--by using a cooldown info
local isReady, normalizedPercent, timeLeft, charges, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
--add spells to a custom filter
--to change the spells in the filter just call it again with different spells, spells not included in the new table are removed from the filter
--to remove the filter, call it with an empty table
@filterName: any string containing alphanumeric characters
@spells: a table containing spellIds {spellId, spellId, spellId, ...}
openRaidLib.AddCooldownFilter(filterName, spells)
--get a list of filters which a spell has, returns a table in map format: {[filterName] = true}
--@spellId: the ID of a spell
--@defaultFilterOnly (bool): if true only return built-in filters, example: "defensive-raid", "ofensive".
--@customFiltersOnly (bool): if true onlt return a list of custom filters where the spell was added.
local filterListArray = openRaidLib.GetSpellFilters(spellId, defaultFilterOnly, customFiltersOnly)
--request information about a spell for all units in the raid, units which has this cooldown will report back with a "CooldownUpdate" event
openRaidLib.RequestCooldownInfo(spellId)
EQUIPMENT:
local allPlayersGear = openRaidLib.GetAllUnitsGear()
allPlayersGear = {
["playerName1"] = playerGear,
["playerName2"] = playerGear,
["playerName3"] = playerGear,
}
local playerGear = openRaidLib.GetUnitGear(unitId)
playerGear = {
.durability = number
.ilevel = number
.noGems = {socketId}
.noEnchants = {socketId}
.weaponEnchant = number (oils)
.equippedGear = {
{
.slotId = number
.gemSlots = number
.itemLevel = number
.itemLink = string
.itemQuality = number
.itemId = number
.itemName = string
.enchantId = number
.gemId = number
.isTier = boolean
}
}
}
UNIT INFORMATION
local allUnitsInfo = openRaidLib.GetAllUnitsInfo()
allUnitsInfo = {
["unitName1"] = unitInfo,
["unitName2"] = unitInfo,
["unitName3"] = unitInfo,
}
local unitInfo = openRaidLib.GetUnitInfo(unitId)
unitInfo = {
.specId = number
.specName = string
.role = string
.renown = number
.covenantId = number
.talents = {talentId, talentId, talentId, ...}
.pvpTalents = {talentId, talentId, talentId}
.conduits = {spellId, conduitLevel, spellId, conduitLevel, spellId, conduitLevel, ...}
.class = string class eng name 'ROGUE'
.classId = number
.className = string class localized name
.name = string name without realm
.nameFull = string name with realm 'unitName-ServerName'
}
KEYSTONE
--send and receive mythic+ keystone information and works only in retail
--the event "KeystoneUpdate" is triggered on receive keystone info from another player
local allKeystoneInfo = openRaidLib.GetAllKeystonesInfo()
allKeystoneInfo = {
["unitName1"] = keystoneInfo,
["unitName2"] = keystoneInfo,
["unitName3"] = keystoneInfo,
}
--@mapID and @challengeMapID are the instanceMapID, also obtained with GetInstanceInfo(), can be used to retrive map name with GetRealZoneText(mapID)
--@mythicPlusMapID is used with C_ChallengeMode.GetMapUIInfo(mythicPlusMapID) to retrive the map name for the dungeon
--@classID: class id as number (1 to 12)
--@rating: mythic plus rating on the current season
local keystoneInfo = openRaidLib.GetKeystoneInfo(unitId)
keystoneInfo = {
.level = number,
.mapID = number,
.challengeMapID = number,
.classID = number,
.rating = number,
.mythicPlusMapID = number,
}
--request all online players in the guild to send their keystone information
--this call fails if the player isn't in a guild
local requestSent = openRaidLib.RequestKeystoneDataFromGuild()
--request to players in your party to send their keystone information
--this call fails if the player is in raid
local requestSent = openRaidLib.RequestKeystoneDataFromParty()
--request to players in your raid to send their keystone information
--this call fails if not in a raid group
local requestSent = openRaidLib.RequestKeystoneDataFromRaid()
FLASK and FOOD buffs
--@spellId: a regular spellId
local flaskInfo = openRaidLib.GetFlaskInfoBySpellId(spellId)
--@auraInfo: UnitAuraInfo -> https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo see C_UnitAuras.GetAuraDataBySlot()
local flaskTier = openRaidLib.GetFlaskTierFromAura(auraInfo)
--@spellId: a regular spellId
local foodInfo = openRaidLib.GetFoodInfoBySpellId(spellId)
--@auraInfo: UnitAuraInfo -> https://wowpedia.fandom.com/wiki/Struct_UnitAuraInfo see C_UnitAuras.GetAuraDataBySlot()
local foodTier = openRaidLib.GetFoodTierFromAura(auraInfo)
Callbacks:
===================================================================================================================================
"CooldownListUpdate": triggers when the lib received a list of cooldowns from another unit in the group.
@unitId: which unit got updated
@unitCooldows: list of cooldowns of the unit
@allUnitsCooldowns: a list of all players with their cooldowns
===================================================================================================================================
function MyAddonObject.OnReceiveCooldownListUpdate(unitId, unitCooldows, allUnitsCooldowns)
--regular iteration among the group
for i = 1, GetNumGroupMembers() do
local unitId = "raid"..i
local thisUnitCooldowns = openRaidLib.GetUnitCooldowns(unitId, "defensive-raid, defensive-target")
end
--using the 'unitCooldows' table passed for the updated unit
for spellId, cooldownInfo in pairs(unitCooldows) do
--minValue, maxValue, currentValue is the same as startTime, expirationTime, GetTime()
local isReady, timeLeft, charges, normalizedPercent, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
--statusbar frame
local statusbar = CreateFrame("statusbar", "MyStatusBar", UIParent)
statusbar:SetMinMaxValues(minValue, maxValue)
statusbar:SetValue(currentValue)
--cooldown frame
local cooldownFrame = CreateFrame("cooldown", "MyCooldownFrame", UIParent)
local startTime = minValue
CooldownFrame_Set(cooldownFrame, startTime, cooldownDuration, timeLeft > 0)
--or
cooldownFrame:SetCooldown(startTime, cooldownDuration)
end
--this event also passes a table with all player cooldowns
for unitName, unitCooldows in pairs(allUnitsCooldowns) do
for spellId, cooldownInfo in pairs(unitCooldows) do
--minValue, maxValue, currentValue is the same as startTime, expirationTime, GetTime()
local isReady, timeLeft, charges, normalizedPercent, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
--statusbar frame
local statusbar = CreateFrame("statusbar", "MyStatusBar", UIParent)
statusbar:SetMinMaxValues(0, 1)
statusbar:SetValue(normalizedPercent)
--cooldown frame
local cooldownFrame = CreateFrame("cooldown", "MyCooldownFrame", UIParent)
local startTime = minValue
CooldownFrame_Set(cooldownFrame, startTime, cooldownDuration, timeLeft > 0)
--or
cooldownFrame:SetCooldown(startTime, cooldownDuration)
end
end
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "CooldownListUpdate", "OnReceiveCooldownListUpdate")
===================================================================================================================================
"CooldownUpdate": triggered when an unit in the group uses a cooldown or the timeleft of a cooldown of an unit got an update
@unitId: which unit got the update
@spellId: id of the cooldown spell
@cooldownInfo: a table containing information about the cooldown time
@unitCooldows: list of cooldowns of the unit
@allUnitsCooldowns: a list of all players and their cooldowns
===================================================================================================================================
function MyAddonObject.OnReceiveCooldownUpdate(unitId, spellId, cooldownInfo, unitCooldows, allUnitsCooldowns)
--minValue, maxValue, currentValue is the same as startTime, expirationTime, GetTime()
local isReady, timeLeft, charges, normalizedPercent, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
--statusbar frame
local statusbar = CreateFrame("statusbar", "MyStatusBar", UIParent)
statusbar:SetMinMaxValues(minValue, maxValue)
statusbar:SetValue(currentValue)
--cooldown frame
local cooldownFrame = CreateFrame("cooldown", "MyCooldownFrame", UIParent)
local startTime = minValue
CooldownFrame_Set(cooldownFrame, startTime, cooldownDuration, timeLeft > 0)
--or
cooldownFrame:SetCooldown(startTime, cooldownDuration)
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "CooldownUpdate", "OnReceiveCooldownUpdate")
===================================================================================================================================
"CooldownAdded": triggered when an unit get a new cooldown
@unitId: which unit got the update
@spellId: id of the cooldown spell
@cooldownInfo: a table containing information about the cooldown time
@unitCooldows: list of cooldowns of the unit
@allUnitsCooldowns: a list of all players and their cooldowns
===================================================================================================================================
function MyAddonObject.OnUnitNewCooldown(unitId, spellId, cooldownInfo, unitCooldows, allUnitsCooldowns)
--minValue, maxValue, currentValue is the same as startTime, expirationTime, GetTime()
local isReady, timeLeft, charges, normalizedPercent, minValue, maxValue, currentValue, cooldownDuration = openRaidLib.GetCooldownStatusFromCooldownInfo(cooldownInfo)
local statusbar = CreateFrame("statusbar", "MyStatusBar", UIParent)
statusbar:SetMinMaxValues(minValue, maxValue)
statusbar:SetValue(currentValue)
--cooldown frame
local cooldownFrame = CreateFrame("cooldown", "MyCooldownFrame", UIParent)
local startTime = minValue
CooldownFrame_Set(cooldownFrame, startTime, cooldownDuration, timeLeft > 0)
--or
cooldownFrame:SetCooldown(startTime, cooldownDuration)
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "CooldownAdded", "OnUnitNewCooldown")
===================================================================================================================================
"CooldownRemoved": triggered when an unit lost a cooldown spell
@unitId: which unit got the update
@spellId: id of the cooldown spell
@unitCooldows: list of cooldowns of the unit
@allUnitsCooldowns: a list of all players and their cooldowns
===================================================================================================================================
function MyAddonObject.OnUnitLostCooldown(unitId, spellId, unitCooldows, allUnitsCooldowns)
--the unit lost a cooldown
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "CooldownRemoved", "OnUnitLostCooldown")
===================================================================================================================================
"CooldownListWipe": when the list of cooldowns get a wipe, usually when the player leave the group
===================================================================================================================================
function MyAddonObject.OnCooldownListWipe(allUnitsCooldowns)
--print("is nil:", next(allUnitsCooldowns))
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "CooldownListWipe", "OnCooldownListWipe")
Note: right after the wipe, player cooldowns get an update, so a callback "CooldownListUpdate" is triggered right after this event (on the same tick).
===================================================================================================================================
"GearUpdate": when received an update from a player with all information about the gear
===================================================================================================================================
function MyAddonObject.OnGearUpdate(unitId, unitGear, allUnitsGear)
local itemLevelNumber = unitGear.ilevel
local durabilityNumber = unitGear.durability
--hasWeaponEnchant is 1 have enchant or 0 is don't
local hasWeaponEnchantNumber = unitGear.weaponEnchant
local noEnchantTable = unitGear.noEnchants
local noGemsTable = unitGear.noGems
for index, slotIdWithoutEnchant in ipairs(noEnchantTable) do
end
for index, slotIdWithEmptyGemSocket in ipairs(noGemsTable) do
end
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "GearUpdate", "OnGearUpdate")
===================================================================================================================================
"GearDurabilityUpdate": when the gear durability of a player in the group changes
===================================================================================================================================
function MyAddonObject.OnGearDurabilityUpdate(unitId, durability, unitGear, allUnitsGear)
--print(UnitName(unitId) .. " durability is now " .. durability)
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "GearDurabilityUpdate", "OnGearDurabilityUpdate")
===================================================================================================================================
"GearListWipe": when the list of gear get a wipe, usually when the player leave the group
===================================================================================================================================
function MyAddonObject.OnGearListWiped(allUnitsGear)
--print("is nil:", next(allUnitsGear))
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "GearListWipe", "OnGearListWiped")
Note: right after the wipe, player gear information get an update, so a callback "GearUpdate" is triggered right after this event (on the same tick).
===================================================================================================================================
"UnitInfoUpdate": a unit in the group has been updated
===================================================================================================================================
function MyAddonObject.OnUnitUpdate(unitId, unitInfo, allUnitsInfo)
for unitName, unitInfo in pairs(allUnitsInfo) do
local specId = unitInfo.specId
local specName = unitInfo.specName
local role = unitInfo.role
local renown = unitInfo.renown
local covenantId = unitInfo.covenantId
local talents = unitInfo.talents
local pvpTalents = unitInfo.pvpTalents
local conduits = unitInfo.conduits
local class = unitInfo.class = string class eng name 'ROGUE'
local classId = unitInfo.classId = number
local className = unitInfo.className
local unitName = unitInfo.name = string name without realm
local unitNameFull = unitInfo.nameFull = string name with realm 'unitName-ServerName'
end
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "UnitInfoUpdate", "OnUnitUpdate")
===================================================================================================================================
"UnitInfoWipe": when the unit info got wipped, usually when the player leave the group
===================================================================================================================================
function MyAddonObject.OnUnitInfoWipe()
--all unit info got wiped
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "UnitInfoWipe", "OnUnitInfoWipe")
Note: a "UnitUpdate" callback is triggered right after this event to notify the player info is updated.
===================================================================================================================================
"TalentUpdate": when a unit changed a talent
===================================================================================================================================
function MyAddonObject.OnTalentUpdate(unitId, talents, unitInfo, allUnitsInfo)
for i = 1, 7 do
local talentId = talents[i]
local talentID, talentName, texture, selected, available = GetTalentInfoByID(talentId)
print(talentName)
end
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "TalentUpdate", "OnTalentUpdate")
===================================================================================================================================
"PvPTalentUpdate": when an unit changed a pvp talent
===================================================================================================================================
function MyAddonObject.OnPvPTalentUpdate(unitId, pvpTalents, unitInfo, allUnitsInfo)
for i = 1, 3 do
local talentId = pvpTalents[i]
local talentID, talentName, icon, selected, available, spellID, unlocked, row, column, known, grantedByAura = GetPvpTalentInfoByID(talentId)
print(talentName)
end
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "PvPTalentUpdate", "OnPvPTalentUpdate")
===================================================================================================================================
"UnitDeath": when an unit died
===================================================================================================================================
function MyAddonObject.OnUnitDeath(unitId)
print(UnitName(unitId) .. " died.")
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "UnitDeath", "OnUnitDeath")
===================================================================================================================================
"UnitAlive": when an unit revives
===================================================================================================================================
function MyAddonObject.OnUnitRess(unitId)
print(UnitName(unitId) .. " is alive.")
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "UnitAlive", "OnUnitRess")
===================================================================================================================================
"KeystoneUpdate": triggered when the list of keystones got an update
===================================================================================================================================
function MyAddonObject.OnKeystoneUpdate(unitName, keystoneInfo, allKeystoneInfo)
local mapName = C_ChallengeMode.GetMapUIInfo(keystoneInfo.mythicPlusMapID)
print(unitName .. " has a " .. keystoneInfo.level .. " keystone for map " .. mapName .. ".")
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "KeystoneUpdate", "OnKeystoneUpdate")
===================================================================================================================================
"KeystoneWipe": triggered after the call openRaidLib.WipeKeystoneData()
===================================================================================================================================
function MyAddonObject.OnKeystoneUpdate(allKeystoneInfo)
print("no keystone data:", next(allKeystoneInfo) == nil)
end
--registering the callback:
openRaidLib.RegisterCallback(MyAddonObject, "KeystoneWipe", "OnKeystoneWipe")