0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[ScriptAPI参考書] 基本的な扱い #3

Posted at

目次

はじめに

今回は、ScriptAPI (@minecraft/server) の扱いについて例文を添えて解説していきます。但し、あくまでタイトル通りScriptAPIの基本的な要素のみに絞って解説していますので、その点に留意して御一読頂けると幸いです。

この「ScriptAPI参考書」シリーズではマインクラフト統合版のScriptAPIについて基礎から応用、例文まで詳細に解説し、ScriptAPI開発者や、ScriptAPIの開発を始めようと思っている人の助けになることを目的としています。

また、このシリーズを読むにあたって、ある程度のマインクラフトとJavaScriptの事前知識が必要になってくることがあります。

注意: このシリーズではMinecraft Bedrock Editionを省略してマインクラフトと表記しています。

前回: ScriptAPIの情報まとめ
次回: 準備中

World

ワールドの管理を行うことができ、ScriptAPIの全ての基盤と言っても過言ではありません。

afterEvents

説明

最も基本的に使用する要素の一つで、ワールドの様々なイベントを登録することが出来ます。beforeEventsとは違い、イベントが起こった後に登録していた関数が実行されます。

例文

ブロックを破壊した時、ブロックを壊したプレイヤーに壊したブロックのtypeIdを送信する

world.afterEvents.playerBreakBlock.subscribe((ev) => {
    const { player, block } = ev;
    
    player.sendMessage(`${block.typeId}を破壊しました!`);
});

beforeEvents

説明

最も基本的に使用する要素の一つで、ワールドの様々なイベントを登録することが出来ます。aftereEventsとは違い、イベントが起こる前に登録していた関数が実行されます。イベントが起こる前に実行されるため、イベントの実行をキャンセルすることが可能です。但し、ちょっとした制限があります。

例文

ブロックを破壊した時、ブロックを壊したプレイヤーがOPを所持していなければ、ブロックの破壊をキャンセルし通知する

world.beforeEvents.playerBreakBlock.subscribe((ev) => {
    const { player } = ev;
    
    if (!player.isOp()) {
        ev.cancel = true;
        player.sendMessage("§c権限が不足していたため、ブロックの破壊をキャンセルしました。");
    }
});

scoreboard

説明

ワールドのスコアボードの管理をすることが出来ます。

例文

全プレイヤーのスコアボードに5追加しそれぞれのプレイヤーにスコアを表示

const objective = world.scoreboard.getObjective("score"); // 'score' という名前のオブジェクティブを取得

for (const player of world.getPlayers()) { // 全プレイヤーを取得しfor文でループ
    objective.addScore(player, 5);
    player.sendMessage(`あなたの現在のスコアは ${objective.getScore(player)} です。`);
}

サイドバーにスコアボードを表示

import { world, DisplaySlotId } from "@minecraft/server";

world.scoreboard.setObjectiveAtDisplaySlot(DisplaySlotId.Sidebar, {
    objective: world.scoreboard.getObjective("score")
});

structureManager

説明

ワールドのストラクチャーを管理することが出来ます。

例文

(0, 0, 0)から(10, 10, 10)までをstrct:testという名前のストラクチャーとしてメモリに保存

import { world, StructureSaveMode } from "@minecraft/server";

const dimension = world.getDimension("overworld");

const begin = { x: 0, y: 0, z: 0 };
const end = { x: 10, y: 10, z: 10 };

world.structureManager.createFromWorld("strct:test", dimension, begin, end, {
    saveMode: StructureSaveMode.Memory
});

gameRules

説明

ワールドのゲームモードを管理することが出来ます。

例文

落下ダメージをオフにする

world.gameRules.fallDamage = false;

オンにする場合

world.gameRules.fallDamage = true;

取得する

world.sendMessage(`fallDamage: ${world.gameRules.fallDamage}`);

getDimension()

説明

最も基本的に使用する要素の一つで、overworldnetherthe_endの3つのディメンションを取得することが出来ます。

例文

オーバーワールドのブロックを置くことが可能な高さの範囲を送信する

