黄金マスクのフェイスフラッシュを検知する

f:id:yyoshisaur:20200510152850j:plain
2020年4月のアンバスケード エキスパートは、オーク族でした。(引き続き、5月もオーク族のままのようですね)
"Bozzetto Crusader"は、一定時間経過すると発光し、発光状態ではベール・オブ・カオスやマニックダンスを使用します。
背後から物理WSを当てることで光が消え、また一定時間後に発光します。

この発光はHPの減少や特定の特殊技後に発生するというわけではなく、一定時間で発光するので特殊技などをトリガーに検知することはできません。
今回はWindowerでこういったNPCの変化を検知する方法を調べてみたいと思います。

StatueStatus

ダイバージェンスで石像の目の色を表示するStatueStatusというアドオンがあります。
このアドオンではNPCの変化を検知できているので、参考にします。
検出に使用しているパケットは、"NPC Update"(incoming 0x00E)のようです。
このパケットの"_unknown4"というプロパティを使用しています。
"unknown"ということなので、Windower的にはどのようなことに使われる値なのか分っていないようです。
StatueStatusでは、このプロパティの16, 17ビット目で石像の目の色を判別しています。(最下位ビットを0ビット目としています)

Bozzetto Crusader

このパケットに当りをつけて、PacketViewerでBozzetto Crusaderを観察すると、
"_unknown4"の16ビット目が1の場合は発光状態、0で消光状態でした。

検知するスクリプトを書いてみたいと思います。
今回はパケットから目的のプロパティ取得にunpackを使ってみました。
LPack Library · Windower/Lua Wiki · GitHub

require('pack')
local bit = require('bit')

windower.register_event('incoming chunk', function(id, original, modified, injected, blocked)
    if id == 0x00E then
        local id = original:unpack('I', 0x05)
        local mob = windower.ffxi.get_mob_by_id(id)
        if mob and mob.name == 'Bozzetto Crusader' then
            local _unknown4 = original:unpack('I', 0x29)
            if bit.band(_unknown4, 0x010000) == 0x010000 then
                -- 発光中
            else
                -- 発光なし
            end
        end
    end
end)

StatueStatusと今回のBozzetto Crusaderをみると_unknown4の16, 17ビット目あたりにNPCの外見の変化に関する情報がアサインされているような感じがします。
アンバスケードのトロール族やマムージャ族などもオーラ(いわゆるモヤる)状態になりますが、今回の方法で検知できるかは不明です。