2025/11/17 記事をまとめてブログ全体を整理しました。

【GearSwap】Mote-libsで詠唱中断処理を組み込む方法

GearSwapで詠唱中断装備から着弾装備に着替える方法をシェアします。

GearSwapには次のアクションルールがありますので、アクションに応じた装備定義をするのが基本です。

  • precast:魔法詠唱前
  • midcast:魔法詠唱中

魔法詠唱中に中断させないためには、midcast中に詠唱中断装備に着替えておく必要があります。ただし、詠唱中断処理のままでは着弾装備に着替えられないので、midcast中に詠唱中断装備と着弾装備に着替える必要があります。

この方法は推奨されるやり方ではありませんが、現状この方法でしか実装する手段がないため強引に実装しています。

目次

該当ロジック説明

function user_post_midcast(spell, action, spellMap, eventArgs)
    --詠唱中断処理
    if sets.midcast.interruption then
        Interruption(spell, action, spellMap, eventArgs)
    end
end

function Interruption(spell, action, spellMap, eventArgs)
    if string.find(spell.type, 'Magic') then
        if not sets.precast.FC then
            sets.precast.FC.value = 80
        end

        local fc = sets.precast.FC.value/100
        if player.main_job == '剣' and buffactive['ファストキャスト'] then
            --フサルクトラウザ装備時メリポのインスパイア1につき+12%
            --fc = fc + 12/100 --インスパイア1
            --fc = fc + 24/100 --インスパイア2
            --fc = fc + 36/100 --インスパイア3
            --fc = fc + 48/100 --インスパイア4
            --fc = fc + 60/100 --インスパイア5
        end
        if player.sub_job == '赤' then
            fc = fc + 15/100
        elseif player.main_job == '赤' then
            fc = fc + 38/100
        end
        if fc >= 80/100 then
            fc = 80/100
        end
        
        eventArgs.handled = true
        
        local adjust = 0.15
        local cast_time = (spell.cast_time*(1-fc))-adjust

        IdleMelee()
        equip(sets.midcast.interruption)

        if sets.midcast[spell.name] then
            send_command('wait '..cast_time..'; gs equip sets.midcast['..windower.to_shift_jis(spell.name)..']')
        elseif sets.midcast[spellMap] then
            send_command('wait '..cast_time..'; gs equip sets.midcast.'..spellMap)
        elseif sets.midcast[spell.skill] then
            send_command('wait '..cast_time..'; gs equip sets.midcast['..windower.to_shift_jis(spell.skill)..']')
        elseif sets.midcast[spell.type] then
            send_command('wait '..cast_time..'; gs equip sets.midcast.'..spell.type) 
        end
    end
end

詠唱中断処理が起動する条件

魔法詠唱で次の条件全てに合致する場合にのみ詠唱中断装備から着弾装備へ着替えます。

  • sets.midcast.interruption(詠唱中断装備)の定義がある
  • 詠唱中断させたくない魔法の装備定義がある
    • sets.midcast[‘ファランクス’]やsets.midcast[‘青魔法’]など

詠唱中断装備があり該当装備がない場合は詠唱中断装備のまま着弾します。

魔法の詠唱速度

魔法の詠唱速度はFC値によって変わってきますので、次の事項を考慮しています。

sets.precast.FC.value

詠唱時間の長い魔法や短い魔法が混在する状態で、詠唱直前に着弾装備へ着替えるためには、魔法の詠唱時間を計算する必要があります。

魔法そのものに設定されている時間とFC値によって詠唱時間が決定しますので、FC装備の値を取得するため装備定義にsets.precast.FC.valueを追加しました。

装備定義にsets.precast.FC.valueがない場合は、強制的に80で計算するようにしていますが、当然実際の詠唱時間とズレが生じますので、装備定義の方へsets.precast.FC.valueを必ず設定してください。

ジョブ特性によるFC値

ファストキャストの特性を持つジョブは赤と青がありますが、ロジック的にはメイン赤とサポ赤の場合に装備FC値に特性値を加算しています。

マスターレベルが45以上(サポ赤で55)の場合はFC特性値が変わってきますが、面倒くさいので現状未実装です。

