Claude (owner) 4129b345c1 docs: README·연동문서를 영상 시스템/선택 모드 현행화
- README: 정답 영상 시스템(커맨드블럭 큐·preload/FIFO 캐시·동적 src),
  gif 페인팅, videos/ 파일트리, video 스토리지/스코어보드/설정, 영상 모드
  선택화 설치 절차, 2026-06-05 변경 이력 추가
- mc_video_player_mod_integration.md: 가드가 차단→경고만으로 바뀐 점 반영,
  README 에서 상호 링크

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
2026-06-05 18:28:28 +09:00

mc_datapack

마인크래프트 자작 데이터팩 모음 저장소.

현재 포함된 데이터팩:

  • music_quiz/ — 음악퀴즈 데이터팩

music_quiz — 음악퀴즈 데이터팩

플레이어가 노래를 듣고 정답을 맞히는 멀티플레이 음악 퀴즈. 관리자가 버튼/대화창으로 라운드를 진행하고, 참가자는 트리거 명령으로 정답·스킵·힌트·다시듣기 투표에 참여한다.

호환 버전

  • Minecraft 26.1.2 (pack.mcmetamin_format/max_format 모두 [101, 1]).
  • 1.21.6에서 도입된 dialog 시스템, 1.21+의 단수형 function/ 태그 폴더, 매크로 함수(function ... with storage) 기능을 사용한다.
  • 텍스트 컴포넌트는 JSON 표기로 작성돼 있으며, 1.21.5 이후의 SNBT 파서와도 호환된다 (JSON은 SNBT의 부분집합).

외부 모드 의존성 (서버/클라)

모드는 필수 1 + 선택 1 구성이다.

  • mc_chat_answer_mod v1.3.7+ (필수) — 서버 전용. 채팅으로 정답 입력을 받는다. 정답 판정의 핵심이라 없으면 /start 가 차단된다. 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 (선택) — 정답 영상 재생용. 없어도 게임은 정상 진행되며 영상만 표시되지 않는다. /start 는 차단하지 않고 노란 경고만 출력한다 (서버 부재 시 전체 안내, 특정 플레이어 클라 부재 시 본인 에게만 안내). presence 는 #server mq_video_mod (서버 컴포넌트가 매 tick 1 로 갱신) + <player> mq_video_mod (클라 join handshake 수신 시 1 로 set) 로 나눠 표시한다. 모드 측 연동 사양(presence handshake)은 docs/mc_video_player_mod_integration.md 참고. https://git.tkrmagid.kr/tkrmagid/mc_video_player_mod

데이터팩은 모드 명령(videoCache/videoPlace/videoDelete)을 mcfunction 안에서 직접 실행하지 않고 NBT 문자열 큐 → 커맨드블럭 으로만 내보낸다. 덕분에 영상 모드가 없어도 데이터팩 로드 시 미등록 명령 파싱 에러가 나지 않는다 (자세한 건 아래 "정답 영상" 절).

100% 바닐라 — 의존 플러그인 없음 (모드 외)

음원 재생과 정답 이미지 표시는 모두 바닐라 명령으로 처리한다. 음원과 페인팅 텍스처는 minecraft_launcher 가 만들어주는 리소스팩(musicquiz 네임스페이스)에서 가져온다.

  • 음원: /playsound musicquiz:track_NN <source> @s ~ ~ ~ <volume> <pitch> (예: musicquiz:track_01). init/config.mcfunctionaudio.source 가 채널을 결정하며, 곡 재생은 기본 player 채널 (음성/플레이어 볼륨 슬라이더로 음량 제어). stopsound 도 같은 채널로 묶여 있다. 카운트다운 비프와 종료 클릭 같은 UI 사운드는 별도로 weather 채널을 사용한다.
  • 정답 이미지: painting_variant musicquiz:cover_NN/summon painting 으로 벽에 띄우고, 다음 곡 직전 kill @e[type=painting,tag=mq_cover] 로 제거.
  • gif 페인팅: images/gif.mcfunction 을 실행하면 실행한 플레이어에게 mq:gif variant 페인팅 아이템을 지급한다. 벽에 설치하면 랜덤 선택 없이 mq:gif 로 고정 배치되고, 리소스팩의 애니메이션 텍스처 (musicquiz:gif .png + .png.mcmeta) 덕분에 gif 처럼 움직인다. variant 정의는 painting_variant/gif.json (asset_id: musicquiz:gif).

