커스텀 그림과 음반에는 두 가지 팩이 필요하며, 그중 하나만 설치하는 것이 흔한 실패 원인
데이터팩은 콘텐츠를 등록하고, 리소스 팩은 텍스처와 사운드를 제공합니다. 데이터팩만 설치하면 아무것도 표시되지 않은 채로 등록됩니다. 여기에 16×16 제한과 음반 길이가 실제로 제어하는 것까지.
그림과 음악 음반은 현대 Java에서 둘 다 실제 레지스트리이므로, 바닐라 항목을 교체하는 대신 추가할 수 있습니다. 추가한 것이 기존 그림이나 음반을 밀어내는 일은 없습니다.
문제는 콘텐츠가 서로 다른 두 가지 팩 유형에 나뉘어 있고, 각각 단독으로는 쓸모가 없다는 점입니다.
무엇이 어디에 들어가는가
데이터팩은 항목을 등록합니다:
data/<ns>/painting_variant/<id>.json asset_id, width, height, title, author
data/<ns>/jukebox_song/<id>.json sound_event, description, length_in_seconds, comparator_output
리소스 팩은 보이는 것과 들리는 것을 제공합니다:
assets/<ns>/textures/painting/<id>.png
assets/<ns>/sounds/<id>.ogg
assets/<ns>/sounds.json
데이터팩만 설치하면 콘텐츠는 성공적으로 등록됩니다 — 존재하고, /give가 그것을 찾으며, 다만 텍스처와 오디오가 없을 뿐입니다. 이는 완전한 실패보다 훨씬 혼란스러운 결과이며, 커스텀 그림이 "작동하지 않았다"는 흔한 이유입니다. 이 페이지의 도구가 두 가지를 하나의 zip에 함께 담아 제공하는 것은 바로 분리될 수 없게 하기 위해서입니다.
두 개의 pack.mcmeta 파일에 주목하세요. 이들은 별개의 정체성을 가진 별개의 팩이며, 둘 다 담는 통합 형식은 없습니다.
레지스트리 id는 파일 이름보다 엄격합니다
id에는 a-z, 0-9, _, ., -만 포함할 수 있습니다(하위 폴더의 경우 / 추가). 그 외의 문자가 있으면 게임이 로그에 "Invalid path" 줄을 남기고 해당 파일을 건너뜁니다 — 팩은 로드되고, 항목은 그냥 존재하지 않게 되는데, 이는 실패보다 알아채기 어렵습니다. 대문자와 공백이 사람들을 가장 많이 걸리게 하는 두 가지인데, 둘 다 여러분이 끌어온 파일 이름에서는 지극히 평범하기 때문입니다.
그림: 최대 16×16, 그리고 17은 팩을 망가뜨립니다
바닐라 자체 그림은 1 × 1에서 4 × 4 블록까지이며, 이 도구도 같은 범위를 제공합니다. 형식은 더 허용합니다: 26.3은 width과 height을 1에서 16까지의 정수 블록으로 읽으며, 16 × 16 그림은 16 × 16 블록의 공간이 있는 어떤 벽에서든 로드되고 걸리고 유지됩니다 — 26.3 서버에서 테스트했습니다. 그림이 유지되는지를 결정하는 것은 크기가 아니라 공간입니다: 걸린 위치에 맞지 않는 그림은 아이템으로 떨어지며, 뒤에 아무것도 없는 바닐라 1 × 1도 똑같이 떨어집니다.
16을 넘으면 게임은 숫자를 제한하지 않고 거부합니다. "width": 17은 "Value must be within range [1;16]"으로 실패하고, 레지스트리 로드 전체가 그것과 함께 멈추며, 팩을 제거할 때까지 세계가 열리지 않습니다.
크기는 JSON에서 width과 height로 블록 단위로 선언됩니다. PNG에서 추론되지 않으므로, 텍스처가 정사각형인 3 × 1 그림은 늘어나서 표시되는 유효한 파일입니다.
음반 길이는 라벨이 아닙니다
length_in_seconds는 게임이 트랙이 끝났다고 판단하는 시점입니다. 선언된 길이 1초 후에 주크박스는 소리를 끊고, 음악 노트를 멈추고, 노래가 재생되는 동안 내보내던 레드스톤 신호를 끕니다 — 최대 힘으로, 주변 블록에, 트랙이 아직 진행 중이라고 생각하는 바로 그 시간 동안.
따라서 부정확한 길이는 겉치레 오류가 아닙니다. 200초 트랙을 100으로 선언하면 음악이 중간에 끊기고 신호도 같은 순간에 떨어지며, 300으로 선언하면 주크박스는 100초의 침묵 동안 신호를 계속 켜 둡니다. 어느 쪽이든, 음반이 끝나기를 기다리는 레드스톤이 잘못된 시점에 작동합니다. 이 도구가 여러분에게 입력을 요구하는 대신 파일에서 실제 재생 시간을 읽어내는 것은 바로 그 때문입니다.
비교기는 다른 것을 읽습니다: comparator_output, 0에서 15까지의 고정된 하나의 숫자로, 음반이 주크박스에 있는 동안, 재생 중이든 끝났든 계속 유지됩니다. 트랙을 따라 올라가지도 않고, 길이가 그것을 바꾸지도 않습니다 — 바닐라는 이를 음반을 구별하는 데 사용합니다(13은 1, cat은 2, blocks는 3).
트랙은 또한 sounds.json에서 "stream": true로 작성됩니다. 음악은 길고, 재생 전에 전체 트랙을 메모리에 로드하면 끊깁니다 — 스트리밍은 음반 길이의 모든 것에 맞는 올바른 기본값이며, 짧은 음향 효과에는 잘못된 기본값입니다.