const dimension = world.getDimension("overworld");

const { min, max } = dimension.heightRange;
world.sendMessage(`y座標が ${min} ~ ${max} の範囲にブロックが設置可能です。`);

getPlayers()

説明

最も基本的に使用する要素の一つで、ワールド内の全プレイヤーを配列で取得することが出来ます。また、フィルタリングをして取得することも可能です。

例文

ScriptAPIタグを持っているプレイヤーの名前を送信する

for (const player of world.getPlayers({ tags: [ "ScriptAPI" ] })) {
    world.sendMessage(`${player.name}は'ScriptAPI'タグを所持しています!`);
}

ScriptAPIタグを持っていないプレイヤーの名前を送信する

for (const player of world.getPlayers({ excludeTags: [ "ScriptAPI" ] })) {
    world.sendMessage(`${player.name}は'ScriptAPI'タグを所持していません...`);
}

sendMessage()

説明

ワールド内の全プレイヤーにメッセージを送信することが出来ます。
また、入力に文字列ではなくRawMessageを使用する事が出来ます。

例文

ワールド内の全プレイヤーにメッセージを送信する

world.sendMessage("ScriptAPIを始めてみよう!");
world.sendMessage({ text: "ScriptAPIを始めてみよう!" });

System

システムを管理することが出来ます。

afterEvents

説明

システム関連のイベントを登録することが出来ます。動作は基本的にworld.afterEventsと同様です。

例文

/scripteventで受け取ったパラメータを送信する

system.afterEvents.scriptEventReceive.subscribe((ev) => {
    const { id, message } = ev;
    world.sendMessage(`${id} ${message}`);
});

beforeEvents

説明

システム関連のイベントを登録することが出来ます。動作は基本的にworld.beforeEventsと同様です。

例文

ウォッチドッグエラーが発生した際に理由を送信し、ワールドのシャットダウンをキャンセルする

system.beforeEvents.watchdogTerminate.subscribe((ev) => {
    const { terminateReason } = ev;
    
    ev.cancel = true;
    world.sendMessage(`ウォッチドッグエラーが発生しました!: ${terminateReason}`);
});

runInterval()

説明

tick単位でsetIntervalと同じように、一定間隔毎に処理を実行することが出来ます。

例文

5tick毎に全プレイヤーのアクションバーにテキストを送信する

system.runInterval(() => {
    for (const player of world.getPlayers()) {
        player.onScreenDisplay.setActionBar("Actionbar Text");
    }
}, 5);

runTimeout()

説明

tick単位でsetTimeoutと同じように処理の実行を遅延させることが出来ます。

例文

プレイヤーにタグを付与し、1秒後にプレイヤーからタグを削除する

player.addTag("ScriptAPI");
system.runTimeout(() => {
    player.removeTag("ScriptAPI");
}, 20);

clearRun()

説明

system.runsystem.runIntervalsystem.runTimeoutの処理を途中で終了させることが出来ます。

例文

5秒間だけ毎tick(0, 0, 0)に炎のパーティクルを召喚する

const dimension = world.getDimension("overworld");

const interval = system.runInterval(() => {
    dimension.spawnParticle("minecraft:basic_flame_particle", { x: 0, y: 0, z: 0 });
}, 1);

system.runTimeout(() => {
    system.clearRun(interval);
}, 20 * 5);

runJob()

説明

ジェネレーターの処理時間が1tick以上になる際、処理を一時中断し次のtickから再開して処理を実行することが出来ます。これを利用することで、時間のかかる処理の負荷を軽減することが出来ます。

例文

(0, 0, 0)から(10, 10, 10)に石を設置する

function* randomBlocks() {
    const dimension = world.getDimension("overworld");
    const from = { x: 0, y: 0, z: 0 };
    const to = { x: 10, y: 10, z: 10 };
    
    for (let x = from.x; x <= to.x; x++) {
        for (let y = from.y; y <= to.y; y++) {
            for (let z = from.z; z <= to.z; z++) {
                dimension.setBlockType({ x, y, z }, "minecraft:stone");
                yield;
            }
        }
    }
}

