タイトル通り
注意:投稿者は本職でもなんでもなく、完全趣味であるため間違えることがあります
import文
新
import { world } from “@minecraft/server”;
import { ModalFormData,ActionFormData,MessageFormData } from “@minecraft/server-ui”
旧
//import { world } from “mojang-minecraft”;
//import { ModalFormData,ActionFormData,MessageFormData } from “mojang-minecraft-ui”
使えるいい感じのイベント
①beforeChat
チャットを実行した時に発生するイベント。メッセージの内容も編集できる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/beforechatevent
②itemUse
アイテムを使用した時に発生するイベント。一番使う。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/itemuseevent
③itemUseOn
ブロックに触った時に発生するイベント。チェストを開く動作をキャンセルできたりする。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/beforeitemuseonevent
④blockBreak
ブロックを破壊した時に発生するイベント。破壊したブロックと座標とかも当然取れる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/blockbreakevent
⑤blockPlace
ブロックを設置した時に発生するイベント。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/blockplaceevent
⑥entityHurt
ダメージを受けたときに発生するイベント。与えたモブ受けたモブ、ダメージ量とか取れる。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/entityhurtevent
⑦entityHit
近接攻撃した時に発生するイベント。攻撃したブロックも取得できる。⑥と違い攻撃を当てなくても無条件で発生する。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/entityhitevent
⑧projectileHit
投擲物(矢とか)がエンティティかブロックに命中したときに発生するイベント。
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/projectilehitevent
⑨tick
1tick(0.05秒)ずつ常に実行するイベント。他とは違い常に動いている。
※このイベントは削除予定。代替品であるsytem.runScheduleを推奨
https://learn.microsoft.com/en-us/minecraft/creator/scriptapi/minecraft/server/tickevent
【1.19.60追加】/scriptevent
・gametest版 /function みたいなコマンド。コマンドで起動できるのでフォーム開くのとか便利だと思う。
◇jsの構文
system.events.scriptEventReceive.subscribe( ev => {
//処理
});
◇コマンドの構文
/scriptevents saba:sayEvent(識別子) メッセージ(任意)
JS側で識別子を取得できるのでswitchとかで分岐して関数を実行したり、メッセージで値を受け取れる
フォームのテンプレ用
ActionForm
async function showActionForm(player) {
const actionForm = new ActionFormData()
.title(“設定フォーム”)
.body(“説明”)
.button(“ボタン”,icon);
const response = await actionForm.show(player);
if(response.canceled) return;
response.selection //選んだボタン番号(0から)
}
ModalForm
async function showModalForm(player) {
const modalForm = new ModalFormData()
.title(“設定フォーム”)
.textField(“ラベル”,”プレースホルダ”,”初期値”)
.dropdown(“ラベル”,配列,初期値(num))
.toggle(“ラベル”,初期値(boolean))
.slider(“ラベル”,最小値,最大値,ステップ,初期値(num));
const response = await modalForm.show(player);
if(response.canceled) return;
response.formValues[0] //回答の配列
}
MessageForm
async function showMessageForm(player) {
const messageForm = new MessageFormData()
.title(“〇〇設定フォーム”)
.body(“説明”)
.button1(“ボタン1”)
.button2(“ボタン2”);
const response = await messageForm.show(player);
if(response.canceled) return;
response.selection //button1> 1 ,button2 > 0
}
扱える変数
・JSの変数で管理する方法
〇メリット
・最強
△デメリット
・ワールドを開き直したり、/relodeをしたりするとデータが初期化される
以下開き直してもデータが残るもの
・dynamicPropertiesで管理する方法
〇メリット
・文字列、数値、boolean、を変数で扱える
・ワールド、各エンティティごとに変数が扱える
・ユーザ側にあまり影響を及ぼさない
・メソッドがあるため操作しやすい
△デメリット
・文字列は1000文字までしか代入できないためエラーになる可能性がある
・アドオンを抜いてしまうとデータが失われる
・tagで管理する方法
〇メリット
・文字列で扱え、文字数制限がない
・アドオンを抜いてもデータが保持される
・各エンティティごとに変数が扱える
・ワールド内での確認がしやすい
・メソッドがあるため操作しやすい
△デメリット
・タグとして残るため、/tagので表示されると邪魔になる
・アマスタ等のタグで記録だとユーザ側に初期設定の手間がある
・メソッドがあるとは言え、取得がめんどくさい
・scoreboardのオブジェクトIDで管理する方法
〇メリット
・文字列で扱え、文字数制限がない・アドオンを抜いてもデータが保持される
・ワールド自体に設定できるので、ユーザ側の手間がいらない
・ユーザ側に見えにくい
△デメリット
・スコアボードのオブジェクト名として残るため、表示されると邪魔
・個人的使い分け
1000文字以上データを保存しそうな場合 → タグを使う or オブジェクトID
アドオンの入れ直しがある場合 → タグを使う or オブジェクトID
それ以外 → dynamicを使う
最近のアプデで、オブジェクトIDの文字数制限がなくなったので、その方法でもデータを管理できます。
dynamicPropertiesの設定
定義するとき
world.events.worldInitialize.subscribe(ev => {
const test = new DynamicPropertiesDefinition;
test.defineString(“名前”,900);
test.defineNumber(“変数名”);
test.defineBoolean(“変数名”);
ev.propertyRegistry.registerWorldDynamicProperties(test); //ワールドに定義
ev.propertyRegistry.registerEntityTypeDynamicProperties(test,MinecraftEntityTypes.player) //エンティティに定義
})
取得と設定
・ワールド
world.getDynamicProperties(“変数名”);
world.setDynamicProperties(“変数名”,値);
・プレイヤー(エンティティ)※playerはプレイヤークラス
player.getDynamicProperties(“変数名”);
player.setDynamicProperities(“変数名”);
String(文字列)を配列とかオブジェクトとして扱うとき
文字列 → 配列とかオブジェクト
JSON.stringify(“文字列”);
配列とかオブジェクト → 文字列
JSON.JSON.parse(変数);
sytem.runScheduleとか
system.runSchedule( function(){
//処理
} , 1)
・使うときは sytem をインポートするのを忘れない
・最後の1はティック間隔
スコアの取得
・エンティティスコア
const score = world.scoreboard.getObjective(“オブジェクト”).getScore(player.scoreboard);
・仮想スコア
const score = world.scoreboard.getObjective(“オブジェクト”).getScores().find(score => score.participant.displayName == “スコア名”).score;
インベントリの取得
・インベントリのアイテム
const item = player.getComponent(“inventory”).container.getItem(スロット数);
・手に持ってるアイテム
const item = player.getComponent(“inventory”).container.getItem(player.selectedSlot);
スロットの番号

