パーティメンバーのジョブを取得する

お久しぶりの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)