【Luaマクロ】Something Need Doing:CP/GP取得系関数の使い方と応用

免責事項

この記事では、XIVLauncherやDalamudプラグインに関する内容を取り扱っています。
外部ツールを使うリスクをよく理解した上で、自己責任で使用してください。
当ブログでは、記載内容によって生じた損害・損失に対する一切の責任を負いません。

この記事は「Lua言語(またはスクリプト言語)の基本を理解している方」向けの記事になります。

  • 当ブログはプログラマー向けサイトではない
  • ヤオ自身もLuaは専門分野ではなく、分からない・間違って理解している内容を含む可能性がある
  • Dalamud及びSomething Need Doingを使うこと自体にリスクがあり、初心者の方がLuaを扱い複雑なマクロを組むことで、何らかのミスにより更にリスクを高める可能性がある

上記の理由により、コメントを頂いてもLua自体に関する質問にはお答えできない場合があります。
何卒ご了承ください。

また、Something Need DoingでLuaを使ったマクロを使用する際は必ず、Macro Editorの下にある「</>」ボタン(Lua script)をクリックして有効(緑色の状態)にしてください。
これが有効になっていないと、Luaで書いた内容が全てチャットに流れるので要注意です。

CP/GPの取得

まずは簡単に、現在のCP/GPと最大値をechoで流す方法から。

-- クラフターの場合
yield("/e 現在のCPは「" .. GetCp() .. "」です")
yield("/e 最大CPは「" .. GetMaxCp() .. "」です")
-- ギャザラーの場合
yield("/e 現在のGPは「" .. GetGp() .. "」です")
yield("/e 最大GPは「" .. GetMaxGp() .. "」です")

HP/MP関係の関数と違い、CP/GPは「p」は小文字なので注意。

現在のジョブがクラフター以外の場合 GetCp()GetMaxCp() で取得できる値は常に「0」、ギャザラー以外の場合 GetGp()GetMaxGp() で取得できる値は常に「0」になります。

条件分岐

これらの関数で取得できる値は数値型なので、関係演算子で条件分岐も可能です。

if 500 == GetCp() then
  yield("/e 現在のCPは500です")
end
if 500 ~= GetCp() then
  yield("/e 現在のCPは500ではありません")
end
if 500 < GetCp() then
  yield("/e 現在のCPは500より上です")
end
if 500 > GetCp() then
  yield("/e 現在のCPは500未満です")
end
if 500 <= GetCp() then
  yield("/e 現在のCPは500以上です")
end
if 500 >= GetCp() then
  yield("/e 現在のCPは500以下です")
end

条件分岐の使い道は例えばこんな感じ。

if 700 <= GetGp() then
  yield("/ac トリプルフッキング")
elseif 400 <= GetGp() then
  yield("/ac ダブルフッキング")
else
  yield("/ac フッキング")
end

標準のマクロでもトリプル → ダブル → フッキングの順に /action (/ac) コマンドを記述することで殆ど同じ動作を期待できますが、ラグなどによる不発を考慮するとこちらの方法がより確実です。

演算

取得できる値は数値なので、もちろん演算も可能です。

yield("/e CP全回復まで残り「" .. GetMaxCp() - GetCp() .. "」です")
yield("/e GP全回復まで残り「" .. GetMaxGp() - GetGp() .. "」です")

ギャザラーのGPは3秒毎に一定数回復するので、「全回復までの残りGP」と「ジョブのLv」が分かれば、全回復するまでのおおよその時間を計算することができます。

まずは現在のジョブのLvを取得する関数のご紹介から。

yield("/e 現在のレベルは「" .. GetLevel() .. "」です")

続いて、GPの回復量は以下の通りです。

ジョブのLvGPの回復量/3秒
Lv 1〜695
Lv 70〜796
Lv 80〜827
Lv 83〜908

これらを踏まえて一つのマクロにまとめるとこんな感じになります。

remain = GetMaxGp() - GetGp()
raises = 5
if 83 <= GetLevel() then
  raises = 8
elseif 80 <= GetLevel() then
  raises = 7
elseif 70 <= GetLevel() then
  raises = 6
end
yield("/e GP全回復まで残り約「" .. remain / raises * 3 .. "」秒です")

おわりに

簡単な処理の紹介ばかりになってしまいましたが、いかがでしたでしょうか。
今回紹介した処理のみで実用的なマクロを作るのは難しいかもしれませんが、Something Need DoingのLuaマクロは発想次第ではプラグインよりも複雑な自動化も実現可能だと思います。

膨大な量の関数が用意されているので全てを一度に覚えるのは難しいですが、少しずつ理解していくうちに、今まで諦めて手動でこなしていたタスクを自動化するアイディアが思いつくかもしれません。

自身の備忘録も兼ねて、今後も少しずつ関数を紹介していきたいと思います。
興味のある方は次回も是非お付き合いください。

ヤオ

自動化・ツール化が趣味のエンジニアです。
C言語やLuaは専門外ですが、実際に動かしながらマイペースに勉強中。
ゆくゆくはDalamudプラグインの開発に挑戦するのが目標です。

よく「本当に人間だったんだ」「喋り方がChatGPTみたい」と言われます。

コメント

コメントを投稿する