5 Commits

Author SHA1 Message Date
Claude (owner)
f71bd95de5 music_quiz: pack.mcmeta 에 min_format / max_format 명시 (26.1.2 = format 75)
25w31a 이후 pack metadata 에서 min_format / max_format 가 권장 필드로
추가됨. 없으면 게임 시작 시 PackRepository.reload 단계에서
"missing mandatory fields min_format and max_format" WARN 로그가
fallback 으로 처리되며, 향후 버전에서 hard fail 로 바뀔 가능성이
있어 명시. 단일 버전(26.1.2) 만 지원하므로 75/75 로 고정.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 23:04:43 +09:00
Claude (owner)
b19f37969a music_quiz: add painting_variant definitions (cover_01 ~ cover_50)
리소스팩의 assets/musicquiz/textures/painting/cover_NN.png 를 게임에서
painting entity 로 띄우려면 데이터팩 쪽에 painting_variant 정의가
있어야 한다. 곡 수(50)에 맞춰 data/musicquiz/painting_variant/cover_NN.json
50개를 추가. asset_id 의 musicquiz:cover_NN 이 자동으로
assets/musicquiz/textures/painting/cover_NN.png 를 가져다 쓴다.
width/height = 1×1 (정사각 한 블록).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-05-14 22:57:49 +09:00
Claude (owner)
416eaee14a music_quiz: chat_answer 모드 활성 알림 — race-free 함수 호출 방식으로 전환
기존: storage chat_answer:status active 1b/0b 플래그를 모드가 set,
데이터팩이 mq:load 에서 0b 로 reset 하는 구조였는데,
통합 서버에서 mq:load 가 player join 이후에 도는 케이스가 발견되어
모드가 써놓은 1b 를 데이터팩이 직후에 0b 로 덮어쓰는 race 발생.

수정: storage 플래그를 완전히 제거. 모드가 직접 PlayerLoggedInEvent
핸들러에서 mq:players/mod_active_notice 함수를 해당 플레이어로 호출.
데이터팩이 없으면 함수가 없어 silent fail → race 없음.

- mq:load: chat_answer:status 0b 초기화 라인 삭제
- mq:players/login: 조건부 tellraw 제거 (모드가 직접 호출하므로)
- mq:players/mod_active_notice: 새 함수, 그냥 tellraw 만 수행
2026-05-14 03:14:55 +09:00
Claude (owner)
de6e040623 music_quiz: add pack.png icon 2026-05-14 02:28:52 +09:00
Claude (owner)
141bc5eaa5 music_quiz: fix invalid dialog type — simple_input_form → notice
mq/dialog/answer.json 이 'minecraft:simple_input_form' 타입을 쓰는데
1.21.6 dialog registry 에 그 타입이 없어서 데이터팩 로드 자체가 실패
"세계를 불러올 수 없습니다" 오류. 유효한 타입 중 단일 버튼 + inputs 를
지원하는 minecraft:notice 로 교체, action 을 button(label+inner action)
구조로 감싼다. dynamic/run_command 템플릿은 그대로 — $(text) 매크로 치환.
2026-05-13 23:36:29 +09:00
56 changed files with 367 additions and 11 deletions

View File

