MENU

GerSwap】Mote-libsで楽しむナイト

アンバスなどのコンテンツで、何かと出番が増えてきているナイト。

詠唱中断処理など、そこそこ拘ってMote-libsのコードを組んでいます。是非とも参考にしてください。

目次

Mote-libsコード

ナイトのGearSwapコードは下記リンク参照。

あわせて読みたい
【GearSwap】ナイトのMote-libs用コード ナイトのMote-libsコードです。 ソースコード Mote-libsでは、ジョブロジック部分(ジョブ名.lua)と装備セット部分(ジョブ名_gear.lua)を切り分けていますので、次の...

私のナイトの説明

ナイトでコンテンツに出す機会もそれなりにありますので、少しでも便利にするため、小細工を仕込んでいます。

小細工その①詠唱中断処理

function job_midcast(spell, action, spellMap, eventArgs) 
    local fc=63/100
    if string.find(spell.type, 'Magic') then
        equip(sets.midcast.interruption)
        local adjust=0.9
        local cast_time = (spell.cast_time*(1-fc))*adjust        
        if spellMap == 'Phalanx' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.Phalanx')

        elseif spellMap == 'Cure' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.Cure')

        elseif spellMap == 'Flash' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.Flash')

 --[[]      elseif spellMap == 'Banish' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.Banish')
]]
        elseif spellMap == 'BlueMagical' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.BlueMagical')

        elseif spellMap == 'BlueBuff' then
            eventArgs.handled = true
            send_command('wait '..cast_time..'; gs equip sets.midcast.BlueBuff')
        end
    end
end

【GearSwap】Mote-libsで詠唱中断処理を組み込む方法で紹介している詠唱中断処理を使っています。

  • ファランクス
  • ケアル
  • フラッシュ
  • バニシュ
  • 青魔法

これらの魔法は詠唱中断装備で詠唱して、詠唱完了直前に効果アップ装備に着替えています。

上記の定義にない魔法に関しては、とりあえず詠唱中断装備で詠唱するようになっています。

小細工その②マクロの節約

    elseif cmdParams[1] == 'Enmity' then
        local spell_recasts = windower.ffxi.get_spell_recasts()
        local recast_time_Flash = spell_recasts[112]/60
        local recast_time_BlankGaze = spell_recasts[592]/60
        local recast_time_Jettatura = spell_recasts[575]/60
        
        local ability_recasts = windower.ffxi.get_ability_recasts()
        local recast_time_Provoke = spell_recasts[5]/60

        if recast_time_Flash == 0 then
            send_command('input /ma '..windower.to_shift_jis('フラッシュ')..' <stnpc>')
        elseif recast_time_Jettatura == 0 then
            send_command('input /ma '..windower.to_shift_jis('ジェタチュラ')..' <stnpc>')--0.5
        elseif recast_time_BlankGaze == 0 then
            send_command('input /ma '..windower.to_shift_jis('ブランクゲイズ')..' <stnpc>')--3
        elseif recast_time_Provoke == 0 then
            send_command('input /ja '..windower.to_shift_jis('挑発')..' <stnpc>')
        end
    elseif cmdParams[1] == 'EnmityRange' then
        local spell_recasts = windower.ffxi.get_spell_recasts()
        local recast_time_FrightfulRoar = spell_recasts[561]/60
        local recast_time_Soporific = spell_recasts[598]/60
        local recast_time_SheepSong = spell_recasts[584]/60
        local recast_time_GeistWall = spell_recasts[605]/60
        local recast_time_Stinking = spell_recasts[537]/60
        
        if recast_time_FrightfulRoar == 0 then
            send_command('input /ma '..windower.to_shift_jis('フライトフルロア')..' <stnpc>')--2
        elseif recast_time_GeistWall == 0 then
            send_command('input /ma '..windower.to_shift_jis('ガイストウォール')..' <stnpc>')--3
        elseif recast_time_Stinking == 0 then
            send_command('input /ma '..windower.to_shift_jis('スティンキングガス')..' <stnpc>')--4
        elseif recast_time_Soporific == 0 then
            send_command('input /ma '..windower.to_shift_jis('サペリフィック')..' <stnpc>')--3
        elseif recast_time_SheepSong == 0 then
            send_command('input /ma '..windower.to_shift_jis('シープソ\\ング')..' <stnpc>')--3
        end
    end

挑発やフラッシュなど目的が同じで違う処理が複数ある場合、マクロパレットが煩雑になってしまいます。

加えてガイストウォールなどの範囲敵対心用のマクロボタンも用意しなければいけなく、似たような処理を行うマクロがたくさん必要になります。

同じ目的の処理は一つのボタンにまとめたい。そのためのコードです。

こんなコードを使わなくても、6行のマクロに書けばいいじゃないかと思うかもしれませんが、GearSwapで6行マクロに複数の魔法を記述すると、正しく着替えが行われません。なので、一つのボタンで複数の処理をまとめるためこんなコードを書きました。

目的該当箇所マクロからの呼び出し方法
単体敵対心用cmdParams[1] == ‘Enmity’/console gs c Enmity
範囲敵対心用cmdParams[1] == ‘EnmityRange’/console gs c EnmityRange

これらのコマンドが呼び出されると、実行可能なアクションが上から順番に実行されます。リキャストが間に合わない場合は実行されません。

        if recast_time_Flash == 0 then
            send_command('input /ma '..windower.to_shift_jis('フラッシュ')..' <stnpc>')
        elseif recast_time_Jettatura == 0 then
            send_command('input /ma '..windower.to_shift_jis('ジェタチュラ')..' <stnpc>')--0.5
        elseif recast_time_BlankGaze == 0 then
            send_command('input /ma '..windower.to_shift_jis('ブランクゲイズ')..' <stnpc>')--3
        elseif recast_time_Provoke == 0 then
            send_command('input /ja '..windower.to_shift_jis('挑発')..' <stnpc>')
        end

魔法のリキャスト情報はffxi.get_spell_recasts()から、アビリティのリキャスト情報はffxi.get_ability_recasts()から取得します。Windower\resを参照して該当アクションのコードで認識させています。

小細工その③ファランクス切れの通知

function job_buff_change(buff, gain)
    if buff == "ファランクス" and not gain then
        windower.add_to_chat(167,'!!!!!! ファランクス切れ !!!!!!')
    end
end

ナイトにとってファランクスは生命線です。

たくさん強化されているような状況で小さなアイコンからファランクスの経過時間を確認するのは困難です。

Timersである程度認識できるとしても、切れている場合はなかなか気付かないことも多いので、私はファランクスが切れたタイミングで目立つメッセージを自分に表示させるようにしています。

コメント

コメントする

目次