독수리에선 내가 커맨드를 배운 방법을 알려주려고 함.

독수리는 영어로 이글이기 때문에 "이글에선"이라는 뜻임.


예를 들어 마붕이가 인터넷에서 타이머 만드는 방법을 검색해서 찾았다고 치자.

그럼 그 커맨드의 원리를 모르는 상태로 복붙만 해서 타이머를 만들게 되겠지.

이러면 타이머 만드는 방법은 알지만 정작 타이머 만들 때 쓴 execute if와 scoreboard의 사용법과 이게 뭐하는 명령어인지를 모르는 이상한 현상이 일어나게 되고, 타이머와 똑같이 scoreboard와 execute if를 사용하는 스톱워치를 어떻게 만들어야 되는지 몰라서 또 유튜브나 구글을 찾아가야 될 거임. 하지만 타이머를 만들기 전에 이미 scoreboard와 execute if의 사용법을 알고 있는 상태라면, 타이머와 스톱워치를 만들어본 적이 없어도 둘 다 어렵지 않게 만들 수 있음. 그러기 위해선 커맨드로 만든 하나의 완성품(타이머, 스톱워치)을 만드는 방법이 아니라 커맨드 하나하나의 사용법과 기능(scoreboard와 execute if의 사용법)을 알아야 함.

복붙질보다 이게 더 어렵다고 생각할 수도 있지만, 커맨드 복붙만 계속 하면 계속 구글과 유튜브에 의존해야 되고 커맨드 잘 못하는 사람이 이상한 방법으로 알려준 거를 그대로 복붙해서 맵 최적화도 안 되거나 마붕이가 복붙한 커맨드가 어떻게 작동하는지를 모르니 그 커맨드가 일으킨 버그를 수정하지 못하는 상황이 생기기도 함. 이런 걸 생각해 보면 오히려 복붙질만 하는 게 맵 만드는 데에는 더 어려움. 커맨드의 각 구문들의 기능과 사용법을 알고 있으면, 마붕이가 만들고 싶은 것을 만들기 위해 마붕이가 알고 있는 커맨드를 어떻게 활용해야 하는지를 생각해 볼 수 있게 된다.



커맨드의 각 구문들의 기능과 사용법을 알 방법은 매우 간단함.

그냥 마붕이들이 직접 이것저것 쳐보면서 알아내면 된다.

나도 이렇게 했기 때문에 "이 방법 안 좋음", "네가 먼저 그렇게 해봐" 같은 거 안 통함. ㅅㄱ

(맢도 생방에서 이 방법으로 커맨드 알게 됐다고 한 적 있음)


물론 그렇다고 해서 검색이나 복붙을 아예 하지 말라는 게 아니라,

검색, 복붙을 하더라도 마붕이가 쓰는 커맨드가 정확히 뭐하는 커맨드인지는 알고 쓰면 좋다는 거임.

그리고 그걸 알기 위해서 검색/복붙한 커맨드를 변형해서 써봐도 좋구.



이 아래에는 내가 커맨드를 알게 된 과정을 대충 써봤음.

다른 명령어들도 아래와 같은 느낌으로 이것저것 해보면 된다.



예를 들어 /execute의 사용법을 알고 싶다?

그럼 그냥 /execute를 한번 써보셈.


24b0d121e09c28a8699fe8b115ef046a7d6ae9c9


뭐가 이것저것 나오는데, 그냥 맨 위에 뜨는 align부터 써보자.



24b0d121e09c28a8699fe8b115ef046f584d9d98


이번엔 이상한 도끼들이라는 텍스트만 보이고 아무것도 안 나오노?


그래도 일단 그냥 아무거나 입력해 보자.



24b0d121e09c28a8699fe8b115ef046ec84ac2f2


스위즐이 뭔진 모르겠는데 일단 x y z의 조합이 필요하다니까 써보자.




24b0d121e09c28a8699fe8b115ef046c60f620469f


다시 그게 나왔음. 이번엔 좀 다른 걸로 해보지



24b0d121e09c28a8699fe8b115ef0464de8ae1cb


밑으로 내리니까 run이 있음.

run을 프로그램에다가 쓰면 '실행하다'라는 뜻이니까 뒤에 오는 커맨드를 실행하라는 구문 같노.



24b0d121e09c28a8699fe8b115ef046c60f520489a


뒤에 익숙한 명령어들이 보임. align xz가 뭐하는 구문인지를 알고 싶으니 일단 아무거나 써보자.



24b0d121e09c28a8699fe8b115ef046ec240c2f5


이건 그냥 /tellraw @a "asdf" 한 거랑 다른 게 없으니 이걸로는 align xz가 뭐하는 건지 모르겠노.

