【Minecraftのアドオンを作る】#3 ScriptAPIの基礎に触れてみる

#1と#2でリソースパックとビヘイビアーパックを作ってみましたが、どちらもjsonファイルの設定を少し修正するだけの簡単なものでした。今回はScriptAPIを使って、より自由度の高いアドオンの世界に足を踏み入れてみたいと思います。
目次 [hide]
前提条件
nodeを利用するので、インストール済みであることが条件です。インストール方法については、ここでは省略します。ちなみに、わたしの環境でのバージョンは以下のとおりです。
$ node --version v18.12.1
コメントを出力するアドオン
下準備
いつもどおりアドオンのディレクトリを作成します。今回は「say_hello」という名前のディレクトリを作成しました。ディレクトリ直下で以下のコマンドを入力し、モジュールをインストールします。
npm i @minecraft/server
インストールが出来ると、ディレクトリ配下にこのようなファイルが生成されます。

manifest.json
「say_hello」ディレクトリ直下にmanifest.jsonファイルを作成します。中身は以下の通り。#1、#2とは中身が異なるので注意。
{
"format_version": 2,
"header": {
"description": "Say Hello!",
"name": "Say Hello Behavior Pack",
"uuid": "63549f48-13b8-4cc1-9f9a-cd824eb7abaa",
"version": [
1,
0,
0
],
"min_engine_version": [
1,
16,
0
]
},
"modules": [
{
"type": "script",
"language": "javascript",
"uuid": "63549f48-13b8-4cc1-9f9a-cd824eb7abab",
"entry": "scripts/main.js",
"version": [
1,
0,
0
]
}
],
"capabilities": [
"script_eval"
],
"dependencies": [
{
"module_name": "@minecraft/server",
"version": "1.19.0"
}
]
}
script
ここからが新しいところです。「say_hello」ディレクトリ直下に「scripts」ディレクトリを作成し、その配下に、main.jsファイルを作成します。
main.jsファイルの中身は以下のようにしてみました。runIntervalは定期的に実行される処理なので、「Hello, This is Supilog World!」というコメントが定期的に流れ続けるという命令になります。
import * as server from '@minecraft/server';
server.system.runInterval(ev => {
server.world.sendMessage("Hello, This is Supilog World!");
});
配置
(本記事から読み始める方もいるかもしれないので、念の為説明しておきますと)本シリーズでは、Linuxサーバー上に立てたリモートマイクラサーバー(統合版)に対して、アドオンを開発して適用させてみるシリーズになります。
配置は、これまでと同様にbedrock-server/development_behavior_packs配下にディレクトリごと配置。worlds/[ワールド名]/world_behavior_packs.jsonファイルで、今回のアドオンのUUIDを指定してあげます。
再起動して適用させてみます。

メッセージが連続で出力されています。成功ですね。
ソースコード
https://github.com/supilog/minecraft_addons/tree/main/behaviors/say_hello
アイテムを使用すると、ダイヤモンドを獲得する
こちらのサンプルも、様々なサイトで見かけたので、やってみることにします。
下準備、manifest.jsonは省略
先ほどと同じですので、省略します。同じとは言っても、UUIDは変更しておいてください。
script
今回はアイテムの使用をキックに、処理が行われる予定です。
import * as server from '@minecraft/server';
server.world.beforeEvents.itemUse.subscribe((eventData) => {
if (eventData.itemStack.typeId === 'minecraft:stick') {
eventData.source.runCommandAsync('give @a diamond 1');
}
});
beforeEvents.itemUseは、アイテムを使用した際に、使用処理の前処理として利用される。アイテムを使用前に実行されるので、使用をキャンセルしたりすることも出来る(らしい)。
今回は、使用したアイテムが’minecraft:stick’(棒)だった場合に、runCommandAsyncでコマンドを実行している。ここでは、ダイヤモンド1個を獲得するというコマンドを実行している。
(method) Entity.runCommandAsync(commandString: string): Promise<server.CommandResult> @deprecated — This function is deprecated and will be removed in 2.0.0.
VSCodeでプログラムを記述していると、打ち消し線が出ていたので確認してみると、runCommandAsyncはdeprecatedらしく2.0.0では削除されるとの記述があった。
うーむ、一旦現在も使用できるし、浅く広く勉強している最中なので、今はこのまま利用させていただくことにします。
配置
さて、こちらも配置して試してみます。今まで同様にbedrock-server/development_behavior_packs配下にディレクトリごと配置。worlds/[ワールド名]/world_behavior_packs.jsonファイルで、今回のアドオンのUUIDを指定してあげます。再起動して適用させてみます。

棒を使用すると、ダイヤモンドが獲得できました!
ソースコード
https://github.com/supilog/minecraft_addons/tree/main/behaviors/give_item
まとめ
ScriptAPIを利用した処理の基礎を学びました。
まだ、自分のやりたい事をどう記述すれば良いのかは、完璧に把握はできていませんが、なんとなく掴めてきたものがある気がします。ここからは、チュートリアルベースでの学びというよりは、自分のやりたいことを中心に、少しずつ学習していけると良いなと思っています。
ではまた。次回にお会いしましょう。