system.runJob(randomBlocks());

clearJob()

説明

system.runJobの処理を途中で終了させることが出来ます。

例文

5tick間にブロックを設置できる回数をカウントし送信する

let count = 0;
function* counter() {
    while (true) {
        dimension.setBlockType({ x: 0, y: 0, z: 0 }, "minecraft:stone");
        count++;
        yield;
    }
}

const job = system.runJob(counter());
system.runTimeout(() => {
    system.clearJob(job);
    world.sendMessage(count.toString());
}, 5);

waitTicks()

説明

指定のtick後resolveするPromiseを取得することが出来ます。

例文

5秒カウントする

for (let i = 1; i <= 5; i++) {
    await system.waitTicks(i * 20);
    world.sendMessage(`${i}秒`);
}

Dimension

ワールドのディメンションを管理することが出来ます。
world.getDimension()や、特定のイベント等で取得することが出来ます。

runCommand()

説明

コマンドを実行することが出来ます。返り値のsuccessCountは実行に成功したコマンドの対象になったエンティティの数を返します。

ScriptAPIでは様々なクラスにrunCommandが存在していますが、その全てにおいてプレフィックスの/は必要ありません。

また、/setmaxplayers/reload/connectなどは実行することが出来ず、実行者がディメンションな為、@sを使用することは出来ません。

これは個人的な意見ですが、殆どのコマンドはScriptAPIのみで実行できるため、<Dimension>.runCommandは基本的に推奨しません。

例文

難易度をノーマルに設定する

dimension.runCommand("difficulty normal");

runCommandAsync()

説明

<Dimension>.runCommand()と同じ動作をしますが、実行に時間がかかるコマンド(例えば、executeを利用した二分木での実行や、ワールドにエンティティが多い状態での@eの使用など)を実行する場合に、コマンドの実行がし終わるのを待たずに次の処理に進めます。
返り値はPromiseなので、実行が終わった後に実行させることも出来ます。

例文

エンティティの数を送信する

dimension.runCommandAsync("testfor @e")
    .then((result) => {
        world.sendMessage(`${result.successCount}体のエンティティが存在します。`);
    });

getBlock()

説明

ディメンションの<Block>を座標から取得することが出来ます。

例文

(0, 0, 0)のブロックのtypeIdを送信する

const block = dimension.getBlock({ x: 0, y: 0, z: 0 });
world.sendMessage(`(0, 0, 0) のブロックは ${block.typeId} です。`);

setBlockType()

説明

ディメンションの指定の座標にブロックを設置することが出来ます。

例文

(0, 0, 0)にオークの板材を設置する

dimension.setBlockType({ x: 0, y: 0, z: 0 }, "minecraft:planks");

setBlockPermutation()

説明

ディメンションの指定の座標にBlockPermutation(ブロックステートを含むより詳細なブロックデータ)を設置することが出来ます。

例文

(0, 0, 0)に黒色の羊毛を設置する

const wool = BlockPermutation.resolve("minecraft:wool", { "color": "black" });
dimension.setBlockPermutation({ x: 0, y: 0, z: 0 }, wool);

getEntities()

説明

ディメンションの全エンティティを配列で取得することが出来ます。また、world.getPlayersと同様に、フィルタリングして取得することも可能です。

例文

ディメンションのゾンビの数を送信する

const zombies = dimension.getEntities({ type: "minecraft:zombie" });
world.sendMessage(`${dimension.id} にゾンビが ${zombies.length}体 存在しています`);

spawnEntity()

説明

ディメンションにエンティティを召喚することが出来ます。/summonコマンドと同等の事が出来ます。
また、namespace:typeId<event>のフォーマットでイベントのidを付属することによってイベントを実行された状態で召喚することが出来ます。

例文

一番小さい状態のスライムを(0, 0, 0)に召喚する

dimension.spawnEntity("minecraft:slime<spawn_baby>", { x: 0, y: 0, z: 0 });

fillBlocks()

説明

