Hướng dẫn / Xây dựng & tài nguyên
Tranh vẽ và đĩa nhạc tùy chỉnh cần hai gói, và việc cài thiếu một trong hai là lỗi thường gặp
Gói dữ liệu đăng ký nội dung; gói tài nguyên cung cấp texture và âm thanh. Chỉ cài gói dữ liệu thì nội dung được đăng ký nhưng không có gì để hiển thị. Cùng với giới hạn 16×16 và độ dài đĩa thực sự kiểm soát điều gì.
Tranh vẽ và đĩa nhạc đều là các registry thực thụ trong Java hiện đại, nghĩa là bạn có thể thêm chúng thay vì ghi đè lên các mục vanilla. Không có gì bạn thêm vào lại thay thế một tranh vẽ hay đĩa nhạc đã có sẵn.
Vấn đề nằm ở chỗ nội dung bị chia ra hai loại gói khác nhau, và mỗi loại đều vô dụng nếu đứng một mình.
Cái gì nằm ở đâu
Gói dữ liệu đăng ký nội dung:
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
Gói tài nguyên cung cấp những gì bạn thấy và nghe:
assets/<ns>/textures/painting/<id>.png
assets/<ns>/sounds/<id>.ogg
assets/<ns>/sounds.json
Chỉ cài gói dữ liệu thì nội dung vẫn đăng ký thành công — nó tồn tại, /give tìm thấy nó, chỉ đơn giản là không có texture và không có âm thanh. Đó là kết quả khó hiểu hơn nhiều so với một lỗi rõ ràng, và đây chính là lý do thường gặp khiến một tranh vẽ tùy chỉnh "không hoạt động". Công cụ trên trang này đóng gói cả hai vào một file zip chính vì lý do đó, để chúng không thể bị tách rời.
Lưu ý hai file pack.mcmeta. Chúng là hai gói riêng biệt với danh tính riêng; không có định dạng kết hợp nào chứa cả hai.
Id registry nghiêm ngặt hơn tên file
Một id chỉ được chứa a-z, 0-9, _, . và - (cùng với / cho thư mục con). Bất kỳ ký tự nào khác và game sẽ bỏ qua file đó với dòng "Invalid path" trong log — gói vẫn tải, và mục đó đơn giản là không bao giờ tồn tại, điều này khó phát hiện hơn cả một lỗi rõ ràng. Chữ in hoa và dấu cách là hai thứ khiến người ta dính bẫy, vì cả hai đều hoàn toàn bình thường trong tên file bạn kéo vào.
Tranh vẽ: tối đa 16×16, và 17 làm hỏng cả gói
Tranh vẽ của vanilla chạy từ 1 × 1 đến 4 × 4 khối, và công cụ này cũng cung cấp đúng khoảng đó. Định dạng cho phép nhiều hơn: 26.3 đọc width và height theo đơn vị khối nguyên từ 1 đến 16, và một tranh vẽ 16 × 16 tải được, treo được và giữ nguyên trên bất kỳ bức tường nào có đủ 16 × 16 khối không gian — đã kiểm tra trên server 26.3. Điều quyết định tranh vẽ có giữ được hay không là không gian, chứ không phải kích thước: tranh không vừa chỗ treo sẽ rơi ra thành vật phẩm, và một tranh vanilla 1 × 1 không có gì phía sau cũng rơi y như vậy.
Vượt quá 16 thì game không kẹp giá trị lại, mà từ chối thẳng. "width": 17 thất bại với dòng "Value must be within range [1;16]", toàn bộ quá trình tải registry dừng theo, và thế giới sẽ không mở được cho đến khi gỡ gói ra.
Kích thước được khai báo trong JSON dưới dạng width và height, tính theo khối. Nó không được suy ra từ file PNG, nên một tranh 3 × 1 có texture hình vuông vẫn là file hợp lệ và hiển thị bị kéo giãn.
Độ dài đĩa không phải chỉ là nhãn
length_in_seconds là thời điểm game quyết định bản nhạc đã hết. Một giây sau độ dài được khai báo, hộp chơi nhạc cắt âm thanh, dừng các nốt nhạc, và tắt tín hiệu redstone mà nó phát ra trong khi bài hát đang chạy — ở cường độ tối đa, tới các khối xung quanh, đúng trong khoảng thời gian nó nghĩ bản nhạc còn đang phát.
Vậy nên độ dài không chính xác không phải là lỗi thẩm mỹ. Khai báo một bản nhạc 200 giây thành 100 thì nhạc bị cắt ngang giữa chừng, tín hiệu cũng tắt đúng lúc đó; khai báo thành 300 thì hộp chơi nhạc vẫn giữ tín hiệu suốt 100 giây im lặng. Dù theo cách nào, redstone chờ đĩa kết thúc cũng kích hoạt sai thời điểm. Công cụ này đọc độ dài thực từ file thay vì bắt bạn tự gõ vào, chính vì lý do đó.
Comparator lại đọc một thứ khác: comparator_output, một con số cố định từ 0 đến 15, giữ nguyên chừng nào đĩa còn nằm trong hộp chơi nhạc, dù đang phát hay đã hết. Nó không tăng dần theo bản nhạc, và độ dài không làm thay đổi nó — vanilla dùng nó để phân biệt các đĩa (13 cho 1, con mèo cho 2, blocks cho 3).
Các bản nhạc cũng được ghi với "stream": true trong sounds.json. Nhạc thì dài, và việc nạp cả bản nhạc vào bộ nhớ trước khi phát sẽ gây giật — streaming là mặc định đúng cho mọi thứ dài cỡ một đĩa nhạc, và là sai cho một hiệu ứng âm thanh ngắn.