리소스팩 트랙 번호와 mq:init/songs 리스트의 순서가 1:1로 일치해야 한다. 1번째 곡 → track_01 / cover_01, … (2자리 zero-pad).

정답 영상 (선택)

mc_video_player_mod 가 설치돼 있으면 정답 공개 시 곡별 영상을 벽면에 띄운다. 모드가 없어도 게임은 정상 진행되며 영상만 표시되지 않는다.

핵심은 모드 명령을 mcfunction 안에서 직접 실행하지 않는다는 점이다. 모드 명령(videoCache add/remove/clear, videoPlace, videoDelete)은 미설치 시 데이터팩 로드 단계에서 미등록 명령 파싱 에러를 일으키므로, NBT 문자열로만 만들어 큐에 적재하고 커맨드블럭으로 실행한다.

  • 큐 적재mq:videos/macro/cmd 가 명령을 문자열로 조립해 mq:main video.cmdq 리스트({c:"<명령 문자열>"})에 push 한다. 문자열은 mcfunction 파서를 거치지 않으므로 모드가 없어도 로드된다.
  • 드레인mq:videos/drain (매 tick, mq:tick 에서 호출) 이 큐를 한 tick 에 한 개씩 꺼내 cmd_x/cmd_y/cmd_z 좌표에 커맨드블럭을 setblock 하고 auto 를 켜 1회 실행한다. 커맨드블럭은 auto:1b 면 매 tick 재실행되므로, video.armed 플래그로 실행한 다음 tick 에 mq:videos/macro/drain_offauto:0b 로 꺼 정확히 1회만 실행되게 한다 (모드의 videoCache add 가 중복 이름을 실패 처리해 스팸나는 것 방지).
  • 캐시(preload / FIFO keep) — 게임 시작 시 videos/cache/preload 가 1..preload 번 영상을 미리 받아두고, 라운드마다 videos/cache/add 가 N개 앞까지 캐시를 채운다. 캐시 개수가 keep 을 넘으면 videos/cache/evict 가 가장 먼저 받은 것부터 FIFO 로 축출한다 (keep<=0 이면 무제한). 데이터팩이 mq:main video.cached ({i:N} 리스트) 로 캐시 상태를 1:1 추적해 중복 등록을 막고 src 를 고른다.
  • 동적 src — 재생 시 해당 번호가 캐시에 있으면 등록 이름 video_N 으로, 없으면 전체 URL $(namespace)/N 으로 videoPlace 한다. videos/normalizenamespace 끝의 / 를 떼어 경로 중복 // 를 막는다.

모드 측이 구현해야 하는 presence handshake(서버 tick + 클라 payload) 사양은 docs/mc_video_player_mod_integration.md 참고.

게임 흐름과 상태 (init 스코어보드)

게임 전체 상태는 main 스코어보드의 가상 플레이어 init 값으로 관리한다.

init 단계
0 정지/대기 (기본 상태)
1 게임 시작 — page1 대화창에서 ready 트리거 대기
2 카운트다운 (3·2·1)
5 곡 재생 + 정답 입력 단계
6 정답 공개·점수 부여
10 엔딩 시퀀스

main 스코어보드의 timer는 활성 상태에서만 증가하는 카운터로, mq:repeat/timer가 이를 보고 상태 전이를 처리한다. 매 틱 디스패치는 init 값에 따라 게이팅된다.

트리거 명령

다음 명령은 trigger 타입 스코어보드로 등록돼 있어 어드벤처 모드의 일반 플레이어도 사용할 수 있다.

  • trigger ready — 시작 안내 대화창에서 시작 확정
  • trigger cancel — 시작 취소
  • trigger stop — 다수결 종료
  • trigger skip — 다수결 스킵 (현재 곡 패스)
  • trigger hint — 다수결 힌트 요청 (자음 절반 가리기 — func:hint)
  • trigger replay — 다수결 다시 듣기

