誰でも編集に参加できるWIKIです。

GearSwap > レッスン4日目




レッスン4日目

課題1:黒魔が2人以上いる場合

今までのBLM.luaでは、キャラ1とキャラ2の黒魔2人がいる場合に所持している装備が微妙に違うでしょうから、困ってしまいます。そこでファイル名にキャラ名を入れることでこの2人を区別することができます。
キャラ1:AyanamiAyanami_BLM.lua
キャラ2:AsukaAsuka_BLM.lua

このようにして2つのファイルで別々に異なる装備セットを記述します。実際にBLM.luaをコピーして、キャラ名を入れてみてください。1人しかいない場合でも名前を入れてみてください。それで、//gs reloadして認識されるかどうか確認しましょう。

課題2:dataフォルダーを整理する

キャラ数が多くなり、ジョブも増えていき、さらに別サーバーのキャラまでとなると、さすがにdataフォルダーがごちゃごちゃしてきます。そこでキャラクターごとのフォルダーを作って、その中にluaファイルを置くことで整理することが可能です。

Windower4\addons\GearSwap\data\
  1. Ayanami
  2. Asuka
  3. Ikari
  4. Ritsuko
  5. Misato

このキャラ毎のフォルダーの中には、BLM.luaというファイル名でもいいし、Ayanami_BLM.luaというファイル名でも認識します。もし、将来的に別サーバーでも遊ぶことがあったら、キャラ名は違うものにしてください。

課題3:所持していない装備チェック

他のキャラのluaファイルをコピーしてきて、装備セットを変える場合に所持していないものがあるかどうかをチェックする必要があります。
  1. //gs reloadしてから
  2. //gs validateコマンドを実行すると所持していない装備が表示されます。


課題4:所持しているのに着替えがうまくいかない#1

問題:この1文がsets.aftercastに入っていますが、着替えてくれません。原因はなぜでしょう。
waiste="まほろばの帯",

正解:waisteがミススペル。実際はwaist="まほろばの帯", でなければならない。
このように自分で書いてしまうと、こんなことをやらかしてしまいます。そして、//gs validateはエラー検出しないし、//gs reloadもエラーを教えてくれません。

課題5:所持しているのに着替えがうまくいかない#2

問題:この1文がsets.aftercastに入っていますが、着替えてくれません。原因はなぜでしょう。
feet="GTショウス+2",

正解:feetはミススペルではありません。正解はlegsです。GTショウス+2は両脚装備なのでfeetでは着替えてくれません。
覚え方は、1フィート、2フィートといって何歩で距離を測る国があるから、feetは両足と覚えるとよいでしょう。
ちなみにフィートをいまだに使っている国は、リベリア、ミャンマー、アメリカの3国です。なぜメートルにしないのか信じられないですね。
面積をいまだに東京ドームでしか表せない国もどうかしてますがw 「ドーム200個分です」んな分かるかww

課題6:send_commandの使い方を覚える

あるイベントに対してprecastやmidcastで装備を変えるのが基本的な使い方ですが、ここではあるイベントに対してコマンドを実行させてみます。
例としてスニーク詠唱する前にスニークアイコンを切ってみましょう。

すでにマクロで次のようにしている人もいると思いますが、手動でメニューからスニークを選んだ場合は対応できません。
/con cancel 71
/ma スニーク <me>

GearSwapでは次のようにsend_commandを使ってCancel 71を実行することでアイコンを切ることが可能です。
このIf文は、現在詠唱中の魔法がスニークで、尚且つ詠唱対象が自分の場合にCancel 71しろという意味です。

function midcast(spell)

    if spell.english == 'Sneak' and spell.target.name == player.name then
        send_command('cancel 71;')
	return
    end

end

では、詠唱対象が自分以外のプレーヤーの場合はどうしたらいいでしょうか。Reactのページを読んだ人ならReactを使えばいいんじゃないかと
思うかもしれませんが、以下の理由で却下です。
  • 誰がスニークしてくるのか分からないので、考えられるキャラ名をすべて登録しなければならないのは煩雑。
  • 野良で他の外人とパーティを組んでいる場合に外人がスニークしてくれた場合に対応できない。(そんなケースはないでしょうけど)

GearSwapで対応できますが、考えてみてください。

回答はこちら



じゃあ、せっかくなのでスニークをもらったら、Cancel 71をやって、移動速度アップ装備orリジェネ装備orリフレ装備に着替えてみましょう。

