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

# 目次

<ul>
    <li><a href="#はじめに">はじめに</a></li>
    <li>
        <details>
            <summary><a href="#world">World</a></summary>
            <ul>
                <li><a href="#afterevents">afterEvents</a></li>
                <li><a href="#beforeevents">beforeEvents</a></li>
                <li><a href="#scoreboard">scoreboard</a></li>
                <li><a href="#structuremanager">structureManager</a></li>
                <li><a href="#gamerules">gameRules</a></li>
                <li><a href="#getdimension">getDimension()</a></li>
                <li><a href="#getplayers">getPlayers()</a></li>
                <li><a href="#sendmessage">sendMessage()</a></li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#system">System</a></summary>
            <ul>
                <li><a href="#afterevents-1">afterEvents</a></li>
                <li><a href="#beforeevents-1">beforeEvents</a></li>
                <li><a href="#runinterval">runInterval()</a></li>
                <li><a href="#runtimeout">runTimeout()</a></li>
                <li><a href="#clearrun">clearRun()</a></li>
                <li><a href="#runjob">runJob()</a></li>
                <li><a href="#clearjob">clearJob()</a></li>
                <li><a href="#waitticks">waitTicks()</a></li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#dimension">Dimension</a></summary>
            <ul>
                <li><a href="#runcommand">runCommand()</a></li>
                <li><a href="#runcommandasync">runCommandAsync()</a></li>
                <li><a href="#getblock">getBlock()</a></li>
                <li><a href="#setblocktype">setBlockType()</a></li>
                <li><a href="#setblockpermutation">setBlockPermutation()</a></li>
                <li><a href="#getentities">getEntities()</a></li>
                <li><a href="#spawnentity">spawnEntity()</a></li>
                <li><a href="#fillblocks">fillBlocks()</a></li>
                <li><a href="#spawnparticle">spawnParticle()</a></li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#entity">Entity</a></summary>
            <ul>
                <li><a href="#dimension-1">dimension</a></li>
                <li><a href="#location">location</a></li>
                <li><a href="#id">id</a></li>
                <li><a href="typeid">typeId</a></li>
                <li><a href="#runcommand-1">runCommand</a></li>
                <li><a href="#runcommandasync-1">runCommandAsync</a></li>
                <li><a href="#getheadlocation">getHeadLocation()</a></li>
                <li><a href="#addtag">addTag()</a></li>
                <li><a href="#removetag">removeTag()</a></li>
                <li><a href="#hastag">hasTag()</a></li>
                <li><a href="#gettags">getTags()</a></li>
                <li><a href="#getcomponent">getComponent()</a></li>
                <li><a href="#remove">remove()</a></li>
                <li><a href="#kill">kill()</a></li>
                <li><a href="#teleport">teleport()</a></li>
                <li><a href="#triggerevent">triggerEvent()</a></li>
                <li><a href="#addeffect">addEffect()</a></li>
                <li><a href="#removeeffect">removeEffect()</a></li>
                <li><a href="#geteffect">getEffect()</a></li>
                <li><a href="#geteffects">getEffects()</a></li>
                <li>
                    <a href="#状態">状態</a>
                    <ul>
                        <li>isClimbing</li>
                        <li>isFalling</li>
                        <li>isInWater</li>
                        <li>isOnGround</li>
                        <li>isSleeping</li>
                        <li>isSneaking</li>
                        <li>isSprinting</li>
                        <li>isSwimming</li>
                    </ul>
                </li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#player">Player</a></summary>
            <ul>
                <li><a href="#camera">camera</a></li>
                <li><a href="#inputpermissions">inputPermissions</a></li>
                <li><a href="#selectedslotindex">selectedSlotIndex</a></li>
                <li><a href="#sendmessage-1">sendMessage()</a></li>
                <li><a href="#setgamemode">setGameMode()</a></li>
                <li><a href="#getgamemode">getGameMode()</a></li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#block">Block</a></summary>
            <ul>
                <li><a href="#dimension-2">dimension</a></li>
                <li><a href="#location-1">location</a></li>
                <li><a href="#typeid-1">typeId</a></li>
                <li><a href="#type">type</a></li>
                <li><a href="#permutation">permutation</a></li>
                <li><a href="#offset">offset()</a></li>
                <li><a href="#north">north()</a></li>
                <li><a href="#south">south()</a></li>
                <li><a href="#east">east()</a></li>
                <li><a href="#west">west()</a></li>
                <li><a href="#above">above()</a></li>
                <li><a href="#below">below()</a></li>
                <li>
                    <a href="#状態-1">状態</a>
                    <ul>
                        <li>isAir</li>
                        <li>isLiquid</li>
                        <li>isSolid</li>
                        <li>isWaterlogged</li>
                    </ul>
                </li>
            </ul>
        </details>
    </li>
    <li>
        <details>
            <summary><a href="#itemstack">ItemStack</a></summary>
            <ul>
                <li><a href="#typeid-2">typeId</a></li>
                <li><a href="#type-1">type</a></li>
                <li><a href="#nametag">nameTag</a></li>
                <li><a href="#amount">amount</a></li>
                <li><a href="#maxamount">maxAmount</a></li>
                <li><a href="#getcandestroy">getCanDestroy()</a></li>
                <li><a href="#setcandestroy">setCanDestroy()</a></li>
                <li><a href="#getcanplaceon">getCanPlaceOn()</a></li>
                <li><a href="#setcanplaceon">setCanPlaceOn()</a></li>
                <li><a href="#getlore">getLore()</a></li>
                <li><a href="#setlore">setLore()</a></li>
            </ul>
        </details>
    </li>
    <li><a href="#最後に">最後に</a></li>