스킵/힌트/리플레이는 mq:repeat/triggers/trigger 매크로 안에서 max_player = ceil(전체/2) 다수결 계산을 거친 뒤 실행된다. 트리거 정의 자체는 mq:init/triggers에서 storage 리스트로 관리된다.

입력 버튼

관리자가 사용하는 6개의 물리 스톤 버튼. 좌표·표면 방향·실행 명령·라벨은 mq:init/buttons에서 storage 리스트(mq:main button_defs)로 관리되며, mq:repeat/buttons/handler가 매 틱 storage 인덱스로 btn_prepbtn 매크로 체인을 호출한다.

  • start / stop / skip / hint / replay / test

버튼 본체는 보이는 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 를 정리하고 정확한 개수만 (재)소환한다. /reloadcommands/stop 을 호출해 buttons 점수를 -1 로 재설정하므로 리로드 시 자동 보장된다. /kill @e 로 지워졌어도 다음 /reload 한 번으로 복구. 월드 회로 (커맨드블럭) 의존은 없다.

파일 구조

music_quiz/
├── pack.mcmeta                  # min_format/max_format [101, 1]
├── pack.png
└── data/
    ├── minecraft/tags/function/
    │   ├── load.json            # → mq:load
    │   └── tick.json            # → mq:tick
    ├── func/function/           # 공용 헬퍼 (length/half/shuffle/text_list/join…)
    │                              ─ mq:commands/hint에서 사용
    └── mq/
        ├── function/
        │   ├── load.mcfunction        # 스코어보드·storage 초기화, init/* 호출
        │   ├── tick.mcfunction        # 매 틱 서브함수 디스패치 (init 게이팅)
        │   ├── tellraw.mcfunction     # 매크로 prefix 메시지 헬퍼
        │   ├── init/                  # 사용자 설정·정적 데이터 (수정 포인트)
        │   │   ├── config.mcfunction    # 주제·스폰·오디오·페인팅 설정
        │   │   ├── songs.mcfunction     # 곡 목록 + max_index 자동계산
        │   │   ├── buttons.mcfunction   # 버튼 좌표·실행 명령·라벨
        │   │   └── triggers.mcfunction  # 다수결 트리거 정의
        │   ├── commands/               # start·stop·skip·hint·replay·test
        │   ├── quiz/                   # 게임 진행 로직
        │   │   ├── start·select·setanswer·correct·end.mcfunction
        │   │   ├── play_sound·stop_sound.mcfunction  # /playsound · /stopsound 래퍼
        │   │   └── macro/              # 매크로 진입점
        │   │     ├── setanswer.mcfunction   # songs[$(idx)] → answer + track/cover id
        │   │     ├── play_sound.mcfunction  # $playsound 매크로
        │   │     └── stop_sound.mcfunction  # $stopsound 매크로
        │   ├── images/                 # 정답 페인팅 표시·제거
        │   │   ├── show.mcfunction          # cover painting 소환
        │   │   ├── clear.mcfunction         # cover painting 일괄 제거
        │   │   ├── gif.mcfunction           # 실행 플레이어에게 mq:gif 페인팅 아이템 지급
        │   │   └── macro/show.mcfunction    # $summon painting 매크로
        │   ├── videos/                 # 정답 영상 (선택 모드, 커맨드블럭 큐 경로)
        │   │   ├── show.mcfunction          # "play" 큐 적재
        │   │   ├── clear.mcfunction         # "delete" 큐 적재
        │   │   ├── normalize.mcfunction     # namespace 끝 / 제거 + 캐시 상태 초기화
        │   │   ├── drain.mcfunction         # 매 tick 큐 1개씩 커맨드블럭 실행 (mq:tick)
        │   │   ├── cache/{fill,add,preload,evict,clear}.mcfunction  # preload/FIFO 캐시 관리
        │   │   └── macro/               # 매크로 진입점
        │   │     ├── cmd.mcfunction         # 모드 명령 문자열 조립 → cmdq push
        │   │     ├── drain.mcfunction       # $setblock command_block + auto 1b
        │   │     └── drain_off.mcfunction   # $auto 0b (다음 tick 재실행 방지)
        │   ├── repeat/                 # tick에서 호출되는 매 틱 처리
        │   │   ├── players·check_answer·timer.mcfunction
        │   │   ├── timers/{init2,init6,init10}.mcfunction  # init 단계별 timer 디스패치 분할
        │   │   ├── buttons/{handler,btn_prep,btn}.mcfunction
        │   │   └── triggers/{handler,trigger}.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

