建築勢のためのかんたんマクロMOD解説2(応用、実例)
基本編はこちら。
「ちょっとした便利なアイデアや具体例の紹介をしつつ、前回説明しきれなかった細かい事項や、スクリプトの書き方を補足していく」といった方向で解説をしていきます。結構突っ込んで文量も増えてしまいましたが。今回もWorldEdit(WE)のコマンドが基本ですが、他にもVoxelSniper (VS)や他のプラグインのコマンド例も一部紹介しています。
なお今回の記事では、「変数、定数、関数」あたりのワードがちょくちょく出て来るのですが、前回も紹介させて頂いたこちらの記事で非常にわかりやすく解説されているので、深く理解したい場合は複数タブで開いておいて行ったり来たりすると良いと思われます。
例によって本記事では1.7.10環境でやっているので、最新版だと多少表示が変わっていたり日本語対応していたり機能が結構増えていたりします。
ですが基本は同じですし、こちらで紹介しているものは全て新しいバージョンでも使えるので、環境に合わせて臨機応変に色々試してみてください。
- 専用GUIを作成する
- 矢印キーに移動系コマンドを割り当てる(簡単な条件分岐)
- 火薬、矢を持っている時は/u、それ以外の時は//undo(条件分岐例2)
- 持っているアイテムのIDを自動で入力させる(type)
- 持っているブロックのメタ値を指定してセットする(ロットメタの//set簡易対応)
- トグルで切り替えを行う(グローバル変数)
- ミュートワードを設定してログを静かにする(チャットフィルター)
- ワールドに入った瞬間になんかする(Events)
- 特定スロットに特定のアイテムを用意する(setslotitem)
- ブラシセットを一発で準備する(簡単なスクリプト)
- 植樹用葉っぱブラシをワンタッチで準備する(スクリプトで入力機能を使う場合)
- その他細々とした便利な機能や裏ワザなど
- おわりに
専用GUIを作成する
前回はチャット画面にボタンを設置する方法を紹介しましたが、あまりボタンを置きすぎても肝心のチャットが見づらくなってしまいます。ボタンを置ける専用GUIを作ることができるので、そちらに逃がしてやるという手もありますのでご紹介します。
まずはこのように新しいGUIを準備します。
次に、任意キーやボタンにGUIを開くマクロを登録します。
実行するとGUIが開きます。右下の設定アイコンを押せば、チャット画面と同じようにボタンなどを配置できます。
参考までに筆者の1.7.10環境では、WEやその他よく使うものはチャット画面に配置し、別途VoxelSniperやWEブラシといった機能は専用GUIにまとめています。キーバインドで開きます。
散らかってますが雰囲気だけでも参考に…ならないなこれ
マクロ設定(Config)を切り替えてもチャット画面のGUIのボタン配置を変えることはできないのですが、このように専用GUIを作っておくことで対処できそう。
矢印キーに移動系コマンドを割り当てる(簡単な条件分岐)
↑↓←→キー及びPageUp、PageDownキーに、それぞれ前後左右上下への//moveと//shiftを割り当てます。
普通に押すと//moveを行い、CTRLと同時に押すと//shiftするようになっています。
とりあえず「→」キーに設定してみます。
「→」キーのキーバインド設定画面を開きます。
上の方に「Conditional Macro」と言う項目があるので、そちらを選択します。
そしてこのように記入。
コントロールキーではなく他のキーにしたい場合は、「CTRL」の部分を「ALT」や「SHIFT」、または「KEY_Z」(A〜Zなどどのキーでも指定できます)といった具合に変更してみてください。
このように簡単な条件分岐なら、スクリプトを書かなくても使えます。
CTRLという定数には、CTRLキーを押しているか否か(TRUE、FALSE)が保持されています。
範囲選択をして、実際に右にブロックを動かしたりCTRLを押して選択範囲だけ動かしたりできているか試してみましょう。
一応コマンドの解説…
「r」というのは方向指定。この場合は右。「-s」というのは、moveする際に選択範囲も同時に移動するというオプション指定です。//stackでも使えます。
なお、実は1個だけ動かす場合はいちいち「1」と指定しなくてもいいんですがわかりやすいようにあえて指定してます。いちいちすいません。
「←」キーにも同じように設定します。方向指定である「r」の部分を「l」(小文字のL)に変えれば左に動くようになります。
前、後、上、下も同じように設定してみましょう。方向指定はそれぞれf、b、u、dです。
(fは省略可能です。なお、それぞれforward、back、up、down、の頭文字です)
実際に前後左右上下に動かして試してみましょう。革命が貴方を待っています。 たぶん。
CTRLと同時に押せば範囲選択だけ動いているはずです。
ちなみに筆者の環境では同じような感じで「//stack 1 r -s」といった具合でチャット画面にボタンとしておいてます。これもまた便利。こういう場合でボタンを連続で押したいときはボタン設定欄の「Don't close GUI on click」にチェックを入れておくと便利です。
・マクロMODでコマンドを連続実行すると遅延がかかるようになっていますが、これは設定で切れます。様子を見て適切な設定を見極めてください。負荷がかかるような誤爆やコマンド乱発にはくれぐれも注意。キーバインド一覧の左上からマクロMOD設定画面を開き、Enable flood protectionのチェックを外すだけ。
・後述する「スクリプト」を組めば、CTRL以外のキーも使ってもっと細かい場合分けをして、//shiftの他に//expandやら//contractも自由自在に扱えるように…なんてこともできそう。筆者の環境だと、//outset 1や//inset 1をキーバインドして使っているので、あまり必要性を感じておらずやってませんが。アイデアだけ置いておきます。
火薬、矢を持っている時は/u、それ以外の時は//undo(条件分岐例2)
//undoをキーバインドしている人は多いと思いまが、その際に条件分岐を行い、火薬か矢を持っている場合にはVSのundoコマンドである「/u」を発動させようという試みです。
とりあえず矢印キーの時と同じくConditional Macroを選択し、こんな感じで書いてやれば動きます。
コピペ用→ (ITEM="gunpowder")||(ITEM="arrow")
ITEMは、現在持っているアイテムIDを保持している定数です。条件の記法などは最初に紹介させて頂いた記事で詳しく解説されています。
分からなくてもとりあえず丸写しすれば動くのが良いところですね!
/bと/sizeもこんな感じで指定してやると捗ります。
持っているアイテムのIDを自動で入力させる(type)
typeという関数の紹介です。特定の文字列をチャット欄に自動入力(送信ではない)してくれます。typeを使う際は、必ずチャット画面のボタンに設置するようにし、「Don't close GUI on click」をチェックしてください。ミスるとめっちゃバグって(要はチャット画面閉じたあとに勝手にキーがタイピングされてしまう状態になって)ビビります。怖ければどうでもいいシングルワールドで試してみてください。
定数に入ってる値を確認したりコピーできたりするのが強いです。
例えばこれだと持ってるアイテムのIDとダメージ値をチャット欄に出力してくれます。
$${type(%ITEMIDDMG%)}$$
他の例としては、$${type(//hcyl %ITEMIDDMG% );}$$のように用意しておけばコマンド入力を補助するような形で便利になったりします。チャット欄で↑キーで履歴を遡って何度も入力したいようなコマンドなんかはこの方式が便利な気がします。自分のスタイルにあった方式を探してみてください。
ちなみに$${log(%ITEMIDDMG%)}$$とするとログに水色の文字列として出力してくれます。これはクライアント側にしか表示されていないのでマルチでも他の人には見えません。皆に見えるよう発言したければ$${echo(%ITEMIDDMG%)}$$のようにすれば良いです。
任意の定数や変数の中にどういう文字列が入っているのか確認したいなどに便利です。
次はちょっと工夫してみましょう。
inventoryup();という、ホットバーの選択を指定数だけ右にずらす関数を使用します。
コピペ用→$${type(%ITEMIDDMG%);type(",");inventoryup(1);}$$
これは説明より動画で見たほうが早そう。「//set 」は自分で入力し、最後の「,」も自分で消しています。
これ、ConquestReforgedみたいなブロック追加MODとか使ってる環境だとめっちゃ便利です。
typeはわりと設定が楽なのにかなり融通が効くので、上手く使うと非常に捗ります。大事なことなのでもう一度書きますが、必ずチャット画面のボタンに設置するようにし、「Don't close GUI on click」をチェックしてください。やらかすと結構ビビります。
持っているブロックのメタ値を指定してセットする(ロットメタの//set簡易対応)
前回の記事でエンターキーで手持ちブロックを//setする方法$${echo(//set %ITEMIDDMG%);}$$を紹介しましたが、これ実は1.7.10でお馴染みのLotMetaBlockModで追加されたメタブロックには対応してません。いろいろ考えたのですが、アイテムIDだけマクロMODに取得してもらい、メタ値は自分で入力するという方式が一番楽です。
$${prompt(&input, "$$[meta]");echo(//set %ITEM%:%&input%);}$$
任意のキーにこれを入れておくだけ。今回のように数値入力をするようなものはテンキーやその近くのキーにキーバインドすると便利です。promptだの変数だのに関しては後述します。
筆者の環境ではこれにプラスして、直近のメタ指定//set履歴を残しておいて別のキーで一発で設置できるようにしています。テンキーの「+」キーでメタ指定//set発動、テンキーの「.」キーで直近のメタブロックを設置、と言った具合にキーバインドしてます。エンターに近いし数字入力も楽なので便利。
さっきの代わりにこちらを設定し、$${prompt(&input, "$$[meta]");echo(//set %ITEM%:%&input%);@&metaset=%ITEM%:%&input%}$$
別のキーにこれを設定します。$${echo("//set %@&metaset%");}$$
@&metasetと名付けたグローバル変数を使い、「設置したブロックIDと入力したメタ値をつなげた文字列」を保存して、ふたつ目のマクロでそれを利用しています。グローバル変数については次で。
トグルで切り替えを行う(グローバル変数)
マクロの処理を終えても値を保持していたい時や、先ほどのように別々のマクロで値を受け渡したい時にはグローバル変数を使います。
例では透明状態、非透明状態の切り替えを一つのボタン(キー)で行います。
コピペ用
@invisibilityset
$${echo(/effect %PLAYER% 14 0); @invisibilityset=0;}$$
$${echo(/effect %PLAYER% 14 9999); @invisibilityset=1;}$$
@invisibilitysetと名付けたグローバル変数を利用して条件分岐を行っています。0はFALSE、1はTRUEと同義です。
キーを何度か押してみましょう。透明、非透明状態が交互に切り替われば成功。
グローバル変数は同一ゲームフォルダ内で共通して使えるので、別々のマクロで使ったりワールドやサーバーをまたいで使ったりできます。マイクラを終了して再度起動しても保存されてます。共通なので変数名かぶりには要注意。
グローバル変数を使えるようになると一気にできることが一気に増えて便利です。
例えばこんなことも。
キーボードやマウスから一切手を離さないでコマンド実行できたら便利かなと思ってとりあえず作ってはみた
— はやなさ🏰 (@hayanasa) 2017年2月17日
あとは実際使って見て便利かどうか pic.twitter.com/WHdMOWQCO4
…やたら凝ったわりにクソ使いづらくて消しましたが。
たくさん試行錯誤して最強の環境を創りあげましょう!筆者もまだまだ迷走試行錯誤中です。
ミュートワードを設定してログを静かにする(チャットフィルター)
チャットログを監視し、特定の単語がある行を表示させなくします。
ここのEdit Chat Filterを選択し、
IFMATCHES(%CHATCLEAN%, "消したい文字列");FILTER();ENDIF();
これを好きなだけ並べていくだけ。
日本語でもコピペすればいけます。?????となってもたぶん大丈夫。
ここに書いた単語と一致する部分がある場合、その行がまるごと表示されなくなります。
ワールドに入った瞬間になんかする(Events)
キーバインドやボタン以外にも、何かが起きたら何かを実行するという設定ができます。
今回は例として、ワールドに入った瞬間に色々やってもらう設定をしてみましょう。
おなじみキーバインド設定画面をひらき、上にある右向きの三角マークを押します。
色々なイベントに対応しているのがわかります。ゲーム(ワールド)に参加したとき、チャット送信した時、体力が変わった時…などなど。とりあえずonJoinGameというところをクリックします。
あとはキーバインドやボタンと同じように実行したいコマンドやスクリプトを入力するだけ。設定が済んだらワールドに入りなおして確認してみましょう。筆者は//sel extendを実行したり、特定のグローバル変数のリセットを行ったりということをしています。
ワールドに入った瞬間に使いたい機能をまとめたスクリプトを書いておくと便利かもしれません。ただしマルチ鯖で使うときなんかは色々要注意ですが。
特定スロットに特定のアイテムを用意する(setslotitem)
giveコマンドと違ってアイテムを持っていても指定したスロットに上書きできるので便利。処理もコマンドを送信するわけではなくクライアント依存なのでサーバー側に余計な負荷をかけません。
コピペ用→$${setslotitem(arrow,0,1);setslotitem(gunpowder,1,1);}$$
画像だと大文字なのはミスですが特に関係なく動きます。
setslotitem(アイテムID,ホットバー番号,個数);
という指定の仕方です。今回は二つ並べていますが、さらに追加すれば好きなだけ増やせます。もちろん一個消して一つだけにしてもOKです。
ホットバー番号(0〜8)やアイテムを好きなものに変えてみたりしましょう。
ブラシセットを一発で準備する(簡単なスクリプト)
上の応用編です。ブラシ用アイテムの用意だけでなく、ブラシ設定コマンドも同時にやってもらいましょう。
書きたいものが長くなってしまう場合、テキストファイルにスクリプトを書いて読み込む、ということができます。
テキストファイルは、ゲームフォルダ/liteconfig/common/macros内に.txt形式でおくと利用できます。今回はBrush.txtというファイルを作り、中にスクリプトを書いていきます。 余計なところに全角スペースなどが入ると動かなくなる場合があるので注意。
setslotitem(arrow,0,1);
setslotitem(gunpowder,1,1);
setslotitem(ghast_tear,2,1);
setslotitem(reeds,3,1);
setslotitem(clay_ball,4,1);
setslotitem(gold_ingot,5,1);
setslotitem(feather,8,1);
slot(3);
wait(2t);
echo(/br smooth 3);
slot(4);
wait(2t);
echo(/br cyl grass 5|/mask <air);
slot(5);
wait(2t);
echo(/br sphere stone 5|/mask sand);
slot(6);
wait(2t);
echo(/br sphere sand 5|/mask !air);
あとは、好きなキーやボタンにスクリプトを割り当てれば完了。このように書きます。
やたら長いだけでやってることは単純です。
まずsetslotitem();でアイテムを準備します。slot();はホットバーのスロット選択を指定した場所に移動する関数ですが、こちらは1~9で指定するのでsetslotitemと1つズレます。どうしてこうなった
遅延を挟まないと上手く動かないので、wait();で遅延を挟んでいます。wait(2t);で2tick待つという指定になります。もし上手く動かなかったらこの辺を調整してみると良いかも。echo();はお馴染み、中に書いてある文字列を送信してくれる関数ですね。中で|で区切ると複数に分けて送ってくれます。
はい便利。
当然ですが実行中にマウスホイールを弄ったりしてスロット選択位置を変えてしまうとおかしくなりますので注意。
植樹用葉っぱブラシをワンタッチで準備する(スクリプトで入力機能を使う場合)
木を作るためのWE葉っぱブラシを用意するスクリプトです。個人的にはかなり高頻度で使うので参考までに紹介します。マクロ起動→葉っぱの種類指定→サイズ指定→ブラシ設定コマンド送信、と言った具合で動きます。
setslotitem(emerald,%INVSLOT%-1,1);
setslotitem(log,%INVSLOT%,1);
prompt(&input,"$$[leaves[18:4,18:5,18:6,18:7,161:4,161:5,161:6,161:7]]");
prompt(&rad,"$$[radius[1,1.5,2,3,4]]");
echo("/br sphere 15%%&input%,85%air %&rad%|/mask 0");
一行目で選択スロットにエメラルドを用意し、二行目で次のスロットに原木を用意しています。%INVSLOT%は選択スロット番号(1~9)が入っている定数です。
promptは「入力画面を出してその値を変数に入れる」という関数です。スクリプトだと$$?のような書き方はそのまま使うことはできず、これを使う必要があります。
ここでは「&input」と「&rad」という二つの変数を使用しています。変数名は任意です。
promptで取得した値がそれぞれの変数に入るので、それらを使って/brコマンドを実行しています。
ちょっと%のせいで見づらいのですが、青地の部分が変数になっています。変数の中身を取り出して文字として使いたい場合は%〜%のように囲ってやる必要があります。
実際にどういうコマンドが出力されているのかというと、例えば18:4、1と選択していくとこんな感じ。
/mask 0
あくまで自分用のものを紹介しているだけなので汎用性はあまり考えていません、好みに応じて色々弄ってってみてください。
・promptを使う場合、ボタンを押した後にチャット画面が閉じられないような場合に上手く動きません。Don't close GUI on clickのチェックがもし入っていたら外しましょう。それでも不具合か何かで上手く行かない場合はスクリプトの一行目にgui();と入れてみてください。開いているGUIを閉じる関数です。
その他細々とした便利な機能や裏ワザなど
fov(視野)を選んで設定
例:$${prompt(&input,"$$[fov[30,42,54,70]]");fov(%&input%);}$$
ちょっとした補足ですが、選択肢表示画面でも手打ちで好きな文字を入力することができます。
方角を指定してピッタリ向く
例:$${prompt(&yaw, "$$[yaw[0,90,180,-90]]");look(%&yaw%,,);}$$
look(ヨー,ピッチ,向くのにかける時間);と指定します。
ウインドウサイズの指定
例:$${setres(1280,720);}$$
クリックするとGUIを閉じれるというだけの空ボタン
何も入ってない半透明なボタンをチャット画面の真ん中に置いてます。
クリックでチャット画面を閉じれるので地味に結構便利。
今持っているブロックから次のスロットにあるブロックにreplaceする
#slot1=%INVSLOT%;
#slot2=%INVSLOT%+1;
getslotitem(%#slot1%,&item1,,&itemdmg1);
getslotitem(%#slot2%,&item2,,&itemdmg2);
echo(//re %&item1%:%&itemdmg1% %&item2%:%&itemdmg2%);
BiomeEdit用ブラシ設定
バイオームを選択すると、枯れ木を用意してBiomeEditの設定コマンドを送信してくれるようなマクロです。
指定しているバイオームはcocricot環境用+αなので環境に応じて変えると良いと思います。半径も固定ですが"round 2"にしてあるバージョンのボタンも作ってあります。いちいち数字選んだり入れたりするの面倒なので…。好みに応じていろいろ変えてみてください。
$${prompt(&input, "$$[Biome[plains,forest,river,extreme_hills,ocean,jungle,deep_ocean,jungle_hills,desert]]");echo(/be brush %&input% round 0);setslotitem(deadbush,9,1);}$$
これくらいの長さならtxtファイルにしなくてもいけます。
おわりに
例によってやたら長くなってしまいましたがお疲れ様でした。わからないことや指摘などあればお気軽にコメント宜しくお願いします。素敵な建築ライフをお祈り申し上げます。そしてマクロMODの素晴らしさをぜひとも広めてください。