From 5d866a14573fb19fb7e9625b20ed4841ab8697d1 Mon Sep 17 00:00:00 2001 From: "Claude (owner)" Date: Fri, 5 Jun 2026 02:51:51 +0900 Subject: [PATCH] =?UTF-8?q?=EC=98=81=EC=83=81=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=EB=A5=BC=20=EC=84=A0=ED=83=9D(optional)=20=EB=AA=A8=EB=93=9C?= =?UTF-8?q?=EB=A1=9C=20=E2=80=94=20=EB=AF=B8=EC=84=A4=EC=B9=98=20=EC=8B=9C?= =?UTF-8?q?=20=EC=B0=A8=EB=8B=A8=20=EB=8C=80=EC=8B=A0=20=EA=B2=BD=EA=B3=A0?= =?UTF-8?q?=EB=A7=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit start.mcfunction 의 mq_video_mod 서버/클라 부재 차단(return)을 제거하고 노란색 경고 출력 후 그대로 진행하도록 변경. 영상 모드 없이도 게임을 시작/플레이할 수 있다(영상만 미표시). 채팅정답 모드(mq_chat_mod)는 정답 판정에 필수라 서버 부재 차단 유지. load/players/login 주석의 "필수 모드/차단" 뉘앙스도 "선택 모드, 없으면 영상 없이 진행"으로 정정. Co-Authored-By: Claude Opus 4 --- .../mq/function/commands/start.mcfunction | 40 +++++++------------ music_quiz/data/mq/function/load.mcfunction | 8 ++-- .../data/mq/function/players/login.mcfunction | 9 +++-- 3 files changed, 25 insertions(+), 32 deletions(-) diff --git a/music_quiz/data/mq/function/commands/start.mcfunction b/music_quiz/data/mq/function/commands/start.mcfunction index e76382e..32083b7 100644 --- a/music_quiz/data/mq/function/commands/start.mcfunction +++ b/music_quiz/data/mq/function/commands/start.mcfunction @@ -1,35 +1,25 @@ execute if score init main matches 10 run return run function mq:tellraw {"text":"퀴즈가 완전히 종료된후 시작해주세요.","color":"red","msg":""} -# ---- 외부 모드 설치 검증 ---- -# 두 모드는 성격이 달라서 검증 방식이 다름: +# ---- 외부 모드 확인 ---- +# * mq_chat_mod : mc_chat_answer_mod = 채팅 정답 판정에 필수인 서버 전용 +# 모드. 서버에서 채팅을 가로채야 퀴즈가 성립하므로 없으면 시작 차단. +# 모드가 매 server tick 마다 fake player `#server` 점수를 1 로 set. # -# * 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 → 서버에 모드 미설치. -# - ` mq_video_mod` : 클라 join 시 payload 가 서버로 오면 서버 -# 컴포넌트가 해당 플레이어 점수를 1 로 set (client presence). 클라 +# * mq_video_mod : mc_video_player_mod = 정답 영상 재생용 선택 모드. 없어도 +# 게임은 정상 진행되며 영상만 표시되지 않는다 → 차단하지 않고 경고만 출력. +# - `#server mq_video_mod` : 서버 컴포넌트가 매 tick 1 로 갱신. 없으면 0. +# - ` mq_video_mod` : 클라 join handshake 수신 시 1 로 set. 클라 # 미설치면 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) 부재 — 본인 누락 안내 + 차단. +# 1) 채팅정답 모드(필수) 서버 부재 — 전원 차단. +execute unless score #server mq_chat_mod matches 1 run return run function mq:tellraw {"text":"채팅정답 모드가 서버에 미설치 — 서버 관리자에게 문의해주세요.","color":"red","msg":""} + +# 2) 영상 모드(선택) 부재 — 경고만 출력하고 그대로 진행. 영상은 안 나옴. # selector `scores={X=..0}` 는 점수 미존재를 매치하지 않으므로 직전에 -# `add @a ... 0` 으로 materialize. 개인 안내는 tellraw @s 직접 (mq:tellraw -# 는 내부 @a broadcast 라 부적합). +# `add @a ... 0` 으로 materialize. 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":""} +execute unless score #server mq_video_mod matches 1 run function mq:tellraw {"text":"영상재생 모드가 서버에 미설치 — 영상 없이 진행됩니다.","color":"yellow","msg":""} +execute if score #server mq_video_mod matches 1 as @a[scores={mq_video_mod=..0}] run tellraw @s ["",{"text":"영상재생 모드 미설치 — 본인 화면에는 영상이 표시되지 않습니다.","color":"yellow"}] setblock ~ ~ ~ minecraft:air diff --git a/music_quiz/data/mq/function/load.mcfunction b/music_quiz/data/mq/function/load.mcfunction index 7831eb6..f34d75c 100644 --- a/music_quiz/data/mq/function/load.mcfunction +++ b/music_quiz/data/mq/function/load.mcfunction @@ -23,9 +23,11 @@ scoreboard objectives add answer dummy scoreboard objectives add leave_game custom:leave_game # 외부 모드 존재 확인용 점수. -# mq_chat_mod : 서버 전용 모드(mc_chat_answer_mod). 모드가 매 server tick -# 마다 fake player `#server` 점수를 1 로 set. 모드가 서버에 없으면 0 유지. -# mq_video_mod : 클라이언트 모드(mc_video_player_mod). 클라 join 시 서버로 +# mq_chat_mod : 채팅 정답 판정 필수 모드(mc_chat_answer_mod, 서버 전용). +# 모드가 매 server tick 마다 fake player `#server` 점수를 1 로 set. 서버에 +# 없으면 0 유지 → start 차단. +# mq_video_mod : 정답 영상 재생용 선택 모드(mc_video_player_mod). 없어도 +# 게임은 진행되고 영상만 안 나온다(start 는 경고만). 클라 join 시 서버로 # handshake payload 전송 → 서버 측 모드가 해당 플레이어 점수를 1 로 set. # 클라에 모드가 없으면 0 유지. (login.mcfunction 에서 플레이어별 0 초기화.) scoreboard objectives remove mq_chat_mod diff --git a/music_quiz/data/mq/function/players/login.mcfunction b/music_quiz/data/mq/function/players/login.mcfunction index 0c90af8..28cfd3c 100644 --- a/music_quiz/data/mq/function/players/login.mcfunction +++ b/music_quiz/data/mq/function/players/login.mcfunction @@ -1,12 +1,13 @@ tag @s add player scoreboard players reset @s leave_game -# 외부 모드 검증 점수 초기화 (per-player 검증 대상만). -# mq_video_mod : 클라이언트 모드(mc_video_player_mod) 가 join 시 handshake +# 외부 모드 확인 점수 초기화 (per-player 대상만). +# mq_video_mod : 영상 모드(mc_video_player_mod, 선택)는 join 시 handshake # payload 를 서버로 보내면 서버 모드가 해당 플레이어 점수를 1 로 set 한다. # 여기서 0 으로 미리 깔아 두면 handshake 가 없는 플레이어는 0 유지 → -# start 가드 차단. handshake 가 오면 곧바로 1 로 갱신됨. -# mq_chat_mod 는 서버 전용 모드라 fake player(#server) 로 검증 — per-player +# start 에서 "영상 안 보임" 경고 대상이 된다(차단은 아님). handshake 가 +# 오면 곧바로 1 로 갱신됨. +# mq_chat_mod 는 서버 전용 모드라 fake player(#server) 로 확인 — per-player # 초기화 불필요. scoreboard players set @s mq_video_mod 0