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>
This commit is contained in:
@@ -10,12 +10,16 @@
|
||||
| `<player> mq_video_mod` | 해당 플레이어 클라에 모드 존재 | 서버 컴포넌트가 client→server payload 수신 시 1 |
|
||||
|
||||
둘 다 같은 objective `mq_video_mod` (dummy) 를 쓰고 holder 이름으로 의미를
|
||||
구분한다. 데이터팩 `mq:commands/start` 가드는 두 단계로 검사:
|
||||
서버 부재 → 전원 안내 후 차단 / 일부 플레이어 클라 부재 → 본인 안내 + 차단.
|
||||
구분한다. **영상재생 모드는 선택 모드라 미설치여도 `/start` 를 차단하지
|
||||
않는다.** `mq:commands/start` 는 두 점수를 보고 **경고만** 출력한다:
|
||||
서버 부재 → 전원에게 "영상 없이 진행됩니다" / 일부 플레이어 클라 부재 →
|
||||
본인에게만 "본인 화면에는 영상이 표시되지 않습니다". 게임은 그대로 진행된다.
|
||||
|
||||
> 참고: 자매 모드 `mc_chat_answer_mod` 는 채팅 가로채기가 본질적으로 서버
|
||||
> 측 동작이라 `#server mq_chat_mod` 한 가지만 쓴다 (per-player handshake 무의미).
|
||||
> 본 모드는 클라이언트가 직접 영상 렌더링하므로 per-player handshake 도 필요함.
|
||||
> 그쪽은 정답 판정의 핵심이라 **없으면 `/start` 가 실제로 차단된다.** 본
|
||||
> 모드는 클라이언트가 직접 영상 렌더링하므로 per-player handshake 가 필요하고,
|
||||
> 그 점수는 차단이 아니라 **플레이어별 경고**에만 쓰인다.
|
||||
|
||||
## 데이터팩 측이 이미 제공하는 것
|
||||
|
||||
@@ -32,25 +36,24 @@ scoreboard objectives add mq_video_mod dummy
|
||||
scoreboard players set @s mq_video_mod 0
|
||||
```
|
||||
|
||||
`mq:commands/start.mcfunction` 가드:
|
||||
`mq:commands/start.mcfunction` 경고 (차단 아님):
|
||||
|
||||
```mcfunction
|
||||
# 서버 부재 우선 차단
|
||||
execute unless score #server mq_video_mod matches 1 run return run function mq:tellraw {"text":"영상재생 모드가 서버에 미설치 — 서버 관리자에게 문의해주세요.","color":"red","msg":""}
|
||||
# unset 매치 안 되므로 materialize
|
||||
scoreboard players add @a mq_video_mod 0
|
||||
# 본인 안내 (tellraw @s 직접 — mq:tellraw 는 @a broadcast 라 부적합)
|
||||
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"}]
|
||||
```
|
||||
|
||||
`load.mcfunction` 에서 `#server mq_video_mod = 0` 으로 미리 깔아둠 → 서버
|
||||
컴포넌트가 한 tick 도 안 돌면 0 유지 → 가드 차단.
|
||||
컴포넌트가 한 tick 도 안 돌면 0 유지 → 서버 부재 경고 출력.
|
||||
|
||||
즉, **서버 컴포넌트가 (a) 매 tick `#server mq_video_mod=1` 갱신,
|
||||
(b) client payload 수신 시 송신 플레이어 점수=1 갱신**, 이 두 가지만 하면
|
||||
나머지는 데이터팩이 알아서 한다.
|
||||
나머지는 데이터팩이 알아서 한다. (점수가 0 이어도 게임은 진행되며, 경고
|
||||
출력과 영상 표시 여부에만 영향을 준다.)
|
||||
|
||||
## 모드가 구현해야 하는 동작
|
||||
|
||||
@@ -135,12 +138,13 @@ ServerPlayNetworking.registerGlobalReceiver(HelloPayload.TYPE, (payload, context
|
||||
|
||||
- 데이터팩 `mq:players/login` 이 spawn dialog 통과 시점에 점수를 0 으로
|
||||
리셋하므로, **클라 payload 주기 재전송은 필수**. login 이후 다음 재전송
|
||||
까지의 짧은 공백에 호스트가 start 를 누르면 가드가 차단되니, 재전송
|
||||
간격은 5 초 이하 권장.
|
||||
까지의 짧은 공백에 호스트가 start 를 누르면 (차단은 아니지만) 설치된
|
||||
플레이어에게도 잘못된 미설치 경고가 뜰 수 있으니, 재전송 간격은 5 초
|
||||
이하 권장.
|
||||
- 서버가 set 한 점수는 다음 join 시 login 에서 다시 0 으로 리셋됨 → 모드를
|
||||
빼고 재접속한 플레이어가 stale 1 을 가질 일 없음.
|
||||
- payload 송신 → 서버 처리는 ms 단위 → 주기 재전송이 살아 있는 한 start
|
||||
타이밍 race 없음.
|
||||
- payload 송신 → 서버 처리는 ms 단위 → 주기 재전송이 살아 있는 한 경고
|
||||
오탐 race 없음.
|
||||
|
||||
### 대안: `/trigger` 방식 (별도 서버 컴포넌트 불필요)
|
||||
|
||||
@@ -162,18 +166,21 @@ ServerPlayNetworking.registerGlobalReceiver(HelloPayload.TYPE, (payload, context
|
||||
4. 플레이어 spawn dialog 통과 → `mq:players/login` 이 점수를 0 으로 리셋.
|
||||
5. **클라 모드가 주기 재전송 (5 초 이하 권장, 필수)** → 늦어도 다음 주기에
|
||||
서버 모드가 다시 `mq_video_mod = 1` 로 갱신.
|
||||
6. 호스트 start → 가드가 `@a[scores={mq_video_mod=..0}]` 검사 → 클라 모드
|
||||
미설치 플레이어 있으면 시작 차단.
|
||||
6. 호스트 start → `@a[scores={mq_video_mod=..0}]` 검사 → 클라 모드 미설치
|
||||
플레이어 본인에게만 경고. 차단 없이 게임 진행 (해당 플레이어 화면에만
|
||||
영상 미표시).
|
||||
|
||||
## 테스트
|
||||
|
||||
1. **서버 미설치**: 서버에 모드 jar 가 없는 상태에서 데이터팩만 적용 →
|
||||
호스트 start → "영상재생 모드가 서버에 미설치 — 서버 관리자에게..." 한
|
||||
줄 출력 후 차단. (`#server mq_video_mod` 가 갱신되지 않음.)
|
||||
호스트 start → "영상재생 모드가 서버에 미설치 — 영상 없이 진행됩니다."
|
||||
노란 경고 출력 후 **그대로 게임 진행** (영상만 안 나옴).
|
||||
(`#server mq_video_mod` 가 갱신되지 않음.)
|
||||
2. **서버 설치 + 일부 클라 미설치**: 모드를 클라에 설치한 플레이어와 안
|
||||
한 플레이어 혼재 → 호스트 start → 클라 미설치 본인에게 "영상재생 모드
|
||||
미설치" + 전원에게 "필수 모드 미설치 플레이어가 있어..." 후 차단.
|
||||
3. **서버 + 모든 클라 설치**: 모두 정상 → start 정상 진행.
|
||||
한 플레이어 혼재 → 호스트 start → 클라 미설치 본인에게만 "영상재생 모드
|
||||
미설치 — 본인 화면에는 영상이 표시되지 않습니다." 노란 경고. 차단 없이
|
||||
게임 진행.
|
||||
3. **서버 + 모든 클라 설치**: 모두 정상 → start 정상 진행 + 영상 표시.
|
||||
4. `/scoreboard players list #server` 로 server presence 점수 확인,
|
||||
`/scoreboard players list <player>` 로 client presence 점수 확인.
|
||||
|
||||
|
||||
Reference in New Issue
Block a user