回答はこちら



ここで賢い人なら、あれ?ってことは最初のサンプルは・・・・と気づくことがあるはずです。

回答はこちら



白魔のカーズナに対してカーズナ効果アップ装備に着替える。

白魔のmidcastでsend_commandを入れておきます
	elseif string.find(spell.name, 'カーズナ') then
		send_command('send ' .. spell.target.name .. ' gs equip sets.Cursna;')
		equip(sets.midcastCursna)

カーズナをもらうキャラのluaファイルにsets.Cursnaを定義してください。
sets.Cursna={
    legs="シャブテクウィス",
    left_ring="サイダリング",
    right_ring="ブレンモドリング",
}

白魔のケアルに対して被ケアル装備に着替える

白魔のmidcastでsend_commandを入れておきます
	elseif string.find(spell.name, 'ケアル') then
		send_command('send ' .. spell.target.name .. ' gs equip sets.Cure;')
		equip(sets.midcastCure)

ケアルをもらうキャラのluaファイルにsets.Cureを定義してください。
sets.Cure={
    right_ear="オネイロスピアス",
    head="シャブテアーメット",
    hands="ブレムテグローブ",
}

ここで問題になるのはケアルガ系とケアルラ系です。対象<t>となっているキャラは反応しますが、ケアルガの範囲内にいるその他のキャラはイベントが発生しないため着替えることができません。


課題7:spell.typeとspell.nameの内容を表示させる

printコマンドを使えばspell.typeやspell.nameの内容をコンソールウィンドウに表示できます。ところが、spell.nameは文字化けしてしまうので確認することができません。

function precast(spell)
	print (spell.type)
	print (spell.name)
end

2バイトコードに変換してechoでチャットウィンドウに表示すればこの問題を回避することができます。
function precast(spell)
	send_command(windower.to_shift_jis("@input /echo spell.type: " ..spell.type ))
	send_command(windower.to_shift_jis("@input /echo spell.name: " ..spell.name ))
end
自分のluaファイルに上記の2行をコピペしてケアルを詠唱して確認してみてください。

spell.type: WhiteMagic
spell.name: ケアル
と表示されるはずです。


課題8:通常装備を被ダメカットとTP装備とリフレ装備で自動切替したい

ナイトなら物理カット、魔法カット、ブレスカットの3種。青魔なら被ダメカット、TP装備、リフレ装備に自動で切り替えられるようにしたいところです。これを手動でやるとしたら、普段はTP装備にしておいて、マクロボタンで被ダメカットに切り替える。もしくは、面倒な相手をやるときはluaファイルを編集して通常装備を被ダメカットにして・・・ そうでないときはTP装備に変更して。といった具合に考えたくない話になってしまいます。

function aftercast(spell)

	equip(sets.aftercastX)	-- 被ダメカット
	--equip(sets.aftercastM)	-- 魔攻
	--equip(sets.aftercastP)	-- TPセット

end

自動切換えを実現するための基本的な考え方は、
  1. 現在の装備モードを示す変数を用意しておいて、その変数をマクロで変更する。
  2. aftercastではその変数の値に応じて装備を変更する。

では、変数の宣言ですがluaファイルの先頭に次のような行を追加してください。
local amode = 2

そして、マクロから指示を受け取るためにはself_commandという関数を使用します。
function self_command(command)

	if command == "defense" then
		send_command(windower.to_shift_jis('@input /echo 防御モード'))
		equip(sets.aftercastX)	-- 被ダメカット
		amode = 0
	elseif command == "magic" then
		send_command(windower.to_shift_jis('@input /echo 魔攻モード'))
		equip(sets.aftercastM)	-- 魔攻
		amode = 1
	elseif command == "physical" then
		send_command(windower.to_shift_jis('@input /echo TPモード'))
		equip(sets.aftercastP)	-- TPセット
		amode = 2
	end
end

aftercastでは、このamodeの値に応じて装備セットを切り替えます。最初のamodeの宣言で初期値を2にしてありましたが、普段はTPセットにしておくという意味です。
function aftercast(spell)

	if amode == 0 then
		equip(sets.aftercastX)	-- 被ダメカット
	elseif amode == 1 then
		equip(sets.aftercastM)	-- 魔攻
	else
		equip(sets.aftercastP)	-- TPセット
	end
end