다른 명령어를 써봐야겠음.



24b0d121e09c28a8699fe8b115ef046b65699237


이번엔 tp를 썼는데, 분명 제자리로 tp되도록 했는데 좌표가 딱 맞는게 좀 이상하노.

그냥 아무 곳에서 쓴 건데 좌표가 저렇게 딱 맞을 수가 없음.

tp 명령어는 확실히 제자리로 tp하도록 썼기 때문에, 좌표를 딱 맞춘 건 align xz의 소행이라고 볼 수 있겠노.


실제로 align은 좌표를 .0으로 맞추는 (소숫점을 버리는) 구문임.

뒤에다가 xz라고 쓰면 y좌표는 그대로, x와 z만 .0으로 맞춰짐.




이번엔 위에서도 말했던 execute if를 써보자.


24b0d121e09c28a8699fe8b115ef046b6e669135


뭐가 많은데 block이 좀 익숙한 단어니까 block으로 해보자.



24b0d121e09c28a8699fe8b115ef046ecf4fc9f2


이건 딱 봐도 좌표니까 그냥 좌표를 쓰고


24b0d121e09c28a8699fe8b115ef046f58459f97


이건 딱 봐도 블럭이니까 블럭을 쓰면



24b0d121e09c28a8699fe8b115ef046c61f92a4a98


다시 아까 그게 나왔음. 이번에도 execute if block이 뭐하는지를 알고 싶으니 방금처럼 뒤에다가 뭔가를 써보면 될 텐데,

근데 사실 이건 딱 봐도 그냥 한 칸 밑이 잔디블럭이면 뒤의 명령어를 실행하는 명령어인 것처럼 보임.

실제로도 그런지 해보면, 한 칸 밑에 잔디블럭이 있을 때만 뒤의 명령어가 실행되는 것을 확인할 수 있음.




그럼 이 명령어로 에메랄드 블럭을 밟으면 스폰포인트가 찍히도록 해보자.


블럭이 에메랄드 블럭이니까 grass_block을 emerald_block으로 바꾸고

"밟으면" 이니까 ~ ~-1 ~을 ~ ~-0.01 ~로 바꿔야겠지


24b0d121e09c28a8699fe8b115ef046f584b9f98


이렇게 하면 에메랄드 블럭을 밟아야 스폰이 찍힌다.


근데 이걸 커맨드 블럭에 넣어놓으면 작동하지가 않음.

당연히 명령어는 기본적으로 실행한 위치에서 실행한 엔티티로서 작동되기 때문에, 저걸 그대로 커맨드 블럭에 넣어놓으면

"커맨드 블럭이 에메랄드 블럭을 밟고 있다커맨드 블럭의 스폰포인트를 여기로 찍는다"가 돼버린다.


그러면 일단 명령어의 실행 위치를 바꿔서 플레이어의 위치에서 실행하도록 바꿔야 된다고 생각해 볼 수 있지.


24b0d121e09c28a8699fe8b115ef046c62f22a4c


마침 아까 거기에 at이 있음. at의 뜻을 생각해 보면 딱 봐도 실행 위치를 바꿔줄 것 같노.


24b0d121e09c28a8699fe8b115ef046a7e68eb


at을 쓰니까 뒤에 골뱅이들이 나오는데, 딱 봐도 뒤에 쓴 엔티티의 위치에서 실행하도록 만드는 구문임을 알 수 있음.


근데 아닐 수도 있으니, 실제로도 그런지 확인해봐도 좋음.

이걸 확인해 보려면 그냥 아이템 하나 던져 놓고

/execute at @e[type=item] run particle end_rod

이렇게 쳤을 때 아이템에서 파티클이 나오는 걸 확인할 수 있음.

/particle end_rod는 명령어가 실행된 위치에다가 end_rod 파티클을 표시하는 명령어인데, at으로 실행 위치를 바꿨으니

그 바뀐 위치에서 실행된 거임.


아무튼 @a는 모든 플레이어니까 at @a를 쓰면 모든 플레이어의 위치에서 실행되겠노.

(명령어는 동시에 여러개를 실행할 수가 없기 때문에 at @a를 써도 한 번에 하나씩 실행된다.

물론 이것도 그냥 at 계속 쓰다보면 자연스럽게 알게 된다.)


24b0d121e09c28a8699fe8b115ef046c64f42c4e

이렇게 돼 있으면 세 개의 위치에서 say a를 순서대로 실행하니까 say a가 순서대로 세 번 실행됨. 동시에 실행하지 않음



그 다음, spawnpoint는 뒤에 아무것도 안 쓰면 자기 자신의 스폰을 찍는 명령어이므로,