プレイヤークラスとかの取得方法
①イベントから取る(sourceとかsenderとか)
beforeChat → sender
itemUse → source
②ワールドクラスから取る
const players = […world.getPlayers()]; //プレイヤークラスの配列を受け取る
const player = players[0];
getPlayers() は()の中にクエリを入れると条件をつけて取得できる
https://learn.microsoft.com/ja-jp/minecraft/creator/scriptapi/minecraft/server/entityqueryoptions
const players = […world.getPlayers({excludeTag:[“oni”]})] //oniタグを持っていない人を取得する
プレイヤー(エンティティ)クラスから多分取得できるもの、メソッド

プロパティ
よく使うものだけ
・名前
const name = player.name;
・頭上の名前(名札でつけれるやつとか) 変更可能
var nameTag = player.nameTag;
・ID(数値の識別値、たぶん不変なのでプレイヤーの識別に使える)
var id = player.id;
・種族、minecraft:zombie みたいな感じ
const typeId = player.typeId;
・座標
const location = player.location;
const { x , y , z} = location; //x,y,z座標が入る
・視点の方向
const rotation = player.rotation;
const { x , y } = rotation; // x,yが入る
・スニークしているか(true/false)
const isSneaking = player.isSneaking
メソッド
・コマンドを実行する(一番使う)
player.runCommandAsync(“コマンド”);
・タグを持っているか(true/false)
player.hasTag(“タグ名”);
・持っているタグ(配列)
player.getTags();
・コンポーネント(いろいろ)
inventoryならインベントリ、minecraft:healthを入れたら体力とかいろいろ取得できる
player.getComponent(“component”);
・OP権限を持っているか(true/false)
player.isOp();
・dynamicPropertiesの取得と設定
player.getDynamicProperty(“変数名”);
player.setDynamicProperty(“変数名”,値);
配列で使えそうなメソッドとか
・プレイヤークラスの配列の取得
const players = […world.getPlayers()];
・forEach() :各要素ごとに実行する。困ったらこれを使う
全てのプレイヤーが挨拶をする
players.forEach(player => {
player.runCommandAsync(”say こんにちは”);
})
・find() :条件に一致する要素を取り出す。一部を取り出すときに使う
名前が「Steve」のプレイヤークラスを取り出す
const steve = players.find(player => player.name == “Steve”);
・map() : 各要素ごとに実行した配列を作り出す。プロパティの情報の配列を作る時に使う
全てのプレイヤーの名前の配列を作る
const playerNames = players.map(player => player.name);
・filter() :条件に一致する要素から、配列を作り出す。一部(複数)を取り出すときに使う
タグ「killer」を持ったプレイヤークラスの配列を作る
const killers = players.filter(player => player.hasTag(“killer”));
・some() :条件からtrue/falseを返す。条件式で使う
名前が「Steve」のプレイヤーがいたらメッセージを送る
if(players.some(player => player.name == “Steve”)) {
world.say(“Steveがいるよ!!1);
}
コメント