最後にマクロボタンの定義です。
被ダメカット
1行目: /con gs c defense

リフレ装備
1行目: /con gs c magic

TP装備
1行目: /con gs c physical

装備セットの名前やself_commandのパラメーターは自分が分かりやすいものにしてください。注意:パラメーター名には日本語は使えません。


課題9:ワードローブ指定

レベル違いのアルマスや同じ名前のアクセサリを左右の耳に装備する場合にうまくいかない場合がありますが、別々のワードローブに保存しておいてワードローブ指定することで着替えることができます。bag="保存場所"で指定しますが、モグワードローブではなくワードローブ、その後の数字は半角です。

例:bag="ワードローブ2",

サンプル
    main={ name="アルマス", bag="ワードローブ4", augments={'STR+99 DEX+99 AGI+99 MND+99','DMG:+99','Weapon skill damage +99%',}},
    sub={ name="アルマス", bag="ワードローブ3", augments={'STR+99 DEX+99 AGI+99 MND+99','DMG:+99','Weapon skill damage +99%',}},


課題10:スペクトラルジグに対してリジェネ装備に着替える


課題6ではスニークをもらった場合に自動的にスニークアイコンを切ってリジェネ/リゲイン/リフレ/移動速度アップ装備に着替える方法を説明しましたが、自分にスニークをかける場合のことは全く考慮されていませんでした。midcastでsend spell.target.name exec Sneak.txtを実行して、このスクリプトの中でCancel 71とgs equip sets.Sneakを実行させるというやり方でしたが、自身にスニークをした場合は最終的にaftercastが実行されるのでsets.Sneakの意味がなくなります。スニのあとはたいていインビジもするから、スニのことしか考えてないとか、どうせマウントするからそもそもスニ使わないよね、とかもっともなご批判も考えられますが、どうしてもスニが必要なサーバーの人だけここの説明を参考にしてください。

1. スニークアイコンを切るタイミング
precastでもmidcastでもどちらでも構いませんが、FC装備に着替えて詠唱したいのでmidcastでCancel 71を実行します。
send でスニーク対象にexec sneak.txtを送信しているので、スニークをもらう側のケースも対応可能です。

function midcast(spell)
	if spell.name == "スペクトラルジグ" or spell.name == "スニーク" then
		send_command('send ' .. spell.target.name .. ' exec sneak.txt;')
		return
	end

end

2. リジェネ/リゲイン/リフレ/移動速度アップ装備に着替える
aftercastでspell.nameの内容をチェックして切り替えればいいだけです。ここではスニーク >> インビジのケースもあるのでインビジもチェックしてください。あとは、サポ踊/白/赤で使いそうなジョブのluaファイルに記述すれば完了です。

function aftercast(spell)
	if spell.name == "スペクトラルジグ" or spell.name == "スニーク"  or spell.name == "インビジ" then
		equip(sets.Sneak)
	else
		equip(sets.aftercast)
	end
end

課題11: バフが消えたら報告

MetusやOdinをやっている時にバフを消去されることがあります。ヘイストくらいなら無視してもいいんですが、マジックバリアやランパートだと致命傷になります。しかも、このマジックバリアのアイコンは特徴のないアイコンなので分別が難しいです。そこでマジックバリアが消えたら報告してくれるような仕組みをGearSwapで記述してみましょう。

使うのはbuff_change関数です。
function buff_change(name, gain, buff_details)
nameはバフ名、gainは true/falseのブーリアン、buff_detailsはテーブルです。

まず、nameに何が来るのか分からないので、チャットウィンドウに書き出してみます。すると、日本語でプロテスとかヘイストとかアクアベールとか分かりやすい名称になっていることが分かります。そしてマジックバリアとランパートはどちらも"魔法バリア"だということが分かりました。

function buff_change(name, gain, buff_details)

	if name == '魔法バリア' then
		if not gain then
			send_command(windower.to_shift_jis("input /party マジックバリア消失! <call10>"))
		end
	end
end

send_commandで "/ma マジックバリア <me>" でもいいんですが、どういうタイミングなのか分からないのでこのようにしてみました。<call10>で音を鳴らしてくれるのも便利だと思います。