指定の座標間を埋めることが出来ます。/fillと約同等の事が出来ますが、オプションのdestroyoutlinehollowkeepは使うことができません。また、範囲の指定にはBlockVolumeListBlockVolumeCompoundBlockVolumeの何れかを使用しなければならないことに注意してください。

例文

(0, 0, 0)から(10, 10, 10)の空気を草ブロックに置き換える

import { BlockVolume } from "@minecraft/server";  

const filter = {
    includeTypes: [ "minecraft:air" ]
}

const volume = new BlockVolume({ x: 0, y: 0, z: 0 }, { x: 10, y: 10, z: 10 });

dimension.fillBlocks(volume, "minecraft:grass", { blockFilters: filter });

(0, 0, 0)から(10, 10, 10)の中が空洞な鉄ブロックの立方体を作る

import { CompoundBlockVolume, CompoundBlockVolumeAction, CompoundBlockVolumePositionRelativity } from "@minecraft/server";

const compound = new CompoundBlockVolume();

compound.pushVolume({ // (0, 0, 0) ~ (10, 10, 10) の座標を全てリストに追加
    action: CompoundBlockVolumeAction.Add,
    locationRelativity: CompoundBlockVolumePositionRelativity.Absolute,
    volume: new BlockVolume({ x: 0, y: 0, z: 0 }, { x: 10, y: 10, z: 10 })
});

compound.pushVolume({ // (1, 1, 1) ~ (9, 9, 9) の座標を全てリストから削除
    action: CompoundBlockVolumeAction.Subtract,
    locationRelativity: CompoundBlockVolumePositionRelativity.Absolute,
    volume: new BlockVolume({ x: 1, y: 1, z: 1 }, { x: 9, y: 9, z: 9 })
});

dimension.fillBlocks(compound, "minecraft:iron_block");

spawnParticle()

説明

パーティクルを召喚することが出来ます。/particleと同等の事が出来ます。パラメータが設定できるパーティクルであれば、RGBRGBA、スピード等を設定することも出来ます。

例文

緑色の炎のパーティクルを(0, 0, 0)に召喚する

import { MolangVariableMap } from "@minecraft/server";

const molang = new MolangVariableMap();
molang.setColorRGB("color", { red: 0, green: 1, blue: 0 });
dimension.spawnParticle("minecraft:colored_flame_particle", { x: 0, y: 0, z: 0 }, molang);

image.png

Entity

ワールドに存在しているエンティティを扱うことが出来ます。
<Dimension>.getEntities()や、エンティティに関するイベント等で取得することが出来ます。

dimension

説明

エンティティが存在している<Dimension>を取得することが出来ます。

例文

エンティティ存在しているディメンションを送信する

world.sendMessage(`このエンティティは${entity.dimension.id}に存在しています。`);

location

説明

エンティティの足元の座標を取得することが出来ます。

例文

エンティティの座標を送信する

const { x, y, z } = entity.location;
world.sendMessage(`エンティティの座標: (${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`);

id

説明

エンティティの識別IDを取得することが出来ます。
このIDはエンティティ特有のもので、基本的にワールドを再起動しても変化することはありません。
一部例外的に、村人が村人ゾンビになるときのように、エンティティが別のエンティティに変化した場合IDが変化する場合があります。

例文

エンティティの識別IDを送信する

world.sendMessage(`このエンティティIDは${entity.id}です。`);

typeId

説明

エンティティのIDを取得することが出来ます。
牛ならminecraft:cow、ゾンビならminecraft:zombieのようにマインクラフトのバニラエンティティのIDと対応しています。また、追加したエンティティもnamespace:entityのように取得することが出来ます。

例文

エンティティのtypeIdを送信する

world.sendMessage(`このエンティティは${entity.typeId}です`);

runCommand()

説明

コマンドを実行することが出来ます。また、@sセレクターを使う際にエンティティが対象になります。
その他の動作は<Dimension>.runCommandと同様です。

例文

エンティティから最も離れているエンティティにダメージを与える

entity.runCommand("damage @e[c=-1] 1 entity_attack entity @s");

