【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側に書きます!
では早速( 'ω')
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を取得したい!っていうときに使えます。
今度は上級者向けになりそうです( 'ω')
まずはコードから( 'ω')
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);
}
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
という名前のイベントを登録しています。
つぎに、
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を表示し、フラグを折ればできあがりです。
理解すればとても簡単なのですが、理解するまでに時間がかかります。
少しずつ学習していきましょう!
わからないことがあれば、コメントでよろしくお願いします( 'ω')