독수리에선 내가 커맨드를 배운 방법을 알려주려고 함.
독수리는 영어로 이글이기 때문에 "이글에선"이라는 뜻임.
예를 들어 마붕이가 인터넷에서 타이머 만드는 방법을 검색해서 찾았다고 치자.
그럼 그 커맨드의 원리를 모르는 상태로 복붙만 해서 타이머를 만들게 되겠지.
이러면 타이머 만드는 방법은 알지만 정작 타이머 만들 때 쓴 execute if와 scoreboard의 사용법과 이게 뭐하는 명령어인지를 모르는 이상한 현상이 일어나게 되고, 타이머와 똑같이 scoreboard와 execute if를 사용하는 스톱워치를 어떻게 만들어야 되는지 몰라서 또 유튜브나 구글을 찾아가야 될 거임. 하지만 타이머를 만들기 전에 이미 scoreboard와 execute if의 사용법을 알고 있는 상태라면, 타이머와 스톱워치를 만들어본 적이 없어도 둘 다 어렵지 않게 만들 수 있음. 그러기 위해선 커맨드로 만든 하나의 완성품(타이머, 스톱워치)을 만드는 방법이 아니라 커맨드 하나하나의 사용법과 기능(scoreboard와 execute if의 사용법)을 알아야 함.
복붙질보다 이게 더 어렵다고 생각할 수도 있지만, 커맨드 복붙만 계속 하면 계속 구글과 유튜브에 의존해야 되고 커맨드 잘 못하는 사람이 이상한 방법으로 알려준 거를 그대로 복붙해서 맵 최적화도 안 되거나 마붕이가 복붙한 커맨드가 어떻게 작동하는지를 모르니 그 커맨드가 일으킨 버그를 수정하지 못하는 상황이 생기기도 함. 이런 걸 생각해 보면 오히려 복붙질만 하는 게 맵 만드는 데에는 더 어려움. 커맨드의 각 구문들의 기능과 사용법을 알고 있으면, 마붕이가 만들고 싶은 것을 만들기 위해 마붕이가 알고 있는 커맨드를 어떻게 활용해야 하는지를 생각해 볼 수 있게 된다.
커맨드의 각 구문들의 기능과 사용법을 알 방법은 매우 간단함.
그냥 마붕이들이 직접 이것저것 쳐보면서 알아내면 된다.
나도 이렇게 했기 때문에 "이 방법 안 좋음", "네가 먼저 그렇게 해봐" 같은 거 안 통함. ㅅㄱ
(맢도 생방에서 이 방법으로 커맨드 알게 됐다고 한 적 있음)
물론 그렇다고 해서 검색이나 복붙을 아예 하지 말라는 게 아니라,
검색, 복붙을 하더라도 마붕이가 쓰는 커맨드가 정확히 뭐하는 커맨드인지는 알고 쓰면 좋다는 거임.
그리고 그걸 알기 위해서 검색/복붙한 커맨드를 변형해서 써봐도 좋구.
이 아래에는 내가 커맨드를 알게 된 과정을 대충 써봤음.
다른 명령어들도 아래와 같은 느낌으로 이것저것 해보면 된다.
예를 들어 /execute의 사용법을 알고 싶다?
그럼 그냥 /execute를 한번 써보셈.
뭐가 이것저것 나오는데, 그냥 맨 위에 뜨는 align부터 써보자.
이번엔 이상한 도끼들이라는 텍스트만 보이고 아무것도 안 나오노?
그래도 일단 그냥 아무거나 입력해 보자.
스위즐이 뭔진 모르겠는데 일단 x y z의 조합이 필요하다니까 써보자.
다시 그게 나왔음. 이번엔 좀 다른 걸로 해보지
밑으로 내리니까 run이 있음.
run을 프로그램에다가 쓰면 '실행하다'라는 뜻이니까 뒤에 오는 커맨드를 실행하라는 구문 같노.
뒤에 익숙한 명령어들이 보임. align xz가 뭐하는 구문인지를 알고 싶으니 일단 아무거나 써보자.
이건 그냥 /tellraw @a "asdf" 한 거랑 다른 게 없으니 이걸로는 align xz가 뭐하는 건지 모르겠노.
다른 명령어를 써봐야겠음.
이번엔 tp를 썼는데, 분명 제자리로 tp되도록 했는데 좌표가 딱 맞는게 좀 이상하노.
그냥 아무 곳에서 쓴 건데 좌표가 저렇게 딱 맞을 수가 없음.
tp 명령어는 확실히 제자리로 tp하도록 썼기 때문에, 좌표를 딱 맞춘 건 align xz의 소행이라고 볼 수 있겠노.
실제로 align은 좌표를 .0으로 맞추는 (소숫점을 버리는) 구문임.
뒤에다가 xz라고 쓰면 y좌표는 그대로, x와 z만 .0으로 맞춰짐.
이번엔 위에서도 말했던 execute if를 써보자.
뭐가 많은데 block이 좀 익숙한 단어니까 block으로 해보자.
이건 딱 봐도 좌표니까 그냥 좌표를 쓰고
이건 딱 봐도 블럭이니까 블럭을 쓰면
다시 아까 그게 나왔음. 이번에도 execute if block이 뭐하는지를 알고 싶으니 방금처럼 뒤에다가 뭔가를 써보면 될 텐데,
근데 사실 이건 딱 봐도 그냥 한 칸 밑이 잔디블럭이면 뒤의 명령어를 실행하는 명령어인 것처럼 보임.
실제로도 그런지 해보면, 한 칸 밑에 잔디블럭이 있을 때만 뒤의 명령어가 실행되는 것을 확인할 수 있음.
그럼 이 명령어로 에메랄드 블럭을 밟으면 스폰포인트가 찍히도록 해보자.
블럭이 에메랄드 블럭이니까 grass_block을 emerald_block으로 바꾸고
"밟으면" 이니까 ~ ~-1 ~을 ~ ~-0.01 ~로 바꿔야겠지
이렇게 하면 에메랄드 블럭을 밟아야 스폰이 찍힌다.
근데 이걸 커맨드 블럭에 넣어놓으면 작동하지가 않음.
당연히 명령어는 기본적으로 실행한 위치에서 실행한 엔티티로서 작동되기 때문에, 저걸 그대로 커맨드 블럭에 넣어놓으면
"커맨드 블럭이 에메랄드 블럭을 밟고 있다면 커맨드 블럭의 스폰포인트를 여기로 찍는다"가 돼버린다.
그러면 일단 명령어의 실행 위치를 바꿔서 플레이어의 위치에서 실행하도록 바꿔야 된다고 생각해 볼 수 있지.
마침 아까 거기에 at이 있음. at의 뜻을 생각해 보면 딱 봐도 실행 위치를 바꿔줄 것 같노.
at을 쓰니까 뒤에 골뱅이들이 나오는데, 딱 봐도 뒤에 쓴 엔티티의 위치에서 실행하도록 만드는 구문임을 알 수 있음.
근데 아닐 수도 있으니, 실제로도 그런지 확인해봐도 좋음.
이걸 확인해 보려면 그냥 아이템 하나 던져 놓고
/execute at @e[type=item] run particle end_rod
이렇게 쳤을 때 아이템에서 파티클이 나오는 걸 확인할 수 있음.
/particle end_rod는 명령어가 실행된 위치에다가 end_rod 파티클을 표시하는 명령어인데, at으로 실행 위치를 바꿨으니
그 바뀐 위치에서 실행된 거임.
아무튼 @a는 모든 플레이어니까 at @a를 쓰면 모든 플레이어의 위치에서 실행되겠노.
(명령어는 동시에 여러개를 실행할 수가 없기 때문에 at @a를 써도 한 번에 하나씩 실행된다.
물론 이것도 그냥 at 계속 쓰다보면 자연스럽게 알게 된다.)
이렇게 돼 있으면 세 개의 위치에서 say a를 순서대로 실행하니까 say a가 순서대로 세 번 실행됨. 동시에 실행하지 않음
그 다음, spawnpoint는 뒤에 아무것도 안 쓰면 자기 자신의 스폰을 찍는 명령어이므로,
커맨드 블럭에다가 "/execute at @a run spawnpoint"라고만 써 놓으면 커맨드 블럭의 스폰포인트를 플레이어의 위치에 찍게 된다. (당연히 찍히지도 않음)
그럼 이 실행 주체를 바꿔야 될 것 같은데,
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도 해보자.
일단 단어만 보면 뭔가를 저장하는 거 같음. result라고 쓰면 뭔가의 결과를 저장할 수 있을 것처럼 보이노.
엔티티의 결과를 저장한다..? 뭔가 이상한데 일단 이상해도 아무거나 써보자.
이번엔 <path>라고만 나와 있고 뭘 써야 되는지도 안 알려준다. 그래도 일단 아무거나 써보자.
근데 사실 이건 /data로 직접 이것저것 해봤으면 저 <path>가 익숙할 거임.
/data를 안 써봤으면 여기서 막힐 수도 있는데, 그렇다면 그냥
이게 뭔지를 알게 될 때까지 다른 명령어를 해보다가 알게 됐을 때 다시 이걸 해봐도 된다. (나는 이렇게 했음)
/data get을 써보면 똑같이 path가 보임. 바로 NBT 데이터의 경로(path)를 의미하는 것인데,
예를 들어 저기에 Health라고 쓰면, 대상의 NBT 데이터에 저장되어 있는 Health 값을 반환함.
Health의 값이 20인 상태로 저 명령어를 쓰면 아래와 같이 출력된다.
저 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
이렇게 쓰면, 들고 있는 책과 깃펜의 첫 페이지 내용을 가져올 수 있음. 저 마침표들이 뭐하는 애인지는 스스로 알아보슈
다시 돌아가서 다음 거를 쳐보면 갑자기 숫자가 튀어나온다. 뭔진 모르겠는데 그래도 일단 아무거나...
여긴 아무거나 쓰니까 실수가 필요하다노. 아무 실수를 쓴다.
사실 이것도 /data get으로 뭔가를 해봤으면 알 수 있는데, 몇을 곱할지를 쓰는 거임. (뭘 뭐에 곱하는건지 곧 나옴 ㄱㄷ)
이제 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 값의 반으로 설정된다.
그럼 모든 asdf라는 태그를 가진 엔티티의 Health 값을 제 Health 값의 반으로 설정하려면 그냥 @e[tag=asdf]를 하면 될 것 같지만
이런 문구가 뜬다. 이 문구는 개체 한 개만 허용되는 곳에 결과가 두 개 이상일 수 있는 선택자를 사용했다는 뜻으로,
개체 한 개만 허용되는 곳에 결과가 두 개 이상일 수 있는 선택자를 사용하면 나오는 문구임.
@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. 직접 이것저것 쳐보면서 배우면 됨
마지막 1번과 2번과 3번이 참 "하나같이" 유익하노
비난이야 무야
하나같잖음
그렇긴 하네.....
정말 맞는 말임 나도 옛날엔 복붙질만 했었는데 만들었던 것들이 다 퀄리티가 높아지진 않더라고 지금은 겁내 깨부하면서 맵의 퀄리티가 높아지는 것 뿐만 아니라 나의 실현할 수 없던 상상을 실현할 수 있게되면서 정착된 제작물의 틀에서도 벗어날 수 있게 되었구
좋은 글이노 커맨드에서 인터넷이 필요할 순간은 너무 문법 설명이 개떡같아서 예시 구문이 필요한 경우 그리고 커맨드가 너무 겁내 다이나믹하게 긴 경우뿐임 커맨드에 자주 나오는 용어 몇 개랑 영어만 좀 익히면 알아서 뭐가 나오든 내용은 추측 가능함 부딪혀보는 걸 두려워 마셈 혹여 월드가 터지면 새로 파면 그만이니까
복붙질로는 엄청난 퀄리티를 만들 수 없다는 교훈을 주는 글이노 고맙다
업데이트되는 명령어 문법같은 경우에는 다들 어디서 정보를 얻고 있는지도 알 수 있을까...ㅠ 버전이 달라지면서 뭐가 너무 많이 바뀌어가지고...내 기억은 1.17에 머물러있는데.....ㅠㅠㅠㅠㅠㅠㅠㅠㅠ...
기본적으로 마인크래프트 공식 디스코드 채널에서 올라오는 업데이트 로그를 참고하고 이후 구글링이나 맢이 직접 커맨드를 체험하는 영상(집단지성)을 보면서 정보를 얻음 -> 커맨드 수정/추가된 부분 인지 어쨌든 커맨드 자동완성 해주는 곳도 있으니 그것도 되게 유용하고. -> 인지한 커맨드 완성
아..!! 공식 디스코드 채널이 있군..! 찾아볼게! 고맙다!!