Updates, please see /details news
This commit is contained in:
@@ -0,0 +1,217 @@
|
||||
--[=[
|
||||
Dumping logical functions here, make the code of the main file smaller
|
||||
--]=]
|
||||
|
||||
|
||||
|
||||
if (not LIB_OPEN_RAID_CAN_LOAD) then
|
||||
return
|
||||
end
|
||||
|
||||
local openRaidLib = LibStub:GetLibrary("LibOpenRaid-1.0")
|
||||
|
||||
local CONST_FRACTION_OF_A_SECOND = 0.01
|
||||
|
||||
local CONST_COOLDOWN_TYPE_OFFENSIVE = 1
|
||||
local CONST_COOLDOWN_TYPE_DEFENSIVE_PERSONAL = 2
|
||||
local CONST_COOLDOWN_TYPE_DEFENSIVE_TARGET = 3
|
||||
local CONST_COOLDOWN_TYPE_DEFENSIVE_RAID = 4
|
||||
local CONST_COOLDOWN_TYPE_UTILITY = 5
|
||||
|
||||
--simple non recursive table copy
|
||||
function openRaidLib.TCopy(tableToReceive, tableToCopy)
|
||||
if (not tableToCopy) then
|
||||
print(debugstack())
|
||||
end
|
||||
for key, value in pairs(tableToCopy) do
|
||||
tableToReceive[key] = value
|
||||
end
|
||||
end
|
||||
|
||||
--find the normalized percent of the value in the range. e.g range of 200-400 and a value of 250 result in 0.25
|
||||
--from details! framework
|
||||
function openRaidLib.GetRangePercent(minValue, maxValue, value)
|
||||
return (value - minValue) / max((maxValue - minValue), 0.0000001)
|
||||
end
|
||||
|
||||
--transform a table index into a string dividing values with a comma
|
||||
--@table: an indexed table with unknown size
|
||||
function openRaidLib.PackTable(table)
|
||||
local tableSize = #table
|
||||
local newString = "" .. tableSize .. ","
|
||||
for i = 1, tableSize do
|
||||
newString = newString .. table[i] .. ","
|
||||
end
|
||||
|
||||
newString = newString:gsub(",$", "")
|
||||
return newString
|
||||
end
|
||||
|
||||
--return is a number is almost equal to another within a tolerance range
|
||||
function openRaidLib.isNearlyEqual(value1, value2, tolerance)
|
||||
tolerance = tolerance or CONST_FRACTION_OF_A_SECOND
|
||||
return abs(value1 - value2) <= tolerance
|
||||
end
|
||||
|
||||
--return true if the lib is allowed to receive comms from other players
|
||||
function openRaidLib.IsCommAllowed()
|
||||
return IsInGroup() or IsInRaid()
|
||||
end
|
||||
|
||||
--stract some indexes of a table
|
||||
local selectIndexes = function(table, startIndex, amountIndexes)
|
||||
local values = {}
|
||||
for i = startIndex, startIndex+amountIndexes do
|
||||
values[#values+1] = tonumber(table[i]) or 0
|
||||
end
|
||||
return values
|
||||
end
|
||||
|
||||
--transform a string table into a regular table
|
||||
--@table: a table with unknown values
|
||||
--@index: where in the table is the information we want
|
||||
--@isPair: if true treat the table as pairs(), ipairs() otherwise
|
||||
--@valueAsTable: return {value1, value2, value3}
|
||||
--@amountOfValues: for the parameter above
|
||||
function openRaidLib.UnpackTable(table, index, isPair, valueIsTable, amountOfValues)
|
||||
local result = {}
|
||||
local reservedIndexes = table[index]
|
||||
if (not reservedIndexes) then
|
||||
return result
|
||||
end
|
||||
local indexStart = index+1
|
||||
local indexEnd = reservedIndexes+index
|
||||
|
||||
if (isPair) then
|
||||
amountOfValues = amountOfValues or 2
|
||||
for i = indexStart, indexEnd, amountOfValues do
|
||||
if (valueIsTable) then
|
||||
local key = tonumber(table[i])
|
||||
local values = selectIndexes(table, i+1, max(amountOfValues-2, 1))
|
||||
result[key] = values
|
||||
else
|
||||
local key = tonumber(table[i])
|
||||
local value = tonumber(table[i+1])
|
||||
result[key] = value
|
||||
end
|
||||
end
|
||||
else
|
||||
for i = indexStart, indexEnd do
|
||||
local value = tonumber(table[i])
|
||||
result[#result+1] = value
|
||||
end
|
||||
end
|
||||
|
||||
return result
|
||||
end
|
||||
|
||||
--returns if the player is in group
|
||||
function openRaidLib.IsInGroup()
|
||||
local inParty = IsInGroup()
|
||||
local inRaid = IsInRaid()
|
||||
return inParty or inRaid
|
||||
end
|
||||
|
||||
function openRaidLib.UpdateUnitIDCache()
|
||||
openRaidLib.UnitIDCache = {}
|
||||
if (IsInRaid()) then
|
||||
for i = 1, GetNumGroupMembers() do
|
||||
local unitName = UnitName("raid"..i)
|
||||
if (unitName) then
|
||||
openRaidLib.UnitIDCache[unitName] = "raid"..i
|
||||
end
|
||||
end
|
||||
elseif (IsInGroup()) then
|
||||
for i = 1, GetNumGroupMembers() - 1 do
|
||||
local unitName = UnitName("party"..i)
|
||||
if (unitName) then
|
||||
openRaidLib.UnitIDCache[unitName] = "party"..i
|
||||
end
|
||||
end
|
||||
end
|
||||
openRaidLib.UnitIDCache[UnitName("player")] = "player"
|
||||
end
|
||||
|
||||
function openRaidLib.GetUnitID(playerName)
|
||||
return openRaidLib.UnitIDCache[playerName] or playerName
|
||||
end
|
||||
|
||||
|
||||
local filterStringToCooldownType = {
|
||||
["defensive-raid"] = CONST_COOLDOWN_TYPE_DEFENSIVE_RAID,
|
||||
["defensive-target"] = CONST_COOLDOWN_TYPE_DEFENSIVE_TARGET,
|
||||
["defensive-personal"] = CONST_COOLDOWN_TYPE_DEFENSIVE_PERSONAL,
|
||||
["ofensive"] = CONST_COOLDOWN_TYPE_OFFENSIVE,
|
||||
["utility"] = CONST_COOLDOWN_TYPE_UTILITY
|
||||
}
|
||||
|
||||
function openRaidLib.CooldownManager.DoesSpellPassFilter(spellId, filters)
|
||||
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
|
||||
local cooldownData = allCooldownsData[spellId]
|
||||
if (cooldownData) then
|
||||
for filter in filters:gmatch("([^,%s]+)") do
|
||||
local cooldownType = filterStringToCooldownType[filter]
|
||||
if (cooldownData.type == cooldownType) then
|
||||
return true
|
||||
end
|
||||
end
|
||||
else
|
||||
return false
|
||||
end
|
||||
end
|
||||
|
||||
local getCooldownsForFilter = function(unitName, allCooldowns, unitDataFilteredCache, filter)
|
||||
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
|
||||
local filterTable = unitDataFilteredCache[filter]
|
||||
--if the unit already sent its full list of cooldowns, the cache can be built
|
||||
--when NeedRebuildFilters is true, HasFullCooldownList is always true
|
||||
|
||||
--bug: filterTable is nil and HasFullCooldownList is also nil, happening after leaving a grou´p internal callback
|
||||
if ((not filterTable and openRaidLib.CooldownManager.HasFullCooldownList[unitName]) or openRaidLib.CooldownManager.NeedRebuildFilters[unitName]) then
|
||||
filterTable = {}
|
||||
unitDataFilteredCache[filter] = filterTable
|
||||
|
||||
for spellId, cooldownInfo in pairs(allCooldowns) do
|
||||
local cooldownData = allCooldownsData[spellId]
|
||||
if (cooldownData and cooldownData.type == filterStringToCooldownType[filter]) then
|
||||
filterTable[spellId] = cooldownInfo
|
||||
end
|
||||
end
|
||||
end
|
||||
return filterTable
|
||||
end
|
||||
|
||||
--@allCooldowns: all cooldowns sent by an unit, {[spellId] = cooldownInfo}
|
||||
--@filters: string with filters, "defensive-raid, "defensive-personal"
|
||||
function openRaidLib.FilterCooldowns(unitName, allCooldowns, filters)
|
||||
local allDataFiltered = openRaidLib.CooldownManager.UnitDataFilterCache --["unitName"] = {defensive-raid = {[spellId = cooldownInfo]}}
|
||||
local unitDataFilteredCache = allDataFiltered[unitName]
|
||||
if (not unitDataFilteredCache) then
|
||||
unitDataFilteredCache = {}
|
||||
allDataFiltered[unitName] = unitDataFilteredCache
|
||||
end
|
||||
|
||||
--before break the string into parts and build the filters, attempt to get cooldowns from the cache using the whole filter string
|
||||
local filterAlreadyInCache = unitDataFilteredCache[filters]
|
||||
if (filterAlreadyInCache and not openRaidLib.CooldownManager.NeedRebuildFilters[unitName]) then
|
||||
return filterAlreadyInCache
|
||||
end
|
||||
|
||||
local allCooldownsData = LIB_OPEN_RAID_COOLDOWNS_INFO
|
||||
local resultFilters = {}
|
||||
|
||||
--break the string into pieces and filter cooldowns
|
||||
for filter in filters:gmatch("([^,%s]+)") do
|
||||
local filterTable = getCooldownsForFilter(unitName, allCooldowns, unitDataFilteredCache, filter)
|
||||
if (filterTable) then
|
||||
openRaidLib.TCopy(resultFilters, filterTable) --filter table is nil
|
||||
end
|
||||
end
|
||||
|
||||
--cache the whole filter string
|
||||
if (next(resultFilters)) then
|
||||
unitDataFilteredCache[filters] = resultFilters
|
||||
end
|
||||
|
||||
return resultFilters
|
||||
end
|
||||
Reference in New Issue
Block a user