2025/3/26 Mote-Mappings.lua を公式のものに入れ替えました。それに伴い各種ジョブロジック見直し動作確認中。エラーが出るものがあるかもしれません。

【GearSwap】job_self_commandの便利な使い方

job_self_commandは、自分でコマンドをカスタムできる便利なファンクションです。

このコマンドを使えば、GearSwapを少し便利に使えるようになります。

例えば、次のようなカスタムコマンドを定義したとします。

function job_self_command(cmdParams, eventArgs)
    if cmdParams[1] == 'aaa' then
        send_command('input /p あいうえお')
    end
end

このカスタムコマンド名は、’aaa’として定義し、処理の内容はパーティ会話モードで「あいうえお」と出力するだけの簡単なものです。

このやり方を応用すれば、自由にカスタマイズすることが可能になります。

目次

カスタムコマンドの実行方法

カスタムコマンドは、次の方法で実行できます。

--スクリプトから実行する場合
gs c aaa

--チャット欄から実行する場合
//gs c aaa

--マクロから実行する場合
/con gs c aaa

カスタムコマンドの使い方

カスタムコマンドは次の方式で実行します。<string>にはパラメータを指定します。

gs c <string>

<string>には複数のパラメータを引き渡すことが可能です。

例えば、3つのパラメータを渡したい場合は次のようになります。

gs c aaa  bbb ccc

このコマンドが実行された場合、job_self_commandcmdParamsに<string>を次のように格納して引き渡してくれます。

  • cmdParams[1]:aaa
  • cmdParams[2]:bbb
  • cmdParams[3]:ccc

冒頭のサンプルのように、パラメータを一つだけ指定して使うやり方が基本形となりますが、パラメータによって条件分岐させることも可能です。

カスタムコマンドの実用例

私は次の用途でカスタムコマンドを使っています。

  • フラグの切り替え
  • 待機装備強制着替え
  • マクロパレットの節約
  • 学者の連携

実例で使い方を説明します。

job_self_commandのサンプル

次のコードは、私の学者のjob_self_commandです。

このコードが網羅的に説明できるので、学者のコードをサンプルに説明します。

  • jazero(Jazeroの有効無効切り替え)
  • lockstyleset(ロックスタイルの固定)
  • Idle(待機装備への強制着替え)
  • white(白グリ用のロックスタイル固定)
  • black(黒グリ用のロックスタイル固定)
  • aspir(マクロパレットの節約)
  • sc(震天動地連携)
function job_self_command(cmdParams, eventArgs)
    if cmdParams[1] == 'jazero' then
        send_command('gs c cycle Jazero;')
        if state.Jazero.value then
            send_command('send @all unload jazero;')
        else
            send_command('send @all load jazero;')
        end
    elseif cmdParams[1] == 'lockstyleset' then
        send_command('input /lockstyleset '..lockstyleset)

    elseif cmdParams[1] == 'Idle' then
        if player.status == 'Idle'then 
            equip(get_idle_set()) 
        else
            equip(get_melee_set()) 
        end
        
    elseif cmdParams[1] == 'white' then
        send_command('gs c set Weapons white;input /lockstyleset '..lockstyleset_white)

    elseif cmdParams[1] == 'black' then
        send_command('gs c set Weapons black;input /lockstyleset '..lockstyleset_black)

    elseif cmdParams[1] == 'aspir' then
        local recasts = windower.ffxi.get_spell_recasts()
        local recast_time_a1 = recasts[247]/60
        local recast_time_a2 = recasts[248]/60

        if recast_time_a2 == 0 then
            send_command('input /magic '..windower.to_shift_jis('アスピルII')..' <stnpc>')
        elseif recast_time_a1 == 0 then
            send_command('input /magic '..windower.to_shift_jis('アスピル')..' <stnpc>')
        else
            windower.add_to_chat(30, 'アスピル リキャスト---> II: %.1fs, I: %.1fs':format(recast_time_a2, recast_time_a1))
        end

    elseif cmdParams[1] == 'sc' then
        if cmdParams[2] == 'start' then
            disp_start_skillchain_message(cmdParams[3],cmdParams[4])
        elseif cmdParams[2] == 'end' then
            disp_end_skillchain_message(cmdParams[3],cmdParams[4])
        else
            windower.add_to_chat(123,'invalid argment: ' .. command)
        end
    end
end