Valhallaでは入手経路がないので検証できていませんが、寝てしまったときにHPスリップ装備に着替えて対応するといった使い方もできるようです。
↓たぶんこんな感じ
function buff_change(name, gain, buff_details)

    if name == '睡眠' then
        --if player.status == 'Engaged' then -- 抜刀時
            if gain then -- 睡眠状態
                equip({neck="サクリフィストルク",}) -- HPスリップ装備に変更
            else
                -- 通常装備に戻す       
                equip(sets.aftercast)
            end
        --end
    end
end

課題12: トレハン装備に着替えてファーストタッチ

これはジョブによっても違うでしょうし、個人の趣味の問題もあるので、一概にこれがFA的なことは言いませんが、目的はただひとつ。トレハンを乗せて倒したい。GearSwapと/equipsetコマンドの相性の悪さ問題があるので、まず考えられるのはself_commandに//gs c thを送ってトレハン装備に着替えてから1発殴るというのがひとつの方法です。

マクロ: TH
/con gs c th
function self_command(command)

	if command == "th" then
		equip(sets.th)
	end
end

ではウルガランの巨人はどうでしょうか。近くにOgopogoがいるので、できれば遠くから遠隔/魔法/挑発で釣りたいですよね。遠隔攻撃した際にトレハン装備に着替えるのはいいのですが、サッシェにトレハンのオーグメントを付けていたりすると使えない方法と言えます。では、挑発したときにトレハン装備に着替えるのはどうでしょうか。precastで挑発かどうかを判定してトレハン装備に着替えて、midcastは何もしない。aftercastは通常装備に着替えるようにすればいけそうです。特定の魔法で(例えばディアの時だけ)トレハン装備に着替えるというのもよさそうです。

このGearSwapのページはValhallaで遊んでいる人以外にも読まれているようなので簡単に説明すると、Valhallaの挑発はカスタム仕様となっていて10秒間のリゲインが付きます。しかも、クロスジョブという仕組みのおかげでどのジョブでも挑発を使えるようになっています。


function precast(spell)

	if spell.name == '挑発' then
		equip(sets.th)
		return
	end
end

function midcast(spell)

	if spell.name == '挑発' then
		return
	end
end

最後に黒魔がデュナミスの石像をワンショットする時にINT装備ではなくトレハン装備に着替えてトレハンを乗せるという方法を考えてみましょう。Valhallaの石像なら2系で倒せる程度のHPなのでインフィニティコア回収なら黒魔でやるのが簡単です。仮にワンショットできないような相手なら、2つのマクロを用意しておいてTHモードかINTモードを切り替えてやればよさそうです。

マクロ:THモード
/con gs c th

マクロ:INTモード
/con gs c int

function self_command(command)

	if command == "int" then
		send_command(windower.to_shift_jis('@input /echo モード[INT]'))
		tmode = 0
	elseif command == "th" then
		send_command(windower.to_shift_jis('@input /echo モード[TH]'))
		tmode = 1
	end
end

function midcast(spell)

	if spell.type == 'BlackMagic' then
		if tmode == 0 then
			equip(sets.midcastINT)
		else
			equip(sets.midcastTH)
		end
	end
end



コメント文

GithubやGearSwapのサンプルLUAを見た人ならもうお分かりでしょうが、--で始まる行はコメント扱いにすることができます。

ファイルのヘッダーとして次のように変更履歴を記録してもいいし、以前の装備はそのままコメントとして残しておいてもよいでしょう。
-- 
--  Created: 2022/01/25
--  Version: 1.4
--  Level  : 99
--  Revision: 
--  2022/02/01  FC装備追加
--  2022/02/07  被ダメカット装備追加
-- 


    --left_ring="レベッチェリング",
    left_ring={ name="塊土の指輪", augments={'MND+8','"Cure" potency +3%','Lightning resistance+5','"Refresh"+2',}},

おまけ:抜刀せずにWSを打ってみる

TPを貯めておいて、WSが打てるくらいの距離まで雑魚に近寄って、抜刀しない状態でWSマクロを実行してみてください。
どうですか? 打てましたか? 次に//gs disableやって同じことをやってみましょう。打てませんよね。
自分に打つタイプのWS(ミルキル、ダガン)なら雑魚がいなくても打てます。どうですか? GearSwap楽しくなりました?



以上でレッスンは終わりです。これはあくまで基本です。sets.precast.Cureのような記述方法もあるし、召喚士はちょっと違う書き方を
しないと動きません。\Windower4\addons\GearSwap\beta_examples_and_information\にあるサンプルも見てください。

編集にはIDが必要です

メンバー募集!