2020年9月18日金曜日

Mote-Include: aftercastの流れを整理してみる

 Mote-Includeのaftercastにおける自動着替えの流れはちょっと複雑なので整理してみる。


全体の流れは、Mote-Include.luaのhandle_actions()で定義されており、
aftercast()
 ┗handle_actions()
   ┗filter_aftercast()      → EquipStopの処理
[C]   user_aftercast() [U]
[C][h] job_aftercast()  [U]アクション成功時(not spell.interrupted)の処理など
[C][h] default_aftercast()
     ┗handle_equipping_gear()
       ┗job_handle_equipping_gear() [U]check_range_lock()など
     [h']  equip_gear_by_status() → sets.engaged or sets.idleへ着替え
[C]   user_post_aftercast() [U]
[C]   job_post_aftercast()   [U]sets.Buffへの着替えなど
    cleanup_aftercast()
     ┗reset_transitory_classes() → classes.CustomClass and .JAMode= nil

上記の順番で関数が実行される。
[C]:eventArgs.cancel = trueのとき実行されない。
[h]:eventArgs.handled = trueのとき実行されない。
[U]:ユーザー関数

ユーザー関数[U]は5つもあるが、実際にはjob_aftercast()くらいしか使われていないようだ。希少な例だがTHF.luaでは他のユーザー関数も実装されている。

ここではBLM.luaのjob_aftercast()の例を挙げる。

function job_aftercast(spell, action, spellMap, eventArgs)
    -- Lock feet after using Mana Wall.
    if not spell.interrupted then
        if spell.english == 'Mana Wall' then
            enable('feet')
            equip(sets.buff['Mana Wall'])
            disable('feet')
        elseif spell.skill == 'Elemental Magic' then
            state.MagicBurst:reset()
        end
    end
end
マナウォールが成功した場合(not spell.interrupted)にマナウォール用の足装備に着替えて、足の部位を装備変更不可にしている。また、精霊魔法を成功させたときは、マジックバーストモードをリセットしている。

なお、equip()は装備をGearSwapに登録するだけの関数で、サーバーへのパケット送信はこのタイミングでは行われない。equip()はGearSwapのグローバル変数equip_listに値をセットしているだけである。パケット送信がされるのは、equip_sets()内のみ。equip_sets()をユーザーファイルから呼び出すことはできない。

ユーザー関数aftercast()は、通常、triggers.luaのアクションパケットのイベントハンドラから呼び出される。その際、equip_sets('aftercast',~)という感じでequip_sets()にラップされる形で呼び出される。equip_sets()はaftercast()を実行し終わった後、着替え用パケットを送信する。


2 件のコメント:

  1. 今晩は、いつも楽しく拝見させていただいています。
    afterでの自動着替えについて教えていただきたくコメントさせていただきます。

    pre → mid → afterの自動着替えで、preとmidは反映されるのですが、魔法詠唱後やアビ使用後にafterでの自動着替えがどうしても反映されません。

    pre、mid、afterそれぞれのファンクションは空の状態で init_gear_sets には以下を宣言しています。
    -------------------
    sets.idle
    sets.idle.Town
    sets.idle.Field
    -------------------
    init_gear_setsでのsets名が間違っているのか、afterの自動着替えでは何かしら指示が必要なのか、教えていただけると幸いです。

    ※ afterファンクション内で「equip(sets.idle)」を記述すると着替えるのですが、これだとmoteを使う意味がないような…

    返信削除
    返信
    1. こんにちは。コメントありがとうございます。

      sets名は正しいと思いますし、aftercastで特別な指示は必要ないと思います。

      //gs debugmode
      でデバッグログを確認してみてはいかがでしょうか。
      "Default aftercast set selection for ~"というデバッグログで、
      装備セット名が表示されると思います。

      削除