jazero(Jazeroの有効無効切り替え)

    if cmdParams[1] == 'jazero' then
        send_command('gs c cycle Jazero;')
        if state.Jazero.value then
            send_command('send @all unload jazero;')
        else
            send_command('send @all load jazero;')
        end

この処理は、Jazeroのロード・リロードを切り替えるためのスイッチフラグです。

Jazeroを使っている姿は他人には見せたくないので、オーメン詰みなど一人で遊べる場面ではJazeroをオンにして、PTプレイ時はJazeroをオフにしています。

ONとOFFをキーバインドさせておけば、処理を書かなくても良いのですが、一つのボタンでON/OFFを切り替えたかったので、このように実装しています。

私の癖の問題です。

lockstyleset(ロックスタイルの固定)

    elseif cmdParams[1] == 'lockstyleset' then
        send_command('input /lockstyleset '..lockstyleset)

ロックスタイルを固定するためだけのコマンドです。

キャラクター毎の装備ファイルにlockstylesetを定数として定義しています。

Idle(待機装備への強制着替え)

    elseif cmdParams[1] == 'Idle' then
        if player.status == 'Idle'then 
            equip(get_idle_set()) 
        else
            equip(get_melee_set()) 
        end

この処理は、抜刀・納刀状態に応じた装備に着替えるだけのコマンドです。

着替えがおかしくなったときや、デジョンリングなどを使った後にワンタッチで抜刀・待機状態の装備へ戻すために使っています。

white(白グリ用のロックスタイル固定)

    elseif cmdParams[1] == 'white' then
        send_command('gs c set Weapons white;input /lockstyleset '..lockstyleset_white)

白グリ時はムサで待機することが多いので、白グリ時は両手棍でロックスタイルを固定するためのコマンドです。

black(黒グリ用のロックスタイル固定)

    elseif cmdParams[1] == 'black' then
        send_command('gs c set Weapons black;input /lockstyleset '..lockstyleset_black)

黒グリ時はブンジロッドで待機することが多いので、黒グリ時は片手棍でロックスタイルを固定するためのコマンドです。

aspir(マクロパレットの節約)

    elseif cmdParams[1] == 'aspir' then
        local recasts = windower.ffxi.get_spell_recasts()
        local recast_time_a1 = recasts[247]/60
        local recast_time_a2 = recasts[248]/60

        if recast_time_a2 == 0 then
            send_command('input /magic '..windower.to_shift_jis('アスピルII')..' <stnpc>')
        elseif recast_time_a1 == 0 then
            send_command('input /magic '..windower.to_shift_jis('アスピル')..' <stnpc>')
        else
            windower.add_to_chat(30, 'アスピル リキャスト---> II: %.1fs, I: %.1fs':format(recast_time_a2, recast_time_a1))
        end

アスピル1とアスピル2のマクロが2つ置けるスペースがなかったので、アスピルマクロとして一つにまとめたものです。

Windowerのリソースからリキャスト状態で判断して、アスピル2>アスピル1の優先度でアスピルを詠唱できるカスタムコマンドです。

FF11のマクロを/con gs c aspirとすれば、このカスタムコマンドが実行されます。

sc(震天動地連携)

    elseif cmdParams[1] == 'sc' then
        if cmdParams[2] == 'start' then
            disp_start_skillchain_message(cmdParams[3],cmdParams[4])
        elseif cmdParams[2] == 'end' then
            disp_end_skillchain_message(cmdParams[3],cmdParams[4])
        else
            windower.add_to_chat(123,'invalid argment: ' .. command)
        end

マクロパレット節約術を使った震天動地マクロを簡単にするためのカスタムコマンドです。

cmdParams[2]がstartの時はトスの処理、cmdParams[2]がendの時は〆の処理になっています。

連携作成のメッセージをGearSwapで作っているため、このような実装になっています。

他は全部応用で拡張できる

基本的にはcmdParams[1]で指定した処理を分岐させれば、好きなだけカスタムコマンドを作ることが可能です。

このページに書いたやり方を応用すれば、ある程度やりたいことは実現可能かと思われます。

やろうと思えば、二垢の制御も可能ですが、GearSwapはあくまでも着替えの補助ツールですので、本来の用途から外れないように使うのが正しい使い方なのではないかと考えています。

パラメータを複数渡せばより複雑な制御も可能ですが、処理が複雑化するとバグったときに面倒くさいので、プログラムに自信が無い人は、シンプルに構成することをお勧めします。

コメント

