diff --git a/PanicModeCombatAnalyzer.lua b/PanicModeCombatAnalyzer.lua index 95ddae7..a4e07e2 100644 --- a/PanicModeCombatAnalyzer.lua +++ b/PanicModeCombatAnalyzer.lua @@ -1,9 +1,10 @@ PanicModeCombatAnalyzer = PanicModeCombatAnalyzer or {} +base64 = base64 or {} PanicModeCombatAnalyzer.name = 'PanicModeCombatAnalyzer' -PanicModeCombatAnalyzer.version = '1.0.9' -PanicModeCombatAnalyzer.versionDB = 2 +PanicModeCombatAnalyzer.version = '1.0.10' +PanicModeCombatAnalyzer.versionDB = 3 PanicModeCombatAnalyzer.loaded = false PanicModeCombatAnalyzer.author = 'silentgecko, deevilius' PanicModeCombatAnalyzer.savedVarsName = 'PMCAVars' @@ -51,27 +52,9 @@ function PanicModeCombatAnalyzer.Initialize(_, addonName) --combat state EVENT_MANAGER:RegisterForEvent(self.name, EVENT_PLAYER_COMBAT_STATE, self.OnPlayerCombatState) - -- group change - EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_UPDATE, self.onGroupChange) - EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_MEMBER_JOINED, self.onGroupChange) - EVENT_MANAGER:RegisterForEvent(self.name, EVENT_GROUP_MEMBER_LEFT, self.onGroupChange) - CALLBACK_MANAGER:RegisterCallback("FTC_NewDamage", self.addDamage) end --- fight status -function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat) - local self = PanicModeCombatAnalyzer - local timeStamp = GetTimeStamp() - local data = self.savedVariables.data or {} - - data[timeStamp] = data[timeStamp] or {} - data[timeStamp]['event'] = data[timeStamp]['event'] or {} - table.insert(data[timeStamp]['event'], {combat = inCombat}) - - self.savedVariables.data[timeStamp] = data[timeStamp] -end - -- cleanup function PanicModeCombatAnalyzer.cleanUp() local self = PanicModeCombatAnalyzer @@ -86,6 +69,19 @@ function PanicModeCombatAnalyzer.cleanUp() end end +-- fight status +function PanicModeCombatAnalyzer.OnPlayerCombatState(_, inCombat) + local self = PanicModeCombatAnalyzer + local timeStamp = GetTimeStamp() + local data = self.savedVariables.data or {} + + data[timeStamp] = data[timeStamp] or {} + data[timeStamp]['event'] = data[timeStamp]['event'] or {} + table.insert(data[timeStamp]['event'], {combat = inCombat}) + + self.savedVariables.data[timeStamp] = data[timeStamp] +end + -- get current trial function PanicModeCombatAnalyzer.getTrial() local self = PanicModeCombatAnalyzer @@ -146,6 +142,7 @@ function PanicModeCombatAnalyzer.addDamage(damage) -- only store, when we have damage or healing if next(data[lastSaveTS]['damage']) ~= nil or next(data[lastSaveTS]['healing']) ~= nil then data[lastSaveTS]['trial'] = self.getTrial() + data[lastSaveTS]['group'] = self.getGroupEnc() self.savedVariables.data[lastSaveTS] = data[lastSaveTS] end @@ -174,37 +171,45 @@ function PanicModeCombatAnalyzer.onAlive(event) local timeStamp = GetTimeStamp() local data = self.savedVariables.data or {} - data[timeStamp] = data[timeStamp] or {} - data[timeStamp]['event'] = data[timeStamp]['event'] or {} table.insert(data[timeStamp]['event'], {alive = true}) self.savedVariables.data[timeStamp] = data[timeStamp] end --- group change -function PanicModeCombatAnalyzer.onGroupChange(event) +-- player rezz +function PanicModeCombatAnalyzer.onRezz(event, requesterCharacterName, timeLeftToAccept) local self = PanicModeCombatAnalyzer local timeStamp = GetTimeStamp() local data = self.savedVariables.data or {} data[timeStamp] = data[timeStamp] or {} data[timeStamp]['event'] = data[timeStamp]['event'] or {} - table.insert(data[timeStamp]['event'], {group = self.getGroup()}) + table.insert(data[timeStamp]['event'], {rezz = zo_strformat("<<!aC:1>>", requesterCharacterName)}) self.savedVariables.data[timeStamp] = data[timeStamp] end --- player rezz -function PanicModeCombatAnalyzer.onRezz(event, requesterCharacterName, timeLeftToAccept) + +-- group change +function PanicModeCombatAnalyzer.getGroupEnc() local self = PanicModeCombatAnalyzer - local timeStamp = GetTimeStamp() - local data = self.savedVariables.data or {} + local group = self.getGroup() + local groupEnc = '' + local groupStr = '' - data[timeStamp] = data[timeStamp] or {} - data[timeStamp]['event'] = data[timeStamp]['event'] or {} + --sort group + local groupSort = function(char1, char2) return char1.name < char2.name end + table.sort(group, groupSort) - table.insert(data[timeStamp]['event'], {rezz = zo_strformat("<<!aC:1>>", requesterCharacterName)}) - self.savedVariables.data[timeStamp] = data[timeStamp] + -- encode group + for key,charName in pairs(group) do --actualcode + groupStr = groupStr .. "," .. charName.name + end + groupStr = string.sub(groupStr, 2); + + groupEnc = base64.enc(groupStr) + + return groupEnc end -- get group @@ -219,7 +224,10 @@ function PanicModeCombatAnalyzer.getGroup() local unitTag = GetGroupUnitTagByIndex(i) if (DoesUnitExist(unitTag)) then local charName = zo_strformat("<<!aC:1>>", GetUnitName(unitTag)) - table.insert(group, charName) + local charTable = { + name = charName + } + table.insert(group, charTable) end end end diff --git a/PanicModeCombatAnalyzer.txt b/PanicModeCombatAnalyzer.txt index 284aa19..e5b3d85 100644 --- a/PanicModeCombatAnalyzer.txt +++ b/PanicModeCombatAnalyzer.txt @@ -1,10 +1,11 @@ ## Title: |cEFEBBEPanic Mode Combat Analyzer|r ## Description: Saves your dps during fight, based on FTC DPS Meter. ## Author: |c009ad6silentgecko|r, deevilius -## Version: 1.0.9 -## APIVersion: 100013 +## Version: 1.0.10 +## APIVersion: 100014 ## SavedVariables: PMCAVars -## OptionalDependsOn: FoundryTacticalCombat +## DependsOn: FoundryTacticalCombat +ext/base64.lua OverwriteFTC.lua PanicModeCombatAnalyzer.lua \ No newline at end of file diff --git a/ext/base64.lua b/ext/base64.lua new file mode 100644 index 0000000..7f6822c --- /dev/null +++ b/ext/base64.lua @@ -0,0 +1,72 @@ +-- working lua base64 codec (c) 2006-2008 by Alex Kloss +-- compatible with lua 5.0 +-- http://www.it-rfc.de +-- licensed under the terms of the LGPL2 + +-- bitshift functions (<<, >> equivalent) +-- shift left +base64 = {} + +local function lsh(value,shift) + return math.mod((value*(2^shift)), 256) +end + +-- shift right +local function rsh(value,shift) + return math.mod(math.floor(value/2^shift), 256) +end + +-- return single bit (for OR) +local function bit(x,b) + return (math.mod(x, 2^b) - math.mod(x, 2^(b-1)) > 0) +end + +-- logic OR for number values +local function lor(x,y) + local result = 0 + for p=1,8 do result = result + (((bit(x,p) or bit(y,p)) == true) and 2^(p-1) or 0) end + return result +end + +-- encryption table +local base64chars = {[0]='A',[1]='B',[2]='C',[3]='D',[4]='E',[5]='F',[6]='G',[7]='H',[8]='I',[9]='J',[10]='K',[11]='L',[12]='M',[13]='N',[14]='O',[15]='P',[16]='Q',[17]='R',[18]='S',[19]='T',[20]='U',[21]='V',[22]='W',[23]='X',[24]='Y',[25]='Z',[26]='a',[27]='b',[28]='c',[29]='d',[30]='e',[31]='f',[32]='g',[33]='h',[34]='i',[35]='j',[36]='k',[37]='l',[38]='m',[39]='n',[40]='o',[41]='p',[42]='q',[43]='r',[44]='s',[45]='t',[46]='u',[47]='v',[48]='w',[49]='x',[50]='y',[51]='z',[52]='0',[53]='1',[54]='2',[55]='3',[56]='4',[57]='5',[58]='6',[59]='7',[60]='8',[61]='9',[62]='-',[63]='_'} + +-- function encode +-- encodes input string to base64. +function base64.enc(data) + local bytes = {} + local result = "" + for spos=0,string.len(data)-1,3 do + for byte=1,3 do bytes[byte] = string.byte(string.sub(data,(spos+byte))) or 0 end + result = string.format('%s%s%s%s%s', + result, + base64chars[rsh(bytes[1],2)], + base64chars[lor(lsh((math.mod(bytes[1], 4)),4), rsh(bytes[2],4))] or "=", + ((string.len(data)-spos) > 1) and base64chars[lor(lsh( + math.mod(bytes[2], 16) + ,2), rsh(bytes[3],6))] or "=", + ((string.len(data)-spos) > 2) and base64chars[(math.mod(bytes[3], 64))] or "=" + ) + end + return result +end + +-- decryption table +local base64bytes = {['A']=0,['B']=1,['C']=2,['D']=3,['E']=4,['F']=5,['G']=6,['H']=7,['I']=8,['J']=9,['K']=10,['L']=11,['M']=12,['N']=13,['O']=14,['P']=15,['Q']=16,['R']=17,['S']=18,['T']=19,['U']=20,['V']=21,['W']=22,['X']=23,['Y']=24,['Z']=25,['a']=26,['b']=27,['c']=28,['d']=29,['e']=30,['f']=31,['g']=32,['h']=33,['i']=34,['j']=35,['k']=36,['l']=37,['m']=38,['n']=39,['o']=40,['p']=41,['q']=42,['r']=43,['s']=44,['t']=45,['u']=46,['v']=47,['w']=48,['x']=49,['y']=50,['z']=51,['0']=52,['1']=53,['2']=54,['3']=55,['4']=56,['5']=57,['6']=58,['7']=59,['8']=60,['9']=61,['-']=62,['_']=63,['=']=nil} + +-- function decode +-- decode base64 input to string +function base64.dec(data) + local chars = {} + local result="" + for dpos=0,string.len(data)-1,4 do + for char=1,4 do chars[char] = base64bytes[(string.sub(data,(dpos+char),(dpos+char)) or "=")] end + result = string.format('%s%s%s%s', + result, + string.char(lor(lsh(chars[1],2), rsh(chars[2],4))), + (chars[3] ~= nil) and string.char(lor(lsh(chars[2],4), rsh(chars[3],2))) or "", + (chars[4] ~= nil) and string.char(lor(math.mod(lsh(chars[3],6), 192), (chars[4]))) or "" + ) + end + return result +end \ No newline at end of file