사용 스코어보드 / 스토리지

스코어보드:

  • main — 게임 핵심 상태 (init, index, max_index, timer, score, song_idx)
  • buttons — 물리 버튼 상태 머신
  • answer — 플레이어별 정답 입력값 (1=정답, 2=오답)
  • func.temp — 산술용 임시 상수 (two=2 등)
  • leave_gamecustom:leave_game 통계 (재접속 감지)
  • score — 사이드바 표시용 점수
  • mq_chat_modmc_chat_answer_mod presence. #server 점수 1 이면 설치됨 (없으면 /start 차단)
  • mq_video_modmc_video_player_mod presence. #server = 서버 측 모드 존재, <player> = 클라 측 모드 존재 (없으면 경고만, 차단 X)
  • ready / cancel / stop / skip / hint / replay — 플레이어 트리거

스토리지:

  • mq:main — 게임 전역 데이터
    • title, max_index, spawn — 설정
    • audio = {namespace, source, volume, pitch}/playsound 파라미터
    • image = {namespace, x, y, z, facing} — 정답 페인팅 좌표
    • video = {namespace, cmd_x/y/z, x/y/z, facing, w, h, sound, preload, keep} — 정답 영상 설정 + 런타임 캐시 상태. cmd_* 는 큐 실행용 커맨드블럭 좌표, x/y/z·facing·w/h 는 영상 표시 위치/크기. 런타임에 cached({i:N} 리스트), cmdq(명령 큐), armed(커맨드블럭 1회 실행 플래그) 가 이 컴파운드에 추가된다
    • answer = {title, author, alias, track, cover} — 현재 곡 정답
    • songs — 곡 목록 (mq:init/songs 가 채움)
    • button_defs / trigger_defs — 버튼·트리거 정의
  • mq:tmp — setanswer·play_sound·페인팅·버튼 호출용 임시 페이로드 (idx, pad, num, playsound, painting, btn, btn_default)
  • mq:input — 채팅 정답 입력 큐 (chat_answer 모드 경로)
  • func:tempfunc: 헬퍼 함수용 임시 NBT

참고: 과거 marker 스토리지와 minecraft:marker 정답 입력 엔티티는 폐기됨. commands/stopkill @e[type=marker,tag=mq] 한 줄만 이전 월드에 남아 있을 수 있는 legacy entity 청소 목적으로 유지된다.

설정 (한 곳에서 수정)

세계마다 다른 값은 모두 data/mq/function/init/ 폴더에서 편집한다. /reload 후 반영된다.

  • init/config.mcfunction — 주제, 스폰 위치, 오디오 설정(audio), 정답 페인팅 좌표(image), 정답 영상 설정(video). title[ … ] 채팅 접두사로도 사용된다. videonamespace 는 영상 URL 베이스, cmd_x/y/z 는 모드 명령 실행용 커맨드블럭 좌표, x/y/z·facing·w/h 는 영상 표시 위치/크기, sound 는 음량(-1 음소거), preload 는 미리 받아둘 캐시 개수(0 이면 끔), keep 은 FIFO 유지 개수(0 이하 무제한).
  • init/songs.mcfunction — 곡 목록 (한 줄에 한 곡씩 append). alias 배열의 문자열은 정답 판정 시 동의어로 인정된다. 곡의 순서가 리소스팩 트랙 번호와 1:1 매칭 되므로 순서 변경 시 리소스팩도 함께 재생성해야 한다. max_index 는 리스트 길이로 자동 계산된다.
  • init/buttons.mcfunction — 6개 물리 버튼의 좌표·표면 방향·실행 명령.
  • init/triggers.mcfunction — 다수결 트리거(stop/skip/hint/replay) 표시 이름·실행 명령.

load.mcfunction 은 위 4개를 호출해 mq:main 스토리지를 적재한다. 스코어보드·보스바 같은 런타임 인프라는 load.mcfunction 본문에 남아 있다.

