actionbar 는 재전송을 멈춰도 ~3초간 페이드로 남으므로, init6 의 video URL 이
다음 곡(init=5) 초반까지 잔상으로 보였다. 상태 전환(timer 300, select) 직전에
빈 actionbar 를 보내 깔끔히 지우고, 전체 리셋인 commands/stop 에도 동일하게
빈 actionbar 를 추가해 종료/리셋 시 잔상이 남지 않게 한다.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
곡 포맷에 선택 필드 video(영상 URL)를 추가. 정답 공개 상태(init=6) 동안
repeat/timers/init6 에서 매 tick answer.video 를 actionbar 에 흰색으로 재전송해
유지한다. video 필드가 없는 곡은 표시하지 않는다(if data 로 게이트).
answer 는 setanswer 가 곡 객체로 통째로 교체하므로 곡별 video 가 그대로 반영되고
미지정 곡에서는 잔상이 남지 않는다. songs.mcfunction 포맷 주석/예시도 갱신.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
퀴즈 종료 후(quiz/end → init=10, init10 타이머의 "종료를 눌러주세요" 안내)
정지 버튼을 눌러도 종료/재시작이 안 됐다. 정지 버튼 클릭은 init!=0 이면 투표
경로(trigger stop)로 가는데, 투표 집계(repeat/triggers/trigger)는 init==5 에서만
수행돼 종료 상태에서는 무시됐기 때문.
종료 상태는 단일 클릭 재시작이 의도이므로(init==0 설정단계와 동일), init>=10 에서
정지 버튼을 투표 없이 commands/stop 으로 직접 실행하도록 분기 추가. commands/stop 이
init 을 0 으로 만들어 같은 tick 의 투표 줄은 자동으로 건너뛴다(중복 실행 없음).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
직전 커밋(657db78)의 block_pos 만으로는 부족했다. /summon 은 Entity.load() →
readAdditionalSaveData() 에서 block_pos 의 16블록 거리검사를 수행한 뒤에야 명령
좌표로 이동하므로, 검사 시점엔 엔티티가 기본 위치라 검사를 실패해 로그가
"invalid position: 2782,88,5979" 형태로 계속 남는다. NBT에 Pos:[xd,yd,zd] 를
함께 넣으면 load 단계에서 위치가 먼저 설정돼 거리검사를 통과한다.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
페인팅을 /summon 으로 소환하면 부착 블록 좌표가 비어(null) 있어
"Block-attached entity at invalid position: null" 로그가 소환 시·주기 검사마다
반복 출력된다(MC-252934). 1.20.5+ 의 block_pos:[I; x,y,z] 정수배열을 페인팅
자신의 좌표와 동일하게 명시해 null 구간을 없앤다. 렌더링 위치/동작은 동일.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
{title,author,alias,description,volume} → {volume,title,author,alias,description}
50곡 전체 + 헤더 예시 동일 순서로 정렬 (NBT 파싱에는 영향 없음, 가독성용)
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
- 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>
start.mcfunction 의 mq_video_mod 서버/클라 부재 차단(return)을 제거하고
노란색 경고 출력 후 그대로 진행하도록 변경. 영상 모드 없이도 게임을
시작/플레이할 수 있다(영상만 미표시). 채팅정답 모드(mq_chat_mod)는 정답
판정에 필수라 서버 부재 차단 유지.
load/players/login 주석의 "필수 모드/차단" 뉘앙스도 "선택 모드, 없으면
영상 없이 진행"으로 정정.
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
videoCache add/remove/clear 까지 모든 모드 명령을 mcfunction 에서 직접
실행하지 않고 큐(mq:main video.cmdq)에 문자열로 적재한 뒤, 매 tick
videos/drain 이 공용 command_block 으로 하나씩 실행(auto 0→1, 1회 실행 후
off)한다. 데이터팩 로드 시 모드 명령을 파싱하지 않으므로 영상 모드 미설치
상태에서도 데이터팩이 정상 로드/플레이된다.
- preload/FIFO 축출 다건도 큐를 tick 당 1개씩 소진해 순서 보장
- cache 캐시 추적/dedup/src 결정(video_N vs 전체 URL)을 macro/cmd 로 통합
- 캐시 관련 파일 정리: add_one/preload_loop/evict_one/clear_run/
macro/add_one/macro/evict_one/resolve_src 제거, fill/drain/drain_off 도입
(videos 15→12 파일, cache/macro 폴더 제거)
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
- config 에 preload(미리받기 갯수)/keep(유지 갯수) 추가
- 시작 시 1..preload 캐시 미리받기, 재생 중에도 preload 개 앞까지 롤링 prefetch
- 재생 시 캐시 있으면 video_N, 없으면 전체 URL 로 동적 선택(데이터팩 self-tracking)
- keep 초과 시 가장 먼저 받은 캐시부터 삭제(FIFO)
- namespace 끝 / 자동 제거(normalize)
- command_block 한 tick 1회 발동 제약 회피: cache add/remove 직접 실행, clear 는 schedule
Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
리뷰어 지적 후속:
- docs/mc_video_player_mod_integration.md 복구 (f0a2e4f 에서 추출).
pull 시점에 main 에 없어서 같이 사라졌던 파일.
- temp/ 부분 적용 패키지 v1.0.26 기준으로 복구. 좌표 보존을 위해
init/*.mcfunction 은 일부러 제외, framework 파일만 포함:
- commands/start.mcfunction, load.mcfunction (모드 게이트 + objective)
- repeat/buttons/{btn,btn_prep,handler}.mcfunction
- repeat/timer.mcfunction + repeat/timers/{init2,init6,init10}.mcfunction
- temp/README.md 에 적용 방법 + 라벨 추가 안내 명시.
- README.md 사실 정정:
- 음원 채널 "기본 weather" → 실제 config.mcfunction 은 player
(UI 비프만 weather). source 가 무엇이 무엇인지 명시.
- 스토리지 섹션의 marker 항목 제거 (현재 config 에 marker 정의 없음,
legacy kill 한 줄만 잔존). mq:input 큐 추가, mq:tmp 페이로드 갱신.
- init/config.mcfunction 설명 / 좌표 의존성 섹션에서 marker 제거.
데이터팩 코드 변경 없음 — v1.0.25 = v1.0.26 동작 동일.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- 호환 버전: pack_format 75 → min_format/max_format [101, 1] 명시
- 외부 모드 의존성 섹션 신설 — mc_chat_answer_mod v1.3.7+ / mc_video_player_mod
- 입력 버튼: text_display 라벨 + interaction 3 타일 구조 명시, btn_prep
defaults+merge 로 옵션 필드 (label/label_color/label_font/label_scale)
- 파일 구조: timers/{init2,init6,init10}, answer/, painting_variant/,
btn_prep, mod_active_notice 등 현재 트리 반영
- 설치 절차에 mods 폴더 단계 추가, 게이트 동작 명시
- 좌표 의존성: 박혀 있는 좌표를 일일이 적지 않고 init/* 참조로 일반화
- 변경 이력에 v1.0.19~v1.0.25 요약 추가
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
- mq:answer/normalize: storage 의 norm.in 을 한 글자씩 떼어내
소문자화 + 공백 제거 후 norm.acc 에 누적. char 단위 반복은
'data modify ... set string from ... <start> <end>' (1.20+) 로,
결합은 매크로 ($(acc)$(c)) 로 수행하는 pure-datapack 구현.
- process: 큐의 text 를 정규화한 결과를 judge.input 으로 사용
- judge: answer.title 정규화 후 judge.answer 로 사용
- iter_aliases: alias 각 항목 정규화 후 비교
원본 songs.mcfunction 의 title/alias 표기는 그대로 유지 (display
및 정규화 입력으로 모두 사용됨). 입력이 'Lose My Mind' / 'lose my mind'
/ 'LOSEMYMIND' / 'losemymind' 어떤 형태든 동일한 정규형으로 떨어져 매치.
리소스팩 1번 방식 (.png 세로 스트립 + .png.mcmeta) 이
painting_variant 에서 동작하는지 검증하기 위한 샘플.
사용 위치: musicquiz 리소스팩의
assets/musicquiz/textures/painting/gif.png
assets/musicquiz/textures/painting/gif.png.mcmeta
데이터팩 v1.0.6 의 mq:gif painting_variant 와 짝.
- data/musicquiz/painting_variant/* → data/mq/painting_variant/* 로 이동
변종 ID = mq:cover_NN, 텍스처 asset_id = musicquiz:cover_NN (리소스팩)
- title/author 필드 제거 (기본값 사용)
- init/config.mcfunction 의 image.namespace 기본값을 "mq" 로 변경
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>
리소스팩의 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>
기존: 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 만 수행
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) 매크로 치환.
기존엔 volume 이 선택 필드여서 미지정 시 config.audio.volume 으로 fallback 되었는데,
곡마다 음량 조절을 자주 하기 위해 모든 곡 엔트리에 volume 을 명시 (모두 1.0). 런타임
quiz/play_sound 흐름은 그대로 — songs[i].volume 을 그대로 사용.
mq:load 가 storage chat_answer:status active 를 0b 로 초기화. chat_answer 모드의
PlayerLoggedInEvent / ServerPlayConnectionEvents.JOIN 핸들러가 첫 로그인 직후
1b 로 set 하므로, mq:players/login 에서 1b 인 경우 "[채팅정답] 모드가 활성화되어
있습니다. 정답 입력 시 채팅으로 바로 제출할 수 있습니다." tellraw.
정답 입력 UI 를 dialog 로 제공 (mq:dialog/answer), #minecraft:quick_actions 태그
등록으로 빠른행동키에서 바로 열 수 있게 함. 동시 제출 시 먼저 제출한 사람이 정답으로
인정되도록 mq:answer/ 에 submit_seq 기반 FIFO 큐 + 매크로 기반 제출자 lookup 으로
처리. tick/stop/setanswer 도 새 큐 흐름에 맞춰 업데이트.
minecraft_launcher 가 만드는 musicquiz 리소스팩 (track_NN / cover_NN)
과 한 쌍으로 동작한다.
- 음원 재생: yp playall (명령 블록 + auto 토글) → /playsound musicquiz:track_NN
- 정답 이미지: ts placeloc → /summon painting (musicquiz:cover_NN) +
/kill @e[type=painting,tag=mq_cover]
- stopsound 하드코딩(weather) 4곳을 mq:quiz/stop_sound 매크로 호출로 통일
- check/server, repeat/check_server, status 스코어보드(yp/ts/skript) 등
플러그인 hello 패킷 대기 로직 일괄 삭제
- 스토리지 재구성: command_block 컴파운드 폐기, audio/image/marker 분리
(init/config.mcfunction 한 곳에서 수정)
- 곡 단위 volume override 지원 — songs[i].volume 으로 곡별 음량 지정 가능
(미지정 시 audio.volume fallback)
- 트랙 번호 zero-pad 는 mq:tmp.pad 분기 + 매크로 문자열 조립으로 처리
- max_index 는 songs 배열 길이에서 자동 계산
- 호출 경로 단축: select → setanswer → macro/setanswer → macro/summon →
play_sound
- 주제(title), 곡 개수(max_index), 스폰 위치, 음원 명령 블록 좌표/볼륨,
이미지 표시 영역 좌표를 모두 init/config.mcfunction 에서 관리
- tellraw 접두사([ … ])가 storage 의 title 을 참조하도록 변경 — 주제
변경 시 config 한 줄만 고치면 채팅 접두사까지 일관 적용
- load.mcfunction 의 인라인 data merge 블록을 제거하고 init/config 호출로
대체 (스코어보드/보스바 같은 런타임 인프라는 load 본문에 유지)
- README 의 "곡 목록 수정" 절을 "설정 (한 곳에서 수정)" 으로 재작성
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>