runCommandAsync()

説明

コマンドを実行することが出来ます。また、<Entity>.runCommandと同様に、@sセレクターを使う際にエンティティが対象になります。
その他の動作は<Dimension>.runCommandAsync()と同様です。

例文

entity.runCommandAsync("testfor @e");

getHeadLocation()

説明

エンティティの頭の座標を取得する事が出来ます。

例文

エンティティの頭の座標と足元の座標が何マス離れているかを送信する

const location = player.location;
const headLocation = player.getHeadLocation();
const length = Math.sqrt((headLocation.x - location.x) ** 2 + (headLocation.y - location.y) ** 2 + (headLocation.z - location.z) ** 2);
world.sendMessage(`${length.toFixed(3)}マス離れています。`);

addTag()

説明

エンティティにタグを付与することが出来ます。

例文

タグを付与する

entity.addTag("ScriptAPI");

removeTag()

説明

エンティティからタグを削除することが出来ます。

例文

タグを削除する

entity.removeTag("ScriptAPI");

hasTag()

説明

エンティティがタグを持っているか確認出来ます。

例文

エンティティがタグを持っていればタグを削除します。

if (entity.hasTag("ScriptAPI")) {
    entity.removeTag("ScriptAPI");
}

getTags()

説明

エンティティのタグを配列で取得することが出来ます。

例文

エンティティのScriptAPI:で始まるタグを全て送信する

for (const tag of entity.getTags()) {
    if (tag.startsWith("ScriptAPI:")) world.sendMessage(tag);
}

getComponent()

説明

エンティティのコンポーネントを取得することが出来ます。

例文

エンティティのHPを5減少させる

const health = entity.getComponent("health");
const value = Math.min(health.currentValue - 5, 0); // 現在のHPから5減少させた値
health.setCurrentValue(value);

remove()

説明

エンティティを消去する事が出来ます。
<Entity>.kill()とは違い、エンティティが死ぬとき特有の挙動がスキップされ、ワールドから消滅します。

例文

エンティティを消去する

entity.remove();

kill()

説明

エンティティをkillする事が出来ます。/killと同じように使用する事が出来ます。

例文

エンティティをkillする

entity.kill();

teleport()

説明

エンティティをテレポートさせることが出来ます。

例文

エンティティをネザーにテレポートさせる

const dimension = world.getDimension("nether");
entity.teleport(entity.location, { dimension });

triggerEvent()

説明

エンティティのイベントを発火させる事が出来ます。/eventコマンドと同じように使用する事が出来ます。

例文

エンドクリスタルを爆発させる

const [entity] = player.dimension.getEntities({ type: "minecraft:ender_crystal" });
entity.triggerEvent("minecraft:crystal_explode");

addEffect()

説明

エンティティにエフェクトを付与する事が出来ます。/effectコマンドと同じように使用する事が出来ます。

例文

エンティティに10秒跳躍力上昇IIを付与する

entity.addEffect("jump_boost", 10 * 20, { amplifier: 1 });

removeEffect()

説明

エンティティからエフェクトを消去する事が出来ます。

例文

エンティティから透明化を消去する

entity.removeEffect("invisibility");

getEffect()

説明

エンティティに付与されているエフェクトを取得する事が出来ます。
指定したエフェクトがエンティティに付与されていない場合undefinedを返します。

例文

エンティティに毒が付与されている場合メッセージを送信する

const effect = entity.getEffect("poison");
if (effect) {
    world.sendMessage("毒のエフェクトが付与されています。");
}

getEffects()

説明

エンティティのエフェクトを全て取得する事が出来ます。

例文

エンティティに付与されているエフェクトのIDと効果レベルを全て送信する

for (const effect of entity.getEffects()) {
    world.sendMessage(`ID: ${effect.typeId} Amplifier: ${effect.amplifier}`);
}

状態

