From 5ade870f842c7be518f6d9112b2592c25072ee2c Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Thu, 11 Nov 2021 07:51:27 -0700 Subject: [PATCH 01/21] Update Master Level 2 Changed to use boolbits and added Master Levels menu display data --- addons/libs/packets/fields.lua | 47 +++++++++++++++++++++++++++++++--- 1 file changed, 43 insertions(+), 4 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 5133d0255..36b4f6676 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -1519,6 +1519,45 @@ fields.incoming[0x01B] = L{ {ctype='unsigned char', label='Mentor Icon', fn=e+{'mentor icon'}},-- 65 {ctype='unsigned char', label='Mastery Rank'}, -- 66 {ctype='unsigned char', label='_unknown8'}, -- 67 + {ctype='bit[1]', label='_junk1'}, -- 68 + {ctype='boolbit', label='Warrior Master'}, -- 68 Indicates if the job is mastered, but only after receiving "Master Breaker" KI. Used to populate "Master Levels" Menu + {ctype='boolbit', label='Monk Master'}, -- 68 + {ctype='boolbit', label='White Mage Master'}, -- 68 + {ctype='boolbit', label='Black Mage Master'}, -- 68 + {ctype='boolbit', label='Red Mage Master'}, -- 68 + {ctype='boolbit', label='Thief Master'}, -- 68 + {ctype='boolbit', label='Paladin Master'}, -- 68 + {ctype='boolbit', label='Dark Knight Master'}, -- 69 + {ctype='boolbit', label='Beastmaster Master'}, -- 69 + {ctype='boolbit', label='Bard Master'}, -- 69 + {ctype='boolbit', label='Ranger Master'}, -- 69 + {ctype='boolbit', label='Samurai Master'}, -- 69 + {ctype='boolbit', label='Ninja Master'}, -- 69 + {ctype='boolbit', label='Dragoon Master'}, -- 69 + {ctype='boolbit', label='Summoner Master'}, -- 69 + {ctype='boolbit', label='Blue Mage Master'}, -- 6A + {ctype='boolbit', label='Corsair Master'}, -- 6A + {ctype='boolbit', label='Puppetmaster Master'}, -- 6A + {ctype='boolbit', label='Dancer Master'}, -- 6A + {ctype='boolbit', label='Scholar Master'}, -- 6A + {ctype='boolbit', label='Geomancer Master'}, -- 6A + {ctype='boolbit', label='Rune Fencer Master'}, -- 6A + {ctype='bit[1]', label='_junk2'}, -- 6A + {ctype='unsigned short', label='_junk3'}, -- 6B + {ctype='unsigned char', label='Warrior Master Level'}, -- 6D + {ctype='unsigned char', label='Monk Master Level'}, -- 6E + {ctype='unsigned char', label='White Mage Master Level'}, -- 6F + {ctype='unsigned char', label='Black Mage Master Level'}, -- 70 + {ctype='unsigned char', label='Red Mage Master Level'}, -- 71 + {ctype='unsigned char', label='Thief Master Level'}, -- 72 + {ctype='unsigned char', label='Paladin Master Level'}, -- 73 + {ctype='unsigned char', label='Dark Knight Master Level'}, -- 74 + {ctype='unsigned char', label='Beastmaster Master Level'}, -- 75 + {ctype='unsigned char', label='Bard Master Level'}, -- 76 + {ctype='unsigned char', label='Dancer Master Level'}, -- 77 + {ctype='unsigned char', label='Scholar Master Level'}, -- 78 + {ctype='unsigned char', label='Geomancer Master Level'}, -- 79 + {ctype='unsigned char', label='Rune Fencer Master Level'}, -- 7A } -- Inventory Count @@ -2993,7 +3032,7 @@ fields.incoming[0x061] = L{ {ctype='unsigned int', label='_junk2'}, -- 60 {ctype='unsigned char', label='_unknown7'}, -- 64 {ctype='unsigned char', label='Master Level'}, -- 65 - {ctype='bit[1]', label='Master Breaker'}, -- 66 + {ctype='boolbit', label='Master Breaker'}, -- 66 {ctype='bit[15]', label='_junk3'}, -- 66 {ctype='unsigned int', label='Current Exemplar Points'}, -- 68 {ctype='unsigned int', label='Required Exemplar Points'}, -- 6C @@ -3382,7 +3421,7 @@ func.incoming[0x0C9][0x01] = L{ {ctype='unsigned char', label='Sub Job Level'}, -- 25 {ctype='unsigned char', label='Main Job', fn=job}, -- 26 {ctype='unsigned char', label='Master Level'}, -- 27 - {ctype='bit[1]', label='Master Breaker'}, -- 28 + {ctype='boolbit', label='Master Breaker'}, -- 28 {ctype='bit[7]', label='_junk2'}, -- 28 {ctype='data[43]', label='_unknown5'}, -- 29 At least the first two bytes and the last twelve bytes are junk, possibly more } @@ -3467,7 +3506,7 @@ fields.incoming[0x0DD] = L{ {ctype='unsigned char', label='Sub job', fn=job}, -- 24 {ctype='unsigned char', label='Sub job level'}, -- 25 {ctype='unsigned char', label='Master Level'}, -- 26 - {ctype='bit[1]', label='Master Breaker'}, -- 27 + {ctype='boolbit', label='Master Breaker'}, -- 27 {ctype='bit[7]', label='_junk2'}, -- 27 {ctype='char*', label='Name'}, -- 28 } @@ -3499,7 +3538,7 @@ fields.incoming[0x0DF] = L{ {ctype='unsigned char', label='Sub job', fn=job}, -- 22 {ctype='unsigned char', label='Sub job level'}, -- 23 {ctype='unsigned char', label='Master Level'}, -- 24 - {ctype='bit[1]', label='Master Breaker'}, -- 25 + {ctype='boolbit', label='Master Breaker'}, -- 25 {ctype='bit[7]', label='_junk2'}, -- 25 } From 22b865b5a08d919688a2a2182745056377596166 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Thu, 11 Nov 2021 08:44:12 -0700 Subject: [PATCH 02/21] Master Levels Update 2 Change to use Refs --- addons/libs/packets/fields.lua | 45 +++++++--------------------------- 1 file changed, 9 insertions(+), 36 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 36b4f6676..e4baefcdc 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -1490,6 +1490,13 @@ fields.incoming[0x017] = function() end end() +types.job_master= L{ + {ctype='boolbit', label='Master'} +} +types.job_master_level= L{ + {ctype='unsigned char', label='Master Level'} +} + -- Job Info fields.incoming[0x01B] = L{ {ctype='unsigned int', label='_unknown1'}, -- 04 Observed value of 05 @@ -1520,44 +1527,10 @@ fields.incoming[0x01B] = L{ {ctype='unsigned char', label='Mastery Rank'}, -- 66 {ctype='unsigned char', label='_unknown8'}, -- 67 {ctype='bit[1]', label='_junk1'}, -- 68 - {ctype='boolbit', label='Warrior Master'}, -- 68 Indicates if the job is mastered, but only after receiving "Master Breaker" KI. Used to populate "Master Levels" Menu - {ctype='boolbit', label='Monk Master'}, -- 68 - {ctype='boolbit', label='White Mage Master'}, -- 68 - {ctype='boolbit', label='Black Mage Master'}, -- 68 - {ctype='boolbit', label='Red Mage Master'}, -- 68 - {ctype='boolbit', label='Thief Master'}, -- 68 - {ctype='boolbit', label='Paladin Master'}, -- 68 - {ctype='boolbit', label='Dark Knight Master'}, -- 69 - {ctype='boolbit', label='Beastmaster Master'}, -- 69 - {ctype='boolbit', label='Bard Master'}, -- 69 - {ctype='boolbit', label='Ranger Master'}, -- 69 - {ctype='boolbit', label='Samurai Master'}, -- 69 - {ctype='boolbit', label='Ninja Master'}, -- 69 - {ctype='boolbit', label='Dragoon Master'}, -- 69 - {ctype='boolbit', label='Summoner Master'}, -- 69 - {ctype='boolbit', label='Blue Mage Master'}, -- 6A - {ctype='boolbit', label='Corsair Master'}, -- 6A - {ctype='boolbit', label='Puppetmaster Master'}, -- 6A - {ctype='boolbit', label='Dancer Master'}, -- 6A - {ctype='boolbit', label='Scholar Master'}, -- 6A - {ctype='boolbit', label='Geomancer Master'}, -- 6A - {ctype='boolbit', label='Rune Fencer Master'}, -- 6A + {ref=types.job_master, lookup={res.jobs, 0x01}, count=0x16}, -- 68 {ctype='bit[1]', label='_junk2'}, -- 6A {ctype='unsigned short', label='_junk3'}, -- 6B - {ctype='unsigned char', label='Warrior Master Level'}, -- 6D - {ctype='unsigned char', label='Monk Master Level'}, -- 6E - {ctype='unsigned char', label='White Mage Master Level'}, -- 6F - {ctype='unsigned char', label='Black Mage Master Level'}, -- 70 - {ctype='unsigned char', label='Red Mage Master Level'}, -- 71 - {ctype='unsigned char', label='Thief Master Level'}, -- 72 - {ctype='unsigned char', label='Paladin Master Level'}, -- 73 - {ctype='unsigned char', label='Dark Knight Master Level'}, -- 74 - {ctype='unsigned char', label='Beastmaster Master Level'}, -- 75 - {ctype='unsigned char', label='Bard Master Level'}, -- 76 - {ctype='unsigned char', label='Dancer Master Level'}, -- 77 - {ctype='unsigned char', label='Scholar Master Level'}, -- 78 - {ctype='unsigned char', label='Geomancer Master Level'}, -- 79 - {ctype='unsigned char', label='Rune Fencer Master Level'}, -- 7A + {ref=types.job_master_level,lookup={res.jobs, 0x01}, count=0x16}, -- 6D } -- Inventory Count From ffa2cce145973ae61bbb5f3ba88804108ce70e5a Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Thu, 11 Nov 2021 08:47:11 -0700 Subject: [PATCH 03/21] Master Level Update 2 Re-add Master flags comment --- addons/libs/packets/fields.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index e4baefcdc..77f3f4406 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -1527,7 +1527,7 @@ fields.incoming[0x01B] = L{ {ctype='unsigned char', label='Mastery Rank'}, -- 66 {ctype='unsigned char', label='_unknown8'}, -- 67 {ctype='bit[1]', label='_junk1'}, -- 68 - {ref=types.job_master, lookup={res.jobs, 0x01}, count=0x16}, -- 68 + {ref=types.job_master, lookup={res.jobs, 0x01}, count=0x16}, -- 68 Indicates if the job is mastered, but only after receiving "Master Breaker" KI. Used to populate "Master Levels" Menu {ctype='bit[1]', label='_junk2'}, -- 6A {ctype='unsigned short', label='_junk3'}, -- 6B {ref=types.job_master_level,lookup={res.jobs, 0x01}, count=0x16}, -- 6D From cf18fa94f889d2c5174d1d4bbc1d436d5fb53393 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Thu, 11 Nov 2021 08:48:25 -0700 Subject: [PATCH 04/21] Master Level Update 2 spacing fix --- addons/libs/packets/fields.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 77f3f4406..769a43ed6 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -3394,7 +3394,7 @@ func.incoming[0x0C9][0x01] = L{ {ctype='unsigned char', label='Sub Job Level'}, -- 25 {ctype='unsigned char', label='Main Job', fn=job}, -- 26 {ctype='unsigned char', label='Master Level'}, -- 27 - {ctype='boolbit', label='Master Breaker'}, -- 28 + {ctype='boolbit', label='Master Breaker'}, -- 28 {ctype='bit[7]', label='_junk2'}, -- 28 {ctype='data[43]', label='_unknown5'}, -- 29 At least the first two bytes and the last twelve bytes are junk, possibly more } From 7620dd219cd618239889fa535ef30b703a275908 Mon Sep 17 00:00:00 2001 From: Byrth Date: Sun, 14 Nov 2021 09:54:54 -0500 Subject: [PATCH 05/21] the table's hex keys are interpreted as unsigned --- addons/libs/packets/fields.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 769a43ed6..bdc9b782f 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2719,9 +2719,9 @@ enums.quest_mission_log = { [0x00E8] = 'Completed Abyssea Quests', [0x00F0] = 'Current Adoulin Quests', [0x00F8] = 'Completed Adoulin Quests', - [0x0100] = 'Current Coalition Quests', - [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0x0100] = 'Current Coalition Quests', + [0x0108] = 'Completed Coalition Quests', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. @@ -2737,7 +2737,7 @@ fields.incoming[0x056] = function (data, type) end func.incoming[0x056].type = L{ - {ctype='short', label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x056][0x0080] = L{ From 295e1fb7d950e77835a3945d7312c89d64ce1749 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Tue, 23 Nov 2021 18:32:25 -0700 Subject: [PATCH 06/21] Update Pointwatch.lua 1) Add support for Exemplar Points 2) Partial rework of packets to both utilize the packets library, and to take advantage of last_incoming when it is first loaded 3) Partial rework of Key Item detection for Dynamis --- addons/pointwatch/pointwatch.lua | 163 +++++++++++++++++++------------ 1 file changed, 102 insertions(+), 61 deletions(-) diff --git a/addons/pointwatch/pointwatch.lua b/addons/pointwatch/pointwatch.lua index 8eac64d95..a2bd62342 100644 --- a/addons/pointwatch/pointwatch.lua +++ b/addons/pointwatch/pointwatch.lua @@ -24,17 +24,19 @@ --(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS --SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -texts = require 'texts' -config = require 'config' -require 'sets' -res = require 'resources' -require 'statics' -messages = require 'message_ids' -require 'pack' +texts = require('texts') +config = require('config') +require('sets') +res = require('resources') +require('statics') +messages = require('message_ids') +packets = require('packets') +require('pack') +require('chat') _addon.name = 'PointWatch' _addon.author = 'Byrth' -_addon.version = 0.150811 +_addon.version = 0.211112 _addon.command = 'pw' settings = config.load('data\\settings.xml',default_settings) @@ -44,31 +46,35 @@ box = texts.new('${current_string}',settings.text_box_settings,settings) box.current_string = '' box:show() -initialize() +granule_KIs = res.key_items:en(function(x) return x:endswith('granules of time') end):map(function(ki) + return { + id=ki.id, + type=math.floor(ki.id/0x200), + offset=ki.id%0x200, + name=ki.en:match('%w+'):ucfirst(), + } +end) -windower.register_event('incoming chunk',function(id,org,modi,is_injected,is_blocked) - if is_injected then return end - if id == 0x29 then -- Action Message, used in Abyssea for xp - local val = org:unpack('I',0xD) - local msg = org:unpack('H',0x19)%1024 - exp_msg(val,msg) - elseif id == 0x2A then -- Resting message +packet_initiators = L{0x02A,0x055,0x061,0x063,0x110} +packet_handlers = { + [0x029] = function(org) -- Action Message, used in Abyssea for xp + local p = packets.parse('incoming',org) + exp_msg(p['Param 1'],p['Message']) + end, + [0x02A] = function(org) -- Resting message + local p = packets.parse('incoming',org) local zone = 'z'..windower.ffxi.get_info().zone if settings.options.message_printing then - print('Message ID: '..(org:unpack('H',0x1B)%2^14)) + print('Message ID: '..p['Message ID']) end if messages[zone] then - local msg = org:unpack('H',0x1B)%2^14 + local msg = p['Message ID'] for i,v in pairs(messages[zone]) do - if tonumber(v) and v + messages[zone].offset == msg then - local param_1 = org:unpack('I',0x9) - local param_2 = org:unpack('I',0xD) - local param_3 = org:unpack('I',0x11) - local param_4 = org:unpack('I',0x15) - -- print(param_1,param_2,param_3,param_4) -- DEBUGGING STATEMENT ------------------------- + if tonumber(v) and v + messages[zone].offset == msg then + -- print(p['Param 1'],p['Param 2'],p['Param 3'],p['Param 4']) -- DEBUGGING STATEMENT ------------------------- if zone_message_functions[i] then - zone_message_functions[i](param_1,param_2,param_3,param_4) + zone_message_functions[i](p['Param 1'],p['Param 2'],p['Param 3'],p['Param 4']) end if i:contains("visitant_status_") then abyssea.update_time = os.clock() @@ -76,50 +82,75 @@ windower.register_event('incoming chunk',function(id,org,modi,is_injected,is_blo end end end - elseif id == 0x2D then - local val = org:unpack('I',0x11) - local msg = org:unpack('H',0x19)%1024 - exp_msg(val,msg) - elseif id == 0x55 then - if org:byte(0x85) == 3 then - local dyna_KIs = math.floor((org:byte(6)%64)/2) -- 5 bits (32, 16, 8, 4, and 2 originally -> shifted to 16, 8, 4, 2, and 1) - dynamis._KIs = { - ['Crimson'] = dyna_KIs%2 == 1, - ['Azure'] = math.floor(dyna_KIs/2)%2 == 1, - ['Amber'] = math.floor(dyna_KIs/4)%2 == 1, - ['Alabaster'] = math.floor(dyna_KIs/8)%2 == 1, - ['Obsidian'] = math.floor(dyna_KIs/16) == 1, - } - if dynamis_map[dynamis.zone] then - dynamis.time_limit = 3600 - for KI,TE in pairs(dynamis_map[dynamis.zone]) do - if dynamis._KIs[KI] then - dynamis.time_limit = dynamis.time_limit + TE*60 + end, + [0x02D] = function(org) + local p = packets.parse('incoming',org) + exp_msg(p['Param 1'],p['Message']) + end, + [0x055] = function(org) + local p = packets.parse('incoming',org) + --print(p['Type'],p['Key item available'], p['Key item available']:byte(1),p['Key item available']:byte(2)) + for _,ki in pairs(granule_KIs) do + if p['Type'] == ki.type then + local byte = p['Key item available']:byte(math.floor(ki.offset/8)+1) + local flag = bit.band(bit.rshift(byte, ki.offset % 8), 1) + --print('byte', byte, 'offset', ki.offset % 8, 'flag', flag) + if flag == 1 then + dynamis._KIs[ki.name] = true + if dynamis_map[dynamis.zone] then + dynamis.time_limit = 3600 + for KI,TE in pairs(dynamis_map[dynamis.zone]) do + if dynamis._KIs[KI] then + dynamis.time_limit = dynamis.time_limit + TE*60 + end + end + update_box() end end - update_box() end end - elseif id == 0x61 then - xp.current = org:unpack('H',0x11) - xp.tnl = org:unpack('H',0x13) - accolades.current = math.floor(org:byte(0x5A)/4) + org:byte(0x5B)*2^6 + org:byte(0x5C)*2^14 - elseif id == 0x63 and org:byte(5) == 2 then - lp.current = org:unpack('H',9) - lp.number_of_merits = org:byte(11)%128 - lp.maximum_merits = org:byte(0x0D)%128 - elseif id == 0x63 and org:byte(5) == 5 then - local offset = windower.ffxi.get_player().main_job_id*6+13 -- So WAR (ID==1) starts at byte 19 - cp.current = org:unpack('H',offset) - cp.number_of_job_points = org:unpack('H',offset+2) - elseif id == 0x110 then - sparks.current = org:unpack('I',5) - elseif id == 0xB and box:visible() then + end, + [0x061] = function(org) + local p = packets.parse('incoming',org) + xp.current = p['Current EXP'] + xp.tnl = p['Required EXP'] + accolades.current = p['Unity Points'] + ep.current = p['Current Exemplar Points'] + ep.tnml = p['Required Exemplar Points'] + end, + [0x063] = function(org) + local p = packets.parse('incoming',org) + if p['Order'] == 2 then + lp.current = p['Limit Points'] + lp.number_of_merits = p['Merit Points'] + lp.maximum_merits = p['Max Merit Points'] + elseif p['Order'] == 5 then + local job = windower.ffxi.get_player().main_job_full + cp.current = p[job..' Capacity Points'] + cp.number_of_job_points = p[job..' Job Points'] + end + end, + [0x110] = function(org) + local p = packets.parse('incoming',org) + sparks.current = p['Sparks Total'] + end, + [0xB] = function(org) zoning_bool = true box:hide() - elseif id == 0xA and zoning_bool then + end, + [0xA] = function(org) zoning_bool = nil box:show() + end, +} + +initialize() + +windower.register_event('incoming chunk',function(id,org,modi,is_injected,is_blocked) + if is_injected or is_blocked then return end + local handler = packet_handlers[id] + if handler then + handler(org,modi) end end) @@ -195,6 +226,7 @@ function update_box() end cp.rate = analyze_points_table(cp.registry) xp.rate = analyze_points_table(xp.registry) + ep.rate = analyze_points_table(ep.registry) if dynamis.entry_time ~= 0 and dynamis.entry_time+dynamis.time_limit-os.clock() > 0 then dynamis.time_remaining = os.date('!%H:%M:%S',dynamis.entry_time+dynamis.time_limit-os.clock()) dynamis.KIs = X_or_O(dynamis._KIs.Crimson)..X_or_O(dynamis._KIs.Azure)..X_or_O(dynamis._KIs.Amber)..X_or_O(dynamis._KIs.Alabaster)..X_or_O(dynamis._KIs.Obsidian) @@ -323,6 +355,15 @@ function exp_msg(val,msg) -- If a merit point was not gained, lp.current = math.min(lp.current,lp.tnm-1) end + elseif msg == 810 then + ep.registry[t] = (ep.registry[t] or 0) + val + if ep.tnl and ep.current >= ep.tnl then + ep.current = ep.current - ep.tnl + end end update_box() end + +function max_color(str,val,max,r,g,b) + return val >= max and tostring(str):text_color(r,g,b) or tostring(str) or "" +end From 3190cb63950572de57596c1914149cd44107a5de Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Tue, 23 Nov 2021 18:37:26 -0700 Subject: [PATCH 07/21] Update Pointwatch - Statics.lua - Exemplar Points --- addons/pointwatch/statics.lua | 23 +++++++++++++++++++---- 1 file changed, 19 insertions(+), 4 deletions(-) diff --git a/addons/pointwatch/statics.lua b/addons/pointwatch/statics.lua index 902cc46dc..eee27f3f5 100644 --- a/addons/pointwatch/statics.lua +++ b/addons/pointwatch/statics.lua @@ -28,9 +28,9 @@ --Default settings file: default_settings = { strings = { - default = "xp.current..'/'..xp.tnl..'XP '..lp.current..'/'..lp.tnm..'LP ['..lp.number_of_merits..'/'..lp.maximum_merits..'] XP/hr:'..string.format('%.1f',math.floor(xp.rate/100)/10)..'k '..cp.current..'/'..cp.tnjp..'CP ['..cp.number_of_job_points..'] CP/hr:'..string.format('%.1f',math.floor(cp.rate/100)/10)..'k'", - dynamis = "xp.current..'/'..xp.tnl..'XP '..lp.current..'/'..lp.tnm..'LP ['..lp.number_of_merits..'/'..lp.maximum_merits..'] XP/hr:'..string.format('%.1f',math.floor(xp.rate/100)/10)..'k '..cp.current..'/'..cp.tnjp..'CP ['..cp.number_of_job_points..'] '..dynamis.KIs..' '..dynamis.time_remaining", - abyssea = "xp.current..'/'..xp.tnl..'XP '..lp.current..'/'..lp.tnm..'LP ['..lp.number_of_merits..'/'..lp.maximum_merits..'] XP/hr:'..string.format('%.1f',math.floor(xp.rate/100)/10)..'k Amber:'..(abyssea.amber or 0)..'/Azure:'..(abyssea.azure or 0)..'/Ruby:'..(abyssea.ruby or 0)..'/Pearlescent:'..(abyssea.pearlescent or 0)..'/Ebon:'..(abyssea.ebon or 0)..'/Silvery:'..(abyssea.silvery or 0)..'/Golden:'..(abyssea.golden or 0)..'/Time Remaining:'..(abyssea.time_remaining or 0)" + default = "string.format('%d/%dXP %sMerits XP/hr:%.1fk %sJP CP/hr:%.1fk %d/%dEP EP/hr:%.1fk',xp.current,xp.tnl,max_color('%5.2f':format(math.floor(lp.current/lp.tnm*100)/100+lp.number_of_merits),lp.current/lp.tnm+lp.number_of_merits,lp.maximum_merits,58,147,191),math.floor(xp.rate/100)/10,max_color('%6.2f':format(math.floor(cp.current/cp.tnjp*100)/100+cp.number_of_job_points),cp.current/cp.tnjp+cp.number_of_job_points,500,58,147,191),math.floor(cp.rate/100)/10,ep.current,ep.tnml,math.floor(ep.rate/100)/10)", + dynamis = "string.format('%d/%dXP %sMerits XP/hr:%.1fk %sJP CP/hr:%.1fk %d/%dEP %s %s',xp.current,xp.tnl,max_color('%5.2f':format(math.floor(lp.current/lp.tnm*100)/100+lp.number_of_merits),lp.current/lp.tnm+lp.number_of_merits,lp.maximum_merits,58,147,191),math.floor(xp.rate/100)/10,max_color('%6.2f':format(math.floor(cp.current/cp.tnjp*100)/100+cp.number_of_job_points),cp.current/cp.tnjp+cp.number_of_job_points,500,58,147,191),math.floor(cp.rate/100)/10,ep.current,ep.tnml,dynamis.KIs,dynamis.time_remaining or 0)", + abyssea = "string.format('%d/%dXP %sMerits XP/hr:%.1fk %sJP CP/hr:%.1fk %d/%dEP Amber:%d Azure:%d Ruby:%d Pearl:%d Ebon:%d Silver: Gold:%d Time-Remaining:%d',xp.current,xp.tnl,max_color('%5.2f':format(math.floor(lp.current/lp.tnm*100)/100+lp.number_of_merits),lp.current/lp.tnm+lp.number_of_merits,lp.maximum_merits,58,147,191),math.floor(xp.rate/100)/10,max_color('%6.2f':format(math.floor(cp.current/cp.tnjp*100)/100+cp.number_of_job_points),cp.current/cp.tnjp+cp.number_of_job_points,500,58,147,191),math.floor(cp.rate/100)/10,ep.current,ep.tnml,abyssea.amber or 0,abyssea.azure or 0,abyssea.ruby or 0,abyssea.pearlescent or 0,abyssea.ebon or 0,abyssea.silvery or 0,abyssea.golden or 0,abyssea.time_remaining or 0)", }, text_box_settings = { pos = { @@ -110,6 +110,13 @@ function initialize() number_of_merits = 0, maximum_merits = 30, } + + ep = { + registry = {}, + current = 0, + rate = 0, + tnml = 0, + } sparks = { current = 0, @@ -155,5 +162,13 @@ function initialize() cur_func = loadstring("current_string = "..settings.strings.default) setfenv(cur_func,_G) end - + for _,id in ipairs(packet_initiators) do + local handler = packet_handlers[id] + if handler then + local last = windower.packets.last_incoming(id) + if last then + handler(last) + end + end + end end From eb3c99ddc0e119a482b7e4069547af544219331c Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Tue, 23 Nov 2021 19:30:29 -0700 Subject: [PATCH 08/21] Update Pointwatch.lua -- minor bugfix typo --- addons/pointwatch/pointwatch.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/pointwatch/pointwatch.lua b/addons/pointwatch/pointwatch.lua index a2bd62342..91b356609 100644 --- a/addons/pointwatch/pointwatch.lua +++ b/addons/pointwatch/pointwatch.lua @@ -357,8 +357,8 @@ function exp_msg(val,msg) end elseif msg == 810 then ep.registry[t] = (ep.registry[t] or 0) + val - if ep.tnl and ep.current >= ep.tnl then - ep.current = ep.current - ep.tnl + if ep.tnml and ep.current >= ep.tnml then + ep.current = ep.current - ep.tnml end end update_box() From f8015a0adb7e0bf777ebe8d5f27f3af257cb3842 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Tue, 23 Nov 2021 22:29:39 -0700 Subject: [PATCH 09/21] update for 0x063 order 2 --- addons/libs/packets/fields.lua | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index bdc9b782f..b7aba18b9 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2719,9 +2719,9 @@ enums.quest_mission_log = { [0x00E8] = 'Completed Abyssea Quests', [0x00F0] = 'Current Adoulin Quests', [0x00F8] = 'Completed Adoulin Quests', - [0x0100] = 'Current Coalition Quests', - [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0x0100] = 'Current Coalition Quests', + [0x0108] = 'Completed Coalition Quests', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. @@ -2737,7 +2737,7 @@ fields.incoming[0x056] = function (data, type) end func.incoming[0x056].type = L{ - {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='short', label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x056][0x0080] = L{ @@ -3045,7 +3045,14 @@ func.incoming[0x063].base = L{ } func.incoming[0x063][0x02] = L{ - {ctype='data[7]', label='_flags1', fn=bin+{7}}, -- 06 The 3rd bit of the last byte is the flag that indicates whether or not you are xp capped (blue levels) + {ctype='unsigned short', label='_unknown1', const=0x000C}, -- 06 + {ctype='unsigned short', label='Limit Points'}, -- 08 + {ctype='bit[7]', label='Merit Points'}, -- 0A + {ctype='bit[6]', label='Assimilation'}, -- 0A Bonus Blue Magic Points + {ctype='boolbit', label='Limit Breaker'}, -- 0A Level >=75 and have KI + {ctype='boolbit', label='EXP Capped'}, -- 0A + {ctype='boolbit', label='Limit Point Mode'}, -- 0A + {ctype='unsigned char', label='Max Merit Points'}, -- 0C } func.incoming[0x063][0x03] = L{ From 2564bd1cf420feb0ed6b5a26de3f614415c1fef6 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Tue, 23 Nov 2021 23:00:57 -0700 Subject: [PATCH 10/21] fix extra spaces --- addons/libs/packets/fields.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index b7aba18b9..22cab0fee 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2719,9 +2719,9 @@ enums.quest_mission_log = { [0x00E8] = 'Completed Abyssea Quests', [0x00F0] = 'Current Adoulin Quests', [0x00F8] = 'Completed Adoulin Quests', - [0x0100] = 'Current Coalition Quests', - [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0x0100] = 'Current Coalition Quests', + [0x0108] = 'Completed Coalition Quests', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. From e7c348cedb3fba9ef0bfb624684113371032a3b8 Mon Sep 17 00:00:00 2001 From: trevor Date: Thu, 25 Nov 2021 21:33:54 -0500 Subject: [PATCH 11/21] Swap the order of unpack's arguments. --- addons/libs/dialog.lua | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/libs/dialog.lua b/addons/libs/dialog.lua index 559817559..9fd054d6e 100644 --- a/addons/libs/dialog.lua +++ b/addons/libs/dialog.lua @@ -40,7 +40,7 @@ local function binary_search(pos, dat, n) local l, r, m = 1, n while l < r do m = floor((l + r) / 2) - if decode(unpack(' Date: Thu, 25 Nov 2021 21:43:04 -0500 Subject: [PATCH 12/21] Handle unsigned int --- addons/libs/dialog.lua | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/addons/libs/dialog.lua b/addons/libs/dialog.lua index 9fd054d6e..01473c0e3 100644 --- a/addons/libs/dialog.lua +++ b/addons/libs/dialog.lua @@ -80,7 +80,11 @@ function dialog.get_ids_matching_entry(dat, encoded_entry) local last_offset = decode(unpack(dat, ' Date: Fri, 26 Nov 2021 22:05:08 -0700 Subject: [PATCH 13/21] Revert "update for 0x063 order 2" This reverts commit f8015a0adb7e0bf777ebe8d5f27f3af257cb3842. --- addons/libs/packets/fields.lua | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 22cab0fee..bdc9b782f 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2737,7 +2737,7 @@ fields.incoming[0x056] = function (data, type) end func.incoming[0x056].type = L{ - {ctype='short', label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x056][0x0080] = L{ @@ -3045,14 +3045,7 @@ func.incoming[0x063].base = L{ } func.incoming[0x063][0x02] = L{ - {ctype='unsigned short', label='_unknown1', const=0x000C}, -- 06 - {ctype='unsigned short', label='Limit Points'}, -- 08 - {ctype='bit[7]', label='Merit Points'}, -- 0A - {ctype='bit[6]', label='Assimilation'}, -- 0A Bonus Blue Magic Points - {ctype='boolbit', label='Limit Breaker'}, -- 0A Level >=75 and have KI - {ctype='boolbit', label='EXP Capped'}, -- 0A - {ctype='boolbit', label='Limit Point Mode'}, -- 0A - {ctype='unsigned char', label='Max Merit Points'}, -- 0C + {ctype='data[7]', label='_flags1', fn=bin+{7}}, -- 06 The 3rd bit of the last byte is the flag that indicates whether or not you are xp capped (blue levels) } func.incoming[0x063][0x03] = L{ From 07a44c87b593e6938a1aa4330c3739a8f03c0f13 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:16:03 -0700 Subject: [PATCH 14/21] Update 0x063-Order 2 --- addons/libs/packets/fields.lua | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index bdc9b782f..b7aba18b9 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2719,9 +2719,9 @@ enums.quest_mission_log = { [0x00E8] = 'Completed Abyssea Quests', [0x00F0] = 'Current Adoulin Quests', [0x00F8] = 'Completed Adoulin Quests', - [0x0100] = 'Current Coalition Quests', - [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0x0100] = 'Current Coalition Quests', + [0x0108] = 'Completed Coalition Quests', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. @@ -2737,7 +2737,7 @@ fields.incoming[0x056] = function (data, type) end func.incoming[0x056].type = L{ - {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='short', label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x056][0x0080] = L{ @@ -3045,7 +3045,14 @@ func.incoming[0x063].base = L{ } func.incoming[0x063][0x02] = L{ - {ctype='data[7]', label='_flags1', fn=bin+{7}}, -- 06 The 3rd bit of the last byte is the flag that indicates whether or not you are xp capped (blue levels) + {ctype='unsigned short', label='_unknown1', const=0x000C}, -- 06 + {ctype='unsigned short', label='Limit Points'}, -- 08 + {ctype='bit[7]', label='Merit Points'}, -- 0A + {ctype='bit[6]', label='Assimilation'}, -- 0A Bonus Blue Magic Points + {ctype='boolbit', label='Limit Breaker'}, -- 0A Level >=75 and have KI + {ctype='boolbit', label='EXP Capped'}, -- 0A + {ctype='boolbit', label='Limit Point Mode'}, -- 0A + {ctype='unsigned char', label='Max Merit Points'}, -- 0C } func.incoming[0x063][0x03] = L{ From 10d34abd4a86fedd0f80327ece3dd0a667b62c82 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:19:28 -0700 Subject: [PATCH 15/21] un-un-revert a change --- addons/libs/packets/fields.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index b7aba18b9..7b9ad2da5 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -3041,7 +3041,7 @@ fields.incoming[0x063] = function(data, type) end func.incoming[0x063].base = L{ - {ctype='unsigned short', label='Order'}, -- 04 + {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x063][0x02] = L{ From 9fcf2aca49d12a89260166aed05df25ded95562f Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:24:21 -0700 Subject: [PATCH 16/21] fix broken fix --- addons/libs/packets/fields.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 7b9ad2da5..59c436707 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2737,7 +2737,7 @@ fields.incoming[0x056] = function (data, type) end func.incoming[0x056].type = L{ - {ctype='short', label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 } func.incoming[0x056][0x0080] = L{ @@ -3041,7 +3041,7 @@ fields.incoming[0x063] = function(data, type) end func.incoming[0x063].base = L{ - {ctype='unsigned short',label='Type', fn=e+{'quest_mission_log'}} -- 24 + {ctype='unsigned short', label='Order'}, -- 04 } func.incoming[0x063][0x02] = L{ From e4493465e3fdd38e8113e80b3de7ae7751b04ea2 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:27:06 -0700 Subject: [PATCH 17/21] copy paste hates me --- addons/libs/packets/fields.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 59c436707..d0ed63a8d 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -3041,7 +3041,7 @@ fields.incoming[0x063] = function(data, type) end func.incoming[0x063].base = L{ - {ctype='unsigned short', label='Order'}, -- 04 + {ctype='unsigned short', label='Order'}, -- 04 } func.incoming[0x063][0x02] = L{ From b87b43b29200e04e815ce9f6ad7a16acc28da1e2 Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:28:24 -0700 Subject: [PATCH 18/21] remove extra spaces --- addons/libs/packets/fields.lua | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index d0ed63a8d..f22fee46b 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2719,9 +2719,9 @@ enums.quest_mission_log = { [0x00E8] = 'Completed Abyssea Quests', [0x00F0] = 'Current Adoulin Quests', [0x00F8] = 'Completed Adoulin Quests', - [0x0100] = 'Current Coalition Quests', - [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0x0100] = 'Current Coalition Quests', + [0x0108] = 'Completed Coalition Quests', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. From 348834a00303b39c4a0470d7df90a95ff1000d3f Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Fri, 26 Nov 2021 22:29:19 -0700 Subject: [PATCH 19/21] delete additional spaces --- addons/libs/packets/fields.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index f22fee46b..5f30696fd 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -2721,7 +2721,7 @@ enums.quest_mission_log = { [0x00F8] = 'Completed Adoulin Quests', [0x0100] = 'Current Coalition Quests', [0x0108] = 'Completed Coalition Quests', - [0xFFFF] = 'Current Missions', + [0xFFFF] = 'Current Missions', } -- There are 27 variations of this packet to populate different quest information. From f7f1158778a346ea1aebc71a5d587c29ab4c214e Mon Sep 17 00:00:00 2001 From: RubenatorX Date: Wed, 1 Dec 2021 21:09:05 -0700 Subject: [PATCH 20/21] Add missing message ID --- addons/pointwatch/pointwatch.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/pointwatch/pointwatch.lua b/addons/pointwatch/pointwatch.lua index 91b356609..b1f453e47 100644 --- a/addons/pointwatch/pointwatch.lua +++ b/addons/pointwatch/pointwatch.lua @@ -355,7 +355,7 @@ function exp_msg(val,msg) -- If a merit point was not gained, lp.current = math.min(lp.current,lp.tnm-1) end - elseif msg == 810 then + elseif msg == 809 or msg == 810 then ep.registry[t] = (ep.registry[t] or 0) + val if ep.tnml and ep.current >= ep.tnml then ep.current = ep.current - ep.tnml From b9f48a756ee8500688d3c5c05233442b72e2d69b Mon Sep 17 00:00:00 2001 From: Byrth Date: Sat, 4 Dec 2021 04:37:50 -0500 Subject: [PATCH 21/21] Add 0x0AD Incoming --- addons/libs/packets/data.lua | 1 + addons/libs/packets/fields.lua | 10 ++++++++++ 2 files changed, 11 insertions(+) diff --git a/addons/libs/packets/data.lua b/addons/libs/packets/data.lua index 31df30741..ff1a67473 100644 --- a/addons/libs/packets/data.lua +++ b/addons/libs/packets/data.lua @@ -200,6 +200,7 @@ data.incoming[0x08D] = {name='Job Points', description='Contains all jo data.incoming[0x0A0] = {name='Party Map Marker', description='Marks where players are on your map.'} data.incoming[0x0AA] = {name='Spell List', description='Packet that shows the spells that you know.'} data.incoming[0x0AC] = {name='Ability List', description='Packet that shows your current abilities and traits.'} +data.incoming[0x0AD] = {name='MMM List', description='Packet that shows your current Moblin Maze Mongers Vouchers and Runes.'} data.incoming[0x0AE] = {name='Mount List', description='Packet that shows your current mounts.'} data.incoming[0x0B4] = {name='Seek AnonResp', description='Server response sent after you put up party or anon flag.'} data.incoming[0x0B5] = {name='Help Desk Open', description='Sent when you open the Help Desk submenu.'} diff --git a/addons/libs/packets/fields.lua b/addons/libs/packets/fields.lua index 5f30696fd..7f13dc333 100644 --- a/addons/libs/packets/fields.lua +++ b/addons/libs/packets/fields.lua @@ -3338,6 +3338,16 @@ fields.incoming[0x0A0] = L{ --0x0AA, 0x0AC, and 0x0AE are all bitfields where the lsb indicates whether you have index 0 of the related resource. +-- Moblin Maze Mongers information +-- It appears that they anticipated a substantial expansion of the system, +-- but field sizes here are limited to the available items. +fields.incoming[0x0AD] = L{ + {ctype='bit[16]', label='Maze Vouchers'}, + {ctype='data[6]', label='_junk1'}, + {ctype='bit[128]', label='Maze Runes'}, + {ctype='data[0x68]', label="_junk2"}, +} + -- Help Desk submenu open fields.incoming[0x0B5] = L{ {ctype='data[0x14]', label='_unknown1'}, -- 04