커맨드 블럭에다가 "/execute at @a run spawnpoint"라고만 써 놓으면 커맨드 블럭의 스폰포인트를 플레이어의 위치에 찍게 된다. (당연히 찍히지도 않음)


그럼 이 실행 주체를 바꿔야 될 것 같은데,


24b0d121e09c28a8699fe8b115ef046c62f22a4c


at 바로 위에 딱 봐도 실행 주체를 바꿔줄 것 같은 단어가 하나 보임. 이 구문을 쓰면 플레이어'로서(as)' 명령어를 실행할 수 있겠노. 플레이어로서 실행을 하면 자기 자신을 타겟으로 삼는 명령어의 대상을, 플레이어로서 실행했기 때문에, 플레이어로 정할 수 있겠지.


그럼 /execute as @a run spawnpoint라고 쓰면 될 것처럼 보이는데.. 안 된다.

이걸 커맨드 블럭에 직접 써보면 커맨드 블럭의 위치에서 모든 플레이어로서 자신의 스폰포인트를 찍게 된다.

즉, 이걸로는 커맨드 블럭의 위치에 모든 플레이어의 스폰이 찍히는 것이지.


as와 at을 좀 쓰다 보면, as는 실행 주체, at은 실행 위치를 바꾼다는 것을 알게 된다.


지금 쓸 명령어는 플레이어의 위치에서 플레이어로서 실행해야 되니까

/execute as @a at @s run spawnpoint

(모든 플레이어로서, 자기 자신의 위치에서, 자신의 스폰을 여기에 찍는다.)

이렇게 해야겠노.


이제 에메랄드 블럭 조건까지 더하자.

블럭은 위치를 감지하는 거니까 at으로 위치를 바꾼 후에 써야겠지?

/execute as @a at @s if block ~ ~-0.01 ~ emerald_block run spawnpoint

(모든 플레이어로서, 자기 자신의 위치에서, 에메랄드 블럭을 밟고 있으면, 자신의 스폰을 여기에 찍는다)




많은 게이들이 어려워하는(뇌피셜임) /execute store도 해보자.


24b0d121e09c28a8699fe8b115ef046f5c4b9a9f


일단 단어만 보면 뭔가를 저장하는 거 같음. result라고 쓰면 뭔가의 결과를 저장할 수 있을 것처럼 보이노.



24b0d121e09c28a8699fe8b115ef046ecc40ccf6


엔티티의 결과를 저장한다..? 뭔가 이상한데 일단 이상해도 아무거나 써보자.



24b0d121e09c28a8699fe8b115ef046ecb4dcaf7


이번엔 <path>라고만 나와 있고 뭘 써야 되는지도 안 알려준다. 그래도 일단 아무거나 써보자.



근데 사실 이건 /data로 직접 이것저것 해봤으면 저 <path>가 익숙할 거임.


/data를 안 써봤으면 여기서 막힐 수도 있는데, 그렇다면 그냥

이게 뭔지를 알게 될 때까지 다른 명령어를 해보다가 알게 됐을 때 다시 이걸 해봐도 된다. (나는 이렇게 했음)


24b0d121e09c28a8699fe8b115ef046c69f82b4c


/data get을 써보면 똑같이 path가 보임. 바로 NBT 데이터의 경로(path)를 의미하는 것인데,

예를 들어 저기에 Health라고 쓰면, 대상의 NBT 데이터에 저장되어 있는 Health 값을 반환함.

Health의 값이 20인 상태로 저 명령어를 쓰면 아래와 같이 출력된다.


24b0d121e09c28a8699fe8b115ef0469943af3bf




저 path에 아무것도 안 쓰면 대상의 모든 데이터를 채팅으로 알려주는데, 그 중에서 필요한 거 찾아서 쓰면 된다.


참고로

/data get entity @s attributes[0]

이렇게 쓰면 attributes라는 배열에서 첫 번째 거를 가져올 수 있고, (컴퓨터는 숫자를 0부터 센다.)


/data get entity @s attributes[{id:"minecraft:attack_speed"}]

이렇게 쓰면 attributes라는 배열 중 {id:"minecraft:attack_speed"}를 포함한 것들을 가져올 수 있고,


/data get entity @s attributes[0].base

이렇게 쓰면 attributes라는 배열의 첫 번째 거에서 base 값만 가져올 수도 있음.


/data get entity @s SelectedItem.components."minecraft:writable_book_content".pages[0].raw

이렇게 쓰면, 들고 있는 책과 깃펜의 첫 페이지 내용을 가져올 수 있음. 저 마침표들이 뭐하는 애인지는 스스로 알아보슈



24b0d121e09c28a8699fe8b115ef046c68f3294c


