名前のとおり
開発中
as, at, run, if, unless, in, facing, rotated, positioned, align, anchored,
すべてのサブコマンドの動作はバグ的挙動・BE特有の実行順序を含め再現済み
import { Execute } from "./execute/Execute"; const execute = new Execute(); // execute as @e[type=armor_stand,scores={a=0}] at @e[type=armor_stand,scores={a=0}] run scoreboard players add @s a 1 execute.as("@e[type=armor_stand,scores={a=0}]").at("@e[type=armor_stand,scores={a=0}]").run("scoreboard players add @s a 1");サブコマンドrunに任意のコールバックを指定可能
import { Execute } from "./execute/Execute"; const execute = new Execute(); execute.as("@e[type=armor_stand,scores={a=0}]").at("@e[type=armor_stand,scores={a=0}]").run(stack => { world.scoreboard.getObjective("a")!.addScore(stack.getExecutor(), 1); });実行文脈の遷移をじっくり確認できる
** ForkIterator が返す順序が真逆!!!!!!!!!! **
import { world } from "@minecraft/server"; import { Execute } from "./execute/Execute"; import { Fork } from "./execute/ForkIterator"; const execute: Execute = new Execute(); execute.as("@e[type=armor_stand,scores={a=0}]").at("@e[type=armor_stand,scores={a=0}]"); // イテレータを取得 const iter = execute.buildIterator({ run(stack) { world.scoreboard.getObjective("a")!.addScore(stack.getExecutor(), 1); } }); let result: IteratorResult<Fork, Fork>; do { // 実行文脈のフォークまたはリダイレクト一回単位で取得できる result = iter.next(); world.sendMessage(result.value.stack.toString(), result.value.subCommand, result.value.final); } while (!result.done);エンティティセレクタパーサ, ブロック条件パーサ, 座標入力パーサなどを単体で利用可能
import { Entity } from "@minecraft/server"; import { EntitySelector, EntitySelectorParser } from "./execute/arguments/EntitySelector"; import { CommandSourceStack } from "./execute/CommandSourceStack"; const selector: EntitySelector = EntitySelectorParser.readSelector("@e[type=player,scores={foo.bar:bazbazbaz=0..3},haspermission={camera=disabled}]"); const entities: Entity[] = selector.getEntities(new CommandSourceStack());実行文脈はCommandSourceStackクラスで管理されている
import { world } from "@minecraft/server"; import { Execute } from "./execute/Execute"; import { CommandSender } from "./execute/CommandSender"; import { CommandSourceStack } from "./execute/CommandSourceStack"; import { MinecraftBlockTypes } from "@minecraft/vanilla-data"; world.afterEvents.itemUse.subscribe(event => { const sender = CommandSender.getEntitySender(event.source); const stack = new CommandSourceStack(sender); const execute = new Execute(stack); execute.anchored("eyes").positioned.$("^ ^ ^1").run(ctx => { const block = ctx.getDimension().getBlock(ctx.getPosition())!; block.setType(MinecraftBlockTypes.DiamondBlock); console.log(ctx.getExecutor().nameTag, ctx.getRotation()); }); });- 選択される複数のエンティティの位置が一致していた場合のID順ソート (不可能?)
- 実行文脈の遷移の視覚化機能 (最高にだるい)
- エンティティセレクタ
@initiator(作るか悩み中) - executeコマンドパーサ (こんどやる)
- セレクタ引数
hasitemの動作確認
同一座標に重なったエンティティにプレイヤーが含まれる場合のソート順が正しくない(getEntities() の戻り値はつねにプレイヤーが最後に来てしまう?)
- セレクタ引数
m=は反転であっても重複できない - Map(オブジェクト) を値にとるセレクタ引数はすべて重複を許可し、意味の重複するものは最後の入力を使う
- セレクタ引数
type=だけ特別扱い
(Bun前提) リポジトリcloneして
bun init -y bun i @minecraft/vanilla-data # 必要に応じて # bun i @minecraft/server # bun i @minecraft/server-ui # bun i @minecraft/server-gametest # bun i @minecraft/debug-utilitiesターミナルで以下を実行
# 全部やる bun run buildscriptsフォルダが作成される...はず
tsgoはやくこい
development_behavior_packsに入れるのがおすすめDebugDrawer使うからベータAPI必須!!!!!!!index.tsがエントリポイントになってる