青はFC装備で80を調整しやすいことと、魔法セットの状況でFC特性値が変わり計算が面倒であるためロジックに組み込んでいません。

アビリティによるFC値

魔道剣士のインスパイアでFC値が付与されます。

フサルクトラウザを装備した状態でヴァレションとヴァリエンスを実行すると、インスパイア値1につき12%のFC値が付与されます。ご自身の設定値に合わせてください。

        if player.main_job == '剣' and buffactive['ファストキャスト'] then
            --フサルクトラウザ装備時メリポのインスパイア1につき+12%
            --fc = fc + 12/100 --インスパイア1
            --fc = fc + 24/100 --インスパイア2
            --fc = fc + 36/100 --インスパイア3
            --fc = fc + 48/100 --インスパイア4
            --fc = fc + 60/100 --インスパイア5
        end

また、PTに魔道剣士がいるとファストキャストが付与されることがありますが、これも計算できないのでロジックには組み込んでいません。

装備着替えの優先度

着弾装備の優先度は次の通りで、該当定義があれば着替えます。

  • sets.midcast[spell.name]
    • 例:sets.midcast[‘ファランクス’]
  • sets.midcast[spellMap]
    • 例:sets.midcast.Cure
  • sets.midcast[spell.skill]
    • 例:sets.midcast[‘強化魔法’]
  • sets.midcast[spell.type]
    • 例:sets.midcast.BlueMagic

具体的な流れ

  1. FC値の計算
  2. 詠唱時間の計算(直前判定の調整値込み)
  3. 詠唱中断装備への着替え
  4. 詠唱時間経過後に着弾装備への着替え(非同期)

問題点

この方法は次の問題点があります。

①着替えの失敗

この方法は、理論上限りなく詠唱中断されず着替えることが可能ではありますが、実際はラグの影響で上手く着替えられない場合もあります。

詠唱中断率ダウン装備から着弾装備に着替えるまでの猶予時間は0.15秒です。

この時間を多くすると着弾装備を装備している時間が長くなるため詠唱中断される可能性が高くなり、この時間を少なくすると詠唱中断装備のまま着弾する可能性が高くなります。

プレイヤーのFC値とPC環境などによって変わるため、ちょうど良いadjust値を模索する必要があります。

また、クロ巣のような大量に敵を集める場合もラグくなるため、普段は0.15秒で成功する着替えが失敗するケースもあったりします。

②同期処理ができない

通常のGearSwapでは、midcastに入ってきた時点でメモリ上に該当装備が展開されており、sets.Buffなどでメモリ上の装備を上書きして着替えられるようになっています。

が、この方法はsend_commandで装備定義を直接呼び出しますので、メモリ上の装備更新ができません。

例えば学者でこの詠唱中断対策を組み込んだ場合、令狸執鼠の章や気炎万丈の章などsets.Buffで着替える装備に着替えられなくなります。

ロジック側でゴリゴリ条件分岐を書いて装備定義を用意しておけば可能ではありますが、スマートではありませんので、そういうことはやりたくないのです。

なので、sets.Buffで着替えたいジョブがある場合はこの方法を使わない方が無難です。

コメント

