マクロやGearSwapを使ってバフを消去したい[FF11]

f:id:yyoshisaur:20181107135829p:plain
空蝉の術やストンスキンなど上書きに条件があるものや上書き不可のバフがあります。
標準のテキストコマンドでは"バフの消去"は提供されていないため、
そのようなバフを付与しなおす際は一度「手動でバフを消去」してから再度バフを付与する必要があります。
今回は、「手動でバフを消去」の部分をマクロやGearSwapに組み込んで自動化する方法を書いてみます。

Windowerアドオン 「Cancel」

Cancel :: Windower Documentation
バフの消去をコマンドラインから行うアドオンです。
Windower上のAddonsからCancelをダウンロード、インストールをします。
2018年11月現在でバージョンは1.0でした。
このアドオンを使うことで、標準マクロにバフの消去を組み込むことができます。

使い方

//cancel 37

ここで"37"という数字はストンスキンのバフIDです。
バフIDは、~/Windower4/res/buffs.luaに定義されているので、必要に応じて確認します。

  • 標準のマクロに組み込む
/console cancel 37
/equipset xx (ファストキャスト装備)
/magic ストンスキン <me> <wait 1>
/equipset xx (ストンスキン効果アップ装備)


また、複数のバフIDを指定することで、複数のバフを1度に消去することもできます。

  • ヴァレション、ファストキャスト、リエモンを消去する(ゲーム内コマンドラインから)
//cancel 531,574,537


Cancelのドキュメントをみるとバフ名でも指定できるようですが、クライアントから渡ってきた文字列をUTF-8に変換せずバフの判定を行なっているため、日本語クライアントではバフ名での指定はうまく動作しないようです。
参考までにCancelのソースコードを以下のように変更すると、日本語クライアントでもバフ名指定で一応動作するようになります。

-- cancel.lua 47行目あたり
-- if windower.wc_match(res.buffs[v][language],r) or windower.wc_match(tostring(v),r) then
if windower.wc_match(res.buffs[v][language],windower.from_shift_jis(r)) or windower.wc_match(tostring(v),r) then

GearSwap

GearSwapのユーザースクリプトからバフを消去するには、いくつかの方法があります。

  • Cancelをsend_command関数で呼び出す
  • cancel_buff関数を使う

cancel_buff関数を使って、空蝉の術(分身)を消去する(空蝉の貼り替え)

cancel_buff関数はCancelと同様にバフIDを引数に指定することで指定したバフを消去します。
空蝉の術は分身の数によって、4種類のバフに分れているようです。

function midcast(spell)
    -- 空蝉の術(分身)のバフID
    local ci_id, ci2_id, ci3_id, ci4_id = 66, 444, 445, 446

    -- 空蝉の術:参以外の時に分身を消去する
    local utsusemi = T{'空蝉の術:壱', '空蝉の術:弐'}

    if string.find(spell.name, '空蝉の術') then
        equip({feet="服部脚絆改",})
        if utsusemi:contains(spell.name) then
            if buffactive['分身'] then
                windower.ffxi.cancel_buff(ci_id)
            elseif buffactive['分身(2)'] then
                windower.ffxi.cancel_buff(ci2_id)
            elseif buffactive['分身(3)'] then
                windower.ffxi.cancel_buff(ci3_id)
            elseif buffactive['分身(4+)'] then
                windower.ffxi.cancel_buff(ci4_id)
            end
        end
    end
end

私の環境ではmidcast関数で分身を消去しても空蝉の術の張り替えに間に合っていますが、
うまくいかないようであればprecast関数で消去するほうがよいかもしれません。