명령어와 권한
명령어
mod.commands().register(CommandNode.literal("showcase")
.then(CommandNode.literal("info").executes(context -> {
context.source().sendMessage("Native Showcase");
return 1;
}))
.then(CommandNode.literal("add")
.then(CommandNode.argument("a", CommandArgumentType.integer())
.then(CommandNode.argument("b", CommandArgumentType.integer())
.executes(ctx -> ctx.getInteger("a") + ctx.getInteger("b"))))));
- 명령어는 게임의 Brigadier 트리로 설치되며, 서버를 시작할 때와
/reload를 실행할 때마다 다시 설치됩니다. executes가 반환하는 값이 명령의 결과값이 됩니다(/execute store와 게임 테스트의runCommand가 이 값을 받습니다).- 실패를 알리려면
CommandFailure를 던지세요. 실패 메시지만 보내려면context.source().sendFailure(text)를 쓸 수도 있습니다. - 두 모드가 같은 최상위 명령어를 등록하면
POLY-COMMAND-001경고를 남기고 트리를 병합합니다.
인수 타입
CommandArgumentType | 읽기 |
|---|---|
integer(), integer(min, max) | getInteger(name) |
decimal() | getDouble(name) |
bool() | getBoolean(name) |
word(), string(), greedyString() | getString(name) (각각 단어 하나, 단어 또는 따옴표 문자열, 줄의 나머지 전체) |
blockPos() | getBlockPos(name) |
player() | getPlayer(name) |
CommandSource
context.source()는 명령을 실행한 주체이며 name(), sendMessage, sendFailure, hasPermission(level), hasPermission(node), player()(Optional), world(), blockPos()를 제공합니다.
.then(CommandNode.argument("pos", CommandArgumentType.blockPos()).executes(context -> {
context.source().world().setBlock(context.getBlockPos("pos"), GLOW_BLOCK);
return 1;
}))
권한
권한 수준
CommandNode.literal("reset").requiresPermission(2); // 0..4, 게임의 운영자 레벨
권한 노드
PermissionNode PLACE = mod.permissions().node("place", 2); // my_mod.place, 기본 운영자 레벨 2
mod.commands().register(CommandNode.literal("ruby")
.then(CommandNode.literal("place").requiresPermission(PLACE)
.then(CommandNode.argument("pos", CommandArgumentType.blockPos()).executes(context -> {
context.source().world().setBlock(context.getBlockPos("pos"), RUBY_BLOCK);
return 1;
}))));
player.hasPermission(PLACE);
- 노드 이름은
<mod id>.<path>형식입니다. - 명령어 노드의 레벨과 권한 노드는 함께 검사합니다. 콘솔과 명령 블록은 레벨로 판단합니다.
권한 공급자
권한 모드는 공급자를 등록해 권한 여부를 결정합니다.
mod.permissions().provider((player, node) ->
node.equals(SECRET) && isTrusted(player) ? PermissionResult.ALLOW : PermissionResult.UNDECIDED);
- 공급자는 모든 모드의 모든 권한 검사에서 등록한 순서대로 호출되며,
ALLOW,DENY,UNDECIDED중 하나를 돌려줍니다. - 어느 공급자도 결정하지 않으면 노드의 기본 운영자 레벨을 사용합니다.
- 공급자가 예외를 던지면 그 공급자를 건너뛰고
POLY-PERMISSION-003을 기록합니다.
오류 코드
| 코드 | 뜻 |
|---|---|
POLY-COMMAND-001 | 두 모드가 같은 최상위 명령어를 등록(경고, 트리 병합) |
POLY-COMMAND-002 | 등록이 닫힌 뒤에 등록함 |
POLY-PERMISSION-001 | 잘못되었거나 중복된 권한 노드 |
POLY-PERMISSION-002 | 등록이 닫힌 뒤에 선언함 |
POLY-PERMISSION-003 | 공급자 예외(해당 공급자를 건너뜀) |