目次
- はじめに
-
Entity
- dimension
- location
- id
- typeId
- runCommand
- runCommandAsync
- getHeadLocation()
- addTag()
- removeTag()
- hasTag()
- getTags()
- getComponent()
- remove()
- kill()
- teleport()
- triggerEvent()
- addEffect()
- removeEffect()
- getEffect()
- getEffects()
-
状態
- isClimbing
- isFalling
- isInWater
- isOnGround
- isSleeping
- isSneaking
- isSprinting
- isSwimming
- 最後に
はじめに
今回は、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()
説明
最も基本的に使用する要素の一つで、overworld
、nether
、the_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.run
、system.runInterval
、system.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
と約同等の事が出来ますが、オプションのdestroy
、outline
、hollow
、keep
は使うことができません。また、範囲の指定にはBlockVolume
、ListBlockVolume
、CompoundBlockVolume
の何れかを使用しなければならないことに注意してください。
例文
(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
と同等の事が出来ます。パラメータが設定できるパーティクルであれば、RGB
やRGBA
、スピード等を設定することも出来ます。
例文
緑色の炎のパーティクルを(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);
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の僅か一機能に過ぎません。
ただ、基本的な操作は本記事の内容だけでも十分に行えますので、どのプロパティ、メソッドを使えばいいのか分からない!というような時に参考になれば幸いです。
次回からはまとめ以外の操作系を投稿していくつもりですので、今後ともよろしくお願いしたします。