과거의 플레이어 행동을 유령으로 되살려 보는 Paper 플러그인
모든 플레이어의 움직임, 블록 조작, 전투, 사망을 기록하고 — 투명한 고스트 엔티티로 다시 재생합니다. 게임플레이 연출과 서버 보안, 두 가지 목적을 동시에 달성하는 올인원 기록/재생 시스템입니다.
| 기능 | 설명 |
|---|---|
| 자기 재생 | 자신의 과거 행동을 고스트로 되돌려 봅니다. 건축 과정 리뷰, 탐험 경로 확인 등에 활용할 수 있습니다. |
| 사망 유령 | 플레이어가 사망한 위치에 붉은 해골 고스트가 나타납니다. 위험 지역을 시각적으로 경고해줍니다. |
| 스펙터 존 | 플레이어 활동이 많은 청크에 밀도에 따라 다른 색상의 파티클이 나타납니다. (흰색 → 파란색 → 보라색 → 금색) |
| 유령 메시지 | 월드 어디에든 떠다니는 메시지를 남길 수 있습니다. 다른 플레이어에게 힌트나 메모를 전달하세요. |
| 기능 | 설명 |
|---|---|
| 타인 기록 재생 | 관리자가 특정 플레이어의 과거 행동을 고스트로 재생하여 확인할 수 있습니다. 분쟁 해결, 테러 확인에 유용합니다. |
| 영역 기록 재생 | 특정 반경 내에서 활동한 모든 플레이어의 기록을 한번에 재생합니다. 건물이 파괴된 현장 조사 등에 적합합니다. |
| 실시간 감시 | 특정 플레이어의 행동을 실시간으로 모니터링합니다. 액션바에 실시간 행동이 표시됩니다. |
| 자동 알림 | 대량 블록 파괴, 엑스레이 패턴, 속도 이상, 컨테이너 습격, 용암 배치 등 의심스러운 행위를 자동으로 감지하고 알림을 보냅니다. |
- BossBar UI — 재생 진행률, 경과 시간, 배속을 실시간으로 표시
- 속도 조절 — 0.25배 ~ 8배속까지 자유롭게 변경
- 일시정지/재개 — 특정 장면에서 멈추고 관찰 가능
- 고스트 렌더링 — ArmorStand(플레이어 헤드) + TextDisplay(이름표) + 파티클 궤적으로 유령을 시각화
- 뷰어 전용 — 고스트는 재생을 요청한 플레이어에게만 보입니다
| 명령어 | 설명 |
|---|---|
/specter help |
도움말을 표시합니다 |
/specter self [시간] |
자신의 과거 행동을 재생합니다 (기본: 30분) |
/specter stop |
현재 재생을 정지합니다 |
/specter pause |
재생을 일시정지하거나 재개합니다 |
/specter speed <배속> |
재생 속도를 변경합니다 (0.25, 0.5, 1, 2, 4, 8) |
/specter message <텍스트> |
현재 위치에 유령 메시지를 남깁니다 |
/specter message delete |
가장 가까운 내 메시지를 삭제합니다 |
/specter deaths [on/off] |
사망 유령 표시를 켜거나 끕니다 |
/specter zone |
현재 위치의 스펙터 존 정보를 확인합니다 |
| 명령어 | 권한 | 설명 |
|---|---|---|
/specter replay <플레이어> [시간] |
specter.admin.replay |
다른 플레이어의 기록을 재생합니다 |
/specter area <반경> [시간] |
specter.admin.area |
주변 영역의 모든 기록을 재생합니다 |
/specter watch <플레이어> |
specter.admin.watch |
플레이어를 실시간 감시합니다 |
/specter watch stop |
specter.admin.watch |
감시를 중단합니다 |
/specter alerts [페이지] |
specter.admin.alerts |
보안 알림 목록을 확인합니다 |
/specter alerts review <ID> |
specter.admin.alerts |
알림을 확인 처리합니다 |
/specter alerts replay <ID> |
specter.admin.alerts |
알림 관련 기록을 재생합니다 |
/specter reload |
specter.admin.reload |
설정을 다시 불러옵니다 |
/specter stats |
specter.admin.reload |
스토리지 통계를 확인합니다 |
💡 별칭:
/specter대신/sp또는/spc를 사용할 수 있습니다.
- Paper 1.21.4 이상 (Spigot은 지원하지 않습니다)
- Java 21 이상
- Releases 페이지에서 최신
Specter-x.x.x.jar를 다운로드합니다. - 서버의
plugins/폴더에 넣습니다. - 서버를 시작하거나 재시작합니다.
plugins/Specter/config.yml이 자동으로 생성됩니다. 필요에 따라 수정하세요.
git clone https://github.com/wjddusrb03/Specter.git
cd Specter
mvn clean package
# target/Specter-1.0.0.jar 생성plugins/Specter/config.yml에서 모든 설정을 관리합니다.
recording:
enabled: true # 기록 시스템 활성화
position:
min-distance: 0.5 # 위치 기록 최소 이동 거리 (블록)
min-interval-ms: 100 # 위치 기록 최소 간격 (밀리초)
actions:
block-break: true # 블록 파괴 기록
block-place: true # 블록 설치 기록
entity-attack: true # 엔티티 공격 기록
container-open: true # 컨테이너 열기 기록
death: true # 사망 기록
session:
duration-seconds: 300 # 세션 플러시 간격 (5분)
storage:
retention:
hot-hours: 24 # 빠른 접근 보관 기간
warm-days: 7 # 일반 보관 기간
cold-days: 30 # 장기 보관 기간
death-days: 90 # 사망 기록 보관 기간
max-storage-mb: 5120 # 최대 저장 용량 (MB)
gameplay:
death-echo:
enabled: true # 사망 유령 활성화
duration-minutes: 30 # 사망 유령 지속 시간
max-per-chunk: 5 # 청크당 최대 사망 유령 수
echo-message:
enabled: true # 유령 메시지 활성화
duration-days: 7 # 메시지 유지 기간
max-per-player: 10 # 플레이어당 최대 메시지 수
security:
alerts:
enabled: true # 보안 알림 활성화
rendering:
max-total-ghosts: 200 # 전체 최대 고스트 수
max-ghosts-per-viewer: 30 # 뷰어당 최대 고스트 수| 권한 | 기본값 | 설명 |
|---|---|---|
specter.use |
true |
기본 명령어 사용 |
specter.self |
true |
자기 재생 |
specter.deaths |
true |
사망 유령 토글 |
specter.message |
true |
유령 메시지 작성 |
specter.admin.replay |
op |
타인 기록 재생 |
specter.admin.area |
op |
영역 기록 재생 |
specter.admin.watch |
op |
실시간 감시 |
specter.admin.alerts |
op |
보안 알림 관리 |
specter.admin.reload |
op |
설정 재로드 |
specter.admin.* |
op |
모든 관리자 권한 |
플레이어 행동 → RecordingListener (MONITOR) → RecordingBuffer (메모리)
↓ (5분마다 자동 플러시)
StorageManager
├─ SQLite (세션 메타데이터, 인덱스)
└─ .echo 파일 (GZIP 압축 바이너리)
- 델타 기반 기록: 위치가 0.5블록 이상 변경되었을 때만 기록 (성능 최적화)
- 바이너리 포맷:
"ECHO"매직 넘버 + 버전 + [액션타입 + 타임스탬프 + 데이터]* 구조 - GZIP 압축: 원본 대비 70~90% 용량 절감
/specter self → PlaybackEngine (비동기 데이터 로드)
↓
PlaybackSession (틱 루프)
↓
GhostEntity (ArmorStand + TextDisplay + 파티클)
↓
뷰어에게만 표시 (per-player visibility)
| 감지 유형 | 기준 |
|---|---|
MASS_BREAK |
짧은 시간 내 대량 블록 파괴 |
XRAY_PATTERN |
다이아몬드/에메랄드 등 희귀 광물 연속 채굴 |
SPEED_ANOMALY |
비정상적 이동 속도 |
CONTAINER_RAID |
짧은 시간 내 다수의 컨테이너 접근 |
LAVA_PLACE |
의심스러운 위치에 용암 배치 |
스크린샷은 추후 추가 예정입니다. 직접 서버에서 사용해보세요!
Q: Spigot에서도 작동하나요?
A: 아닙니다. Paper 전용 API(Adventure, TextDisplay 등)를 사용하므로 Paper 1.21.4 이상에서만 작동합니다.
Q: 서버 성능에 영향이 있나요?
A: 최소한으로 설계되었습니다. 위치 기록은 델타 방식, DB 쓰기는 비동기 배치 처리, 고스트는 뷰어에게만 렌더링됩니다. 대규모 서버에서도 안정적으로 운영할 수 있습니다.
Q: 저장 용량이 걱정됩니다.
A:
config.yml에서max-storage-mb와 보관 기간을 조절할 수 있습니다. GZIP 압축으로 용량을 크게 절감합니다.
Q: 고스트가 다른 플레이어에게도 보이나요?
A: 아닙니다. 고스트는 재생을 요청한 플레이어에게만 보입니다. 다른 플레이어의 게임 경험에 영향을 주지 않습니다.
Q: 기존 EchoWorld 데이터와 호환되나요?
A: 바이너리 포맷(
"ECHO"헤더)은 동일하므로.echo파일은 호환됩니다. 단, 플러그인 폴더명이 변경되었으므로 데이터 폴더를 수동으로 이동해야 할 수 있습니다.
버그를 발견하셨거나, 개선 아이디어가 있으시다면 언제든지 알려주세요!
- Issues 탭에서 New Issue를 클릭합니다.
- 아래 내용을 포함해주세요:
- 문제 설명: 어떤 상황에서 어떤 문제가 발생했는지
- 재현 방법: 문제를 재현하는 단계
- 서버 환경: Paper 버전, Java 버전, 다른 플러그인 목록
- 에러 로그: 콘솔에 오류가 출력되었다면 함께 첨부해주세요
새로운 기능이 필요하시다면 Issues에 [기능 요청] 태그를 붙여 제안해주세요.
어떤 의견이든 환영합니다! 🙌
이 프로젝트는 MIT License를 따릅니다.
⭐ 마음에 드셨다면 Star를 눌러주세요! ⭐