마인크래프트 자바에디션 1.21.4를 바탕으로 제작되었습니다.
매크로란?
매크로는 1.20.2에 추가된 기능으로 매크로 함수는 내용의 일부를 게임 중에 수정할 수 있습니다.
이를 통해 스코어나 스토리지 값에 따라 함수의 내용물을 변경하여 마치 변수를 쓰는 것처럼 사용할 수 있습니다.
예를 들어 매크로를 통해 함수를 tp (매크로) 0 0 으로 설정해주면 게임 내에서
- 매크로=1 -> tp 1 0 0
- 매크로=2 -> tp 2 0 0
이런 식으로 값을 변경해서 사용할 수 있습니다.
매크로 함수 만들기
# 매크로 명령어는 $로 시작합니다.
# 매크로를 넣을 부분은 $(매크로명)으로 사용합니다.
# (매크로명) 에는 영어 소문자, 대문자, 숫자, _를 사용 가능합니다.
$say $(say)
# $가 없다면 평범한 명령어입니다.
say macro acitve
# 하나의 함수에 여러 매크로를 넣을 수 있고
# 하나의 명령어에 여러 매크로를 넣을 수 있습니다.
$tp @s $(x) $(y) $(z)
매크로 함수 사용하기
우선 매크로 함수는 평범하게 /function으로 실행하면 작동하지 않습니다.
왜냐하면 $(매크로) 부분이 비어있어 명령어가 완성되지 않았기 때문입니다.
따라서 /function <함수명> [<arguments> | with]에서 뒷부분을 채워서 매크로에 값을 전달해주어야 합니다.
1. 직접 채우기 (arguments)
/function potan:macro {say:"hello", x:11, y:58, z:1}
/function potan:macro {say:"hello", x:"~", y:"~", z:"~1"} (굳이 숫자일 필요 없음)
직접 매크로의 값들을 직접 할당해서 설정해주는 방법입니다.
위 명령어의 첫번째를 실행시키면 작동하는 함수의 내용물은 밑처럼 설정됩니다.
say hello
say macro acitve
tp @s 11 58 1
즉, 위에 적은 부분이 (매크로명) 부분을 대체하는 것입니다.
/function potan:macro {say:"hello", x:"~", y:"~"}
/function potan:macro {say:"hello", x:"~", y:"~", z:"a"}
따라서 위 내용처럼 1. 인수가 부족하거나, 2. 대체한 값이 명령어에 맞지 않을 경우
오류가 나면서 실패하게 됩니다.
2. 다른 곳에서 가져오기 (with)
/function <함수> with (block <좌표>|entity <엔티티>|storage <스토리지ID>) [<경로>]
블록, 엔티티, 스토리지의 NBT 데이터를 인수로 넣어서 함수를 실행시킵니다.
예시 1
블록의 NBT 데이터가 이렇게 되어 있을 때
/function potan:macro with block 5 56 -20
를 작동시키면 인수로 위의 NBT 데이터가 그대로 들어가게 됩니다.
따라서 위의 예시 함수에서 say 매크로를 $(id) 로 변경하고 명령어를 실행시키면 say minecraft:chest가 실행되고 상자의 위치로 tp하게 됩니다.
예시 2
함수 내용
$say I have $(count) $(id)s.
명령어
/function potan:macro with entity @s SelectedItem
플레이어가 들고 있는 아이템의 정보들을 인수로 넣습니다.
이렇게 뒤에 추가 경로를 넣어 특정한 NBT 요소들만 넣을 수 있습니다.
예시 3
스토리지 설정
/data merge storage potan:storage {status:{gold:10,level:1}}
함수 내용물
$tellraw @a ["Level: ", {"text":"$(level)", "color":"aqua"}]
$tellraw @a ["Gold: ", {"text":"$(gold)", "color":"yellow"}]
명령어
/function potan:macro with storage potan:storage status
내용물을 아예 교체하는 것이기에 Text에도 사용이 가능합니다.
만약 ""가 없다면
$tellraw @a ["Gold: ", {"text":$(gold), "color":"yellow"}]
스토리지 수정
/data merge storage potan:storage {status:{gold:'"10"',level:1}}
만약 $(gold) 처럼 ""로 감싸주지 않는다면 값이 들어갔을 때 "10"으로 들어가도록 '"10"' 으로 (문자열 문자열(?)) 로 적어주어야 합니다.
주의사항
1. 함수 실행 오류
기존의 마크 함수는 데이터팩을 불러올 때 함수가 올바른지 확인하기에 함수에 문제가 있으면 즉시 비활성화됩니다.
하지만 매크로가 들어간 명령어는 올바른지 확인하지 않고 넘어갑니다.
이로인해 제대로 검증하지 않으면 작성에 실수를 해도 그냥 넘어갈 수도 있고
함수가 잘 제작되어도 인수가 잘못 들어가 함수가 작동에 실패할 수도 있습니다.
.따라서 이 문제로 결과물이 중간에 멈추지 않도록 신경써줘야 합니다.
2. 성능 문제
기존의 데이터팩 함수들은 맵이 열리거나 /reload 명령어 사용 후에 로드하면서 올바른지 확인한 후 끝납니다.
하지만 매크로가 들어간 명령어는 함수를 실행시킬 때마다 해당 명령어가 올바른지 확인합니다.
이는 매크로 라인이 존재하지 않는 함수에 비해 성능 저하를 유발시킬 수 있습니다.
따라서 온갖 함수에 매크로를 도배하는 것은 성능에 영향을 끼칠 수 있으니 이 점을 주의하는 것이 좋습니다.
'마인크래프트 강좌 > 데이터팩 강좌' 카테고리의 다른 글
마인크래프트 데이터팩 강좌 [2-1] - pack.mcmeta (1) | 2025.01.09 |
---|---|
마인크래프트 데이터팩 강좌 [9-1] - Enchantment Provider (0) | 2024.06.26 |
마인크래프트 데이터팩 강좌 [9] - enchantment (4) | 2024.06.25 |
1.20.5에 추가된 커스텀 아이템 조합 만들기 (6) | 2024.04.14 |
마인크래프트 데이터팩 강좌 [8] - 아이템 수정자 (Item modifier) (7) | 2021.06.25 |