お久しぶりのffxi windowerネタです。
近況
8月のウェルカムバックキャンペーンでオデシー ジェールのラグの状態を確認して、私の環境でも改善しているっぽかったので、9月は課金をしました。オデシー ジェールが実装された1月からログインしていなかったので、半年ぶりぐらいです。
3キャラでぼちぼちジェールを遊んでいます。装備開放で一周して、今Veng上げをやっています。AT3はVeng+5でも大変そうなので、出来るところまでやってみようかなと思っています。
本題
パーティーメンバーのジョブを取得するサンプルをメモしておきます。
TPSReportというパーティー、アライアンスメンバーをXML形式でファイルにエクスポートするアドオンを参考にしています。
github.com
パーティーメンバー(アライアンスを含む)の情報はwindower.ffxi.get_party()で取得できますが、ジョブの情報は含まれていません。
incoming 0x0DD(Party member update)や0x0DF(Char update)のパケットにはジョブの情報が含まれているので、windower.ffxi.get_party()の情報とキャラクターのIDで紐づけします。
おそらくキャラクターに変化がなければParty member updateやChar updateのパケットが来ないので、ジョブの情報が取得できないタイミングがあります。エリア移動やジョブチェンジやなにかしらのアクションをした際にはパケットが来るので、ジョブ情報を更新することができます。
require('luau') packets = require('packets') ptm = T{} windower.register_event('incoming chunk',function(id, data) if id ~= 0x0DD and id ~= 0x0DF then return end local p = packets.parse('incoming',data) if p.ID and p['Main job'] then ptm[p.ID] = { ['name'] = p['Name'], ['mjob'] = p['Main job'], ['sjob'] = p['Sub job'], } end end) windower.register_event('addon command', function(...) local args = {...} if args[1] == 'dump' then local party = windower.ffxi.get_party() for i, prefix in ipairs({[1]='p', [2]='a1', [3]='a2'}) do for j=0, party['party'..i..'_count']-1 do local m = party[prefix..j] if m and m.mob then local m_id = m.mob.id if ptm[m_id] then local mjob = res.jobs[ptm[m_id].mjob].ens local sjob = res.jobs[ptm[m_id].sjob].ens log(string.format('%s%d %s, mjob=%s, sjob=%s', prefix, j, m.mob.name, mjob, sjob)) end end end end end end)