説明

  • isClimbing
    登っている場合trueになる

  • isFalling
    落下している場合trueになる

  • isInWater
    水中にいる場合trueになる

  • isOnGround
    足元がブロックの場合trueになる

  • isSleeping
    寝ている場合trueになる

  • isSneaking
    スニークしている場合trueになる

  • isSprinting
    走っている場合trueになる

  • isSwimming
    泳いでいる場合trueになる

例文

ジャンプしたときにエンティティをkillする

if (entity.isJumping) {
    entity.kill();
}

Player

ワールドに存在しているプレイヤーを扱うことが出来ます。
world.getPlayers()や、プレイヤーに関するイベント等で取得することが出来ます。

Entityから継承されているため、特定のメソッド以外はEntityと同様の動作になります。
なので、Entityで説明したプロパティ、メソッドは殆ど全てPlayerでも使用する事が出来ます。もう一度重複した内容を説明すると効率が悪いので、ここでは割愛します。

camera

説明

プレイヤーのカメラを管理する事が出来ます。

例文

プレイヤーのカメラ(プレイヤーの向きではない)を常に(0, 0, 0)の方向へ向かせる

player.camera.setCamera("minecraft:free", {
    facingLocation: { x: 0, y: 0, z: 0 },
    location: player.getHeadLocation()
});

inputPermissions

説明

プレイヤーの入力権限を取得、設定することができます。/inputpermissionコマンドと同じように使用する事が出来ます。

例文

プレイヤーのカメラの移動を制限する

player.inputPermissions.cameraEnabled = false;

selectedSlotIndex

説明

プレイヤーが選択しているホットバーのスロットを取得、設定することが出来ます。

例文

プレイヤーのホットバーのスロットをプレイヤーに送信する

player.sendMessage(`現在${player.selectedSlotIndex}を選択しています。`);

プレイヤーが手に持っているアイテムのIDをプレイヤーに送信する

const { container } = player.getComponent("inventory");
const itemStack = contaienr.getItem(player.selectedSlotIndex);
player.sendMessage(itemStack.typeId);

プレイヤーの選択しているスロットを0番目に変える

player.selectedSlotIndex = 0;

sendMessage()

説明

プレイヤーにのみメッセージを送信する事が出来ます。/tellrawコマンドと同じように使用する事が出来ます。
また、入力に文字列ではなくRawMessageを使用する事が出来ます。

例文

プレイヤーにメッセージを送信する

player.sendMessage("ScriptAPIを始めてみよう!");
player.sendMessage({ text: "ScriptAPIを始めてみよう!" });

getGameMode()

説明

プレイヤーのゲームモードを取得することができます。

例文

プレイヤーに現在のプレイヤーのゲームモードを送信する

const gameMode = player.getGameMode();
player.sendMessage(`現在のゲームモードは '${gameMode}' です。`);

setGameMode()

説明

プレイヤーのゲームモードを設定することが出来ます。

例文

プレイヤーのゲームモードをクリエイティブにする

import { GameMode } from "@minecraft/server";

player.setGameMode(GameMode.creative);

Block

ワールド内の座標のブロックを扱うことが出来ます。
<Dimension>.getBlock()や、ブロックに関するイベント等で取得することが出来ます。

ブロックのインスタンスは座標に紐付けられている為、インスタンスを作成し、そのブロックの座標を別のブロックに置き換えた後情報を読み取ろうとした場合、置き換えた後のブロックの情報になってしまう点に注意してください。

dimension

説明

ブロックが存在しているを取得することが出来ます。

例文

エンティティ存在しているディメンションを送信する

world.sendMessage(`このブロックは${entity.dimension.id}に存在しています。`);

location

説明

ブロックの座標を取得することが出来ます。

例文

エンティティの座標を送信する

const { x, y, z } = block.location;
world.sendMessage(`ブロックの座標: (${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`);

typeId

説明

ブロックのtypeIdを取得することができます。
鉄ブロックならminecraft:iron_block、ガラスならminecraft:glassのようにマインクラフトのバニラブロックのIDと対応しています。また、追加したブロックもnamespace:blockのように取得することが出来ます。

例文

ブロックのtypeIdを送信する

world.sendMessage(`このブロックは${block.typeId}です。`);

