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>
46 lines
2.9 KiB
MCFunction
46 lines
2.9 KiB
MCFunction
execute if score init main matches 10 run return run function mq:tellraw {"text":"퀴즈가 완전히 종료된후 시작해주세요.","color":"red","msg":""}
|
|
|
|
# ---- 외부 모드 설치 검증 ----
|
|
# 두 모드는 성격이 달라서 검증 방식이 다름:
|
|
#
|
|
# * mq_chat_mod : mc_chat_answer_mod = 서버 전용 모드 (채팅 가로채기는
|
|
# 서버에서 일어남, 클라 설치 불필요). 따라서 fake player `#server`
|
|
# 점수를 모드가 매 server tick 마다 1 로 set. 서버에 모드가 없으면
|
|
# 이 점수가 갱신되지 않음.
|
|
#
|
|
# * mq_video_mod : mc_video_player_mod = 클라이언트 측 렌더링 + 서버 측
|
|
# 컴포넌트. 같은 objective 안에 holder 두 종류 사용:
|
|
# - `#server mq_video_mod` : 서버 컴포넌트가 매 tick 1 로 갱신 (server
|
|
# presence). 없으면 0 → 서버에 모드 미설치.
|
|
# - `<player> mq_video_mod` : 클라 join 시 payload 가 서버로 오면 서버
|
|
# 컴포넌트가 해당 플레이어 점수를 1 로 set (client presence). 클라
|
|
# 미설치면 0 유지.
|
|
# 이렇게 분리해야 "서버 미설치"와 "특정 플레이어 클라 미설치"가 안내에서
|
|
# 구분된다.
|
|
#
|
|
# 1) 서버 측 모드 부재 — 전원 차단, 단일 안내. 서버 부재는 클라 검사보다
|
|
# 우선해야 — 클라가 다 설치되어 있어도 서버가 없으면 동작 안 한다.
|
|
execute unless score #server mq_chat_mod matches 1 run return run function mq:tellraw {"text":"채팅정답 모드가 서버에 미설치 — 서버 관리자에게 문의해주세요.","color":"red","msg":""}
|
|
execute unless score #server mq_video_mod matches 1 run return run function mq:tellraw {"text":"영상재생 모드가 서버에 미설치 — 서버 관리자에게 문의해주세요.","color":"red","msg":""}
|
|
|
|
# 2) 클라이언트 측 모드 (mc_video_player_mod) 부재 — 본인 누락 안내 + 차단.
|
|
# selector `scores={X=..0}` 는 점수 미존재를 매치하지 않으므로 직전에
|
|
# `add @a ... 0` 으로 materialize. 개인 안내는 tellraw @s 직접 (mq:tellraw
|
|
# 는 내부 @a broadcast 라 부적합).
|
|
scoreboard players add @a mq_video_mod 0
|
|
execute as @a[scores={mq_video_mod=..0}] run tellraw @s ["",{"text":"영상재생 모드 미설치 — 모드 적용 후 다시 입장해주세요.","color":"red"}]
|
|
execute if entity @a[scores={mq_video_mod=..0}] run return run function mq:tellraw {"text":"필수 모드 미설치 플레이어가 있어 시작할 수 없습니다.","color":"red","msg":""}
|
|
|
|
setblock ~ ~ ~ minecraft:air
|
|
|
|
function mq:quiz/stop_sound
|
|
|
|
$scoreboard players set max_index main $(max_index)
|
|
scoreboard players set init main 1
|
|
|
|
# 시작 시 1..preload 번 영상 캐시 미리받기(큐 적재). schedule 로 다음 tick 에
|
|
# 실행해 max_index 설정 이후 동작 보장. 실제 다운로드는 drain 이 tick 마다 처리.
|
|
schedule function mq:videos/cache/preload 1t
|
|
|
|
dialog show @a mq:page1
|