다이얼로그 페이지(data/mq/dialog/page{1,2,3}.json) 의 타이틀과 설명문구는 JSON 텍스트 컴포넌트가 storage 참조를 일관되게 지원하지 않으므로 직접 편집해야 한다.

설치

  1. 서버 월드 폴더 datapacks/music_quiz/ 디렉터리째 복사.
  2. 서버 mods 폴더에 mc_chat_answer_mod v1.3.7+ (필수) 설치. mc_video_player_mod (선택) 는 정답 영상을 쓸 때만 서버 + 클라이언트 양쪽에 설치한다. 없어도 게임은 정상 동작하며 영상만 표시되지 않는다.
  3. minecraft_launcher 에서 생성한 musicquiz 리소스팩을 클라이언트에 적용 (런처가 자동 처리).
  4. 서버 /reload — 리로드 성공 메시지가 채팅에 표시되면 정상.
  5. mq:init/buttons 에 정의된 좌표 부근에 6개 버튼이 자동 배치된다.
  6. start 버튼을 눌러 게임 시작 — mc_chat_answer_mod (필수) 미설치 시 사유와 함께 차단된다. mc_video_player_mod (선택) 미설치 시에는 노란 경고만 출력하고 영상 없이 진행된다.

좌표 의존성 (주의)

다음 좌표는 데이터팩 안에 박혀 있어 다른 월드에서 쓰려면 직접 바꿔야 한다. 현재 박혀 있는 좌표는 본인 월드 기준이므로 그대로 옮겨가면 동작 안 한다.

  • 정답 페인팅 / 플레이어 스폰 — init/config.mcfunction (image, spawn)
  • 버튼 좌표·facing — init/buttons.mcfunction (button_defsx,y,z,f)

변경 이력

2026-06-05 — 정답 영상 시스템 + 영상 모드 선택화 + gif 페인팅

  • 정답 영상 추가mc_video_player_mod 연동으로 정답 공개 시 곡별 영상을 벽면에 표시. videos/ 트리 신설 (show/clear/normalize/drain + cache/{fill,add,preload,evict,clear} + macro/{cmd,drain,drain_off}).
  • 모드 명령 커맨드블럭 큐 경로 — 모드 명령(videoCache/videoPlace/ videoDelete)을 mcfunction 에서 직접 실행하지 않고 NBT 문자열로 큐 (mq:main video.cmdq) 에 적재 → videos/drain 이 매 tick 한 개씩 커맨드블럭으로 실행. 미설치 모드여도 데이터팩 로드 시 파싱 에러 없음. video.armed 플래그 + drain_off (auto:0b) 로 정확히 1회 실행 보장.
  • 영상 모드 선택화mc_video_player_mod 없어도 /start 차단 안 함 (노란 경고만, 영상 없이 진행). 채팅 모드(mc_chat_answer_mod) 만 필수.
  • 캐시 (preload / FIFO keep)config.videopreload/keep 으로 미리받기 개수와 FIFO 유지 개수 제어. video.cached 로 캐시 상태 자체 추적, 동적 src (video_N vs 전체 URL), normalize 가 namespace 끝 / 제거.
  • gif 페인팅images/gif.mcfunction: 실행 플레이어에게 mq:gif variant 페인팅 아이템 지급. 벽 설치 시 리소스팩 애니메이션 텍스처로 움직임. painting_variant/gif.json (asset_id: musicquiz:gif) 신설.
  • init/config.mcfunctionvideo 컴파운드 추가, load.mcfunctionmq_chat_mod/mq_video_mod objective 추가.

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.mcfunctionmq_video_mod 게이트 추가 (서버 부재 단일 차단 + 플레이어별 부재 안내). load.mcfunctionmq_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). 이후 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 사문화 디버그 주석 제거

2026-05-13 — 무대 의존 제거 + 최적화 (2b61af2)