다시 돌아가서 다음 거를 쳐보면 갑자기 숫자가 튀어나온다. 뭔진 모르겠는데 그래도 일단 아무거나...



24b0d121e09c28a8699fe8b115ef046c63f42847


24b0d121e09c28a8699fe8b115ef046f5e449d99


여긴 아무거나 쓰니까 실수가 필요하다노. 아무 실수를 쓴다.


사실 이것도 /data get으로 뭔가를 해봤으면 알 수 있는데, 몇을 곱할지를 쓰는 거임. (뭘 뭐에 곱하는건지 곧 나옴 ㄱㄷ)



24b0d121e09c28a8699fe8b115ef046eca41ccf6


이제 run을 쓸 수 있으니 이 store result가 뭐하는 구문인지 알아보자.

그 전에 엔티티 부분에다가 @n[tag=asdf]를 썼으니 asdf라는 태그를 가진 몹을 소환하자.


위에서 말했듯이 /execute store는 뭔가의 결과를 어느 엔티티에 저장하는 명령어 같으니, 뒤에서 실행한 명령어의 결과를 어느 엔티티에 저장하는 거라고 추측해 볼 수 있음. /data get을 써보면 "ddongmap의 개체 데이터는 다음과 같음: 20.0f"와 같이 뭔가의 결과를 알려준다. 이 결과를 어느 엔티티에다가 저장할 수 있을 것 같은데,


/execute store result entity @n[tag=asdf] Health int 0.5 run data get entity @s Health

이런 명령어를 실행하면, asdf라는 태그를 가진 가장 가까운 엔티티의 Health 값을 나의 Health 값에다가 0.5를 곱한 값으로 설정할 것 같음.


실제로 이 명령어를 실행해 보면,

asdf라는 태그를 가진 가장 가까운 엔티티(나는 크리퍼로 했음)의 Health 값이 나의 Health 값의 반으로 설정된다.


24b0d121e09c28a8699fe8b115ef046c64f22048



그럼 모든 asdf라는 태그를 가진 엔티티의 Health 값을 제 Health 값의 반으로 설정하려면 그냥 @e[tag=asdf]를 하면 될 것 같지만


24b0d121e09c28a8699fe8b115ef046f5c4d989a


이런 문구가 뜬다. 이 문구는 개체 한 개만 허용되는 곳에 결과가 두 개 이상일 수 있는 선택자를 사용했다는 뜻으로,

개체 한 개만 허용되는 곳에 결과가 두 개 이상일 수 있는 선택자를 사용하면 나오는 문구임.

@e[tag=asdf]는 asdf라는 태그를 가진 모든 엔티티가 대상이므로 대상이 둘 이상일 수가 있음.


이럴 때에는 아까 쓴 as를 이용해서

/execute as @e[tag=asdf] store result entity @s Health int 0.5 run data get entity ddongmap Health

(asdf 태그를 가진 모든 엔티티로서, 자신의 Health 값에다가 뒤의 명령어의 결과를 0.5를 곱해서 정수로 저장, ddongmap의 Health 값 가져오기)


이러면 모든 asdf 태그를 가진 엔티티의 체력을 내 체력의 반으로 설정할 수 있게 된다.

@s는 대상이 자기 자신이기 때문에 항상 대상이 하나지.


이제 execute store 사용법을 알게 됐으니 이걸 여기저기 활용할 수 있겠노.




이런 식으로 다른 명령어의 사용법도 알아보면 된다.




여까지 읽었으면 알겠지만

사실 커맨드는 그냥 그 단어 자체만으로도 뭐하는 명령어인지를 유추할 수 있는 경우가 꽤 많으니

단어만 보고 유추한 것을 바탕으로 이게 뭐하는 커맨드인지를 직접 쳐보면서 알 수 있음.




아 그리고 execute store success도 있는데 이게 뭐하는건진 직접알아보구 알려주기귀찮음 이거 어차피 알아봤자 별로쓸데도없음 뭐 문자열 두개가 일치하는지 감지하는거 있는거같던데 그냥 상자두개에다가 아이템두개넣어놓고 data modify 써서 비교할문자열두개를 아이템이름으로바꿔서 if blocks 쓰면될꺼임 꼼수같아보이는데 원래 커맨드는꼼수로하는거니까 꼼수쓰는거같다는생각이들면 마붕이는커맨드를제대로하고있는거임 (사실이거 지금이글쓰면서 생각한방법이라 안될수도있음)



세줄요약

1. 인터넷에서 복붙만 하면 실력 안 느니까

2. 커맨드의 각 구문의 역할과 사용법을

3. 직접 이것저것 쳐보면서 배우면 됨