</ul>

# はじめに
今回は、ScriptAPI (`@minecraft/server`) の扱いについて例文を添えて解説していきます。但し、あくまでタイトル通りScriptAPIの基本的な要素のみに絞って解説していますので、その点に留意して御一読頂けると幸いです。
また、仕様の説明について多少齟齬があるかもしれませんので、誤っている箇所がございましたらご報告いただけると助かります。

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

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

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

前回: [仕様・情報まとめ](https://qiita.com/yuki2825624/items/2730a3f420f45c7c7eef)
次回: [イベントの操作 構造編](https://qiita.com/yuki2825624/items/ee561a01ffd3c9fcdf24)

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

## afterEvents 

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

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

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

## beforeEvents

#### 説明
最も基本的に使用する要素の一つで、ワールドの様々なイベントを登録することが出来ます。[`aftereEvents`](#afterevents)とは違い、イベントが起こる前に登録していた関数が実行されます。イベントが起こる前に実行されるため、イベントの実行をキャンセルすることが可能です。但し、ちょっとした[制限](https://qiita.com/yuki2825624/items/2730a3f420f45c7c7eef#beforeevents%E3%81%AE%E4%BB%95%E6%A7%98)があります。

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

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

## scoreboard 

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

#### 例文
全プレイヤーのスコアボードに5追加しそれぞれのプレイヤーにスコアを表示
```js
const objective = world.scoreboard.getObjective("score"); // 'score' という名前のオブジェクティブを取得

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

サイドバーにスコアボードを表示
```js
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`という名前のストラクチャーとしてメモリに保存

```js
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

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

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

```js
world.gameRules.fallDamage = false;
```

オンにする場合
```js
world.gameRules.fallDamage = true;
```

取得する場合
```js
world.sendMessage(`fallDamage: ${world.gameRules.fallDamage}`);
```

## getDimension()
#### 説明
最も基本的に使用する要素の一つで、`overworld`、`nether`、`the_end`の3つのディメンションを取得することが出来ます。

#### 例文
オーバーワールドのブロックを置くことが可能な高さの範囲を送信する
```js
const dimension = world.getDimension("overworld");

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

## getPlayers()

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

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

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

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

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

## sendMessage()

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

#### 例文
ワールド内の全プレイヤーにメッセージを送信する
```js
world.sendMessage("ScriptAPIを始めてみよう！");
```
```js
world.sendMessage({ text: "ScriptAPIを始めてみよう！" });
```

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

## afterEvents

#### 説明
システム関連のイベントを登録することが出来ます。動作は基本的に[`<World>.afterEvents`](#afterevents)と同様です。

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

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

## beforeEvents

### 説明
システム関連のイベントを登録することが出来ます。動作は基本的に[`<World>.beforeEvents`](#beforeevents)と同様です。

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

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

## runInterval()

#### 説明
tick単位で[`setInterval()`](https://developer.mozilla.org/ja/docs/Web/API/setInterval)と同じように、一定間隔毎に処理を実行することが出来ます。

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

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

## runTimeout()

#### 説明
tick単位で[`setTimeout()`](https://developer.mozilla.org/ja/docs/Web/API/setInterval)と同じように処理の実行を遅延させることが出来ます。

#### 例文
プレイヤーに[タグを付与](#addtag)し、1秒後にプレイヤーから[タグを削除](#removetag)する

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

## clearRun()

##### 説明
`system.run()`、[`<System>.runInterval()`](#runinterval)、[`<System>.runTimeout()`](#runtimeout)の処理を途中で終了させることが出来ます。

#### 例文
5秒間だけ毎tick`(0, 0, 0)`に炎の[パーティクルを召喚](#spawnparticle)する

```js
import { world, system, TicksPerSecond } from "@minecraft/server";

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);
}, TicksPerSecond * 5);
```

## runJob()

#### 説明
[`Generator`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Generator)の処理時間が1tick以上になる際、処理を一時中断し次のtickから再開して処理を実行することが出来ます。これを利用することで、時間のかかる処理の負荷を軽減することが出来ます。

#### 例文
`(0, 0, 0)`から`(10, 10, 10)`に石を[設置](#setblocktype)する

```js
function* generateBlocks() {
    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(generateBlocks());
```

## clearJob()

#### 説明
[`<System>.runJob()`](#runjob)の処理を途中で終了させることが出来ます。

#### 例文
5tick間にブロックを[設置](#setblocktype)出来る回数をカウントし送信する

```js
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後fulfillする[`Promise`](https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Promise)を取得することが出来ます。

#### 例文
5秒カウントする

```js
import { world, system, TicksPerSecond } from "@minecraft/server";

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

# Dimension
ワールドのディメンションを管理することが出来ます。
[`<World>.getDimension()`](#getdimension)や、特定のイベント等で取得することが出来ます。

## runCommand()

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

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

また、`/setmaxplayers`や`/reload`、`/connect`などは実行することが出来ず、実行者がディメンション（スクリプト側）な為、セレクター`@s`を使用することは出来ません。

#### 例文
難易度をノーマルに設定する
```js
dimension.runCommand("difficulty normal");
```

## runCommandAsync()

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

#### 例文
ディメンションのエンティティの数を送信する
```js
dimension.runCommandAsync("testfor @e")
    .then((result) => {
        world.sendMessage(`${result.successCount}体のエンティティが存在します。`);
    });
```

## getBlock()

#### 説明
ディメンションの[`<Block>`](#block)を座標から取得することが出来ます。

#### 例文
`(0, 0, 0)`のブロックのtypeIdを送信する
```js
const block = dimension.getBlock({ x: 0, y: 0, z: 0 });
world.sendMessage(`(0, 0, 0) のブロックは ${block.typeId} です。`);
```

## setBlockType()

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

#### 例文
`(0, 0, 0)`にオークの板材を設置する
```js
dimension.setBlockType({ x: 0, y: 0, z: 0 }, "minecraft:planks");
```

## setBlockPermutation()

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

#### 例文
`(0, 0, 0)`に黒色の羊毛を設置する
```js
const wool = BlockPermutation.resolve("minecraft:wool", { "color": "black" });
dimension.setBlockPermutation({ x: 0, y: 0, z: 0 }, wool);
```

## getEntities()

#### 説明
ディメンションの全エンティティを配列で取得することが出来ます。また、[`<World>.getPlayers()`](#getplayers)と同様に、フィルタリングして取得することも可能です。

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

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

## spawnEntity()

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

#### 例文
ゾンビを`(0, 0, 0)`に召喚する
```js
dimension.spawnEntity("minecraft:zombie", { x: 0, y: 0, z: 0 });
```

一番小さい状態のスライムを`(0, 0, 0)`に召喚する
```js
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)`の空気を草ブロックに置き換える

```js
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)`までの中が空洞な鉄ブロックの立方体を作る
```js
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)`に召喚する
```js
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](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3637082/e9109710-7121-78e2-e50e-abef647bb534.png)

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

