MinecraftBEでscriptingAPI！part1.棒で叩いたブロックをダイヤブロックに

#はじめに
はじめましてmcjixifです。
今回私はMinecraft BEでscriptを作るための知識を共有する為に記事を書くことにしました。プログラミング初心者である為に色々気になる点があるかもしれませんが、温かい目で見守っていただけると嬉しいです。

※導入方法や準備、scriptingAPIがどういったものかの説明は既に別の方の記事が存在する為省かせていただきます。

#コードを書き始める
基本的な書き方は以下のようになります。

```javascript:server.js
const system = server.registerSystem(0, 0);
//絶対に書く
//clientではconst system = client.registerSystem(0, 0);

system.initialize = function () {
   //使うイベントをここに書く
};

//イベントの処理
```

これを元にタイトルである <b>棒で叩いたブロックをダイヤブロックに</b> を行いたいと思います。

#イベントの使用
イベントとは、〇〇したら✕✕する の✕✕の部分を引き起こす〇〇の部分(今回でいう 叩いたら の部分)です。
今回は`minecraft:block_interacted_with`を使用します。これはプレイヤーがブロックを叩いたら発動するイベントです。

```javascript:server.js
system.initialize = function () {  
  this.listenForEvent('minecraft:block_interacted_with', (eventData) => this.onInteracted(eventData));
};
```
まず`this.listenForEvent(EventIdentifier, CallbackObject)`を用いて`minecraft:block_interacted_with`を`system.onInteracted`で使用できるように登録します。
*ここの`onInteracted`にあたる部分は好きな文字列(アルファベット)で構いません。

#メインの処理
ここではイベントが発動した時になにが起こるかを書きます。以下のコードを見ながら説明していきます。

```javascript:server.js
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やリプをください。↓は全体のコードです。ご自由にお使い下さい。

```javascript:server.js
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);
   }
};
```

次回は気が向き次第更新します。これからもよろしくお願いします。

[参考リンク](https://minecraft.gamepedia.com/Bedrock_Edition_beta_scripting_documentation)

[このscriptをダウンロード](https://www.mediafire.com/download/lpu06isyf5ieupq)