コメント一覧 (7件)

  • ありがとうございます。
    ④武器固定ロジックにロスタムC着替えも追加して無事固定することが出来ました。
    ソーティでTPリセットが掛からずロールを使用しつつWSも撃ちたい場面もあります。
    持ち替える武器の定義にロスタムCも追加すればいいのでしょうが持ち替える種類が増え不便に感じました。
    又、特定のロール時だけ武器持ち替えしない場合はどのようなコードになりますか。
    例)オデシーで頻繁に使用するボルターズロールだけロスタムCに着替えないモード
    よろしくお願いします。

    • 動作の確認はしていませんが、job_post_midcastでこんな感じでやれば出来そうですね。
      if spell.name == ‘ボルターズロール’then
      equip(sets.Weapons.Rostam)
      end

    • 次のコードの追加で動作確認できました。
      function job_post_precast(spell, action, spellMap, eventArgs)
      if spell.type == ‘CorsairRoll’ and spell.name == ‘ボルターズロール’ then
      equip(sets.Weapons[state.Weapons.value])
      end
      end

      • ありがとうございます。
        state.ody = M(false,’ody’)
        function job_post_precast(spell, action, spellMap, eventArgs)
        if spell.type ==’CorsairRoll’ and spell.name == ‘ボルターズロール’ then
        if state.ody.value then
        equip(sets.Weapons[state.Weapons.value])
        end
        end
        end
        管理人様のコードを参考にon/offまで確認出来ました。
        これからも記事楽しみにしています。

  • お世話になります。
    いくつか要望の記事をあげていただき感謝します。
    武器持ち替えしつつその後武器固定をしたいのですが思うように動かないので添削お願いします。
    function job_self_command(cmdParams, eventArgs)
      if cmdParams[1] == ‘rosc’ then
    send_command(‘gs disable main;input /equip main ‘..windower.to_shift_jis(‘ロスタム 2′)..”)
    このようにすると武器持ち替え固定が出来ました。

    function job_setup()
    state.rosc = M(false,’rosc’)
    function job_self_command(cmdParams, eventArgs)
    if cmdParams[1] == ‘rosc’ then
    if state.rosc.value then
    send_command(‘gs disable main;input /equip main ‘..windower.to_shift_jis(‘ロスタム 2’)..”)
    else
    send_command(‘gs enable main’)
    end
    end
    end
    同じコマンドでon/offをしたいとおもい上記の通りにしましたが動きません。
    よろしくお願いします。

    • 武器の固定とは、その武器の変更を許可しないと言うことですかね?
      例えば、普段ロスタムBを使っていて、ロールをするときにロスタムCに持ち替えると思うのですが、このときロスタムCに変更させないと言うことですかね?
      その場合、disable mainで対応可能です。

      そうではなくて、ロールの時はロスタムCに持ち替えるのであれば私が公開しているコードで対応できています。
      例えば、青魔道士のコードなんて参考になるのではないでしょうか。
      青魔道士は武器の持ち替えも行っていますし、武器の固定もフラグで処理しています。

      一度見てみてください。

      • 分かりにくいと思うので、青魔道士のコードを説明します。

        ①持ち替える武器の定義(ロジック)
        function user_setup()
        state.Weapons = M{‘Tizona’,’Naegling’,’Maxentius’,’D1′}
        end

        ②持ち替える武器の定義(装備)
        sets.Weapons = {}
        sets.Weapons.Tizona = { main={name=”ティソーナ”}, sub={ name=”サクパタソード”}}
        sets.Weapons.Naegling = { main={name=”ネイグリング”}, sub={ name=”サクパタソード”}}
        sets.Weapons.Maxentius = { main={name=”マクセンチアス”}, sub={ name=”サクパタソード”}}
        sets.Weapons.D1 = { main={name=”クトゥルブナイフ”}, sub={ name=”幽世の短剣”}}

        ③武器固定フラグ
        state.OffenseMode:options(‘Normal’,’Fixed’)
        gs cycle OffenseModeで切り替えます。

        ④武器固定ロジック
        フラグが切り替わるとjob_state_changeが動きます。
        Offense ModeがNormal以外の時に、武器関連をdisableして着替えを出来なくしています。
        ※このとき固定される武器はstate.Weaponsで選択中の武器になります。
        function job_state_change(stateField, newValue, oldValue)
        if stateField == ‘Offense Mode’ then
        if newValue == ‘Normal’ then
        enable(‘main’,’sub’,’range’)
        else
        equip(get_melee_set())
        disable(‘main’,’sub’,’range’)
        end
        end
        end

コメントする

目次