마인크래프트 강좌/데이터팩 강좌

마인크래프트 데이터팩 강좌 [3] - function

Potan 2020. 12. 16. 11:28
반응형

안녕하세요 Potan입니다.

 

이번 시간에는 function(함수)에 대해서 알아보겠습니다.

마인크래프트 자바에디션 1.16.4를 바탕으로 제작되었습니다.

 

 

1. 함수 기능 요약 및 장점

  • 길게 늘어진 커맨드 블럭보다 수정, 추가가 간단합니다.
  • 커맨드 블럭을 찾아서 레드스톤 신호를 줄 필요가 없습니다.
  • 청크로딩이 필요 없습니다.
  • 다른 맵으로 옮기기 쉽습니다.
  • 매우 긴 커맨드 블럭보다 렉을 덜 유발합니다.

 

2. 만들기

우선 2강에 나온대로 데이터팩을 만들어준 뒤 functions 폴더를 만들어줍니다.

functions 폴더에 들어갈 수 있는 구성요소입니다. 이름은 자유이며 함수 파일의 확장자는 .mcfunction입니다. 

폴더를 이용해서 정리할 수 있습니다.

 

그러면 이제 함수를 작성해봅시다.

  • #을 붙인 줄은 주석이 됩니다. 함수의 작동에 아무런 영향을 끼치지 않습니다.
  • 빈 줄 역시 영향을 끼치지 않습니다.
  • 슬래시 ( / )는 사용할 수 없습니다. 하나라도 존재하면 함수 파일로 인정되지 않습니다.
  • 커맨드에 오류가 있으면 함수 파일로 인정되지 않습니다.
  • 함수는 커맨드 블럭의 32500자 제한이 없습니다.
  • 함수 내에서 실행될 수 있는 총 커맨드 개수는 /gamerule maxCommandChainLength에서 정해지는 값입니다. (기본 65536)
  • ( ~ )와 같은 상대 좌표계의 경우 함수가 실행된 위치를 기준으로 작동합니다.
  • 명령어 강좌의 경우 이 강좌(유튜브)를 참고해주세요.
  • 싱글이나 랜서버에서는 커맨드블럭과 마찬가지로 권한 레벨 2에서 작동합니다. (서버관련 명령어 제외 나머지)
  • 멀티 서버의 경우 function-permission-level 에서 레벨을 조절할 수 있습니다. (1 ~ 4 중, 기본값 2)
  • 함수 내에서 다른 함수를 실행시켜도 됩니다.
    • 함수 자기자신을 실행할경우 반복되어 총 커맨드 개수 한계까지 작동합니다.

 

3. 함수 관련 명령어

  • /function <함수>
    • <함수>에 해당하는 함수를 실행하는 명령어입니다.
    • <함수>의 경우 <네임스페이스:함수이름> 또는 <네임스페이스:네임스페이스/함수이름>처럼 경로가 들어갑니다. 데이터팩의 이름의 경우 들어가지 않습니다.
    • <함수>에 #태그이름 를 이용할 수 있습니다. #태그이름에 해당하는 함수가 실행됩니다.
    • 네임스페이스를 붙이지 않을경우 minecraft 가 네임스페이스로 설정됩니다.
    • 실행했을때 결과
      • 지정된 함수/함수 태그가 존재하지 않는 경우 - 실패
      • 성공 - 지정된 함수 작동. 단, 함수 내부의 커맨드의 성공 여부는 비교기나 store로 확인할 수 없습니다.
        • execute store success - 1
        • execute store result - 함수에 있는 커맨드의 개수 (함수에서 호출한 함수에 있는 커맨드 포함)
        • 성공 횟수(커맨드 블럭에 비교기를 했을때 나오는 레드스톤 신호의 세기) - store result의 값 + 1

이제 방금전 작성한 함수를 실행해봅시다.

title의 경우 부피가 너무 커서 잘랐으나 잘 작동했습니다.

파일에 적은 커맨드들이 실행되는 모습입니다.

중간에 또다른 폴더를 놓아도 잘 작동합니다.

만약 함수 파일이 올바르다면 이렇게 커맨드 도우미가 출력되며 폴더안에 폴더를 넣어도 괜찮으니 마음껏 해보시길 바랍니다.

 

  • /schedule
    • /schedule function <함수> <시간> [append|replace]
      • <함수>를 <시간>이 지난 뒤 실행합니다.
      • <함수>의 경우 /function과 같은 방식으로 정해집니다.
      • <시간>은 4d 와 같은 방식으로 접미사를 붙일 수 있습니다.
        • d - 게임 내에서의 하루입니다. (24000 틱)
        • s - 초 (20틱)
        • t - 틱 (기본)
      • replace - 같은 함수가 예약되어있을 경우 설정된 <시간>을 교체합니다. (기본값)
      • append - 같은 함수가 예약되어있어도 무시하고 새로 추가합니다.
      • 똑같은 함수가 똑같은 시간에 실행되게 설정할 수 없습니다.
      • execute as를 써도 설정된 함수는 서버에서 실행한 것으로 취급됩니다.
      • 실행했을때 결과
        • <함수>가 존재하지 않을 경우 - 실패
        • <시간>이 0일 경우 - 실패
        • 성공 - <함수>가 예약됨.
          • execute store success - 1
          • execute store result - 함수가 실행될 게임 시간
          • 성공 횟수 - 1
    • /schedule clear <함수>
      • 예약된 <함수>의 예약을 지웁니다.
      • 실행했을때 결과
        • <함수>가 예약되어있지 않을 경우 - 실패
        • <함수>가 존재하지 않는 함수일 경우 - 실패
        • 성공 - 예약된 <함수>를 지웁니다.
          • execute store success - 1
          • execute store result - 삭제된 예약의 개수
          • 성공 횟수 - 1

 

부록. tick, load 태그

마인크래프트에 내장된 태그 중에는 함수 관련 태그가 존재합니다.

  • tick 태그
    • 여기에 등록된 함수는 매 틱마다 작동합니다.
  • load 태그
    • 여기에 등록된 함수는 데이터팩이 적용될 때 실행됩니다.

 이때 데이터팩을 처음 적용한다면 tick 태그에 있는 함수가 load 태그에 있는 함수보다 먼저 실행되니 주의하세요.

이 두 태그의 경우 minecraft를 네임스페이스로 가지고 있어야 하며 경로는 위와 같습니다.

확장자가 .json으로 설정된 텍스트 문서이면 됩니다.

작성은 다음과 같이 하시면됩니다. 이때 함수의 경로는 function 커맨드처럼 적으시면 됩니다.

해당 파일은 load.json으로 이제 reload를 하면 여기에 적힌 함수가 실행될것입니다.
test2 함수의 경우 test1의 복사본입니다.

새로 고침을 하니 별도의 커맨드 입력 없이 함수가 작동한 모습입니다. 이는 데이터팩을 처음 맵에 넣어도 작동합니다.

tick.json 파일도 위처럼 작성하시면 됩니다.

반응형