type

説明

ブロックのBlockTypeを取得することが出来ます。

例文

ブロックが水に浸ることができるかどうかを送信します

if (block.type.canBeWaterlogged) {
    world.sendMessage("水が浸る可能性があります。");
}
else {
    world.sendMessage("水が浸ることがありません。");
}

permutation

説明

ブロックのBlockPermutation(ブロックステートを含むより詳細なブロックデータ)を取得することが出来ます。

例文

ブロックのブロックステートを全て送信する

for (const [key, value] of Object.entries(block.permutation.getAllStates())) {
    world.sendMessage(`${key}: ${value}`);
}

オーバーワールドの(0, 0, 0)から(10, 10, 10)までをそのブロックで埋める

import { MinecraftDimensionTypes } from "@minecraft/server";

const dimension = world.getDimension(MinecraftDimensionTypes.overworld);
const volume = new BlockVolume({ x: 0, y: 0, z: 0 }, { x: 10, y: 10, z: 10 });
dimension.fillBlocks(volume, block.permutation);

offset()

説明

ブロックの座標を中心として、入力した座標分ずらした座標のブロックを取得します
例えば、(1, 2, 3)に存在しているブロックに対して(2, 4, 6)を入力すると、(3, 6, 9)に存在するブロックを取得することができます。

例文

ブロックから座標を全て1ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.offset({ x: 1, y: 1, z: 1 });
world.sendMessage(toBlock.typeId);

north()

説明

ブロックの座標を中心として、入力した座標分北にずらした座標のブロックを取得出来ます。

マイクラの北はx座標が減る方向

例文

ブロックから北に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.north(3);
world.sendMessage(formBlock.typeId);

south()

説明

ブロックの座標を中心として、入力した座標分南にずらした座標のブロックを取得出来ます。

マイクラの南はx座標が増える方向

例文

ブロックから南に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.south(3);
world.sendMessage(formBlock.typeId);

east()

説明

ブロックの座標を中心として、入力した座標分東にずらした座標のブロックを取得出来ます。

マイクラの東はz座標が減る方向

例文

ブロックから東に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.east(3);
world.sendMessage(formBlock.typeId);

west()

説明

ブロックの座標を中心として、入力した座標分西にずらした座標のブロックを取得出来ます。

マイクラの西はz座標が増える方向

例文

ブロックから西に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.west(3);
world.sendMessage(formBlock.typeId);

above()

説明

ブロックの座標を中心として、入力した座標分上にずらした座標のブロックを取得出来ます。

例文

ブロックから上に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.above(3);
world.sendMessage(formBlock.typeId);

below()

説明

ブロックの座標を中心として、入力した座標分下にずらした座標のブロックを取得出来ます。

例文

ブロックから下に3ずらした座標のブロックのtypeIdを送信する

const toBlock = fromBlock.below(3);
world.sendMessage(formBlock.typeId);

状態

説明

  • isAir
    空気の場合trueになる
  • isLiquid
    液体(水、溶岩等)の場合trueになる
  • isSolid
    不透過ブロック(ダイヤモンドブロック、土ブロック等)の場合trueになる
  • isWaterlogged
    水で浸っている場合trueになる

例文

ブロックが空気の場合鉄ブロックに置き換える

if (block.isAir) {
    block.setType("minecraft:iron_block");
}

ItemStack

インベントリやコンテナ内にあるアイテムを扱うことが出来ます。
<Container>.getItem()や、アイテムに関するイベント等で取得することが出来ます。ItemStackのインスタンスはnew ItemStack("minecraft:apple", 5)のようにIDと個数を入力して作成することが出来ます。

また、色々な変更可能なプロパティやメソッドがありますが、変更するだけではアイテムに適用されません。
例えば、コンテナにあるアイテムならコンテナから取得し、アイテムの内容を変更した後に再度そのアイテムをコンテナに設置しなければ適用されないことに注意してください。

typeId

説明

