バフの効果がアップするタイミングは3パターンあります。
- アビリティ発動時に効果アップするもの
- アクション実行時に効果アップするもの
- 装備中に効果アップするもの(マナウォールなど)
レリックやエンピなど、各装備でどのようなタイミングで装備しておけば良いのかについては、用語辞典で確認してください。
Mote-libsでこれらの着替え方法について説明します。
1.アビリティ発動時
アビリティを発動した瞬間に着替える方法です。
sets.precast.JA['アジュールロー'] = {hands="LLバズバンド+1"}
Mote-libsでは、上記の様にアビリティ名を指定して装備を定義するだけで、該当するアビリティが発動したタイミングで自動的に該当する装備を選択して着替えを行ってくれます。
2.アクション実行時
魔法着弾時に装備していなければ効果がない装備に着替える方法です。
ジョブロジックの定義
私が使用している学者のロジックで説明します。
Mote-libsではアクティブになっているバフを「state.Buff」で管理する機能がありまして、どのバフを管理するのかを「job_setup」で定義しています。詳しくはやまみかんさんのブログで解説されておりますので、参考にしてください。
function job_setup()
state.Buff['気炎万丈の章'] = buffactive['気炎万丈の章'] or false
state.Buff['意気昂然の章'] = buffactive['意気昂然の章'] or false
state.Buff['令狸執鼠の章'] = buffactive['令狸執鼠の章'] or false
state.Buff['震天動地の章'] = buffactive['震天動地の章'] or false
state.Buff['電光石火の章'] = buffactive['電光石火の章'] or false
state.Buff['疾風迅雷の章'] = buffactive['疾風迅雷の章'] or false
state.Buff['簡素清貧の章'] = buffactive['簡素清貧の章'] or false
state.Buff['勤倹小心の章'] = buffactive['勤倹小心の章'] or false
state.Buff['虚誘掩殺の策'] = buffactive['虚誘掩殺の策'] or false
state.Buff['机上演習:蓄積中'] = buffactive['机上演習:蓄積中'] or false
include('weather_obi')
end
バフがアクティブになっている状態で、効果アップ装備に着替えるためには「job_post_midcast」で処理を定義しなければいけませんので、次のように実装しています。
もう少しシンプルにすることもできるのですが、わかりやすくするためにスキル毎に分けて書いています。
function job_post_midcast(spell, action, spellMap, eventArgs)
if spell.skill == '強化魔法' then
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
elseif spell.skill == '精霊魔法' then
equip(get_hachirin(spell.element))
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
if state.VagaryMode.value then
equip(sets.Vagary)
end
elseif spell.skill == '暗黒魔法' then
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
elseif spell.skill == '回復魔法' then
if spellMap == 'Cure' and spell.target.type == 'MONSTER' then
equip(set_combine(sets.midcast['精霊魔法'],get_hachirin(spell.element),{main="デイブレイクワンド", sub="アムラピシールド"}))
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
else
equip(set_combine(get_hachirin(spell.element),{back="黄昏の羽衣"}))
end
end
end
このコードの中がで大事な部分が次の処理になります。
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
この処理は、sets.buffで監視しているバフがアクティブになっているものを一つずつ探し、該当する装備に着替える処理です。
アクティブになっているバフをループで処理し、アクティブになっているバフがある場合に該当装備に着替えてくれます。例えば、気炎万丈の章がアクティブになっているのなら、sets.buff[‘気炎万丈の章’]に該当する装備を選択して着替えます。
装備の定義
装備の定義名は、sets.buff「’アビリティ名’」で必ず合わせてください。
監視したいアビリティ名をstate.Buffで管理して、着替えたい装備をsets.buffで定義したものが次のコードです。
sets.buff['気炎万丈の章'] = {head = "ABボネット+3"}
sets.buff['意気昂然の章'] = {head = "ABボネット+3"}
sets.buff['令狸執鼠の章'] = {hands= "ABブレーサー+3"}
sets.buff['簡素清貧の章'] = {legs = "ABパンツ+3"}
sets.buff['勤倹小心の章'] = {legs = "ABパンツ+3"}
sets.buff['電光石火の章'] = {feet = "PDローファー+3"}
sets.buff['疾風迅雷の章'] = {feet = "PDローファー+3"}
sets.buff['虚誘掩殺の策'] = {feet = "ABローファー+3"}
sets.buff['震天動地の章'] = {
main="ハーミットワンド",
sub="玄冥盾",
ammo="ストンチタスラム+1",
head={ name="ブリスタサリット+1", augments={'Path: A',}},
body={ name="ロゼトジャズラン+1", augments={'Path: A',}},
hands="ローゲイスカフス",
legs={ name="AMスロップス+1", augments={'MP+80','"Mag.Atk.Bns."+25','Enmity-6',}},
legs="ピンガズボン",
feet="トゥティアサボ",
neck="上級近衛騎士カラー",
waist="コーネリアの黒帯",
left_ear="エテオレートピアス",
right_ear="ハーティーピアス",
left_ring="守りの指輪",
right_ring={ name="ゼラチナスリング+1", augments={'Path: A',}},
back={ name="フィフォレケープ+1", augments={'Path: A',}},
}
3.装備中に効果アップするもの
マナウォールや机上演習など、バフがアクティブの間、効果アップに着替える続ける方法です。
机上演習の場合
自分が何をやりたいのかによって実装方法は変わってきます。
私の場合は、待機装備で机上演習の効果アップ装備に着替えられればOKなので、次のよう実装しています。
function customize_idle_set(idleSet)
local weapon = sets.weapons[state.Weapons.value]
idleSet = set_combine(idleSet, weapon)
if state.Buff['机上演習:蓄積中'] then
idleSet = set_combine(idleSet, sets.buff['机上演習'])
elseif state.VagaryMode.value then
idleSet = set_combine(idleSet, sets.Vagary)
end
return idleSet
end
sets.buff['机上演習'] = {
head="ACボード+3",
body="PDガウン+3",
waist="エンブラサッシュ",
left_ear="サバントピアス",
}
マナウォールの場合
マナウォールがアクティブになったタイミングで、足の装備を変更不可にセットします。
disable(‘feet’)にセットすると、GearSwapを経由する着替えが一切行われなくなりますので、FC装備や魔攻装備に着替えても足だけ変更されません。
背装備も着替え不可にしたいのであれば、disable(‘back’)を追加してください。
function job_buff_change(buff, gain)
if buff == "マナウォール" then
if gain then
equip(sets.buff['マナウォール'])
disable('feet')
else
enable('feet')
if player.status == 'Idle'then
equip(get_idle_set())
else
equip(get_melee_set())
end
end
end
end
sets.buff['マナウォール'] ={feet="WCサボ+3"}
コメント
コメント一覧 (13件)
挙動確認出来ました。Mote-libs移行が捗りそうで非常に感謝しています。
例)メイン垢オートアタック開始でサブ垢ディア詠唱、メイン垢納刀時にサブ垢ヒーリング
player.statusがIdleかそれ以外がフラグになる記述を知りたいです。
よろしくお願いいたします。
GearSwapでサブ垢の操作は可能ですが、本来の使い方から外れてしまいますので、やるならAutoexあたりで実現するのが簡単ではないでしょうか?
GearSwapで実現するならこうなります。
send_commandしている部分で、sendやスクリプトを実行させればやりたいことは出来ると思います。
ただし、納刀時にヒーリングする場合、移動を考慮しなければいけないでしょうから、別途何かしらのフラグで制御は必要になるでしょうね。
function job_status_change(newStatus, oldStatus)
if player.status == ‘Engaged’ then
send_command(‘input /p 1’)
else
send_command(‘input /p 2’)
end
end
連投すみません。
20行目if auto thenはif is_send thenです。
学者か召喚のコードが参考になると思います。
一部抜粋しました。
is_evasion = false
is_send = false
function status_change(new, old)
local set_equip = nil
if new == ‘Idle’ then
set_equip = sets.aftercast.dt
if is_evasion then
set_equip = sets.aftercast.melee_evasion
end
if is_send then
send_command(windower.to_shift_jis(‘@input //send @others /ma —‘))
end
elseif new == ‘Engaged’ then
set_equip = sets.aftercast.melee
if is_evasion then
set_equip = sets.aftercast.melee_evasion
end
if auto then
send_command(windower.to_shift_jis(‘@input //send @others /ma —‘))
end
end
function self_command(command)
if command == ‘evasion’ then
if is_evasion then
is_evasion = false
windower.add_to_chat(122,’+++ 回避なし +++’)
else
is_evasion = true
windower.add_to_chat(122,’+++ 回避あり +++’)
end
elseif command == ‘send’ then
if send == false then
send_command(windower.to_shift_jis(‘@input /echo Send ON’))
auto = true
else
send_command(windower.to_shift_jis(‘@input /echo Send OFF’))
send = false
end
end
回避部分はstate.OffenseMode state.IdleModeで対応出来そうですが、Mote-libsに置きなおそうとしましたがうまく動いていません。
ご検討をお願いします。
回避装備のセットはstate.OffenseModeとstate.IdleModeでスッキリ解決できますね。
ざっと見た感じ、こんな感じでしょうか?
function job_setup()
state.OffenseMode:options(‘Normal’,’Evasion’)
state.IdleMode:options(‘Normal’,’Evasion’)
state.Send = M(false, ‘send’)
end
function job_self_command(cmdParams, eventArgs)
if cmdParams[1] == ‘send’ then
if state.Send.value then
–send_command(windower.to_shift_jis(‘@input /echo Send ON’))
else
–end_command(windower.to_shift_jis(‘@input /echo Send OFF’))
end
end
end
is_sendとautoで部分が次の処理をしている意図がよく分からないですが、これはmidcastでやれば良さそうな気はします。
send_command(windower.to_shift_jis(‘@input //send @others /ma —’))
job_self_commandでsendのフラグを切り替えるにはFF11から次のコマンドを使います。
/consle gs c cycle send
このコマンドだけでsendのフラグを切り替えられますので、後はどう使うかだけの話です。
フラグを切り替えたタイミングで何かしたいのであれば、job_self_commandに書きますし、何かの処理中に毎回やりたいのであればmidcastになりますしね。
お世話になります。
よしざうるすさんのコード(現在閉鎖中)を参考にgearswap単体を使用しています。
1、着替え順番の部位指定対応についてはHPの増減幅を減らす為よしざうるすさんの記事GearSwapで着替えの順番を指定する[FF11]を参考にして使用していました。
2、self_commandの解説についてはよしざうるすさんの記事#3 狩人ではじめるGearSwap(近接攻撃編)[FF11]を参考に使用していました。
Mote-libsに移行するにあたり使用中のself_commandを管理人様のコードに手を加えて追加したいと考えています。
なるほど。やりたいことは分かりました。
着替えによるHP増減はよしざうるすさんのページで完結していると思うので、たいしたことは書けないと思いますが、分かる範囲で近々書いてみます。
Send_Commandは、Send_Commandの使い方の基本的な内容になりそうですが、こちらも合わせて書いておきます。
バフ中に着替え持続ではなく自己魔法詠唱時の着弾装備に適用されるんですね。
PTからのファランクスにエンボルドの効果を乗せる場合sets.midcast.Phalanxにディバートケープをセットしつつgs equip sets.midcast.Phalanx で被ファランクス待機になりますか。
ありがとうございました。
厚かましいですが今後の要望を 1、着替え順番の部位指定対応 2、self_commandの解説
ご検討よろしくお願いいたします。
私は、いつも自分で動かしながら都度修正をするスタイルであり、魔道剣士はまだちゃんとやっていないので、細かい部分を詰め切れていないのが実情です。
なので、エンボルド後にPTから強化魔法を受ける話に関しては、現段階で未実装です(あとで対応します)
GearSwapは基本的に自己処理のためのものですので、エンボルド後に自己ファラする場合には対応できています。
要望に関してですが、要するに、着替えの仕組み(バフと装備)がわかりにくいということですよね?
self_Commandは私が自分で使いやすいように組んでいるだけなので、私の癖の問題がかなり強いですが、まとまった時間が取りにくいので、追々書いて行くとします。
取り急ぎ、魔道剣士のコード解説が欲しい感じですか?
お世話になります。質問お願いします。
魔導剣士のエンボルド、青魔道士のディフュージョンエフラックス等は記事内2.アクション実行時にあたると思うのですが管理人様のジョブロジックの定義にお間違いはありませんでしょうか。
エンボルドやディフュージョンなどのバフは、アクション実行時というよりも、バフが有効の時に詠唱する魔法を効果アップします。
state.Buff[“バフ名”]が有効の時に、sets.buff[buff]の装備に着替えてくれるように実装しています。
なので、公開しているロジックで問題ありません。