Mote-Includeのsets.precastなどの構文図のようなものを作ってみました。
・sets.precast
・sets.midcast
・sets.engaged
作って気が付きましたが、sets.engagedとsets.idleとでは、user_customize_*_set()とcustomize_*_set()の呼び出し順が逆なんですね。
Mote-Includeのsets.precastなどの構文図のようなものを作ってみました。
・sets.precast
作って気が付きましたが、sets.engagedとsets.idleとでは、user_customize_*_set()とcustomize_*_set()の呼び出し順が逆なんですね。
Mote-Includeのaftercastにおける自動着替えの流れはちょっと複雑なので整理してみる。
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
ユーザー関数[U]は5つもあるが、実際にはjob_aftercast()くらいしか使われていないようだ。希少な例だがTHF.luaでは他のユーザー関数も実装されている。
ここではBLM.luaのjob_aftercast()の例を挙げる。
function job_aftercast(spell, action, spellMap, eventArgs)マナウォールが成功した場合(not spell.interrupted)にマナウォール用の足装備に着替えて、足の部位を装備変更不可にしている。また、精霊魔法を成功させたときは、マジックバーストモードをリセットしている。
-- 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
なお、equip()は装備をGearSwapに登録するだけの関数で、サーバーへのパケット送信はこのタイミングでは行われない。equip()はGearSwapのグローバル変数equip_listに値をセットしているだけである。パケット送信がされるのは、equip_sets()内のみ。equip_sets()をユーザーファイルから呼び出すことはできない。
ユーザー関数aftercast()は、通常、triggers.luaのアクションパケットのイベントハンドラから呼び出される。その際、equip_sets('aftercast',~)という感じでequip_sets()にラップされる形で呼び出される。equip_sets()はaftercast()を実行し終わった後、着替え用パケットを送信する。
Githubにあるmote-includeのシーフ用ユーザーファイルを見ると、
function job_setup()
state.Buff['Sneak Attack'] = buffactive['sneak attack'] or false
state.Buff['Trick Attack'] = buffactive['trick attack'] or false
state.Buff['Feint'] = buffactive['feint'] or false
sets.precast.JA['Sneak Attack'] = sets.buff['Sneak Attack']と定義してあるため、(2)の段階で不意打ち装備への着替えは完了しているから、(5)の処理が完了する前に通常攻撃しちゃったとしても問題はない。
function aftercast(spell)
if state.Buff[spell.english] ~= nil then
state.Buff[spell.english] = not spell.interrupted or buffactive[spell.english] or false
end
handle_actions(spell, 'aftercast')
end
sets.precast.WS['Exenterator'].SA = set_combine(sets.precast.WS['Exenterator'].Mod, {ammo="Qirmiz Tathlum"})
function get_custom_wsmode(spell, spellMap, defaut_wsmode)
local wsmode
if state.Buff['Sneak Attack'] then
wsmode = 'SA'
end
if state.Buff['Trick Attack'] then
wsmode = (wsmode or '') .. 'TA'
end
return wsmode
end
function job_post_midcast(spell, action, spellMap, eventArgs)
-- Add enhancement gear for Chain Affinity, etc.
if spell.skill == 'Blue Magic' then
for buff,active in pairs(state.Buff) do
if active and sets.buff[buff] then
equip(sets.buff[buff])
end
end
sets.buff.Diffusion = {feet="LLチャルク+3"}
if spell.skill == '青魔法' thenもしくは
if spell.type == 'BlueMagic' thenとしなければけない。
//findall オニオンソード↑のような感じ。「ソ」がいわゆるダメ文字。
Searching: オニオンメ[ド
//findall オニオンソ\ード
Searching: オニオンメ[ド
//findall オニオンソ\\\ード
???/storage: オニオンソード
handle_command = function(...)ここの処理で消えないように\を3つ書くとうまくいく。4つでもOK。5つでもOK
if first_pass then
first_pass = false
windower.send_ipc_message('findAll update')
windower.send_command('wait 0.05;findall '..table.concat({...},' '))
windower.send_command('wait 0.05;findall '..table.concat({...},' '):gsub('\\', '\\\\'))
function add_to_chat_user(num,str)上記の通り、to_shift_jis しています。日本語文字を出力させる場合は注意が必要です。
local backup_str
if type(num) == 'string' then
-- It was passed a string as the first argument.
str = not tonumber(str) and str or num
num = 8
elseif not num and str and type(str) == 'string' then
-- It only needs the number.
num=8
end
if language == 'japanese' then
msg.add_to_chat(num,windower.to_shift_jis(str))
else
msg.add_to_chat(num,str)
end
end
--[[ if val2 then
if type(val2) == 'table' and val2.type then logit(' : '..val2.type)
else
logit(' : Unknown type val2- '..tostring(val2))
end
else
logit(' : nil-or-false')
end]]
return equip_sets_exit(swap_type,ts,val1,val2)
function equip_sets_exit(swap_type,ts,val1,val2)
if st_targs[val1.target.raw] or st_targs[val2] then
-- st targets
st_flag = true
local abil, temptarg, temp_mob_arr, val2
temptarg, temp_mob_arr = valid_target(splitline[3])
val2 = splitline[4]
elseif validabils[language][unified_prefix] then
temptarg, temp_mob_arr = valid_target(splitline[2])
val2 = splitline[3]
end
return equip_sets('pretarget',-1,spell,val2)
if not gearswap_disabled then
refresh_globals()
equip_sets('buff_refresh',nil,buff_name,new)
end
if not gearswap_disabled and new.duration > 10 then
refresh_globals()
equip_sets('buff_refresh',nil,buff_name,new)
end