diff --git a/README.md b/README.md index a6cf272..193bb53 100644 --- a/README.md +++ b/README.md @@ -16,13 +16,29 @@ ### 호환 버전 -- **Minecraft 26.1.2** (pack_format `75`) 기준. +- **Minecraft 26.1.2** (`pack.mcmeta` 의 `min_format`/`max_format` 모두 + `[101, 1]`). - 1.21.6에서 도입된 `dialog` 시스템, 1.21+의 단수형 `function/` 태그 폴더, 매크로 함수(`function ... with storage`) 기능을 사용한다. - 텍스트 컴포넌트는 JSON 표기로 작성돼 있으며, 1.21.5 이후의 SNBT 파서와도 호환된다 (JSON은 SNBT의 부분집합). -### 100% 바닐라 — 의존 플러그인 없음 +### 외부 모드 의존성 (서버/클라) + +서버 측 검증이 들어가 있어 다음 두 모드가 반드시 깔려 있어야 `/start` 가 +진행된다. 미설치 시 `commands/start` 의 게이트가 사유와 함께 차단한다. + +- **`mc_chat_answer_mod` v1.3.7+** — 서버 전용. 채팅으로 정답 입력을 + 받는다. presence 는 `#server mq_chat_mod` 점수로 매 tick 표시되며, + `SERVER_STARTED` / `END_DATA_PACK_RELOAD` / `PlayerJoin` / `ServerTick` + 네 지점에서 갱신된다. + https://git.tkrmagid.kr/tkrmagid/mc_chat_answer_mod/releases/tag/v1.3.7 +- **`mc_video_player_mod`** — 클라이언트 + 서버 모두 필요. 서버 컴포넌트가 + `#server mq_video_mod` 를 1 로 갱신하고, 클라 join handshake 가 도착하면 + ` mq_video_mod` 를 1 로 set. `/start` 는 서버 부재 시 단일 차단, + 특정 플레이어 부재 시 본인에게 안내 + 게임 시작 차단. + +### 100% 바닐라 — 의존 플러그인 없음 (모드 외) 음원 재생과 정답 이미지 표시는 모두 바닐라 명령으로 처리한다. 음원과 페인팅 텍스처는 [minecraft_launcher](https://git.tkrmagid.kr/tkrmagid/minecraft_launcher) @@ -71,20 +87,44 @@ ### 입력 버튼 -관리자가 사용하는 6개의 물리 스톤 버튼. 좌표·표면 방향·실행 명령은 +관리자가 사용하는 6개의 물리 스톤 버튼. 좌표·표면 방향·실행 명령·라벨은 `mq:init/buttons`에서 storage 리스트(`mq:main button_defs`)로 관리되며, -`mq:repeat/buttons/handler`가 매 틱 storage 인덱스로 `btn` 매크로를 호출한다. +`mq:repeat/buttons/handler`가 매 틱 storage 인덱스로 `btn_prep` → +`btn` 매크로 체인을 호출한다. - `start` / `stop` / `skip` / `hint` / `replay` / `test` -버튼 본체는 `interaction` 엔티티 + `redstone_block`-`red_wool` 토글 -패턴으로 디바운스를 처리한다. +버튼 본체는 보이는 `stone_button` 블록 + 클릭을 받는 `interaction` 엔티티 +3 타일 (블록 면 바깥, 플레이어 쪽으로 살짝 튀어나오게) + 버튼 바로 아래 +벽면에 부착되는 `text_display` 라벨 1 개로 구성된다. interaction 폭이 +`width × width` 정사각형으로 강제되기 때문에 stone_button hitbox 의 가로 +0.375 를 0.125 폭 × 3 타일로 덮고, 깊이는 두께(0.125) 만큼 밖으로 밀어 +vanilla stone_button 클릭이 동시에 발화되지 않도록 한다. 라벨은 `bold` +적용 text component 로 직접 렌더링된다. + +각 `button_defs` 항목의 필드: + +- 필수: `n` (이름·태그), `x,y,z`, `f` (facing), `c` (실행 명령) +- 옵션: `label`, `label_color` (기본 `black`), `label_font` (기본 + `minecraft:default`), `label_scale` (기본 `1.0`). `btn_prep` 에서 + defaults + `merge from` 패턴으로 기본값이 자동 채워진다. + +클릭 처리는 항상 `interaction` 경로로 흐르므로 `on target as @s` 로 누른 +플레이어가 식별되고, 다수결(`trigger $(n)`) 투표가 성립한다. + +`interaction` / `text_display` 는 데이터팩이 직접 소환·관리한다 — +`buttons` 점수가 `-1` (초기화) 일 때마다 같은 태그의 기존 entity 를 +정리하고 정확한 개수만 (재)소환한다. `/reload` 가 `commands/stop` 을 +호출해 `buttons` 점수를 `-1` 로 재설정하므로 리로드 시 자동 보장된다. +`/kill @e` 로 지워졌어도 다음 `/reload` 한 번으로 복구. 월드 회로 +(커맨드블럭) 의존은 없다. ### 파일 구조 ``` music_quiz/ -├── pack.mcmeta # pack_format 75 +├── pack.mcmeta # min_format/max_format [101, 1] +├── pack.png └── data/ ├── minecraft/tags/function/ │ ├── load.json # → mq:load @@ -99,7 +139,7 @@ music_quiz/ │ ├── init/ # 사용자 설정·정적 데이터 (수정 포인트) │ │ ├── config.mcfunction # 주제·스폰·오디오·페인팅·marker 설정 │ │ ├── songs.mcfunction # 곡 목록 + max_index 자동계산 - │ │ ├── buttons.mcfunction # 버튼 좌표·실행 명령 + │ │ ├── buttons.mcfunction # 버튼 좌표·실행 명령·라벨 │ │ └── triggers.mcfunction # 다수결 트리거 정의 │ ├── commands/ # start·stop·skip·hint·replay·test │ ├── quiz/ # 게임 진행 로직 @@ -108,18 +148,20 @@ music_quiz/ │ │ └── macro/ # 매크로 진입점 │ │ ├── setanswer.mcfunction # songs[$(idx)] → answer + track/cover id │ │ ├── play_sound.mcfunction # $playsound 매크로 - │ │ ├── stop_sound.mcfunction # $stopsound 매크로 - │ │ └── summon{,2}.mcfunction # 정답 marker 엔티티 + alias 체인 + │ │ └── stop_sound.mcfunction # $stopsound 매크로 │ ├── images/ # 정답 페인팅 표시·제거 │ │ ├── show.mcfunction # cover painting 소환 │ │ ├── clear.mcfunction # cover painting 일괄 제거 │ │ └── macro/show.mcfunction # $summon painting 매크로 │ ├── repeat/ # tick에서 호출되는 매 틱 처리 │ │ ├── players·check_answer·timer.mcfunction - │ │ ├── buttons/{handler,btn}.mcfunction + │ │ ├── timers/{init2,init6,init10}.mcfunction # init 단계별 timer 디스패치 분할 + │ │ ├── buttons/{handler,btn_prep,btn}.mcfunction │ │ └── triggers/{handler,trigger}.mcfunction - │ └── players/login.mcfunction + │ ├── answer/ # 채팅 정답 입력 정규화/판정 (chat_answer 모드 경로) + │ └── players/{login,mod_active_notice}.mcfunction ├── dialog/page{1,2,3}.json + ├── painting_variant/{cover_01..50,gif}.json └── advancement/player/login.json ``` @@ -174,31 +216,59 @@ JSON 텍스트 컴포넌트가 storage 참조를 일관되게 지원하지 않 ### 설치 1. 서버 월드 폴더 `datapacks/`에 `music_quiz/` 디렉터리째 복사. -2. minecraft_launcher 에서 생성한 `musicquiz` 리소스팩을 클라이언트에 적용 +2. 서버 mods 폴더에 `mc_chat_answer_mod` v1.3.7+ 와 `mc_video_player_mod` + jar 설치. `mc_video_player_mod` 는 클라이언트 측에도 설치 필요. +3. minecraft_launcher 에서 생성한 `musicquiz` 리소스팩을 클라이언트에 적용 (런처가 자동 처리). -3. 서버 `/reload` — 리로드 성공 메시지가 채팅에 표시되면 정상. -4. 좌표 `144, 62, -225` 부근에 6개 버튼이 자동 배치된다. -5. `start` 버튼을 눌러 게임 시작. +4. 서버 `/reload` — 리로드 성공 메시지가 채팅에 표시되면 정상. +5. `mq:init/buttons` 에 정의된 좌표 부근에 6개 버튼이 자동 배치된다. +6. `start` 버튼을 눌러 게임 시작 — 모드 미설치 시 사유와 함께 차단된다. ### 좌표 의존성 (주의) -다음 좌표가 데이터팩 안에 박혀 있어, 다른 월드에서 그대로 사용하려면 -`init/config.mcfunction` 의 값을 바꿔야 한다: +다음 좌표는 데이터팩 안에 박혀 있어 다른 월드에서 쓰려면 직접 바꿔야 +한다. 현재 박혀 있는 좌표는 본인 월드 기준이므로 그대로 옮겨가면 동작 +안 한다. -- 정답 입력 marker: `144 59 -219` — `marker.{x,y,z}` -- 정답 페인팅: `144 84 -261` (facing south) — `image.{x,y,z,facing}` -- 플레이어 스폰: `144 61 -219` (yaw 180) — `spawn` -- 버튼 좌표: `140..148, 62, -225` / `144, 62, -213` — `mq:init/buttons` +- 정답 페인팅 / 입력 marker / 플레이어 스폰 — `init/config.mcfunction` +- 버튼 좌표·facing — `init/buttons.mcfunction` (`button_defs` 의 `x,y,z,f`) --- ## 변경 이력 +### 2026-05-19 — v1.0.25: 버튼 hitbox/라벨 미세조정 + 곡목록·좌표 갱신 + +- `repeat/buttons/btn.mcfunction`: interaction hitbox 미세조정 (`width` + 0.13 가운데 타일로 micro-gap 보정, `height` 0.26, 깊이 오프셋 + 0.07/0.93, text_display Y `~-0.5` 로 라벨 위치 조정). +- 셀렉터 정렬 `[type=...,tag=mq,tag=$(n)]` → `[distance=0..,tag=mq, + tag=$(n),type=...]`. +- `init/songs.mcfunction`: 아이유 17 곡 셋으로 교체 (alias 빈 배열). +- `init/buttons.mcfunction`: 버튼 좌표 본인 월드 기준으로 갱신, + `label` 필드 추가 ("게임시작" / "정지" / "넘기기" / "힌트" / + "다시듣기" / "소리 테스트"). +- `repeat/timer.mcfunction` 분할 → `repeat/timers/{init2,init6,init10}`. +- `commands/start.mcfunction` 에 `mq_video_mod` 게이트 추가 (서버 부재 + 단일 차단 + 플레이어별 부재 안내). `load.mcfunction` 에 `mq_video_mod` + objective + `#server` 0 materialize 추가. + +### 2026-05-18 ~ 19 — v1.0.19 ~ v1.0.24: 버튼 인프라 안정화 + +- v1.0.19/20/21: `btn_prep` defaults+merge 패턴, `positioned $(x).0` + 로 +0.5 보정 회피, interaction 3 타일 분할, `text_display` 도입. +- v1.0.23: 채팅정답 모드 false negative 의 진짜 fix — 데이터팩 게이트는 + 유지하고 모드 (`mc_chat_answer_mod` v1.3.7) 의 presence pulse 를 + 4 지점으로 확장. +- v1.0.24: `text_display` Y 보정 (`~-1` → `~-0.25`) + 라벨 bold + v1.0.21 + 의 interaction 깊이 부호 반전 수정. + ### 2026-05-13 — 26.1.2 호환 + 1차 정리 (`b1babad`) 이전 푸시본(`6841b7a 이전퀴즈 데이터팩`)을 26.1.2 기준으로 정비. -- `pack_format` 69 → 75 (MC 26.1.2 / 1.21.11) +- `pack_format` 69 → 75 (MC 26.1.2 / 1.21.11). 이후 `min_format`/ + `max_format` 가 `[101, 1]` 로 갱신됨 (현재). - `mq:load`, `mq:players/login`, `mq:commands/start`, `mq:commands/stop`, `mq:quiz/start`, `mq:quiz/end`, `mq:repeat/buttons/btn` 등에 남아 있던 `# say ...` / `# stopsound` 사문화 디버그 주석 제거