특정 맵 좌표에만 동작하던 장식 로직을 들어내고, 매 틱 부하와 정적 데이터 관리를 정비했다.

  • repeat/map/ (무대 트리/조명 애니메이션) 삭제
  • images/image_custom.mcfunction (호출자 없는 사문화 코드) 삭제
  • tick.mcfunction 디스패치를 init 상태로 게이팅 (idle 틱 함수 호출 8→4)
  • 곡 데이터를 mq:init/songsmq:main.songs 리스트로 한 번 적재. 매크로 룩업 한 줄로 50× → O(1) 복사
  • 버튼/트리거 정의를 mq:init/buttons / mq:init/triggers 의 storage 리스트로 분리. handler 는 인덱스로 매크로 호출만 한다.
  • 다수결 산술 dedup (트리거당 5 라인 절감 × 4 트리거)

2026-05-13 — 설정 통합 (b236118)

세계별 수정 포인트를 한 파일로 모았다.

  • init/config.mcfunction 신설 — 주제·곡 개수·스폰·명령 블록 좌표를 한곳에
  • mq:tellrawmq:main.title 을 읽도록 변경 ([ 주제 ] 접두사 동기화)

2026-05-13 — 바닐라 마이그레이션 (이번 커밋)

YP / TS Bukkit 플러그인 의존을 제거하고, 음원과 정답 이미지를 바닐라 명령으로 재구현했다. minecraft_launcher 가 생성하는 musicquiz 리소스팩과 한 쌍으로 동작한다.

삭제

  • mq:check/server + mq:repeat/check_server — 플러그인 설치 확인 로직
  • mq:quiz/macro/command_blockdata modify block … Command + auto 토글 패턴 (YP playall 호출용)
  • mq:quiz/play — 명령 블록 강제 재발화 함수
  • mq:images/image{,_set,_delete} — TS placeloc / removeall 호출
  • status 스코어보드 (yp, ts, skript, timer) — 플러그인 hello 패킷 대기에만 쓰이던 객체

신설

  • 음원mq:quiz/play_soundmq:quiz/macro/play_sound: $execute as @a at @s run playsound $(namespace):$(track) $(source) @s ~ ~ ~ $(volume) $(pitch)
  • 음원 정지mq:quiz/stop_soundmq:quiz/macro/stop_sound: $stopsound @a $(source) (모든 stopsound 호출 합쳐서 매크로화)
  • 정답 페인팅mq:images/showmq:images/macro/show: $summon minecraft:painting $(x) $(y) $(z) {variant:"$(namespace):$(cover)",facing:$(facing)b,Tags:["mq","mq_cover"]}
  • 정답 페인팅 제거mq:images/clear: kill @e[type=painting,tag=mq_cover]

스토리지 재구성

  • command_block 컴파운드(좌표·볼륨·이미지 영역·alias 사본을 한데 묶었던 것) 폐기
  • audio = {namespace, source, volume, pitch} 신설 — /playsound 인자
  • image = {namespace, x, y, z, facing} 신설 — /summon painting 좌표
  • marker = {x, y, z} 신설 — 정답 입력 marker 위치
  • answer.track / answer.cover 필드 추가 — 라운드별 리소스팩 ID (track_NN / cover_NN)
  • max_indexmq:init/songs 끝에서 songs 배열 길이로 자동 계산 (수동 동기화 필요 없음)

트랙 번호 padding

mcfunction 은 문자열 zero-pad 가 없으므로, quiz/select 에서 index ∈ 1..9 일 때만 mq:tmp.pad="0" 로 분기시키고, 매크로 안에서 "track_$(pad)$(num)" 로 조립한다.

기타

  • tick.mcfunction 에서 mq:repeat/check_server 제거 (매 틱 함수 호출 4→3 으로 추가 감소)
  • commands/start / commands/stop / commands/replay 의 하드코딩된 stopsound @a weather 를 모두 function mq:quiz/stop_sound 로 교체 — 채널 변경 시 audio.source 한 곳만 수정하면 됨
  • setanswer 호출 경로 단축: 기존 select → macro/command_block → play(auto-toggle) → setanswer → macro/setanswer + macro/summon → 현재 select → setanswer → macro/setanswer → macro/summon → play_sound

원격 저장소

  • https://git.tkrmagid.kr/tkrmagid/mc_datapack.git
Description
No description provided
Readme 441 KiB
Languages
mcfunction 100%