사실 갤러리에 함수 매크로 관련 글이 잘 없길래 전에 한번 만들려고 시도는 했었는데 귀찮아서 포기했던거 그게이가 방송에서 시켜서(?) 만들어 봤음

이것은 초심자가 만든초심자용이며, 틀린 정보가 있을 수 있음


0.기본 설명

0-1.버전

이 게시글은 1.21.10버전을 기준으로 만들어졌음

버전이 명시되지 않았다면 1.21.10이라고 생각하면 된다


0-2.도구

도구라고 하는게 맞는진 모르겠는데 일단 이 게시글은 함수 설명시 메모장을 기준으로 설명함

vs코드라는 프로그램이 있지만(아래서 설명 예정), 일단 본인은 쓰지 않으니 모름

메모장과 vs코드의 차이점은 다른데서 알아보셈


0-3.뜻

함수=function임

함수와 function을 병용할 때가 있을텐데, 대체로 function은 폴더나 커맨드 명, 함수는 그냥 '함수'임


0-4.알아야하는거

맵 안에서 함수를 업데이트했을때는 반드시 /reload를 해야함

이 게시글에서 파란색 밑줄쳐진 기울어진 글씨를 발견한다면 클릭시 다른 사이트로 이동된다


함수의 사용법은 자세히 설명하지 않음

그냥 '커맨드블록 한줄'이라고만 생각하면 되겠음


1.데이터팩 만드는 방법

가장 기초적인 부분임

요즘은

/datapack create '(이름영어)' '(설명)'

을 통해 만들수 있음

혹시나 이게 없다면

마인크래프트-싱글플레이-맵 선택-편집-세계 폴더 열기-datapacks

혹은

.minecraft-saves-(맵)-datapacks

로 들어가서

폴더 하나 만들기(이름은 아무거나)

폴더 안에 data폴더랑 pack.mcmeta파일에

{

"pack": {

"description": "(설명)",

"min_format": (데이터팩 최소(옛날) 버전),

"max_format": (데이터팩 최대(최신) 버전)

}

}

을 추가하면 된다

데이터팩 버전은 마인크래프트 위키를 보는걸 추천함(1.21.10=1.21.9)

물론 F3+V를 눌러서 pack_data를 확인해도 되지만, 그게 되면 /datapack create를 하는게 낫지 않을까?


이 맵의 폴더의 datapacks에 들어가보면 본인이 만든 이름의 폴더가 하나 있을거임

그 안에는 data폴더와 pack.mcmeta파일이 있을거임

만들어진 data폴더 안에 자기가 만들고 싶은 데이터팩 명을 가진 폴더를 만들고(function a:b에서 a에 들어갈거임)

그 안에 함수면 function 1.21 이전이라면 functions, 다이얼로그면 dialog 등등 원하는거 아무거나 폴더의 이름으로 정해서 넣으면 된다

우리는 function을 다룰것임


function폴더를 만들고 안에 들어가서 원하는 이름의 mcfunction확장자를 가진 파일을 만들어야 함(function a:b에서 b)

chat이라는 이름을 가진 함수(function)를 만들고 싶다면 chat.mcfunction

여기까지 만들었다면 다음단계로 가면 된다


2.함수 작성

함수 작성시에는 매우 추천되는 프로그램이 있음

VS코드로 불리는 비쥬얼 스튜디오 코드

사실 지금 글쓰고있는 본인이 vs코드를 안써서 자세한 내용은 여기있는 글을 참고해줘라

vs코드 안쓸 게이들은 메모장으로도 충분히 가능함

여기서는 메모장 버전으로만 설명함


아무튼

만든 mcfunction파일에 들어간다

함수는 커맨드블록과 비슷함

대신 함수에서는 텍스트 한줄이 커맨드블록 한개임


단, 함수에는 /를 처음에 절대 붙이면 안된다

진짜 안되나 궁금하면 한번 해보셈

쓰고 맵 들어가서 '/function '까지만 한번 해보셈

원래는 함수가 있다면 뒤에 뜨는게 정상인데 안뜨면 문제가 있는거임


함수에는 그냥 커맨드블록처럼 작성하면 된다

커맨드블록처럼 위에있는게 먼저 실행되고, 아래로 내려간다

단, 한가지 다른점은 하나라도 실패하면 함수 자체가 실행되지 않는다는 점임

여기서 실패라는것은 execute if가 실패했다는게 아니고, 그 마크에서 명령어 이상한거 실행했을때 나오는 빨간 글씨를 의미함(알 수 없거나 불완전한 명령어임 같은거)


아무튼 이 글에서는 함수가 메인이 아니니까 여긴 다른데서 보셈갤러리에서 찾아서 링크걸라했는데 못찾음


3.함수매크로

메인임

이거 한번 빠지면 헤어나오기 힘드니까 주의하셈


함수매크로

함수 매크로의 매크로 기능을 사용하려면 '매크로 인자'라는게 필요함

매크로 인자를 지정할때는 기본적인 함수 실행방식인

function a:b

뒤에 무언가를 붙여야 함

function a:b {1:'예',a:'아'}