コメント一覧 (11件)

  • コメントありがとうございます。
    ファイルをずっとにらめっこしております;;

    つまり複雑な記述がなくともジョブ定義ファイルにstate.Interruptionを記載すれば中断処理が起動すると認識してよろしいのでしょうか。
    またその場合
    ①ジョブごとにFCが違う場合どちらに記載すればよいのか
    ②中断処理はすべての魔法に作用するのか(指示いただいてもピンと来なくてすいません例にあった1、2,3,4、以外の魔法行動とはどういった場合なのか思いつかなくて、よってすべての魔法なのかなぁと思った次第です)
    何度もアホな質問で申し訳ございません、お手すきの時にでもご教授いただけますと幸いです。

    • 詠唱中段処理の部分のロジックをいじってstate.Interruptionをなくしました。
      アップしていますのでまたご確認ください。
      いまはsets.midcast.interruptionの定義がある場合のみ詠唱中段処理が動作します。

      ①ジョブ毎のFC値は装備定義ファイルのsets.precast.FC.valueでセットします。
      ②全ての魔法で作用します。たぶん。
      ただし、装備定義がある場合のみです。

      まずは、詠唱中段装備の定義をし、たとえばファランクスの定義を行い、ファランクスを詠唱してみてください。
      詠唱中段処理に着替えた後着弾装備に着替えると思います。

    • sets.midcast.interruptionの定義がある場合は詠唱中断処理function Interruptionが動きます。
      この中でファランクスなど詠唱中断の装備定義があれば詠唱中断→着弾装備に着替えます。
      ファランクスなど個別の定義がない場合は詠唱中断装備のまま着弾します。

      • ナイトで実験してみました。
        これすごい。。。今まで気になってたことが完璧な動作をしてくれています!
        showswapsで確認しただけなので明日にでも実践投入してみます!

        毎度速攻の対応本当に感謝でございます!

      • ちなみにこの共通ファイルに更新することで、人からの魔法自動着替え機能は消滅したのですよね?

        • 被魔法での強化は残っています。
          ナイトファイルですと末尾にあるsets.midcast.IncreasedXXXに定義すれば拾ってくれます。
          ただ、被魔法の場合課題は色々と残っておりますので、state.Increasedフラグを設けて被魔法の着替えで行うかを切り替えられるようにしています。

        • あぁ、この処理は今日ナイトに実装したところなので、剣のはまだアップしていません。

          • おぉ、実装していらっしゃったのですね、、なんで起動しないんだろう。。
            アップしてくださっている329行〜362行だと思うのですが、共通ファイル、pld.lua pld_gear.luaとともに最新にしても着替えてくれない事案が発生しております。
            同じPTの赤より(2垢)ファランクス、プロテス、シェル、リジェネで確認してみました。
            自分で唱える場合はキチンと着替えております。

          • こちらも変更しているので行番号は一致していませんが、共通ファイルを▼▼▼▼▼▼被強化バフ対応▼▼▼▼▼で検索してHITする箇所が該当処理です。
            下記が対象の魔法で装備セットは通常セットとは別の名前で定義する必要があります。
            ・リジェネsets.midcast.IncreasedRegenerated
            ・ファランクスsets.midcast.IncreasedPhalanx
            ・リフレシュsets.midcast.IncreasedRefresh
            ・プロテスsets.midcast.IncreasedProtect
            ・シェルsets.midcast.IncreasedShell
            ・カーズナsets.midcast.IncreasedCursna

            この点確認してみてください

  • こちらにて失礼します。ファランクス、フォイル、フラッシュ、ケアル、強化魔法、青魔法に詠唱中断入れる場合は
    if sets.midcast[spell.name] then
    send_command(‘wait ‘..cast_time..’; gs equip sets.midcast[‘..windower.to_shift_jis(‘ファランクス’,’フォイル’,’フラッシュ’)..’]’)
    elseif sets.midcast[spellMap] then
    send_command(‘wait ‘..cast_time..’; gs equip sets.midcast.’..Cure)
    elseif sets.midcast[spell.skill] then
    send_command(‘wait ‘..cast_time..’; gs equip sets.midcast[‘..windower.to_shift_jis(‘強化魔法’)..’]’)
    elseif sets.midcast[spell.type] then
    send_command(‘wait ‘..cast_time..’; gs equip sets.midcast.’..BlueMagic)
    end
    これでよいのでしょうか?

    どうもうまく動いてなさそうで;;

    • 共通ファイルのロジック該当箇所は次の通りです。

      function user_post_midcast(spell, action, spellMap, eventArgs)
      –詠唱中断処理
      if state.Interruption and state.Interruption.value then
      Interruption(spell, action, spellMap, eventArgs)
      end
      end
      ジョブ定義ファイルにstate.Interruptionが存在していればInterruptionファンクションが起動します。

      Interruptionは該当定義がある場合かつ、該当定義がある場合にのみ詠唱中断処理を行うようになっています。
      例えばフラッシュの場合は次のような定義が必要です。
      sets.midcast[‘フラッシュ’] = set_combine(sets.Enmity,{})

      なので、個別に魔法毎にロジックを実装する必要はなくて、該当装備を定義すれば動くようになっています。

けぇ へ返信する コメントをキャンセル

目次