commit 607365fbe327ffbb23ce30c3e57042bf82e2b3f6 Author: Robin Date: Wed Jan 13 14:17:29 2021 +0100 Revision 13 diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..7f11bd1 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "LibStub"] + path = LibStub + url = https://git.grml.de/rilgamon/LibStub.git diff --git a/LibCombatlog.lua b/LibCombatlog.lua new file mode 100644 index 0000000..825f1d9 --- /dev/null +++ b/LibCombatlog.lua @@ -0,0 +1,141 @@ +local lib = LibStub:NewLibrary("LibCombatLog", 14) +if not lib then return end +local CombatLogGetCurrentEventInfo = CombatLogGetCurrentEventInfo +lib.mixinTargets = lib.mixinTargets or {} +local mixins = {"RegisterCLEvent", "UnRegisterCLEvent", "RegisterCLSuffix", "UnRegisterCLSuffix", "RegisterCLStatus", "UnRegisterCLStatus","SplitCLEvent"} +lib['regs'] = lib['regs'] or {} +local allPrefix = { + 'SWING', 'RANGE', 'SPELL_PERIODIC', 'SPELL_BUILDING', 'SPELL', 'ENVIRONMENTAL', 'UNIT', 'PARTY', 'ENCHANT' +} +local knownsplits = { + ['DAMAGE_SHIELD'] = {'SPELL', 'DAMAGE'}, + ['DAMAGE_SHIELD_MISSED'] = {'SPELL', 'MISSED'}, + ['DAMAGE_SPLIT'] = {'SPELL', 'DAMAGE'}, +} +local function splitEvent(event) + if(event) then + if(knownsplits[event]) then + return knownsplits[event] + end + local prefix, suffix + for i = 1, #allPrefix do + if(strsub(event, 1, strlen(allPrefix[i])) == allPrefix[i]) then + prefix = allPrefix[i] + break + end + end + if(prefix) then + suffix = strsub(event, strlen(prefix) + 2) + if(suffix) then + knownsplits[event] = {prefix, suffix} + return knownsplits[event] + end + end + end + return {'NONE','NONE'} +end +local function OnEvent2(self,event) + if(event == 'COMBAT_LOG_EVENT_UNFILTERED') then + local data = { event, CombatLogGetCurrentEventInfo()} + local prefix, suffix = unpack(splitEvent(data[3])) + if(lib['regs'][data[3]]) then + for k, v in pairs(lib['regs'][data[3]]) do + k[v](self, data, prefix, suffix) + end + end + if(suffix) then + lib['regs'][suffix] = lib['regs'][suffix] or {} + for k, v in pairs(lib['regs'][suffix]) do + k[v](self, data, prefix, suffix) + end + end + elseif(event == 'PLAYER_REGEN_DISABLED' or event == 'PLAYER_REGEN_ENABLED') then + for k, v in pairs(lib['regs']['PLAYER_REGEN']) do + k[v](self, event) + end + else + print('unknown',event) + end +end +local function OnEvent(self, event) + self:RegisterEvent('COMBAT_LOG_EVENT_UNFILTERED') + self:RegisterEvent("PLAYER_REGEN_DISABLED") + self:RegisterEvent("PLAYER_REGEN_ENABLED") + self:UnregisterEvent(event) + self:SetScript("OnEvent", OnEvent2) +end +lib['f'] = lib['f'] or CreateFrame("Frame") +if(not lib['f']:IsEventRegistered("PLAYER_ENTERING_WORLD")) then + lib['f']:RegisterEvent("PLAYER_ENTERING_WORLD") +end +lib['f']:SetScript("OnEvent", OnEvent) +function lib:SplitCLEvent(event) + return splitEvent(event) +end +function lib:RegisterCLSuffix(suffix, funcName) + if(type(suffix) ~= "string" and funcName) then + funcName = funcName or suffix[1] + for _,v in pairs(suffix) do + self:RegisterCLSuffix(v, funcName) + end + else + funcName = funcName or suffix + lib['regs'][suffix] = lib['regs'][suffix] or {} + lib['regs'][suffix][self] = funcName + end +end +function lib:UnRegisterCLSuffix(suffix) + if(lib['regs'][suffix]) then + if(lib['regs'][suffix][self]) then + lib['regs'][suffix][self] = nil + end + end +end +function lib:RegisterCLEvent(event,funcName) + if(type(event) ~= "string" and funcName) then + funcName = funcName or event[1] + for _,v in pairs(event) do + self:RegisterCLEvent(v, funcName) + end + else + funcName = funcName or event + lib['regs'][event] = lib['regs'][event] or {} + lib['regs'][event][self] = funcName + end +end +function lib:RegisterCLStatus(funcName) + lib['regs']['PLAYER_REGEN'] = lib['regs']['PLAYER_REGEN'] or {} + lib['regs']['PLAYER_REGEN'][self] = funcName +end +function lib:UnRegisterCLStatus() + if(lib['regs']['PLAYER_REGEN']) then + if(lib['regs']['PLAYER_REGEN'][self]) then + lib['regs']['PLAYER_REGEN'][self] = nil + end + end +end +function lib:UnRegisterCLEvent(event) + if(lib['regs'][event]) then + if(lib['regs'][event][self]) then + lib['regs'][event][self] = nil + end + end +end +function lib:Embed(target) + for _,name in pairs(mixins) do + target[name] = lib[name] + end + lib.mixinTargets[target] = true +end + +for target,_ in pairs(lib.mixinTargets) do + lib:Embed(target) +end +--[[ Debug demo +local f = CreateFrame("Frame") +f['dmg'] = function(self, ...) + print(...) +end +LibStub("LibCombatLog"):Embed(f) +f:RegisterCLSuffix('DAMAGE', 'dmg') +]] \ No newline at end of file diff --git a/LibCombatlog.toc b/LibCombatlog.toc new file mode 100644 index 0000000..c48e4d1 --- /dev/null +++ b/LibCombatlog.toc @@ -0,0 +1,5 @@ +## Interface: 90001 +## Name: LibCombatlog +## Description: Register combat events +Libstub/Libstub.lua +LibCombatlog.lua \ No newline at end of file diff --git a/LibStub b/LibStub new file mode 160000 index 0000000..a42beba --- /dev/null +++ b/LibStub @@ -0,0 +1 @@ +Subproject commit a42beba70f53a11f874cb6a7a1a819f63837b3cc