function a:b with storage minecraft:hello

처럼 말이지


function a:b {1:'예',a:'아'}

를 예시로 들어서 설명해보겠음

기본적인 경우,

say 예아

를 통해 출력할 수 있음


하지만, 함수 매크로를 사용하면

$say $(1)$(a)

로 하면 되니 매우 간단함...


이게 뭐가 간단하냐구?

그리고 $는 또 뭐냐구?

하나씩 설명하겠음


3-1.$에 대해

$는 매크로 기호임

매크로를 사용하는 줄의 맨 앞과 매크로를 사용할때 들어간다

아까 $say $(1)같이 사용된다

$( )안에 1이 들어간 이유는 {1:'안녕'}을 통해 1이라는 인자의 값을 지정했기 때문임


3-2.왜 굳이 매크로를 써야하나

아까 $say $(1)$(a)는 굉장히 불편해보였는데 굳이 왜 써야하는지 궁금했을거임

이제 함수매크로의 진가가 드러난다


일단

api맵을 만들수 있음!!!

이게 제일 중요한거같긴 한데


아무튼

실제 사용시에는

function a:b {1:'예',a:'아'}

같은건 잘 쓰이지 않음


function a:b with storage minecraft:hello

의 형식으로 자주 쓰임

with뒤에는

entity, block, storage를 넣을 수 있음

간단하게 data get으로 생각하면 편함


사실 entity나 block는 잘 쓰이지 않으니 짧게 설명하겠음

data get으로 생각하라는데는 한가지 이유가 더 있음

data get을 통해 나오는 경로가 중요함


예를들어 돼지에게 pig라는 이름을 붙여보자

원래 엔티티의 종류는 data를 통해 알 수 없음

하지만 돼지를 때릴때

'돼지를 때렸다!'

라는 메세지가 나오게 하고 싶다면

execute as @e[type=pig] on attacker run function a:b with entity @n[type=pig]

로 함수를 실행하고,

함수 안에는

$tellraw @s '$(CustomName)를 때렸다!'

라고 쓰여있으면 된다

하지만, 이렇게 되어있으면 그냥

execute as @e[type=pig] on attacker run tellraw @s '돼지를 때렸다!'

처럼 하는게 훨씬 낫긴 함


하지만 함수매크로는 몹을 돼지 하나로만 한정하지 않음

제대로 한번 해본다면

반복형에

execute as @e[type=!player] at @s on attacker run function a:b with entity @n

연쇄형에

execute as @e[type=!player] if data entity @s last_hurt_by_mob run data remove entity @s last_hurt_by_mob

데팩에

$tellraw @s [{"translate":"entity.minecraft.$(CustomName)"},'을(를) 때렸다!']

를 넣으면


돼지를 때렸을땐

돼지을(를) 때렸다!

양을 때렸을땐

양을(를) 때렸다!

가 될것임


다만 이름이 pig, sheep여야 한다는 점이지

이름이 돼지, 양이면 그냥 데팩에

$tellraw @s '$(CustomName)을(를) 때렸다!'

라고만 해도 된다


아무튼 이걸 storage로 늘리면 채팅api맵도 만들수 있음

채팅 api 초심자용은 나중에 만들 계획이 있긴 함


4.갑자기 함수가 사라졌을때

아까 2에서 /를 절대 처음에 쓰면 안된다고 했었던 이유가 함수를 인식하지 못해 표시되지 않기 때문이였음

함수 매크로에서는 그런일이 유독 잘 일어나는데


4-1.매크로 기호를 사용했지만 매크로를 사용하지 않았을때

매크로 기호를 처음에 쓰면 반드시 매크로를 사용해야함


4-2.매크로 기호를 사용하지 않고 매크로를 사용했을때(일부)

여기에 (일부)가 붙은데는 이유가 있음

그냥 say나 tellraw의 출력시와 같이 그냥 문자열로도 오류가 없을때는 가능함

하지만,

data나 summon의 몹 지정처럼 일반적인 문자열이 아닌것(?)이 들어가야하는곳에는 매크로를 사용할 수 없음

그냥 문자열 $(1)같은걸 쓰고싶을때는 \$로 사용해야함


4-3.이외

전에 이야기했던 /같은거는 매크로가 아니라 포함하지 않았음

이름이 이상하거나 확장자가 이상한거는 갑자기가 아니라 처음부터 없던것이기에 포함하지 않았음


5.결론

한줄 요약하자면

매크로는 커맨드 1000개 쓸거를 1개로 줄여준다

라고 할 수 있음

사실 이건 극단적인거고 보통은 커맨드 50개를 함수 3줄로 줄일 수 있음 이것도 좀 극단적인가

아무튼 이게 별로 도움이 되진 않아보이지만 초심자에겐 4번이 중요할것같아 만들게 되었음

초심잔 몰라도 일단 난 그랬음

사실 글쓰는 본인은 이거보단 storage를 사용한거를 더 잘 알아서 자세한건 채팅api편을 만들게되면 진행하겠음


버그 제보 대환영!!

어우 강의글쓰기 생각보다 겁내 어렵네