3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2019-10-28

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

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

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

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

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

//イベントの処理

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

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

server.js
system.initialize = function () {  
  this.listenForEvent('minecraft:block_interacted_with', (eventData) => this.onInteracted(eventData));
};

まずthis.listenForEvent(EventIdentifier, CallbackObject)を用いてminecraft:block_interacted_withsystem.onInteractedで使用できるように登録します。
*ここのonInteractedにあたる部分は好きな文字列(アルファベット)で構いません。

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

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

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);
   }
};

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

参考リンク

このscriptをダウンロード

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?