はじめに
マインクラフト:1.20.50
minecraft/server : 1.8.0-beta
投稿者は素人です。間違えることがあります。
これのシリーズです。
さば2号のgametest(scriptAPI)備忘録 (23/11/01更新)【不定期更新】
https://minecraft-mcworld.com/26465/
サンプルコード
チャット系
/* カスタムコマンド */
/*
!kill - 自身をキル
!tp @[name:string] - 指定したプレイヤーにテレポート
*/
world.beforeEvents.chatSend.subscribe(event => {
const player = event.sender;
const commands = event.message.split(" ");
event.cancel = true;
switch (commands[0]) {
case "!kill":
system.run(() => {
player.kill();
});
break;
case "!tp":
system.run(() => {
let targetName,target;
if (commands[1]) {
targetName = commands[1].replace("@", "");
target = world.getPlayers({ name: targetName })[0];
} else {
target = player;
}
if (target) {
player.teleport(target.location,{facingLocation:target.location});
player.sendMessage(`${target.name} にテレポートしました`);
} else {
player.sendMessage(`§c"${targetName}" というプレイヤーは見つかりませんでした`);
}
});
break;
default:
event.cancel = false;
}
});
/* 人狼専用チャット */
/*
!jinrou - 人狼チャットの切り替え
*/
world.beforeEvents.chatSend.subscribe(ev => {
const {player,message} = ev;
// メッセージが !jinrou のとき
if(message === "!jinrou") {
// チャット送信をキャンセル
ev.cancel = true;
if(player.hasTag("jinrou")) {
// 人狼(タグ)の場合
// beforeではremoveTag()が使えないため、system.run()で遅延実行
system.run(() => {
if(player.hasTag("jinrou_chat")) {
// 人狼チャット → 通常チャット
player.removeTag("jinrou_chat");
player.sendMessage("通常チャット に切り替えました");
} else {
// 通常チャット → 人狼チャット
player.addTag("jinrou_chat");
player.sendMessage("§c人狼チャット§f に切り替えました");
}
});
} else {
// 人狼(タグ)ではない場合
player.sendMessage("§c人狼チャット は使えません");
}
// 人狼チャットの表示
} else if(player.hasTag("jinrou_chat")) {
ev.cancel = true;
// 人狼(タグ)にメッセージを送信
world.getPlayers({tags:["jinrou"]}).forEach(jinrou => {
jinrou.sendMessage(`<§cWOLF ${player.name}§f> ${ev.message}`); // => <WOLF Steve> message
});
}
});
インベントリ系
/* イベントリの内容をチェストにコピーする */
// チェックタグがあるプレイヤー
const checkPlayer = world.getPlayers({tags:["check"]})[0];
// hotBarItems ホットバーのアイテム
// upItems ホットバー以外の上枠のアイテム
let hotBarItems = [];
let upItems = [];
const container = checkPlayer.getComponent("inventory").container;
// インベントリのアイテム配置をコピー
// hotBarItems = [itemStack,itemStack,Null,Null,itemStack...];
for (let i = 0; i < container.size; i++) { // container.size インベントリの枠数
const item = container.getItem(i);
if(i <= 8) {
// ホットバー
hotBarItems.push(item);
} else {
// ホットバー以外
upItems.push(item);
}
}
// ブロッククラス
const hotBarChest = world.getDimension("overworld").getBlock({x:player.location.x,y:player.location.y+2,z:player.location.z});
const upChest = world.getDimension("overworld").getBlock({x:player.location.x,y:player.location.y+3,z:player.location.z});
// チェストの設置
hotBarChest.setType("minecraft:chest");
upChest.setType("minecraft:chest");
// アイテムの配置
hotBarItems.forEach((item,index) => {
if(item) {
hotBarChest.getComponent("inventory").container.setItem(index,item);
}
});
upItems.forEach((item,index) => {
if(item) {
upChest.getComponent("inventory").container.setItem(index,item);
}
});
フォーム系
アクションフォーム
/* コマンド実行フォーム */
// コマンドの選択リスト
const commands = ["say おはよう","say こんにちは","say こんばんは"];
// async/await を使用しない例
function commandForm(player) {
// フォームの設定
const form = new ActionFormData()
.button("おはよう")
.button("こんにちは")
.button("こんばんは");
// フォームの表示と処理
form.show(player).then(res => {
// キャンセル
if(res.canceled) return;
// 選んだコマンドの実行
player.runCommandAsync(commands[res.selection]);
});
}
// async/await を使用する例
async function commandForm(player) {
const form = new ActionFormData()
.button("おはよう")
.button("こんにちは")
.button("こんばんは");
const res = await form.show(player);
if(res.canceled) return;
player.runCommandAsync(commands[res.selection]);
}
コメント
これはいいですね!
%%ぜひアドオン作りの参考にします!%%