Màn hình hội thoại: tự dựng menu thực thụ không cần mod
Datapack dialog cho bạn một cửa sổ đúng nghĩa với ô nhập liệu và nút bấm. Đây là cấu trúc JSON, cách một nút chạy lệnh, và so sánh với chiêu menu sách.
Menu máy chủ trước đây thường là sách viết có trang bấm được, hoặc một giao diện rương giả lập bằng khung tranh. Dialog thay thế cả hai bằng một màn hình thực thụ.
Dialog là gì
Một tệp JSON trong datapack mô tả một cửa sổ:
data/<namespace>/dialog/welcome.json
{
"type": "minecraft:notice",
"title": { "text": "Welcome" },
"body": [{ "type": "minecraft:plain_message",
"contents": { "text": "Pick a class to begin." } }],
"action": { "label": { "text": "Continue" } }
}
Sau đó /dialog show @p my_pack:welcome.
Các loại
| Loại | Hình dạng |
|---|---|
notice | văn bản kèm một nút đóng |
confirmation | có / không, mỗi bên có hành động riêng |
multi_action | một lưới các nút |
server_links | danh sách liên kết có sẵn |
dialog_list | một menu mở ra các dialog khác |
multi_action là loại chủ lực — nó chính là bảng chọn lớp, cửa hàng, danh sách dịch chuyển.
Nút bấm chạy lệnh
{ "label": { "text": "Warp to spawn" },
"action": { "type": "minecraft:run_command", "command": "/spawn" } }
Giống như clickEvent trong chat, lệnh này chạy dưới danh nghĩa Người chơi đã bấm, ở đúng cấp quyền của họ. Một nút gọi lệnh chỉ dành cho op sẽ không làm gì với Người chơi thường. Cách xử lý tiêu chuẩn là dùng một mục tiêu trigger: nút chạy /trigger warp set 1 và một hàm chạy theo tick đảm nhận phần đặc quyền.
Ô nhập liệu
"inputs": [
{ "type": "minecraft:text", "key": "name", "label": { "text": "Your name" }, "max_length": 16 },
{ "type": "minecraft:boolean", "key": "pvp", "label": { "text": "Enable PvP" } },
{ "type": "minecraft:single_option", "key": "class", "label": { "text": "Class" }, "options": [
{ "id": "mage", "display": { "text": "Mage" } },
{ "id": "rogue", "display": { "text": "Rogue" } } ] }
]
Giá trị đến được với lệnh thông qua một nút có hành động là minecraft:dynamic/run_command: template của nó nhận $(key) cho mỗi ô nhập liệu. Một nút run_command thường không nhận được gì.
"action": {
"type": "minecraft:dynamic/run_command",
"template": "function my_pack:join {name:'$(name)',class:'$(class)'}"
}
Hàm mà nó gọi sau đó là một macro:
$say Welcome $(name), you chose $(class)
Tiền tố $ ở đầu dòng và $(key) để thay thế, ở cả hai đầu. Đó là toàn bộ cơ chế gắn kết, và chính nó khiến dialog thực sự hữu ích chứ không chỉ để trang trí.
Vì sao cách này hơn chiêu sách
- Đây là một màn hình, nên nó tạm dừng nhập liệu thay vì nằm trong lịch sử chat.
- Ô nhập liệu thực sự tồn tại. Sách chỉ có thể cho liên kết.
- Không cần vật phẩm. Không có gì để mất, đánh rơi hay nhân bản.
- Nó đóng gọn gàng và không thể cuộn ngược lại.
Điều duy nhất sách vẫn làm tốt hơn là đọc nội dung dài — phần thân dialog không phải chỗ thích hợp cho ba trang cốt truyện.
Kiểu điểm đánh dấu
Cùng công cụ này cũng dùng cho các điểm đánh dấu trên thanh định vị, với các kiểu là tài nguyên gói tài nguyên (assets/<namespace>/waypoint_style/) quy định hình ảnh và khoảng cách mờ dần của một Người chơi hay vị trí được theo dõi; màu sắc được đặt riêng bằng /waypoint modify <target> color. Hữu ích cho dấu hiệu đồng đội khi thanh bossbar sẽ quá phiền.
Hãy dựng màn hình dialog với ô nhập liệu và nút bấm, cùng tùy chỉnh kiểu điểm đánh dấu, trong Trình tạo ô nhập liệu Dialog & kiểu điểm đánh dấu.