## dimension

#### 説明
エンティティが存在している[`<Dimension>`](#dimension)を取得することが出来ます。

#### 例文
エンティティ存在しているディメンションを送信する
```js
world.sendMessage(`このエンティティは${entity.dimension.id}に存在しています。`);
```

## location

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

#### 例文
エンティティの座標を送信する
```js
const { x, y, z } = entity.location;
world.sendMessage(`エンティティの座標: (${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)})`);
```

## id

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

#### 例文
エンティティの識別IDを送信する
```js
world.sendMessage(`このエンティティIDは${entity.id}です。`);
```

## typeId

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

#### 例文
エンティティのtypeIdを送信する
```js
world.sendMessage(`このエンティティは${entity.typeId}です`);
```

## runCommand()

#### 説明
コマンドを実行することが出来ます。また、同様、実行座標、実行者が共に、そのエンティティとなります。
その他の動作は[`<Dimension>.runCommand()`](#runcommand)と同様です。

#### 例文
エンティティから最も離れているエンティティにダメージを与える
```js
entity.runCommand("damage @e[c=-1] 1 entity_attack entity @s");
```

## runCommandAsync()

#### 説明
コマンドを実行することが出来ます。また、[`<Entity>.runCommand()`](#runcommand-1)と同様、実行座標、実行者が共に、そのエンティティとなります。
その他の動作は[`<Dimension>.runCommandAsync()`](#runcommandasync)と同様です。

#### 例文
エンティティの座標にtntを64個召喚する
```js
entity.runCommandAsync("execute as @e[c=2] as @e[c=2] as @e[c=2] as @e[c=2] as @e[c=2] as @e[c=2] run summon tnt ~~~");
```

## getHeadLocation()

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

#### 例文
エンティティの頭の座標と足元の座標が何マス離れているかを送信する
```js
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()

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

#### 例文
タグを付与する
```js
entity.addTag("ScriptAPI");
```

## removeTag()

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

#### 例文
タグを削除する
```js
entity.removeTag("ScriptAPI");
```

## hasTag()

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

#### 例文
エンティティがタグを持っていればタグを削除します。
```js
if (entity.hasTag("ScriptAPI")) {
    entity.removeTag("ScriptAPI");
}
```

## getTags()

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

#### 例文
エンティティの`ScriptAPI:`で始まるタグを全て送信する
```js
for (const tag of entity.getTags()) {
    if (tag.startsWith("ScriptAPI:")) world.sendMessage(tag);
}
```

## getComponent()

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

#### 例文
エンティティのHPを5減少させる
```js
const health = entity.getComponent("health");
const value = Math.min(health.currentValue - 5, 0); // 現在のHPから5減少させた値
health.setCurrentValue(value);
```

## remove()

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

#### 例文
エンティティを消去する
```js
entity.remove();
```

## kill()

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

#### 例文
エンティティをkillする
```js
entity.kill();
```

## teleport()

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

#### 例文
エンティティを`(0, 0, 0)`にテレポートさせる
```js
entity.teleport({ x: 0, y: 0, z: 0 });
```

エンティティをネザーにテレポートさせる
```js
const dimension = world.getDimension("nether");
entity.teleport(entity.location, { dimension });
```

## triggerEvent()

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

#### 例文
[ディメンションに存在する全てのエンドクリスタル](#getentities)を爆発させる
```js
for (const entity of dimension.getEntities({ type: "minecraft:ender_crystal" })) {
    entity.triggerEvent("minecraft:crystal_explode");
}
```

## addEffect()

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

#### 例文
エンティティに10秒跳躍力上昇IIを付与する
```js
entity.addEffect("jump_boost", 10 * 20, { amplifier: 1 });
```

## removeEffect()

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

#### 例文
エンティティから透明化を消去する
```js
entity.removeEffect("invisibility");
```

## getEffect()

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

#### 例文
エンティティに毒が付与されている場合メッセージを送信する
```js
const effect = entity.getEffect("poison");
if (effect) {
    world.sendMessage("毒のエフェクトが付与されています。");
}
```

## getEffects()

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

#### 例文
エンティティに付与されているエフェクトのIDと効果レベルを全て送信する
```js
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する
```js
if (entity.isJumping) {
    entity.kill();
}
```

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

[`Entity`](#entity)から継承されているため、[特定のメソッド](https://qiita.com/yuki2825624/items/2730a3f420f45c7c7eef#player%E3%82%AF%E3%83%A9%E3%82%B9%E3%81%AE%E4%BB%95%E6%A7%98)以外は`Entity`と同様の動作になります。
なので、`Entity`で説明したプロパティ、メソッドは殆ど全て`Player`でも使用する事が出来ます。もう一度重複した内容を説明すると効率が悪いので、ここでは割愛します。

## camera

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

#### 例文
プレイヤーのカメラ（プレイヤーの向きではない）を常に`(0, 0, 0)`の方向へ向かせる
```js
player.camera.setCamera("minecraft:free", {
    facingLocation: { x: 0, y: 0, z: 0 },
    location: player.getHeadLocation()
});
```

## inputPermissions

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

#### 例文
プレイヤーのカメラの移動を制限する
```js
player.inputPermissions.cameraEnabled = false;
```

## selectedSlotIndex

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

#### 例文
プレイヤーのホットバーのスロットをプレイヤーに送信する
```js
player.sendMessage(`現在${player.selectedSlotIndex}を選択しています。`);
```

プレイヤーが手に持っているアイテムのIDをプレイヤーに送信する
```js
const { container } = player.getComponent("inventory");
const itemStack = container.getItem(player.selectedSlotIndex);
player.sendMessage(itemStack.typeId);
```

プレイヤーの選択しているスロットを0番目に変える
```js
player.selectedSlotIndex = 0;
```

## sendMessage()

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

#### 例文
プレイヤーにメッセージを送信する
```js
player.sendMessage("ScriptAPIを始めてみよう！");
```
```js
player.sendMessage({ text: "ScriptAPIを始めてみよう！" });
```

## getGameMode()

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

#### 例文
プレイヤーに現在のプレイヤーのゲームモードを送信する
```js
const gameMode = player.getGameMode();
player.sendMessage(`現在のゲームモードは '${gameMode}' です。`);
```

## setGameMode()

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

#### 例文
プレイヤーのゲームモードをクリエイティブにする
```js
import { GameMode } from "@minecraft/server";

player.setGameMode(GameMode.creative);
```

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

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

## dimension

#### 説明
ブロックが存在している<Dimension>を取得することが出来ます。

#### 例文
エンティティ存在しているディメンションを送信する
```js
world.sendMessage(`このブロックは${entity.dimension.id}に存在しています。`);
```

## location

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

#### 例文
エンティティの座標を送信する
```js
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を送信する
```js
world.sendMessage(`このブロックは${block.typeId}です。`);
```

## type

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

#### 例文
ブロックが水に浸ることができるかどうかを送信します
```js
if (block.type.canBeWaterlogged) {
    world.sendMessage("水が浸る可能性があります。");
}
else {
    world.sendMessage("水が浸ることがありません。");
}
```

## permutation

#### 説明
ブロックの`BlockPermutation`（ブロックステートを含むより詳細なブロックデータ）を取得することが出来ます。

#### 例文
ブロックのブロックステートを全て送信する
```js
for (const [key, value] of Object.entries(block.permutation.getAllStates())) {
    world.sendMessage(`${key}: ${value}`);
}
```

オーバーワールドの`(0, 0, 0)`から`(10, 10, 10)`までをそのブロックで[埋める](#fillblocks)
```js
const dimension = world.getDimension("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を送信する
```js
const toBlock = fromBlock.offset({ x: 1, y: 1, z: 1 });
world.sendMessage(toBlock.typeId);
```

## north()

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

:::note info
マイクラの北は**x座標が減る**方向
:::

#### 例文
ブロックから北に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.north(3);
world.sendMessage(formBlock.typeId);
```

## south()

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

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

#### 例文
ブロックから南に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.south(3);
world.sendMessage(formBlock.typeId);
```

## east()

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

:::note info
マイクラの東は**z座標が減る**方向
:::

#### 例文
ブロックから東に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.east(3);
world.sendMessage(formBlock.typeId);
```

## west()

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

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

#### 例文
ブロックから西に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.west(3);
world.sendMessage(formBlock.typeId);
```

## above()

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

#### 例文
ブロックから上に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.above(3);
world.sendMessage(formBlock.typeId);
```

## below()

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

#### 例文
ブロックから下に3ずらした座標のブロックのtypeIdを送信する
```js
const toBlock = fromBlock.below(3);
world.sendMessage(formBlock.typeId);
```

## 状態

#### 説明
- **isAir**
    空気の場合`true`になる
- **isLiquid**
    液体（水、溶岩等）の場合`true`になる
- **isSolid**
    不透過ブロック（ダイヤモンドブロック、土ブロック等）の場合`true`になる
- **isWaterlogged**
    水で浸っている場合`true`になる

#### 例文
ブロックが空気の場合鉄ブロックに置き換える
```js
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を送信する
```js
world.sendMessage(`このアイテムは${block.typeId}です。`);
```

## type

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

#### 例文
同じtypeIdの新しい1個の`ItemStack`を作成する
```js
new ItemStack(itemStack.type, 1);
```

## nameTag

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

#### 例文
アイテムのネームタグを編集する
```js
itemStack.nameTag = "ScriptAPI (EDITED)";
```

アイテムのネームタグをディフォルトにリセットする
```js
itemStack.nameTag = undefined;
```

## amount

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

#### 例文
アイテムのIDと個数を送信する
```js
world.sendMessage(`${itemStack.typeId} x${itemStack.amount}`);
```

アイテムの個数を5個に変更する
```js
itemStack.amount = 5;
```

## maxAmount

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

#### 例文
アイテムの個数をスタックできる最大値に設定する
```js
itemStack.amount = itemStack.maxAmount;
```

## lockMode

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

#### 例文
アイテムのスロットに固定する
```js
import { ItemLockMode } from "@minecraft/server";

itemStack.lockMode = ItemLockMode.slot;
```

アイテムの固定を解除する
```js
import { ItemLockMode } from "@minecraft/server";

itemStack.lockMode = ItemLockMode.none;
```

## getCanDestroy()

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

#### 例文
アイテムが壊せるブロックを全て送信する
```js
const typeIds = itemStack.getCanDestroy();
const text = typeIds.length === 0 ? "全てのブロック" : typeIds.join(", ");
world.sendMessage(`${text}を破壊することができます。`);
```

## setCanDestroy()

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

#### 例文
アイテムを石ブロックとガラスを破壊できるように変更する
```js
itemStack.setCanDestroy(["minecraft:stone", "minecraft:glass"]);
```

## getCanPlaceOn()

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

#### 例文
アイテムが設置できるブロックを全て送信する
```js
const typeIds = itemStack.getCanPlaceOn();
const text = typeIds.length === 0 ? "全てのブロック" : typeIds.join(", ");
world.sendMessage(`${text}に設置することができます。`);
```

## setCanPlaceOn()

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

#### 例文
アイテムをエメラルドブロックと金ブロックに設置できるように変更する
```js
itemStack.setCanPlaceOn(["minecraft:emerald_block", "minecraft:golden_block"]);
```

## getLore()

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

#### 例文
アイテムの名前（設定されていなければtypeId）と説明文を送信する
```js
world.sendMessage(itemStack.nameTag ?? itemStack.typeId);
world.sendMessage(itemStack.getLore().join("\n"));
```

## setLore()

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

#### 例文
アイテムの説明文を変更する
```js
itemStack.setLore([
    "説明文1行目",
    "説明文2行目",
    "説明文3行目"
]);
```

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