@@ -1,9 +1,10 @@
{ {
"type": "minecraft:simple_input_form", "type": "minecraft:notice",
"title": { "title": {
"text": "정답 입력", "text": "정답 입력",
"bold": true "bold": true
}, },
"body": [],
"inputs": [ "inputs": [
{ {
"type": "minecraft:text", "type": "minecraft:text",
@@ -19,8 +20,13 @@
"can_close_with_escape": true, "can_close_with_escape": true,
"pause": false, "pause": false,
"after_action": "close", "after_action": "close",
"action": {
"label": {
"text": "제출"
},
"action": { "action": {
"type": "minecraft:dynamic/run_command", "type": "minecraft:dynamic/run_command",
"template": "function mq:answer/submit {text:'$(text)'}" "template": "function mq:answer/submit {text:'$(text)'}"
} }
}
} }

View File

@@ -2,10 +2,6 @@ data modify storage mq:main answer set value {title:"", author:"", alias:[]}
data merge storage func:temp {} data merge storage func:temp {}
data merge storage mq:tmp {} data merge storage mq:tmp {}
# chat_answer 모드 활성화 플래그 초기화. 모드가 살아있으면 첫 플레이어 로그인 직후
# 모드가 다시 1b 로 set 함. 모드가 빠지면 이대로 0b 유지 → 로그인 메세지 미표시.
data modify storage chat_answer:status active set value 0b
function mq:init/config function mq:init/config
function mq:init/songs function mq:init/songs
function mq:init/buttons function mq:init/buttons

View File

@@ -9,6 +9,5 @@ $setworldspawn $(x) $(y) $(z) $(r) $(f)
$tp @s $(x) $(y) $(z) $(r) $(f) $tp @s $(x) $(y) $(z) $(r) $(f)
gamemode adventure @s gamemode adventure @s
# chat_answer 모드가 살아있으면 PlayerLoggedInEvent 핸들러가 active=1b 로 set. # 채팅정답 모드 활성 알림은 모드가 직접 PlayerLoggedInEvent 핸들러에서
# mq:load 에서 0b 로 초기화되어 있으므로, 1b 인 상황 = 모드 활성. # mq:players/mod_active_notice 를 호출해서 표시한다 (race-free).
execute if data storage chat_answer:status {active:1b} run tellraw @s ["",{"text":"[채팅정답] ","color":"green","bold":true},{"text":"모드가 활성화되어 있습니다.","color":"gray"},{"text":" 정답 입력 시 ","color":"gray"},{"text":"채팅","color":"yellow","bold":true},{"text":"으로 바로 제출할 수 있습니다.","color":"gray"}]

View File

@@ -0,0 +1,3 @@
# chat_answer 모드의 PlayerLoggedInEvent 핸들러가 직접 호출.
# 모드가 없으면 이 함수가 호출될 일이 없으므로 메세지가 안 뜬다.
tellraw @s ["",{"text":"[채팅정답] ","color":"green","bold":true},{"text":"모드가 활성화되어 있습니다.","color":"gray"},{"text":" 정답 입력 시 ","color":"gray"},{"text":"채팅","color":"yellow","bold":true},{"text":"으로 바로 제출할 수 있습니다.","color":"gray"}]

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_01",
"width": 1,
"height": 1,
"title": { "text": "Cover 01" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_02",
"width": 1,
"height": 1,
"title": { "text": "Cover 02" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_03",
"width": 1,
"height": 1,
"title": { "text": "Cover 03" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_04",
"width": 1,
"height": 1,
"title": { "text": "Cover 04" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_05",
"width": 1,
"height": 1,
"title": { "text": "Cover 05" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_06",
"width": 1,
"height": 1,
"title": { "text": "Cover 06" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_07",
"width": 1,
"height": 1,
"title": { "text": "Cover 07" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_08",
"width": 1,
"height": 1,
"title": { "text": "Cover 08" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_09",
"width": 1,
"height": 1,
"title": { "text": "Cover 09" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_10",
"width": 1,
"height": 1,
"title": { "text": "Cover 10" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_11",
"width": 1,
"height": 1,
"title": { "text": "Cover 11" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_12",
"width": 1,
"height": 1,
"title": { "text": "Cover 12" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_13",
"width": 1,
"height": 1,
"title": { "text": "Cover 13" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_14",
"width": 1,
"height": 1,
"title": { "text": "Cover 14" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_15",
"width": 1,
"height": 1,
"title": { "text": "Cover 15" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_16",
"width": 1,
"height": 1,
"title": { "text": "Cover 16" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_17",
"width": 1,
"height": 1,
"title": { "text": "Cover 17" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_18",
"width": 1,
"height": 1,
"title": { "text": "Cover 18" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_19",
"width": 1,
"height": 1,
"title": { "text": "Cover 19" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_20",
"width": 1,
"height": 1,
"title": { "text": "Cover 20" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_21",
"width": 1,
"height": 1,
"title": { "text": "Cover 21" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_22",
"width": 1,
"height": 1,
"title": { "text": "Cover 22" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_23",
"width": 1,
"height": 1,
"title": { "text": "Cover 23" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_24",
"width": 1,
"height": 1,
"title": { "text": "Cover 24" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_25",
"width": 1,
"height": 1,
"title": { "text": "Cover 25" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_26",
"width": 1,
"height": 1,
"title": { "text": "Cover 26" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_27",
"width": 1,
"height": 1,
"title": { "text": "Cover 27" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_28",
"width": 1,
"height": 1,
"title": { "text": "Cover 28" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_29",
"width": 1,
"height": 1,
"title": { "text": "Cover 29" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_30",
"width": 1,
"height": 1,
"title": { "text": "Cover 30" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_31",
"width": 1,
"height": 1,
"title": { "text": "Cover 31" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_32",
"width": 1,
"height": 1,
"title": { "text": "Cover 32" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_33",
"width": 1,
"height": 1,
"title": { "text": "Cover 33" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_34",
"width": 1,
"height": 1,
"title": { "text": "Cover 34" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_35",
"width": 1,
"height": 1,
"title": { "text": "Cover 35" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_36",
"width": 1,
"height": 1,
"title": { "text": "Cover 36" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_37",
"width": 1,
"height": 1,
"title": { "text": "Cover 37" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_38",
"width": 1,
"height": 1,
"title": { "text": "Cover 38" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_39",
"width": 1,
"height": 1,
"title": { "text": "Cover 39" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_40",
"width": 1,
"height": 1,
"title": { "text": "Cover 40" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_41",
"width": 1,
"height": 1,
"title": { "text": "Cover 41" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_42",
"width": 1,
"height": 1,
"title": { "text": "Cover 42" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_43",
"width": 1,
"height": 1,
"title": { "text": "Cover 43" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_44",
"width": 1,
"height": 1,
"title": { "text": "Cover 44" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_45",
"width": 1,
"height": 1,
"title": { "text": "Cover 45" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_46",
"width": 1,
"height": 1,
"title": { "text": "Cover 46" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_47",
"width": 1,
"height": 1,
"title": { "text": "Cover 47" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_48",
"width": 1,
"height": 1,
"title": { "text": "Cover 48" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_49",
"width": 1,
"height": 1,
"title": { "text": "Cover 49" },
"author": { "text": "music quiz" }
}

View File

@@ -0,0 +1,7 @@
{
"asset_id": "musicquiz:cover_50",
"width": 1,
"height": 1,
"title": { "text": "Cover 50" },
"author": { "text": "music quiz" }
}

View File

@@ -1,6 +1,8 @@
{ {
"pack": { "pack": {
"pack_format": 75, "pack_format": 75,
"min_format": 75,
"max_format": 75,
"description": "음악퀴즈용 데이터팩입니다." "description": "음악퀴즈용 데이터팩입니다."
} }
} }

BIN
music_quiz/pack.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB