1. 21. 4 기준임.
2. 일반적으로 최근에 추가된 명령어일수록 최적화에 좋음.
if items > nbt={Inventory:[{}]}
3. 텍스트 디스플레이에다가 {shadow:1b} 를 넣어놓으면 가독성이 좋아짐.
4. 그리고 {background:0}을 넣으면 배경이 없어지고 글자만 남음.
배경 색을 바꿀 수도 있는데, RGB 값을 10진수로 바꾼 값을 a라고 하면
-1 * (16777216 - a)
로 하면 해당 RGB 값의 배경색이 나온다. 여기서 불투명도 조절을 하려면 이 값에 16777216n 을 빼면 된다. (n은 1과 255 사이의 자연수)
overflow가 날 수도 있는데, 그 overflow가 난 값을 써야 함.
참고로 1.21.5부터는 그냥
{background:0xff0000}
이런 식으로 0x [RGB] 를 쓰면 될 거임.
5. Axiom, WorldEdit, NBTAutoComplete는 필수 모드임.
6. /function 사용법은 반드시 알아두셈.
함수 매크로 사용법도 알아두면 좋음.
7. 커맨드는 영어 단어만 봐도 뭐 하는 커맨드인지 유추할 수 있음.
8. execute as @e run say 1 처럼
/execute에서 at, as 등으로 실행자/위치를 여러 개로 잡아놓아도 커맨드는 (동시에 실행되지 않고/랜덤한 순서로 작동하지 않고) 정해진 순서대로 작동함.
하지만 랜덤한 순서대로 작동된다고 생각하고, 원하는 대상을 특정되도록 커맨드를 쓰는 게 좋긴 함.
예를 들어,
플레이어 세 명이 각각 (10, 20, 30), (15, 25, 35), (-10, 0, -20)에 있을 때
/execute at @a run setblock ~ ~ ~ bedrock
이라는 명령어를 치면
/setblock 10 20 30 bedrock
/setblock 15 25 35 bedrock
/setblock -10 0 -20 bedrock
이 세 개의 명령어를 순서대로 치는 거라고 볼 수 있음.
9. 커맨드블럭 한 줄이 다 실행되고 나서 다른 줄의 실행이 시작되기 때문에 하나의 이어진 커맨드 줄이 실행되는 도중에는 다른 커맨드가 중간에 끼지 못함.
10. Forge는 늙었고 Fabric이 좋음. Optifine 역시 늙었고 Iris & Sodium이 좋음.
Feather Client는 너무 허접이라 논외
11. 어떤 /function 커맨드 뒤에 있는 커맨드 (또는 다음 줄에 있는 커맨드) 는, 해당 함수가 끝까지 실행되고 나서 실행되기 시작함.
12. /forceload를 쓰면 시야 설정을 하라고 하지 않아도 된다.
커맨드 블럭으로부터 멀리 떨어지면 그 커맨드가 작동하지 않지?
하지만 /forceload로 그 커맨드가 있는 청크를 강제로 로드하도록 지정해 놓으면 아무리 멀리 떨어져도 계속 작동된다.
참고로 /forceload를 너무 많이 추가해 놓으면,
가끔 나갔다 들어왔을 때 /forceload로 추가해 놓은 청크 중 일부 청크의 /forceload가 취소되는 버그가 발생하기도 함.
13. 컴퓨터는 생각보다 빠르지만, 마크는 생각보다 느린다.
f3 + 2를 눌러서 빨간색이 많이 보인다면 최적화가 필요하다는 거임.
특히 중간에 __ms avg에서 50 이상의 숫자가 써 있다면 최적화를 해야 함.
https://gall.dcinside.com/minecraft/80680
여기에 최적화 하는 방법을 대략적으로 써놨음.
참고로 함수 매크로 쓰는 방법도 여기 있음.
14. 최적화가 안 되어 있으면, 맵이 전체적으로 느려짐.
그니까 나만 빼고 전부 0.75 ~ 0.5 배속 한 상태로 게임 하는 거라고 생각하면 된다.
경우에 따라 맵의 재미가 반감되겠지
15. /gamerule commandBlockOutput false 한 번만 쳐줘라.
커맨드 작동될 때마다 채팅 더러워지는 게 안 불편함
16. 게임 시스템으로 구현해야 되는 걸 (강제해야 되는 걸) '이렇게 해줘라'라고 말로 하는 건 하지 않는 게 좋음.
예를 들어 게임 엔딩을 보려면 에메랄드 100개가 있어야 된다고 치자. 근데 그걸 표지판에 "이 버튼은 엔딩 버튼임. 에메랄드 100개가 모이면 눌러줘라."라고 써놓지 않는 게 좋다는 거임.
17. 퀄리티만 높다고 해서 갓맵인 게 아님. 재미가 없으면 안 된다. (마피셜)
반대로 퀄리티가 낮아도 재밌으면 된다. 재밌을 자신이 없다면 적어도 즐길 수만 있으면 된다. (뇌피셜)
18. 그러니 맵 테스트는 필수임.
2주동안 힘들게 만들어놓고 재미없다는 소리 들으면 억울하지 않겠음
19. 그리고 노가다 요소는 최대한 줄이는 게 좋음.
20. 노트블럭 스튜디오를 써보셈.
노트블럭 제작을 작곡 프로그램처럼 할 수 있음.
당연히 마크에 불러오기도 가능함.
21. 그리고 유튜브 영상 다운받아서 그거를 노트블럭으로 만들어버릴 수도 있음.
22. 물론 저작권 조심!!
- 상업적(영리적) 이용 가능해야 됨
- 퍼블릭 도메인이면 무조건 됨
- 원작자 사후 70년이면 퍼블릭 도메인 (물론 원작자 사후 70년이 아니어도 퍼블릭 도메인인 경우 있음)
- 이차배포 (재배포; distribution / re-distribution) 가능해야 됨
- 직접 제작이면 뭐... 당연히 됨
- 노트블럭도 너무 똑같으면 저작권 걸릴 때 있음
- '저작권 없는 노래'도 저작권 있는 경우 많음. 특히 NCS
23. 새로운 커맨드 또는 구문을 배웠으면, 그걸 바로 써볼 필요는 없음.
그냥 기억만 해뒀다가, 언젠가
'이걸 어떻게 만들지... 아 전에 배웠던 그거 쓰면 되겠는데?'
라는 생각이 들 때 써보셈.
24. 디스플레이는 BDEngine으로 하는 게 좋음. BDStudio와 다른 거임.
25. 마크 기본 리소스팩은 %appdata%\.minecraft\versions 안에 있는 jar 파일 압축 풀면 assets 안에 나온다.
똑같은 파일 구조와 파일 이름으로 리소스팩을 만들면 된다.
리소스팩 만들기 귀찮으면 그냥 남의 맵에서 복붙하면 되긴 하는데.....
26. execute as @a at @s if block ~ ~-1 ~ red_concrete run kill @s 는
최악의 게임플레이를 만들기에 적합한 명령어임.
27. 도박을 만들 때에는 기댓값을 계산해서 기댓값이 음수가 나오도록 하는 게 좋음.
안 그러면 계속 시도하면 돈을 계속 벌게 된다. (큰수의 법칙)
계산하기 귀찮다면 그냥 직접 해보면 된다.
한 50번 정도 해서 다 잃었다면 제대로 설계된 거임.
기댓값이 양수여도 올인은 손해일 수가 있는데 이를 이용해서 장난을 쳐봐도 좋음.
(ex. 50% 확률로 x1.8, 나머지 50% 확률로 x0.5인 도박이 있다면
기댓값은 항상 양수지만 계속 올인만 하면 계속 x0.9가 되다가 전부 잃을 거임.)
28. 치트엔진에 배속 기능이 있음. 가끔은 맵 제작에 유용함.
29. schedule의 실행자가 항상 서버인 버그가 있음.
그래서 함수에 @s가 실행자인 커맨드가 있다면 schedule이 제대로 작동하지 않음.
/execute as @p run schedule function f:say 1t
say.mcfunction ======
say 10
========
이걸 실행하면
[Server] 10
이렇게 된다는 소리임.
참고로 서버의 위치는 월드 스폰지점임.
30. 이스터에그가 맵의 진행에 필요하거나 어떤 엔딩을 보는 데 필요하다면 그건 이스터에그가 아님.
31. 본인들이 다른 버전으로 들어가서 생긴 버그를 맵의 버그라고 하는 똥댓글들이 있음.
/data get entity @s DataVersion
을 친 다음에 나온 숫자를
/execute unless data entity @p {DataVersion:____} run tellraw @a "버전 제대로 맞춰서 오쇼"
이 빈칸에 써놓으면 대부분의 그런 똥댓글들이 사라짐.
32. Axiom을 쓰고 있다면, 클립보드에 /summon 명령어가 있는 상태에서 그대로 ctrl + v를 누르면 해당 엔티티가 바로 소환된다.
33. return이라는 명령어로 함수의 작동을 도중에 멈출 수 있음.
return 0는 해당 함수를 멈추기만 하고,
return run function f:unction 이런 식으로 해당 함수의 작동을 멈추면서 명령어를 실행할 수도 있음.
참고로 "해당 함수" "만" 멈춘다.
예시)
upgrade.mcfunction ==========
execute if score gold var matches ..999 run return run tellraw @a "돈 부족함"
scoreboard players remove gold var 1000
scoreboard players add diamond_sword lv 1
tellraw @a "업그레이드 완료!"
==========
34. 존재하는 모든 맵에는 버그가 있음. 예외는 없음.
35. 아직 버그가 없다면 누군가가 제보할 거임.
36. 지금까지 이 갤러리에 쌓인 맵이 너무 많다고 걱정하지 마셈.
가장 개인적인 것이 가장 창의(독창)적인 것임.
37. 부분 클리어 검증은 클리어 검증이 아님.
이게 클리어 검증으로 인정이 된다면
나는 세칸 회오리 1000개 넣어놓고 '오 이거 되네 나머지도 되겠지' 하고 맵 만들어버리겠음
특히 부분 클리어 검증을 하면 맵의 정확한 난이도를 알기가 힘듬.
처음부터 끝까지 치트 없이 깨는 게 클리어 검증이지.
38. {PersistenceRequired:1b}를 넣어놓으면 몹이 디스폰되지 않음.
39. 셜커를 이용해서 투명블럭을 만들 수 있음.
/summon shulker ~ ~ ~ {NoAI:1,Silent:1,PersistenceRequired:1b,Invulnerable:1b,attributes:[{id:"scale",base:0.5d}],active_effects:[{id:"invisibility",amplifier:1,duration:-1,show_particles:0}],Tags:["shulker"]}
40. 갓맵이라고 해서 무조건 유튜브에 올라가는 게 아님.
그리고 똥맵이거나 뇌절맵이어도 유튜브 각이 나온 맵이라면 올라간다.
유튜브 타는 게 목적이라면 유튜브 각이 나와야 한다고 함. (마피셜)
41. 그리고 유튜브에 올라가도 (돈이라던가 치킨이라던가 하는) 물질적인 보상이 있지는 않음.
혹시라도 이 갤러리에만 올릴 맵을 제작하는 것이 시간낭비라고 생각한다면... . . . . . . , 정답임.
(물론 시간낭비라고 생각하지 않았다면 이 가정이 성립하지 않았으니 결론도 의미 없음)
42. 그러니까 그냥 재미로만(취미로만) 만드는 걸 추천함. (마피셜)
43. 아이템 액자나 그림에다가 Invulnerable:1b를 넣어놓으면 서바이벌이나 모험모드에서 때려도 부서지지 않음.
44. 마크 개발자 양반들은 게임을 잘 안 하는 편임.
그 증거로,
- 쉬프트 달리기를 버그라면서 고침
- 45 strafe도 마찬가지
- 끈끈이 피스톤 업데이트해서 t flip flop 못 쓰게 만든 뒤 "유광테라코타쓰셈ㅅㄱ" 시전
- Rotation 값에 쓸데없는 제한을 추가함으로써 /tp 사용을 짜증나게 바꿈
- 29번에서 말한 schedule 버그
- 주민 거래 이상하게 바꾸려 함
- 밑에서 소개할 버그
등등이 있음.
( Q. 버그 있는 게 그렇게 잘못임? A. 고치면 안 되는 버그(?)는 고쳐 놓고 저런 건 냅두는 게.. )
- akdlszmfovmxmroffjfldptjdlrmfvjrkfdPwjddla
45. as는 실행자만, at은 실행 위치만 바꾼다. '실행 위치'와 '실행자'는 엄연히 다름.
실행자라는 건 말그대로 뒤에 있는 명령어를 실행하는 엔티티를 말함.
예를 들어 채팅으로 /give @s diamond를 치면, 이 명령어의 실행자는 마붕이가지.
/execute as @a if block ~ ~-0.1 ~ red_terracotta run kill @s
실행자 : 모든 플레이어
실행 위치 : 커맨드 블럭의 위치
실행되는 명령어 : 모든 플레이어로서, 커맨드 블럭의 0.1칸 아래에 빨간색 테라코타가 있다면, 자기 자신을 죽이기
/execute at @a if block ~ ~-0.1 ~ red_terracotta run kill @s
실행자 : 커맨드 블럭
실행 위치 : 모든 플레이어의 위치
실행되는 명령어 : 모든 플레이어의 위치에서, 0.1칸 아래가 빨간색 테라코타라면, 자기 자신(=커맨드 블럭)을 죽이기
/execute as @a at @s if block ~ ~-0.1 ~ red_terracotta run kill @s
실행자 : 모든 플레이어
실행 위치 : 자신의 위치
실행되는 명령어 : 모든 플레이어로서, 자기 자신의 위치에서, 0.1칸 아래가 빨간색 테라코타라면, 자기 자신을 죽이기
46. 습관처럼 as @a 뒤에 at @s까지 쓰는 경우가 많은데,
실행 위치를 바꿀 필요가 없을 때에는 at @s를 쓸 필요도 없음.
/execute as @e[tag=mob] run data modify entity @s set value Health 10.0f
/execute as @e[tag=mob] store result score @s random run random value 1..10
이런 명령어는 실행 위치가 상관없기 때문에 at @s를 쓸 필요가 없음
47. 필요없는 조건 또는 구문을 달면 괜히 커맨드 작동 속도만 느려짐.
예를 들어 @p 자체가 가장 가까운 한 명의 플레이어인데, @p[limit=1]이라고 쓸 필요는 없는 거지.
바로 위에 있는 at @s도 이 얘기임.
48. as 말고 on 같은 걸로도 실행자를 바꿀 수 있고, at 말고 positioned 같은 걸로도 실행 위치를 바꿀 수 있음.
49. 몹끼리 안 싸우게 할려면 같은 팀에 넣어놓으면 된다.
좀비가 스켈레톤한테 먼저 맞으면 스켈레톤을 때리러 가는 등의 몹끼리 싸우는 현상이 있지?
50. 맵 제작 아이디어가 없다면 타겜 구현을 추천함.
(아이디어 별로 안 내고 되고 높은 확률로 유튜브 탈 수 있음!)
51. 타겜 구현 해놓고 원작엔 없는 새로운 요소를 추가하거나 원작을 마붕이의 입맛대로 변형하면 더 좋겠지?
(유튜브 탈 확률 더 증가!!)
52. 어떤 NBT 또는 Component는 특정 값을 쓰지 않으면 아예 적용이 되지 않기도 함.
/summon block_display ~ ~ ~ {block_state:{Name:"stone"},transformation:{scale:[1,2,3]}}
이렇게 쓰면 scale:[1,2,3]의 값이 무시된다.
/summon block_display ~ ~ ~ {block_state:{Name:"stone"},transformation:{scale:[1,2,3],left_rotation:[0,0,0,1],right_rotation:[0,0,0,1],translation:[0,0,0]}}
이렇게 써야 된다.
참고로 /data는 그냥
/data merge entity @n[tag=display] {transformation:{translation:[0,1,0]}}
이렇게 해도 된다.
53. 채팅창 클릭하면 다음 페이지로 넘어가면서 대사 나오는 그거 만들 때에는 스코어보드와 재귀함수를 이용하면 편함.
이걸 이용하면,
/function f:script {page:-1}
이라는 명령어 한 번만 치면 대사가 쭉 나온다.
script.mcfunction =============
$scoreboard players set remove_or_add var $(page)
execute if score remove_or_add var matches -1 run scoreboard players set page var 1
execute if score remove_or_add var matches 1 run scoreboard players add page var 1
execute if score remove_or_add var matches 0 run scoreboard players remove page var 1
tellraw @a "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
execute if score page var matches 1 run tellraw @a "주민 : 트랄랄레로 트랄랄라가 제일 쎔"
execute if score page var matches 2 run tellraw @a "플레이어 : 퉁 퉁 퉁 퉁 퉁 퉁 퉁 퉁 퉁 사후르가 다 이김"
execute if score page var matches 3 run tellraw @a "주민 : 언제적 퉁 퉁 퉁 퉁 퉁 퉁 퉁 퉁 퉁 사후르임;;"
execute if score page var matches 4 run tellraw @a "플레이어 : 너야말로 언제적 트랄랄레로 트랄랄라임;;;"
execute if score page var matches ..4 run tellraw @a ["\n",{"text":"[ << 이전 대사로 ]","clickEvent":{"action":"run_command","value":"/function f:script {page:0}"}}," ",{"text":"[ 다음 대사로 >> ]","clickEvent":{"action":"run_command","value":"/function f:script {page:1}"}}]
=============
54. 이 방식으로 선택지도 쉽게 추가할 수 있음.
script.mcfunction =============
$scoreboard players set remove_or_add n $(page)
execute if score remove_or_add var matches -1 run scoreboard players set page var 1
execute if score remove_or_add var matches 1 run scoreboard players add page var 1
execute if score remove_or_add var matches 0 run scoreboard players remove page var 1
execute if score remove_or_add var matches 2 run scoreboard players set page var 1000
execute if score remove_or_add var matches 3 run scoreboard players set page var 2000
tellraw @a "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n"
execute if score page var matches 1 run tellraw @a "주민 : 안녕"
execute if score page var matches 2 run tellraw @a "주민 : 넌 누구야"
execute if score page var matches 2 run tellraw @a ["\n",{"text":"[ 사귀자 ]","clickEvent":{"action":"run_command","value":"/function f:script {page:2}"}}," ",{"text":"[ 꺼져 ]","clickEvent":{"action":"run_command","value":"/function f:script {page:3}"}}]
execute if score page var matches 1000 run tellraw @a "주민 : ㅠㅠㅠㅠㅠ"
execute if score page var matches 1001 run tellraw @a "주민 : 어떻게 그렇게 심한 말을"
execute if score page var matches 1002 run return 0
execute if score page var matches 2000 run tellraw @a "주민 : 좋아!"
execute if score page var matches 2001 run tellraw @a "주민 : 네가 원한다면.."
execute if score page var matches 2002 run return 0
execute unless score page var matches 2 run tellraw @a ["\n",{"text":"[ << 이전 대사로 ]","clickEvent":{"action":"run_command","value":"/function f:script {page:0}"}}," ",{"text":"[ 다음 대사로 >> ]","clickEvent":{"action":"run_command","value":"/function f:script {page:1}"}}]
=============
55. 가챠에다가 확률 공개 안 하면 흥미가 확 떨어진다고 함.
56. 갓맵도 똥맵도 아닌 경우, 맵의 첫인상이 생각보다 중요할 때가 있음.
예를 들어 맵에 들어가자마자 스폰지점 이상하고 게임 시작버튼 어딨는지 모르겠고 게임 시작 커맨드에도 버그 있고...
그러면 첫인상이 안 좋아지겠지
실제로 맵의 첫인상 때문에 평범한 맵이 똥맵 취급을 받은 적이 좀 있음.
57. tellraw의 keybind를 이용하면 유저의 키 설정에 따라 다른 메시지를 띄워줄 수 있음.
예를 들어,
/tellraw @a "F키를 눌러서 사용할 수 있음."
라고 하면 솔직히 보통 왼손들기를 다른 키로 설정해 놨어도 눈치껏 알 수 있겠지만 그래도 모르니
/tellraw @a [{"keybind":"key.swapOffhand"},"키를 눌러서 사용할 수 있습니다."]
이렇게 쓰는 게 더 좋음.
이외에도
/tellraw @a [{"keybind":"key.forward"},"키를 눌러 앞으로 갈 수 있습니다."]
/tellraw @a [{"keybind":"key.screenshot"},"키를 눌러 스크린샷을 찍을 수 있습니다."]
등등 대부분의 조작키에다가 쓸 수 있음.
58. 폰트를 바꾸고 마크를 한다면,
다른 사람이 마붕이의 맵을 했을 때 줄바꿈이 이상해지거나 표지판 텍스트가 잘릴 수 있음.
{"font":"uniform","text":"asdfasdf"}
이렇게 하면 기본 폰트로 고정된다.
혹시라도 유니코드 폰트를 리소스팩으로 바꿨다면......, 뭐 근데 그걸 바꿀 정도면 마붕이는 폰트 이슈가 생긴다는 걸 알지 않을까
59. mcstacker.net을 이용하면 외우기 귀찮은, 또는 직접 치기 귀찮은 긴 명령어를 만들어 준다.
대표적으로 주민 거래 커스터마이징 하기, 장비를 착용한 몹을 소환하기 등이 있지.
또한 NBTAutoComplete 모드로 못 하는 부분을 보완해 주기도 함.
60. 파쿠르에서 태초로 보내는 게 있다면 무조건 똥맵임.
특히 보통의 똥맵은 그냥 '이건 또 뭔 맵이야...' 하고 넘어가지만
파쿠르로 심한 똥맵 만들면 욕먹을지도 모르니 조심하길 바람!!
그나저나 어려운 파쿠르 맵으로 마붕이의 파쿠르 실력을 보여주고 싶다면, 적어도
"관상용 맵임.", "내 파쿠르 실력 자랑 좀 하려고 만들었음.", "깨라고 만든 맵은 아님."
라고 써 놓는 게 좋지 않을까 함...
( 자기가 잘 하는 걸 남한테 보여주고 싶어 하는 사람은 많음. 그거 갖고 뭐라 하는 거 아님.
대놓고 너무 어려운 거 만들어서 방송 루즈하게 만들지 말아줘 ㅡㅡ; )
61. 디스플레이에다가 {interpolation_duration: (정수) , start_interpolation:0} 을 넣고
동시에 transformation을 변경하면 transformation이 자연스럽게 변경된다.
/data merge entity @n[tag=display] {start_interpolation:0,interpolation_duration:10,transformation:{scale:[2,2,2]}}
62. 그리고 teleport_duration을 설정해 주면 tp를 했을 때 자연스럽게 움직임.
/data modify entity @n[tag=display] teleport_duration set value 10
/execute as @n[tag=display] at @s run tp @s ~ ~10 ~
63. /trigger는 op 없이도 사용할 수 있기 때문에 플레이어 입장에서도 치트가 아님.
마플은 맵을 하면서 치트를 최대한 안 쓰기 때문에 /trigger를 이용하는 것도 좋은 방법임.
/scoreboard objectives add tr trigger
를 친 다음에
/scoreboard players enable @a tr
로 /trigger 명령어를 사용할 수 있게 하면 된다.
플레이어가 /trigger 명령어를 치면 자신의 스코어보드 값이 바뀐다. 기본적으로는 1씩 추가되지만,
플레이어가 add나 set을 이용해서 값을 입력할 수도 있음.
64. 꼼수 방지는 배리어 대신 유리를 쓰는 게 좋음.
배리어를 쓰는 순간 상당히 높은 확률로 그냥 인성맵이 된다.
65. can_place_on과 can_break로 모험 모드에서 부수거나 설치할 수 있는 걸 정할 수 있음. (컴포넌트)
66. 버튼찾기 같은 맵은 모험모드/서바이벌로 테스트해야 된다.
겜모가 0, 2일 때보다 1일 때의 사거리가 더 긴다.
67. 겜모인 상태에서는, 서바/모험으로는 불가능한 모루질이 가능해지기도 함.
모루질 역시 서바/모험으로 테스트해야 하는데,
68. 이 외에도 여러 변수가 있기 때문에 그냥 맵 테스트는 모험으로 하는 게 맞음.
69. 마플의 키는 169.9cm임.
반박 시 녹슨 마이구미
70. 마플 히스토리에서 나왔던, 괴랄한 미로라고도 알려져 있는 철문 미로 (또는 이것과 비슷한 형태의 미로) 를 만들면
맵이 5초만에 스킵된다. (진짜임)
71. 맵이 목적은 있어야 할 맛이 난다.
72. 베드락 탈출맵에 리셋이 없으면 똥맵 소리 듣기 십상임.
73. 그런 의미로 /clone 사용법을 알려주겠음.
/clone x₁ y₁ z₁ x₂ y₂ z₂ x₃ y₃ z₃
의 형태로 쓰면 되는데,
( x₁, y₁, z₁) 부터 (x₂, y₂, z₂) 까지에 있는 건축물을 (x₃, y₃, z₃) 에다가 복붙하는 명령어임.
여기서 (x₃, y₃, z₃)에 복붙되는 방식은,
(x₃, y₃, z₃)를 기준으로 x, y, z 좌표가 +인 곳으로 붙혀넣기가 된다.
예를 들어
/clone -20 0 -30 20 20 30 100 0 100
이라고 치면,
(-20, 0, -30)부터 (20, 20, 30)까지의 블럭들을
(100, 0, 100)부터 (140, 20, 60)까지에다가 복붙함.
(이해가 안 된다면, 직접 쳐보면 이해가 될 거임.)
참고로 월드에딧의 //copy와 //paste도 같은 방식임.
masked를 쓰면 공기를 빼고 복붙함.
1.21.5에는 strict가 추가되었으니 1.21.5를 쓰고 있다면 뒤에다가 strict까지 붙히는 게 좋음.
74. 이 /clone을 이용해서 세이브/로드도 만들 수 있는데, 문제는 인벤토리임.
인벤토리도 세이브/로드가 돼야겠지?
(x, y, z)와 (x+1, y, z)에다가 상자를 설치해 놓고,
save_inventory.mcfunction ==========
/item replace block x y z container.0 from entity @p hotbar.0
/item replace block x y z container.1 from entity @p hotbar.1
/item replace block x y z container.2 from entity @p hotbar.2
...
/item replace block (x+1) y z container.13 from entity @p weapon.offhand
/item replace block (x+1) y z container.14 from entity @p player.cursor
===============
이렇게 /item의 from을 이용하면 플레이어 인벤토리에 있는 아이템들을 상자에 저장할 수 있음.
로드를 만들 때는 반대로 하면 되겠지?
75. 표지판에 써 있는 숫자를 그대로 스코어보드로 가져오고 싶은데,
표지판에 써 있는 건 무조건 문자열이라서 그걸
/execute store result score number var run data get block x y z front_text.messages[0]
으로 가져오려면 표지판의 글자 수 +2가 가져와짐.
( store를 문자열에다가 쓰면 글자 수를 가져온다. 그리고 큰따옴표도 있으니 +2가 된다. )
그러므로,
/data modify storage stor num set string block x y z front_text.messages[0] 1 -1
/function f:convert with storage stor
convert.mcfunction ==========
$scoreboard players set num var $(num)
=========
를 쓰면 된다.
76. 바로 위에 있는 저 /data modify의 맨 뒤에 있는 1 -1이 뭔지 궁금할 게이들이 있을 거 같은데,
해당 데이터에 있는 문자열에서 몇 번째 문자부터 몇 번째 문자까지 가져올지를 정하는 거임.
(substring이 생각났다면 그거 맞음)
마크에서는 데이터에서 "마이너스 몇 번째"라고 하면 "뒤에서 몇 번째"라는 의미임.
그래서 배열의 값을 가져올 때에도 array[-2] 이런 걸 할 수 있음.
그래서 75번에다가 저걸 써 놓은 이유는, 맨 앞과 맨 뒤에 있는 따옴표를 없애려고 쓴 거임.
front_text.messages[0]의 값은 '"1234"'인데, 1번째 글자부터 -1번째 글자(=뒤에서 1번째 글자)까지만 가져왔기 때문에 "1234"가 됐고, 그걸 함수 매크로에 넣은 거임. 함수 매크로에 문자열 값을 넣으면 큰따옴표는 알아서 없애준다. (정확히는 문자열을 감싼 걸 없애는 거라서 만약 따옴표로 문자열을 감싸놨다면 따옴표를 떼준다.)
숫자에다가 쉼표 넣는 것도 이 /data modify ... string ... 으로 할 수 있음.
77. 이걸 또 응용해서 현실 시간을 마크로 표시할 수 있는데,
커맨드 블럭에다가 아무 명령어를 하나 써 놓고 그 커맨드 블럭을 실행시키면 LastOutput에 현실의 현재 시간이 뜬다.
이걸 이제
/data modify storage time hour set string block x y z LastOutput 10 12
/data modify storage time min set string block x y z LastOutput 13 15
/data modify storage time sec set string block x y z LastOutput 16 18
이렇게 하면 hour에는 현실 시간이, min에는 게이, sec에는 초가 저장된다.
/tellraw @a ["현재 시간 : ",{"storage":"time","nbt":"hour","color":"aqua"},"시 ",{"color":"green","storage":"time","nbt":"min"},"분 ",{"color":"yellow","storage":"time","nbt":"sec"},"초"]
이제 이 명령어를 치면 채팅창에 현실 시간을 띄워줄 수도 있음.
78. 인터렉션을 이용하면 상호작용을 막을 수 있음. (?)
79. CustomName과 같은 NBT, 스코어보드의 displayname, 또는 item_name과 같은 Component 등에 스코어 값, 데이터 값 등을 못 넣는 버그가 있음.
예를 들어
/execute as @e[tag=mob] run data modify entity @s CustomName set value '["체력 : ",{"entity":"@s","nbt":"Health"}]'
이런 식으로 쓰면 몹들의 이름이 "체력 : 20" 대신 "체력 :"으로 바뀌게 된다. (선택자 부분에 @p를 넣어도 안 된다.)
그리고,
/give @s diamond_sword[item_name='[{"selector":"@p"},"의 검"]']
이렇게 쓰면 칼의 이름이 "@p의 검"이 된다.
이 역시 함수 매크로로 해결할 수 있음.
/execute as @e[tag=mob] run function f:hp
hp.mcfunction ==============
execute store result storage stor hp int 1 run data get entity @s Health
function f:hpmacro with storage stor
===============
hpmacro.mcfunction ============
$data modify entity @s CustomName set value '["체력 : $(Health)"]'
=============
(굳이 이렇게 한 이유는, Health 값을 그대로 가져오면 쓸데없는 소숫점 아래자리까지 다 가져와버려서 맞음.)
80. 보스바에 체력을 띄울려면
/execute store result bossbar health value run data get entity @n[tag=boss] Health
를 쓰면 된다.
81. 스코어보드로 점프 감지를 할 수가 있는데, 버그가 있음.
바로 극한점프를 뛰면 감지가 안 되는데....
/scoreboard objectives add jump dummy
/scoreboard objectives add jump_copy dummy
/scoreboard players set @a jump_copy 0
[반복] /execute as @a store result score @s jump run data get entity @s OnGround
[무조건 연쇄] /execute as @a if score @s jump_copy < @s jump run scoreboard players operation @s jump_copy = @s jump
[무조건 연쇄] /execute as @a if score @s jump_copy > @s jump if predicate {condition:"minecraft:entity_properties",entity:"this",predicate:{type_specific:{type:"minecraft:player",input {jump:1}}}} run tag @s add jumped
[조건 연쇄] /execute as @a[tag=jumped] run scoreboard players operation @s jump_copy = @s jump
[조건 연쇄] /execute as @a[tag=jumped] run tellraw @s "점프함"
[조건 연쇄] /tag @a remove jumped
이렇게 하면 제대로 된 점프 감지가 가능함.
82. NBT 감지 쓰지 마셈.
83. 쓰지 말라니까?
84. 아이템이 안 사라지게 하려면
/execute as @e[type=item] run data modify entity @s Age set value -16999s
를 쓰면 된다.
반복형에 넣을 필요는 없고, 그냥 10분에 한 번 쯤씩만 실행해도 충분함.
85. 아이템을 못 던지게 하려면
/execute as @e[type=item,tag=] run data modify entity @s PickupDelay set value 1
를 쓰면 된다.
86. 아이템을 못 줍게 하려면
/execute as @e[type=item,tag=unpickable] run data modify entity @s PickupDelay set value 16999s
를 쓰면 된다.
이것도 역시 반복형에 넣을 필요는 없고, 그냥 10분에 한 번 쯤씩만 실행해도 충분함.
87. @e[tag=] 를 쓰면 태그가 없는 엔티티를, @e[tag=!] 를 쓰면 태그가 있는 엔티티를 대상으로 삼음.
88. 스코어보드를 쓸 때, 가짜 플레이어를 쓰면 스코어보드 null 이슈가 발생하지 않음.
( https://gall.dcinside.com/minecraft/80680 참고 )
89. 파쿠르처럼 자주 죽는 맵을 만들 때에는 doImmediateRespawn을 true로 하면 좋음.
90. /clear 0으로 플레이어가 어떤 아이템을 몇 개 가지고 있는지를 셀 수 있음.
/execute store result score diamonds var run clear @p diamond 0
이렇게 쓰면, diamonds의 var 점수에 가장 가까운 플레이어가 가지고 있는 다이아 개수를 저장함.
91. 랜덤 커맨드가 필요할 때 굳이 /random을 쓰지 않아도 된다.
예를 들어 50% 확률로 죽일려면
/execute as @a store result score @s die run random value 1..2
/kill @a[scores={die=1}]
이렇게 해도 되지만
/execute as @a if predicate {"condition":"random_chance","chance":0.5} run kill @s
이렇게 해도 된다.
92. predicate에 유용한 기능들이 이것저것 있음.
https://misode.github.io/predicate/
이걸 이용하면 된다.
( predicate는 NBTAutoComplete에도 안 나와)
93. 왼손에 들면 아이템을 사용하는 커맨드는 자주 쓰이는 커맨드지만, 그만큼 좀 잘못 쓰이는 경우도 많음.
예를 들어 다이아를 왼손에 들면 다이아 하나를 소모해서 풀피 회복이 되도록 했다고 치자.
그러면 종종,
- 다이아 64개를 왼손에 들었더니 64개가 다 사라짐
- 인벤토리 다른 칸에 있던 다이아가 1개 사라짐
이런 경우가 보임.
해결법은..
/item modify entity @a weapon.mainhand {"function":"set_count","count":-1,"add":true}
이걸 이용하면, 오른손에 든 아이템의 개수를 1 줄여준다.
스코어보드의 특정 값으로 아이템의 개수를 설정하기 등도 가능함.
94. 눈치챘겠지만 item modify에도 유용한 기능들이 이것저것 있음.
https://misode.github.io/item-modifier/
이거 쓰면 된다.
( 얘도 NBTAutoComplete에 안 나와 )
95. F3 + D를 누르면 채팅이 지워짐. 맢을 포함한 일부 유저들은 이 F3 + D를 습관적으로 누르기 때문에
채팅을 지웠을 때 뒤주에 걸리는 상황이 있다면, 수동으로라도 그 채팅을 다시 띄울 수 있도록 하는 게 좋음.
96. 겜모 사용을 막는 것은 똥맵 요소임.
97. 피지컬 맵에 운 요소를 넣으면 플레이어의 짜증이 이만나만이 아니게 된다.
98. 아프리카티비의 스트리머를 BJ라고 잘못 알고 있는 경우가 많은데, DJ가 맞음. (마피셜)
99. 다항함수 및 출제가능한 함수 중 lim_(x → c)에서 연속인 f(x)와 g(x)에 대해서,
lim_(x → c) f(x) / g(x) = lim_(x → c) f'(x) / g'(x)
임.
100. 필독
https://gall.dcinside.com/minecraft/128213
https://gall.dcinside.com/minecraft/133182
그거 일리가 있구만
+본인이 제작하면서 뼈저리게 느낀거 하나만 추가함 169.참신함이 재미를 의미하지 않는다
모장이 79번의 아이템 이름 등 관련은 공식적으로 버그 아니라고 못박았던 걸로 기억함… (MC-131328) (/scoreboard /team /bossbar 는 1.21.5부터 가능하다고 한거같은데)
Oh man it's even worse then... How can they intendedly make that inconvenience Welp atleast it's better they fixed it in 1.21.5 though.
Upon further testing the scoreboard name (and most likely team and bossbar names as well) doesn’t update by itself. It seems like you have to manually update the name. Still better than nothing… (Mojang pls let us do this for item names)
Also since item names and entity names still doesn’t allow score/data resolution it probably is better to word your article like this: “ 79. CustomName과 같은 NBT 스코어보드의 displayname ( ~ 1.21.4 ) 또는 item_name과 같은 Component 등에 스코어 값 데이터 값 등을 못 넣는 시스템이 있음. “
Just edited the 79th tip in this post according to your comments thanks for your testing and correcting.
Out of curiosity I researched about the /schedule bug (MC-154325) and turns out it is very hard to fix due to how the codebase works… I wouldn’t expect that bug to be fixed anytime soon…
Too bad it's bothering to use schedule for each entities... They should re-code or smth imo if they want to fix it
+ 리소스팩 만들때 제발 마인크래프트 내 '모든' 모델 텍스쳐 등을 붙여넣기하여 만들지 마셈
이런 경우가 있었어…?
?원래 저렇게 만드는 거 아니였음?
바꿀 파일들만 리팩에 넣으면 되는건데
ㅇㅎ..
55번은 (마피셜)이 아니냐?
페더클 유저임. function이 왜 안되나 했다
A 명령 블록에 function이 발동된 후 연결된 B 조건형 명령 블록이 안되던데 정상이냐? (A-B로 연결 A는 기본 명령 블록 B는 조건형 연쇄 명령 블록)
아 그거 버그임 /function 뒤에 조건 커맨드 있으면 작동 안 함 원래는 됐었는데 언제부턴가 안 되더군
Adding /return 1 at the end of the function file makes the chain command block too run successfully. EDIT: Apparently this is a change in 23w41a (1.20.3) to better accommodate the /return command: “Functions no longer have any result unless they use /return or there was an error during lookup or instantiation - That means /function command no longer returns (or even displays) the number of comman
ds run during execution” So this is not a bug and now you have to add /return at the end for an output.
함수 마지막에 /return 1 넣어보셈 (혹은 출력하고 싶은 숫자)
Oh thanks again for informing me of a system. so it means that it's another intended inconvenience..
뭐야 개신기해 왜 네이버 카페랑 댓글이 똑같은겨..