ScriptAPI サンプルコード備忘録(23/12/11)

スポンサーリンク

はじめに

マインクラフト: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]);
}
※投稿記事に含まれるファイルやリンクにより発生した被害についてクラフターズコロニーは責任を取りません
投稿通報

コメント

  1. これはいいですね!
    %%ぜひアドオン作りの参考にします!%%

コメント通報