데이터팩 입문 (이전이전 글)

https://gall.dcinside.com/minecraft/167112%2526referrerAllArticles%3Dtrue


마인크래프트 갤러리 - 커뮤니티 포털 디시인사이드

게임 카테고리로 분류된 마인크래프트 갤러리입니다. 마인크래프트 갤러리에 다양한 이야기를 남겨주세요.

gall.dcinside.com


데이터팩 입문 2 (이전 글)

https://gall.dcinside.com/minecraft/167137%2526referrerAllArticles%3Dtrue


마인크래프트 갤러리 - 커뮤니티 포털 디시인사이드

게임 카테고리로 분류된 마인크래프트 갤러리입니다. 마인크래프트 갤러리에 다양한 이야기를 남겨주세요.

gall.dcinside.com


이전 글에서 이어지는 내용임!(정확히는, 접점은 없는데 이전 글을 안 보면 이해가 어려울 내용들이 있을 수 있음!)






이 글에선 무엇을 다루나!


1. 그림(painting_variant)

2. 함수 매크로(macro)

3. 술어(predicate)

* Ctrl+F(단어 찾기)로 쉽게 이동할 수 있음!


그림(painting_variant)

말 그대로 그림 추가임! 사실 이건 너무 쉬워서 설명할 게 많이 없음. 대신 이건 데이터팩만으로는 할 수 없고, 리소스팩의 도움이 좀 필요함.


우선 resources > assets > minecraft > textures > painting 경로에 사진 하나를 추가함. 이때 사진의 가로세로 비는 웬만하면 가장 단순한 정수비로 표현했을 때 한 쪽이 10을 넘지 않는 게 나음.("나는 큰 그림이 만들고 싶다!"하면 해도 괜찮음)


a15714ab041eb360be3335622983746f17de87697c8bd98545de99ee302fa6c22894eeb3eae1c0612dbcf158e003


위 사진은 예시인데, 보다시피 가로세로의 비가 2:1인 것을 알 수 있음.


이제 사진은 넣었고, 이걸 그림으로 만들어야 하겠지? 리소스팩 쪽은 이제 딱히 만질 건 없고, 데이터팩으로 넘어와서 painting_variant 폴더에 아래 코드가 들어간 json 파일을 넣어주면 된다.


{

"asset_id": "minecraft:<사진의 파일명>",

"author": {

"color": "gray",

"translate": "<작가 이름>"

},

"height": <세로 높이>,

"title": {

"color": "yellow",

"translate": "<그림 이름>"

},

"width": <가로 넓이>

}


위 코드는 마인크래프트 기본 painting_variant 파일의 템플릿인데, asset_id에는 아까 리소스팩에 추가한 사진 파일의 파일명이, height과 width에는 마크 내에서 그림이 몇 블록의 크기일지가 들어간다.

title은 마크 내에서 그 그림의 이름이 무엇일지, author은 작가가 누구인지에 대한 값인데 이 둘은 딱히 중요하진 않음.


아래는 예시임.


a15714ab041eb360be3335622983746f17de87697c8bd98545df9de43329a6c259c848d3d1f4d427c72a27fa


아까 그 주기율표 사진에 대한 파일이고, author 값이 이상할 텐데 그건 그냥 다른 그림(pond)의 코드를 복붙한 뒤에 조금만 수정해서 만든 코드이기 때문임(?)



함수 매크로(macro)

커맨드 블록이 함수를 뛰어넘을 수 없는 가장 큰 이유라고도 할 수 있는 기능이지!

이건 함수(function)의 기능인데, 쓰는 법이 굉장히 쉬움! 그냥 명령어 앞에 $를 붙이고 원하는 부분을 $(<변수>)로 바꿔주기만 하면 된다!


/function custom:ex {gg:"hello"}


===== custom:ex =====


$say $(gg)


위에 있는 예시처럼 custom:ex라는 함수에 저 코드를 넣고 위 명령어를 실핼시키면면


[@] hello


가 출력될거임! 그러니까, say hello라는 명령어에서 앞에 $를 붙이고 뒤에 hello 부분을 $(<변수>)로 바꾼 뒤에 그 변수값을 hello로 지정해주고 실행시키게 되면 똑같은 결과가 나온다는 거지!


게다가 변수에는 엔티티, 블록, 스토리지의 데이터도 넣을 수 있대! (중괄호 대신 with를 써서 입력 가능)


이걸로 여러가지를 만들 수 있겠지? 스테이지마다 다른 보상을 준다던가, 스토리지에 데이터들을 넣어서 execute if 노가다를 하지 않는다던가...



술어(predicate)

술어는 특정 명령어를 실행시킬 때의 조건임. 얘는 어떤 일을 하냐면, execute if predicate 할 때 그 predicate 값에 여기서 미리 설정한 값을 겋을 수 있음. 예를 하나 들어서 보여주자면,


{

"condition": "minecraft:entity_properties",

"entity": "this",

"predicate": {

"type_specific": {

"type": "minecraft:player",

"input": {

"sneak": true

}

}

}

}


이건 플레이어가 웅크리고 있는지를 확인하는 술어임. 저 술어가 custom:sneak라고 하면,


execute as @a if predicate custom:sneak run say "웅크리기"


와 같이 쓸 수 있고, 이는


execute as @a if predicate {"condition": "minecraft:entity_properties","entity": "this","predicate": {"type_specific": {"type": "minecraft:player","input": {"sneak": true}}}} run say "웅크리기"


와 완전히 같음. 그러니까, 명령어에 하나하나 쓰기 귀찮으니 미리 데이터팩에 저장해놨다가 나중에 꺼내쓰는 개념이라 생각하면 된다!


그리고 보다시피 사람 손으로 직접 만들기는 되게 불편해 보이지?! 이것도 사이트 통해서 만드는 걸 추천함. https://misode.github.io/predicate/


condition에 대해서 설명을 해보자면, 일단 condition은 위의 예시 코드에서 가장 위에 있는 거거든? 예시에서는 저기에 entity_properties라는 값이 들어가 있는데, 이게 술어를 어떤 목적으로 쓸 지를 결정하는 거라고 생각하면 된다.

condition들 중에 몇 가지에 대해 설명을 하면,


· all of : AND 게이트. 이걸 선택하면 다른 condition들을 또 여러 개 선택할 수 있는데, 이 condition들이 모두 참이어야만 참을 출력한다.

· any of : OR 게이트. all of처럼 다른 condition들을 선택해서, 그 중에 하나만 참이어도 참을 출력한다.

· entity properties : 엔티티의 정보가 이것과 일치하면 참을 출력한다.

· random chance : chance 값의 확률로 참을 출력한다.


사실 다룰 줄 아는 술어가 저것밖에 없어서 저것만 설명했음(?) 어차피 이건 입문용이니 자세히 설명할 필요는 없지(??) 마인크래프트에서 직접 실행하면서 알아가시면 누구나 쉽게 쓸 수 있을 거임!






최근에 맵을 못 만드니 심심해서 그냥 없는 지식으로라도 [커맨드 자료] 게시판에 글을 많이 올렸는데, 이제 맵 제작할 때 데이터팩 쓸 만한 건 다 다뤄버려서 다룰 게 없노(인챈트 추가는 맵 제작에 잘 안 쓰이고, worldgen 쪽은 좀 복잡해서 나도 잘 몰라서 + 다이얼로그는 지금 마크 못 들어가서 안 다뤘음).

어쨌든 이 글을 보고 데이터팩을 쓰는 사람들이 많아졌으면 좋겠노 :)