Minecraft BE ScriptingAPI 第5回講座

# 【Minecraft BE】のscriptingAPI開発講座(5)
お久しぶりです。
バージョンが1.13になりましたが、scriptingでは特に変わっていません( 'ω')
今回は、見ているentityを取得しますよ( 'ω')

## 注意
ScriptingAPI は現段階でWindows10にしか対応していません。
Android,iOS,XboxOne,Switchでは開発できません。(AndroidはBlockLauncherという外部ツールを使えばできます)

## 開発環境
windows10 Minecraft ver 1.13.0

## 見ているentityを取得しよう！
今回使用する、イベントは `minecraft:hit_result_continuous`です。
このイベントはclient側でしか動作しないので、client側に書きます！

では早速( 'ω')

```JavaScript:client.js
const system = client.registerSystem(0, 0);

system.initialize = function () {
    this.listenForEvent("minecraft:hit_result_continuous", (eventData) => this.onPick(eventData));
}


system.onPick = function(eventData) {
    if(event.data.entity !== null) {
        let BroadcastEventData = this.createEventData("minecraft:display_chat_event");
        BroadcastEventData.data.message = `looking entity = ${event.data.entity.__identifier__}`;
        this.broadcastEvent("minecraft:display_chat_event", BroadcastEventData);
    }
}
```

これで動くと思います。

では、解説します！

まず、
`this.listenForEvent("minecraft:hit_result_continuous", (eventData) => this.onPick(eventData));`
の部分ですが、
これは普通にArrow関数で`onPick`関数が呼び出され、
引数にeventDataを渡しています。

`if(event.data.entity !== null)`は、nullではないとき、を表しているので見ている先にentityがいれば、Yesになりますね！


あとは、`minecraft:display_chat_event`でentityのidentifierを表示しています。

## server側で見ているentityを取得したい！
例えば、アイテムを使ったときに見ているentityを取得したい！っていうときに使えます。

今度は上級者向けになりそうです( 'ω')

まずはコードから( 'ω')

```JavaScript:client.js
const system = client.registerSystem(0, 0);

system.initialize = function () {
    this.listenForEvent("minecraft:hit_result_continuous", (eventData) => this.onPick(eventData));
    this.registerEventData("button:hrc", {});
}


system.onPick = function(eventData) {
    var hrcData = this.createEventData("button:hrc");
    hrcData.data = eventData.data;
    this.broadcastEvent("button:hrc", hrcData);
}
```

```JavaScript:server.js
const system = server.registerSystem(0, 0);

var is_hrc = false;

system.initialize = function () {
    this.listenForEvent("minecraft:entity_use_item", (eventData) => this.usedItem(eventData));
    this.listenForEvent("button:hrc", (eventData) => this.onPick(eventData));
}

system.onPick = function(eventData) {
    let BroadcastEventData = this.createEventData("minecraft:display_chat_event");
    if(eventData.data.entity !== null && is_hrc) {
        BroadcastEventData.data.message = `looking entity §a${eventData.data.entity.__identifier__}`;
        this.broadcastEvent("minecraft:display_chat_event", BroadcastEventData);
    } else if(hrc) {
        BroadcastEventData.data.message = `§cNone entity`;
        this.broadcastEvent("minecraft:display_chat_event", BroadcastEventData);
    }
    hrc = false;
}

system.usedItem = function(eventData) {
    if(eventData.data.entity.__identifier__ == "minecraft:player") {
        var itemStack = eventData.data.item_stack.__identifier__;
        if(itemStack == "minecraft:fishing_rod") {
            hrc = true;
        }
    }
}
```

長いですね...( 'ω')

では解説します！

まず、`this.registerEventData("button:hrc", {});`です。
registerEventDataなので、そのままの意味で「イベントデータを登録する」ですね。
これだと、`button:hrc`という名前のイベントを登録しています。

つぎに、

```JavaScript
var hrcData = this.createEventData("button:hrc");
hrcData.data = eventData.data;
this.broadcastEvent("button:hrc", hrcData);
```
これらですが、
`hrcData`に先ほど登録した`button:hrc`のイベントデータを作っています。
登録しただけなので、中身は空っぽですね。
なので、`hrcData.data`に`eventData.data`をいれています。
`eventData.data`には、見ている先のブロックの座標や、entityのidentifierなどがはいっています。

つぎは、server.jsにいきますね！

`this.listenForEvent("button:hrc", (eventData) => this.onPick(eventData));`
ですが、client側では、`"minecraft:hit_result_continuous"` と同じなので、`"button:hrc"` = `"minecraft:hit_result_continuous"` と考えてください。

あとは、`"minecraft:entity_used_item"`で使ったアイテムを取得して、flagを立てて、
`onPick`でフラグがっ立ったときに、entityを表示し、フラグを折ればできあがりです。

理解すればとても簡単なのですが、理解するまでに時間がかかります。
少しずつ学習していきましょう！

わからないことがあれば、コメントでよろしくお願いします( 'ω')