アイテムのtypeIdを取得することができます。
リンゴならminecraft:apple、鉄の剣ならminecraft:iron_swordのようにマインクラフトのバニラアイテムのIDと対応しています。また、追加したブロックもnamespace:itemのように取得することが出来ます。

例文

アイテムのtypeIdを送信する

world.sendMessage(`このアイテムは${block.typeId}です。`);

type

説明

アイテムのItemTypeを取得することが出来ます。

例文

同じtypeIdの新しい1個のItemStackを作成する

new ItemStack(itemStack.type, 1);

nameTag

説明

アイテムのネームタグを取得、変更することが出来ます。
但し、ネームタグは金床や代入で変更したテキストのみで、アイテムのディフォルトの名前の値を取得できないことに注意してください。

例文

アイテムのネームタグを編集する

itemStack.nameTag = "ScriptAPI (EDITED)";

アイテムのネームタグをディフォルトにリセットする

itemStack.nameTag = undefined;

amount

説明

アイテムの個数を取得、変更することが出来ます。
但し、0以下、若しくはmaxAmountより多くすることは出来ません。

例文

アイテムのIDと個数を送信する

world.sendMessage(`${itemStack.typeId} x${itemStack.amount}`);

アイテムの個数を5個に変更する

itemStack.amount = 5;

maxAmount

説明

アイテムのスタックできる最大値を取得することが出来ます。

例文

アイテムの個数をスタックできる最大値に設定する

itemStack.amount = itemStack.maxAmount;

lockMode

説明

アイテムのロックモードを取得、変更することが出来ます。

例文

アイテムのスロットに固定する

import { ItemLockMode } from "@minecraft/server";

itemStack.lockMode = ItemLockMode.slot;

アイテムの固定を解除する

import { ItemLockMode } from "@minecraft/server";

itemStack.lockMode = ItemLockMode.none;

getCanDestroy()

説明

アイテムのcan_destroyに設定されているブロックのtypeIdを全て取得することが出来ます。

例文

アイテムが壊せるブロックを全て送信する

const typeIds = itemStack.getCanDestroy();
const text = typeIds.length === 0 ? "全てのブロック" : typeIds.join(", ");
world.sendMessage(`${text}を破壊することができます。`);

setCanDestroy()

説明

アイテムのcan_destroyを設定することができます。

例文

アイテムを石ブロックとガラスを破壊できるように変更する

itemStack.setCanDestroy(["minecraft:stone", "minecraft:glass"]);

getCanPlaceOn()

説明

アイテムのcan_place_onに設定されているブロックのtypeIdを全て取得することが出来ます。
但し、設置可能なアイテムにのみ有効です。

例文

アイテムが設置できるブロックを全て送信する

const typeIds = itemStack.getCanPlaceOn();
const text = typeIds.length === 0 ? "全てのブロック" : typeIds.join(", ");
world.sendMessage(`${text}に設置することができます。`);

setCanPlaceOn()

説明

アイテムのcan_place_onを設定することができます。

例文

アイテムをエメラルドブロックと金ブロックに設置できるように変更する

itemStack.setCanPlaceOn(["minecraft:emerald_block", "minecraft:golden_block"]);

getLore()

説明

アイテムの説明文を改行区切りの配列で取得することが出来ます。

例文

アイテムの名前(設定されていなければtypeId)と説明文を送信する

world.sendMessage(itemStack.nameTag ?? itemStack.typeId);
world.sendMessage(itemStack.getLore().join("\n"));

setLore()

説明

アイテムの説明文を設定することが出来ます。

例文

アイテムの説明文を変更する

itemStack.setLore([
    "説明文1行目",
    "説明文2行目",
    "説明文3行目"
]);

最後に

ここまで読んで頂き有難うございました。
今回はかなりボリューミーな内容になってしまいましたが、これでもScriptAPIの僅か一機能に過ぎません。
ただ、基本的な操作は本記事の内容だけでも十分に行えますので、どのプロパティ、メソッドを使えばいいのか分からない!というような時に参考になれば幸いです。
次回からはまとめ以外の操作系を投稿していくつもりですので、今後ともよろしくお願いしたします。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?