#はじめに
はじめましてmcjixifです。
今回私はMinecraft BEでscriptを作るための知識を共有する為に記事を書くことにしました。プログラミング初心者である為に色々気になる点があるかもしれませんが、温かい目で見守っていただけると嬉しいです。
※導入方法や準備、scriptingAPIがどういったものかの説明は既に別の方の記事が存在する為省かせていただきます。
#コードを書き始める
基本的な書き方は以下のようになります。
const system = server.registerSystem(0, 0);
//絶対に書く
//clientではconst system = client.registerSystem(0, 0);
system.initialize = function () {
//使うイベントをここに書く
};
//イベントの処理
これを元にタイトルである 棒で叩いたブロックをダイヤブロックに を行いたいと思います。
#イベントの使用
イベントとは、〇〇したら✕✕する の✕✕の部分を引き起こす〇〇の部分(今回でいう 叩いたら の部分)です。
今回はminecraft:block_interacted_with
を使用します。これはプレイヤーがブロックを叩いたら発動するイベントです。
system.initialize = function () {
this.listenForEvent('minecraft:block_interacted_with', (eventData) => this.onInteracted(eventData));
};
まずthis.listenForEvent(EventIdentifier, CallbackObject)
を用いてminecraft:block_interacted_with
をsystem.onInteracted
で使用できるように登録します。
*ここのonInteracted
にあたる部分は好きな文字列(アルファベット)で構いません。
#メインの処理
ここではイベントが発動した時になにが起こるかを書きます。以下のコードを見ながら説明していきます。
system.onInteracted = function (eventData) {
var carriedItemComponent = this.getComponent(eventData.data.player, 'minecraft:hand_container');
var carriedItem = carriedItemComponent.data[0].item;
if (carriedItem == 'minecraft:stick') {
var pos = {
x : eventData.data.block_position.x,
y : eventData.data.block_position.y,
z : eventData.data.block_position.z
};
var ExecuteEventData = this.createEventData('minecraft:execute_command');
ExecuteEventData.data.command = `/setblock ${pos.x} ${pos.y} ${pos.z} diamond_block`;
this.broadcastEvent('minecraft:execute_command', ExecuteEventData);
}
};
結構長いですね…。ですが中身は単純です。
まずここで最初にすべき事は準備です。ということでgetComponent(EntityObject, ComponentIdentifier)
を用いてminecraft:hand_container
のコンポーネント(情報の集まりのようなもの)を取得します。次にそれから必要な情報(アイテムの名前)だけを抽出します。carriedItemComponent.data[0].item
で名前だけ抽出できます。これを変数carriedItem
に代入するまでが第1準備です。
次に 棒で叩いたら の部分を書きます。先程取得した手に持ってるアイテムが棒なら〜っていうものをif文を使って書きます。
その次に叩いたブロックの座標を取得します。onInteracted
の引数eventData
では叩いた座標を取得できます。eventData.data.block_position.x
のようにして座標を取得します。これを変数posに代入します。
※var pos = {}; となっているのがよくわからない方は 'javascript 連想配列' で調べてみると良いと思います。
そして最後、お待ちかねのダイヤブロックです。createEventData(EventIdentifier)
を用いてminecraft:execute_command
のイベントデータを作成し、変数ExecuteEventData
に代入します。そうしたらExecuteEventData.data.command
にコマンドを代入します。ここで先程取得した座標が役に立ちます。文字列中に変数を使いたい時は${hensuu}
のようにするとできます。最後にbroadcastEvent(EventIdentifier, EventData)
を用いてExecuteEventData
を実行させます。
これでおわり!!
#まとめ
長々と雑な解説をしましたがいかがでしたか?少しでも理解していただけたら嬉しいです。わからない所はTwitterでdmやリプをください。↓は全体のコードです。ご自由にお使い下さい。
const system = server.registerSystem(0, 0);
system.initialize = function () {
this.listenForEvent('minecraft:block_interacted_with', (eventData) => this.onInteracted(eventData));
};
system.onInteracted = function (eventData) {
var carriedItemComponent = this.getComponent(eventData.data.player, 'minecraft:hand_container');
var carriedItem = carriedItemComponent.data[0].item;
if (carriedItem == 'minecraft:stick') {
var pos = {
x : eventData.data.block_position.x,
y : eventData.data.block_position.y,
z : eventData.data.block_position.z
};
var ExecuteEventData = this.createEventData('minecraft:execute_command');
ExecuteEventData.data.command = `/setblock ${pos.x} ${pos.y} ${pos.z} diamond_block`;
this.broadcastEvent('minecraft:execute_command', ExecuteEventData);
}
};
次回は気が向き次第更新します。これからもよろしくお願いします。