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_commandはcmdParamsに<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