1. 개요
<colbgcolor=#47A0FF> execute | |
execute <세부 명령문...> run <실행할 명령> | |
<colcolor=#fff> 역사 | JE | [ruby(1.8, ruby=추가)] / [ruby(1.13, ruby=변경)] BE | [ruby(PE 알파 0.16.0 빌드 1, ruby=추가)] / [ruby(1.19.50, ruby=변경)] EE | [ruby(?, ruby=추가)] |
기능 | <세부 명령문...> 에 따라 <실행할 명령> 을 실행한다. |
관련 명령어 | - |
단축 명령어 | - |
기본값 | - |
<rowcolor=#fff> 싱글 사용 | 권한 |
가능 | 2(JE), 1(BE) |
명령어의 실행 주체, 위치, 시점, 차원을 설정하고 명령어가 실행될 조건과 명령어의 결과값을 저장하는 방식을 설정한다. scoreboard와 함께 명령어의 양대산맥이다.[1]
2. execute 문법
세부 명령문은 한 명령어에 여러 번 쓰는 것이 가능하고 세부 명령문의 작성이 끝나면run <실행할 명령>
으로 끝낸다. 이때, <실행할 명령>
앞에는 슬래시(/)를 사용해서는 안 된다.2.1. 실행 설정
명령어의 실행 주체, 위치, 시점, 차원 등을 설정할 수 있다.as <대상> <다음 명령>
- 명령어의 실행 주체를
<대상>
으로 바꾸고 다음 명령을 실행한다. 명령어의 실행 위치를 바꾸진 않는다. - 예: 모든 주민 죽이기:
execute as @e[type=villager] run kill @s
at <대상> <다음 명령>
- 명령어의 실행 위치를
<대상>
의 위치, 시점, 차원으로 바꾸고 다음 명령을 실행한다. - 예: 모든 주민을 1칸 위로 올리기:
execute as @e[type=villager] at @s run tp @s ~ ~1 ~
- 만약
tp @e[type=villager] ~ ~1 ~
를 실행하면, 주민 각각이 1칸 위로 올라가는 것이 아닌 모든 주민이 실행자의 1칸 위로 순간이동한다.] - 실행 주체를 변경하지 않기에 다음 명령어를 쓰면 실행자가 죽는다.
execute at @e[type=villager] run kill @s
positioned <좌표> <다음 명령>
- 명령어의 실행 위치를
<좌표>
로 바꾸고 다음 명령을 실행한다. positioned as <대상> <다음 명령>
- 명령어의 실행 위치를
<대상>
의 좌표로 바꾸고 다음 명령을 실행한다.at
과 달리 위치만 바꿀 뿐 시점, 차원을 바꾸지는 않는다. positioned over <하이트맵> <다음 명령>
(JE)- 지정된 실행 위치를 x와 z 좌표값을 유지한 채 y 좌표값을
<하이트맵>
에 따른 가장 높은 위치로 바꾸고 다음 명령을 실행한다. <하이트맵>에 넣을 문구는 다음과 같다. world_surface
: 가장 높은 곳.motion_blocking
: 충돌 판정이 없는 블록(꽃, 키 작은/키 큰 잔디, 양탄자[2] 등)을 제외한 가장 높은 곳.motion_blocking_no_leaves
: 충돌 판정이 없는 블록(꽃, 키 작은/키 큰 잔디, 양탄자 등) + 잎을 제외한 가장 높은 곳.ocean_floor
: 유체(물, 용암)를 제외한 가장 높은 곳.align <기준> <다음 명령>
- 명령어의 실행 위치의 좌표의 소수부를
<기준>
에 따라 버림하여 정수로 만든 뒤 그 위치에서 다음 명령을 실행한다.x, y, z
를 조합해x, xz, zyx, yz
와 같은 형식으로 쓰고, 쓴 좌표축에 해당하는 좌표의 값의 소수 부분을 버림한다. 버림이 아니라 올림을 하고 싶다면align xyz positioned ~1 ~1 ~1
과 같이 쓰면 된다. - 예: 좌표가
(2.9, -13.2, 6.24)
일 때 기준이yz
면(2.9, -14.0, 6.0)
이 된다. 음수에서 버림이 일어날 때 -13.0이 아님에 주의하자. facing <좌표> <다음 명령>
- 명령어 실행 위치에서
<좌표>
를 바라보는 시점으로 다음 명령을 실행한다. facing entity <개체> <eyes|feet> <다음 명령>
- 명령어 실행 위치에서
<개체>
의 눈(eyes)이나 발(feet)을 바라보는 시점으로 다음 명령을 실행한다. rotated <시점 좌표> <다음 명령>
<시점 좌표>
의 방향의 시점으로 다음 명령을 실행한다.rotated as <개체> <다음 명령>
<개체>
가 바라보는 방향과 동일한 방향의 시점으로 다음 명령을 실행한다.in <차원> <다음 명령>
- 명령어의 실행 위치를 해당 차원으로 바꾸고 다음 명령을 실행한다. 차원은 기본적으로
minecraft:overworld
,minecraft:the_end
,minecraft:the_nether
가 있는데, 모드, 플러그인, 데이터 팩, 만우절 버전 등으로 차원을 추가된 차원도 지원된다. anchored <eyes|feet> <다음 명령>
- 명령어 실행 위치를 명령어 실행 주체의 눈(eyes) 또는 발(feet)로 바꾸고 다음 명령을 실행한다. 기본값은
feet
이다. summon <개체> <다음 명령>
(JE)<개체>
를 소환하고 명령어의 실행 주체, 위치, 시점, 차원을 소환된 개체를 기준으로 하여 다음 명령을 실행한다.on <관계> <다음 명령>
(JE)- 앞의 명령구의 주체와의 특정한
<관계>
에 있는 개체가 새로운 주체가 되어 다음 명령을 실행한다. <관계>
에 넣을 문구는 다음과 같다.[3]attacker
: 최근 5초 동안 대상에게 마지막으로 피해를 입힌 개체를 주체로 설정한다. interaction 개체는 5초 이전의 기록들도 기억한다.controller
: 대상을 타며 조종하는 개체를 주체로 설정한다. (예시: 배 앞자리에 탄 플레이어)leasher
: 대상을 끈으로 묶은 개체를 주체로 설정한다. 울타리에 묶어둔 경우에는minecraft:leash_knot
개체로 설정한다.origin
: 대상을 소환한 개체를 주체로 설정한다. (예시: 화살을 발사한 개체, tnt를 점화시킨 개체)owner
: 대상이 길들여질 수 있는 개체일 경우(고양이, 늑대, 앵무새같은), 대상의 주인을 주체로 설정한다.passengers
: 대상에 직접적으로 타고 있는 개체를 주체로 설정한다. 대상을 타고 있는 개체를 타고 있는 개체는 포함되지 않는다.target
: 대상이 공격 목표로 삼은 개체를 주체로 설정한다.[4]vehicle
: 대상이 타고 있는 개체를 주체로 설정한다.
2.2. 조건 설정
조건을 설정하는 세부 명령문을 사용하면 조건에 맞거나 맞지 않는 경우 <다음 명령>이 실행된다.<if|unless>
if ...
: 다음 조건과 일치할 때 <다음 명령>을 실행한다.unless ...
: 다음 조건과 일치하지 않을 때 <다음 명령>을 실행한다.<if|unless> block <좌표> <블록> <다음 명령>
- 해당 좌표에 맞는 블록이 있거나 있지 않을 때만 다음 명령을 실행한다.
<if|unless> blocks <시작 좌표> <끝 좌표> <지점> <all|masked> <다음 명령>
- 시작과 끝으로 설정된 지역의 블록이 지점 지역의 블록과 정확히 일치하거나 일치하지 않은 경우에만 다음 명령을 실행한다. /clone과 비슷한 문법이다.
... <all|masked> ...
all
: 모든 블록이 일치masked
: 공기 블록을 제외하고 일치<if|unless> entity <개체> <다음 명령>
- 개체가 존재하거나 존재하지 않을 때에만 다음 명령을 실행한다.
<if|unless> score <대상> <스코어보드1> 〈<|<=|=|>=|>〉 <기준> <스코어보드2> <다음 명령>
- 스코어보드1에 있는 대상의 점수와 스코어보드2에 있는 기준의 점수가 (부)등호에 맞거나 맞지 않을 때만 다음 명령을 실행한다.
<if|unless> score <대상> <스코어보드1> matches <범위> <다음 명령>
- 스코어보드1에 있는 대상의 점수가 범위에 들어갔거나 들어가지 않았을 때만 다음 명령을 실행한다.
<범위>
부분은 1(정확히 1), 1..5(1 이상 5 이하), ..6(6 이하), 3..(3 이상)와 같이 지정한다.<if|unless> biome <좌표> <생물 군계> <다음 명령>
(JE)- 해당 좌표에 있는 생물 군계가 있거나 있지 않을 때만 다음 명령을 실행한다.
<if|unless> dimension <차원> <다음 명령>
(JE)- 현재 차원이 맞거나 맞지 않을 때 다음 명령을 실행한다.
<if|unless> function <함수> <다음 명령>
(JE)- 함수를 실행해서 실행된 함수가 반환한 값이 1 이상이면 다음 명령을 실행한다. 만약 함수가 반환한 값이 없거나 0이라면 다음 명령을 실행하지 않는다.
<if|unless> loaded <좌표> <다음 명령>
(JE)- 해당 위치에 있는 청크가 완전히 로딩되어있거나 로딩되지 않을 때 다음 명령을 실행한다.
<if|unless> predicate <술어> <다음 명령>
(JE)- 사용자 정의 술어가 맞거나 맞지 않을 때 다음 명령을 실행한다. 술어에 대한 내용은 마인크래프트/데이터팩 참조
<if|unless> items <entity 대상|block 좌표> <슬롯> <아이템> <다음 명령>
- 대상 및 블록의 슬롯에 있는 아이템이 일치하거나 일치하지 않을 때 다음 명령을 실행한다.
2.3. 저장 설정(JE)
store
을 이용해 다음 명령의 결과나 성공 횟수를 스코어, NBT데이터, 보스바 등에 저장할 수 있다. 결과는 모든 명령어가 실행을 마친 후에 저장된다.store success
다음 명령어가 실패하거나 성공하면 0(실패) 혹은 1(성공)로 반환된다.store result
다음 명령어가 성공하면 출력 문단에 따라 다르며, 실패하면 0으로 설정된다.store <result|success> ...
... score <대상> <스코어보드> <다음 명령>
- 다음 명령의 결과를 스코어보드에 있는 대상의 점수로 저장한다. 스코어보드는 무조건 존재해야 한다
... block <위치> <경로> <byte|short|int|long|float|double> <크기> <다음 명령>
- 블록의 NBT 데이터를 수정하고 결과를 저장한다.
... entity <대상> <경로> <byte|short|int|long|float|double> <크기> <다음 명령>
- 대상의 NBT 데이터를 수정하고 결과를 저장한다.
- 플레이어의 NBT는 그 어떠한 경우에도 수정이 불가능하다.
... bossbar <ID> <value|max> <다음 명령>
- 결과값을 해당 ID를 가진 보스바의 값(value)이나 최대값(max)으로 저장한다.
2.3.1. 출력
명령어 | 상태 | execute store result ... |
advancement | 오류 | 변하지 않음 | |
실패 | 0 | ||
성공 | 각 플레이어에서 추가/제거된 발전/기준의 총 수. |
attribute | any | 실패 | 0 |
... get [규모] | 성공 | 속성 값의 [규모]만큼 곱한 다음 유형을 Int로 변환한다. | |
... base get [규모] | 성공 | ||
... modifier value get [규모] | 성공 | ||
... base set ... ... modifier add ... ... modifier remove ... | 성공 | 1 |
ban | - | 실패 | 0 |
성공 | 차단한 플레이어의 이름 길이 수 |
ban-ip | - | 실패 | 0 |
성공 | ??? |
banlist | - | 실패 | 0 |
성공 | 현재 차단중인 플레이어 수 |
clear | any | 실패 | 0 |
성공 | 지워지거나 감지된 아이템의 수 |
clone | any | 실패 | 0 |
성공 | 대상 지역에서 변경된 블록 수. |
data | any | 실패 | 0 |
... get ... [대상 NBT경로] [규모] | 성공 | [규모]만큼 곱한 다음 유형을 Int로 변환한다. |
datapack | any | 실패 | 0 |
datapack list | 성공 | 활성화된 데이터 팩 개수. |
debug | any | 실패 | 0 |
start | 성공 | 0 | |
stop | 성공 | 평균 TPS | |
function | 성공 | 실행된 명령 수(성공 여부에 관계없음) |
deop | - | 실패 | 0 |
성공 | OP 권한이 제거된 플레이어 수 |
difficulty | - | 실패 | 0 |
성공 | 현재 난이도(평화로움 = 0, 쉬움 = 1, 보통 = 2, 어려움 = 3) | ||
... | 성공 | 1 |
effect | - | 실패 | 0 |
성공 | 효과가 주어 지거나 취소 된 개체의 수 |
enchant | - | 실패 | 0 |
성공 | 성공적으로 부여된 플레이어의 수 |
execute | - | 실패 | 0 |
... <if|unless> block | 실패 | 0 | |
성공 | 1 | ||
... <if|unless> blocks | 실패 | 0 | |
성공 | 감지된 블록 수 | ||
... <if|unless> entity | 실패 | 0 | |
성공 | 감지된 개체 수 | ||
... <if|unless> items | 실패 | 0 | |
성공 | 감지된 아이템 수 | ||
... <if|unless> score | 실패 | 0 | |
성공 | ? | ||
... <if|unless> biome | 실패 | 0 | |
성공 | ? | ||
... <if|unless> dimension | 실패 | 0 | |
성공 | 1 | ||
... <if|unless> function | 실패 | 0 | |
성공 | execute 출력 문단 참고. | ||
... <if|unless> loaded | 실패 | 0 | |
성공 | 1 | ||
... <if|unless> predicate | 실패 | 0 | |
성공 | ? |
experience | - | 실패 | 0 |
experience ... | 성공 | 플레이어의 경험치 또는 레벨 수 | |
experience <add|set> ... | 성공 | 대상 플레이어 수 |
fill | - | 실패 | 0 |
성공 | 성공적으로 채워진 블록 수 |
fillbiome | - | 실패 | 0 |
성공 | 성공적으로 채워진 생물 군계 수 |
function | - | 실패 | 0 |
성공 | 실행된 명령 수(성공 여부에 관계없음) |
gamemode | - | 실패 | 0 |
성공 | 게임 모드가 변경된 플레이어의 수 |
gamerule | - | 실패 | 0 |
성공 | 현재 게임 규칙의 값(false = 0, true = 1, 정수일경우 Int.) |
help | - | 성공 | 목록에 뜬 명령어 개수 |
kick | - | 실패 | 0 |
성공 | 대상 플레이어 수 |
kill | - | 실패 | 0 |
성공 | 대상 플레이어 수 |
list | - | 성공 | 현재 접속 중인 플레이어 수 |
locate | - | 실패 | 0 |
성공 | 실행자 위치와 구조물 및 생물군계간 거리 |
loot | - | 실패 | 0 |
loot spawn ... | 성공 | ? | |
loot give ... | 성공 | ? | |
loot insert ... | 성공 | ? |
particle | - | 실패 | 0 |
성공 | 입자를 볼 수 있는 플레이어 수 |
playsound | - | 실패 | 0 |
성공 | 소리를 들을 수 있는 플레이어 수 |
random | - | 실패 | 0 |
<value|roll> ... | 성공 | 출력된 난수값 | |
reset ... | 성공 | 리셋된 sequenceId 의 개수 |
reload | - | 성공 | 1 |
return | - | 실패 | 0 |
<값> | 성공 | <값> | |
run <명령어> | 성공 | execute 출력 문단 참고. | |
실패 | 0 | ||
return fail | 성공? | 0 |
ride | - | 실패 | 0 |
성공 | 1 |
scoreboard | - | 실패 | 0 |
... <add|remove> | 성공 | 실행 후 대상의 스코어보드 현재 값 | |
... get | 성공 | 대상의 스코어보드 현재 값 | |
... list | 성공 | 스코어보드의 수 |
seed | - | 성공 | 현재 시드값의 32비트로 변환되어 출력된다. |
stop | - | 성공 | 1 |
time | - | 실패 | 0 |
... query ... | 성공 | 인게임 시간. | |
... <add|set> ... | 성공 | 실행 후 인게임 시간. |
worldborder | - | 실패 | 0 |
... get | 성공 | 정수로 반올림 한 다음 세계 경계 크기. |
3. 설명
세부 명령문는 왼쪽으로부터 시작하여 오른쪽으로 순서대로 처리한다. 예를 들어 아래 명령어는 구성은 같지만 문법의 위치만 다르다.execute as @e at @s run tp ^ ^ ^1
- 모든 개체는 1블록 앞으로 이동한다.execute at @s as @e run tp ^ ^ ^1
- 모든 개체는 실행자의 앞의 1블록으로 순간 이동한다.
일부 세부 명령문은 명령어를 여러번 실행할 수 있다. 즉 그 뒤에 오는 세부 명령문이 여러번 실행된다. 예를 들어 "as" 세부 명령문에 여러 개체를 선택하는 경우 그 뒤에 나오는 세부 명령문은 개체당 한 번씩 실행된다.
또한 세부 명령문이 테스트에 실패하거나 대상 지정이 없다면 다음 세부 명령문은 실행 시도조차 하지 않는다. 이를 이용해 명령어 최적화가 가능하다.
execute as @e at @s if score $namu wiki matches 1 run say hello world!
execute if score $namu wiki matches 1 as @e at @s run say hello world!
... run execute ...
는 효과가 전혀 없다. 아래 명령어는 모두 동일하며, 쓸데없는 연산을 하기에 명령어 실행 시 지연이 추가로 발생한다.execute as @e[type=minecraft:armor_stand] as @e[type=minecraft:armor_stand] run summon minecraft:armor_stand
execute as @e[type=minecraft:armor_stand] run execute as @e[type=minecraft:armor_stand] run execute run execute run summon minecraft:armor_stand
4. 예시
- 모든 좀비의 위치에 번개를 소환한다.
execute at @e[type=zombie] run summon lightning_bolt ~ ~ ~
- 모래 위에 있는 모든 좀비의 위치에 번개를 소환한다.
execute at @e[type=zombie] if block ~ ~-1 ~ minecraft:sand run summon lightning_bolt ~ ~ ~
- 모든 플레이어에게서 5블록 반경에 있는 플레이어하고 떨어지는 번개와 아이템을 제외한 모든 개체에게 번개를 소환한다.
- JE:
execute as @a at @e[distance=..5,type=!player,type=!lightning_bolt,type=!item] run summon lightning_bolt ~ ~ ~
- BE:
execute as @a at @e[r=5,type=!player,type=!lightning_bolt,type=!item] run summon lightning_bolt ~ ~ ~
- 플레이어의 아래에 흑요석이 감지될 경우 x y z로 tp한다. (점프맵 등에 사용됨)
execute as @a at @s if block ~ ~-0.001 ~ minecraft:obsidian run tp @s x y z
- 플레이어의 아래에 금 블럭이 감지될 경우 플레이어에게 다이아몬드 검을 주고 그 블럭을 없앤다. (점프맵 등에 사용됨)
첫번째 명령어 : execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block run give @s minecraft:diamond_sword
두번째 명령어(연쇄형) : execute as @a at @s if block ~ ~-1 ~ minecraft:gold_block run setblock ~ ~-1 ~ minecraft:air
- 가장 가까운 플레이어의 체력을 보스바로 나타낼 때(JE)
execute store result bossbar minecraft:1 value run data get entity @p Health
- Pos라는 태그를 가진 blue라는 팀에 속한 갑옷 거치대를 기준으로 가장가까에 있는 team이 red인 플레이어를 100, 100, 100으로 텔레포트 시킨다.(JE)
execute at @e[ team=blue, tag=Pos, type=armor_stand ] run tp @p[ team=red ] 100 100 100
- 아머스탠드의 오른팔이 분당 10번 돌아간다.(JE)
준비 : /scoreboard objectives add test dummy, /summon x y z armor_stand{ShowArms:1,Pose:{RightArm:[0.0f,0.0f,0.0f]},Tags:[test]}
execute as @e[tag=test,limit=1] store result @s Pose.RightArm[0] float 1 run scoreboard players add @s test 3
- 모든 양의 양털 색깔이 스코어보드 숫자번호대로 바뀐다.(0 = 흰색, 1 = 주황색)(JE)
준비 : /scoreboard objectives add color dummy
,/summon sheep X Y Z {Tags:[color],NoAI:1b}
반복 첫번째 : scoreboard players add $color color 1
연쇄 두번째(무조건) : execute if score $color color matches 16.. run scoreboard players set $color color 0
연쇄 세번째(무조건) : execute as @e[tag=color] store result entity @s Color int 1 run scoreboard players get $color color
- 플레이어의 특정 아이템 수 스코어보드로 나타내기.(JE)
준비 : /scoreboard objectives add i.c dummy, /tag @s add i.c
반복 첫번째 : execute as @a[tag=i.c] store result score @s i.c run clear @s <특정 아이템> 0
- 플레이어가 밟고 있는 공급기에 조합법(부싯돌, 종이, 다이아몬드 검)이 충족되면 자동으로 날카로움 2 책으로 조합
execute at @a positioned ~ ~-0.001 ~ if block ~ ~ ~ minecraft:dropper if items block ~ ~ ~ container.0 minecraft:flint if items block ~ ~ ~ container.1 minecraft:paper if items block ~ ~ ~ container.5 minecraft:paper if items block ~ ~ ~ container.7 minecraft:paper if items block ~ ~ ~ container.8 minecraft:diamond_sword run item replace block ~ ~ ~ container.4 with minecraft:enchanted_book[minecraft:stored_enchantments={"minecraft:sharpness":2}]
[1] 과장이 아니라, execute와 scoreboard 없이 뭔가 작동하는 미니게임 같은 걸 만드는 건 어마어마한 노가다가 필요하거나 아예 불가능하다.[2] 양탄자는 충돌 판정이 있음에도 없는 판정으로 계산된다.[3] 다음의 '대상'은 모두 '앞의 명령구를 실행하던 (이전) 주체'를 지칭한다.[4] 만약 현재 대상이 좀비이고 이 좀비가 어떤 주민을 쫓고 있다면 그 주민이 주체가 되어 다음 명령을 실행한다.