
FancyNpcs – Minecraft Java Edition 1.19.4–1.21.x
의존성: 플랫폼: Paper / Folia (Spigot 및 기타 구식 Bukkit 포크는 지원되지 않음) Java 버전: Java 21+ (최신 빌드에는 Java 25가 필요함) Minecraft 버전: 1.19.4 – 1.21.x 추가…
의존성: 플랫폼: Paper / Folia (Spigot 및 기타 구식 Bukkit 포크는 지원되지 않음) Java 버전: Java 21+ (최신 빌드에는 Java 25가 필요함) Minecraft 버전: 1.19.4 – 1.21.x 추가 라이브러리: PlaceholdersAPI (액션 인터페이스에 변수를 통합하는 데 권장됨) Minecraft 서버에서 상호작용형 비플레이어 캐릭터(NPC)
의존성:
플랫폼: Paper / Folia (Spigot 및 기타 구식 Bukkit 포크는 지원되지 않음)
Java 버전: Java 21+ (최신 빌드에는 Java 25가 필요함)
Minecraft 버전: 1.19.4 – 1.21.x
추가 라이브러리: PlaceholdersAPI (액션 인터페이스에 변수를 통합하는 데 권장됨)
Minecraft 서버에서 상호작용형 비플레이어 캐릭터(NPC)를 생성하는 작업에는 전통적으로 상당한 하드웨어 비용이 따른다. 구식 솔루션은 NPC를 완전한 서버 엔티티(Entity)로 등록하므로, 코어가 그들의 인공지능, 물리 충돌, 경로 탐색, 청크 로딩을 처리하도록 강제한다. 이는 캐릭터 수가 늘어남에 따라 TPS(Ticks Per Second) 지표의 치명적인 하락을 초래한다. FancyNpcs 플러그인은 가상 캐릭터를 렌더링하는 대안적인 패킷 기반 방식을 제공하며, 이를 통해 서버 스레드 성능에 어떤 영향도 주지 않고 수백 개의 상호작용형 형상을 유지할 수 있다.
패킷 아키텍처와 Folia 호환성
FancyNpcs의 핵심적인 기술적 특징은 생성된 캐릭터가 오직 플러그인의 메모리와 연결된 클라이언트 측에만 존재한다는 점이다. 서버는 그들을 월드 데이터베이스에 추가하지 않으며, 일반적인 엔티티 갱신 주기에서 처리하지도 않는다.
플레이어가 지정된 좌표에 접근하면, 플러그인은 네트워크 트래픽을 가로채 클라이언트에 ClientboundAddPlayerPacket(인간형 모델용) 또는 ClientboundAddEntityPacket(다른 생물용) 패킷을 전송한다. 이후의 동작, 장비, 표시 상태는 ClientboundSetEntityDataPacket(메타데이터)와 ClientboundSetEquipmentPacket(장비) 패킷을 이용해 갱신된다. 서버에게 이 캐릭터들은 존재하지 않으며, 최종 사용자를 위한 「가상 투영」일 뿐이다.
이러한 접근 방식은 FancyNpcs를 Folia 기반 멀티스레드 서버에 이상적인 선택으로 만든다. Folia는 월드를 각각 자체 스레드에서 동작하는 개별 영역으로 분할하기 때문에, 전통적인 NPC 플러그인은 서로 다른 영역의 스레드 간 상호작용 시도로 인해 종종 데드락과 치명적 오류를 일으킨다. FancyNpcs는 데이터를 비동기적으로 처리하고 패킷을 플레이어에게 직접 전송하여 Folia 작업 스케줄러와의 충돌을 완전히 피한다.
외형 커스터마이징 기능
플러그인은 다양한 엔티티 유형과 시각 효과를 지원한다. 플레이어는 어떤 바닐라 몹(Player, Cow, Zombie, Skeleton, Villager, Pig 등)의 형태로도 NPC를 생성하고 그 외형을 세밀하게 조정할 수 있다.
스킨 관리 (인간형 모델용)
player 유형의 캐릭터에는 텍스처를 불러올 수 있는 여러 소스가 제공된다:
@mirror: NPC의 스킨이 그 순간 NPC를 바라보는 플레이어의 스킨을 동적으로 복사한다.정품 계정의 이름 또는 UUID: 플러그인이 해당 텍스처를 불러오기 위해 Mojang 세션 서버에 자동으로 요청을 보낸다.
웹 리소스로의 직접 링크(URL): 웹 서버에서 임의의 외부 .png 파일을 불러올 수 있는 기능.
로컬 파일: 미리 /plugins/FancyNpcs/skins/ 폴더에 배치된 이미지.
플래그
--slim: 링크로 불러온 스킨에 대해 가는 팔 모델(Alex 스타일)의 사용을 활성화한다.
시각 효과 및 속성
발광 (Glowing): 캐릭터 주위에 색깔 있는 윤곽선을 추가한다. 색상은 바닐라 팀 색상(Team Colors)에 연동된다.
장비 (Equipment): 캐릭터에게 왼손이나 오른손에 임의의 아이템을 쥐여 줄 수 있으며, 투구, 흉갑, 다리 보호구, 부츠를 착용시킬 수도 있다.
자세 (Poses): 앉기, 눕기(침대에서 자는 모습 모방), 헤엄치기, 기어가기와 같은 특정 표시 상태가 지원된다.
크기 (Scale): 플러그인의 새로운 버전에서는 엔티티 크기 조정(모델의 물리적 크기 변경) 지원이 구현되었다.
명령어 시스템과 구문
캐릭터 관리는 오직 게임 내 채팅이나 서버 콘솔의 명령어를 통해서만 이루어진다. 아래 표에는 기본 구문에 대한 설명이 담겨 있다:
명령어 | 설명 및 매개변수 | 사용 예시 |
| 새 캐릭터 생성 |
|
| 기존 캐릭터 삭제 |
|
| 스킨 변경 (이름, url 또는 @mirror) |
|
| 플레이어가 들고 있는 아이템을 NPC에게 착용시킴 |
|
| 모델 주위에 색깔 있는 발광을 켬 |
|
| 캐릭터가 고개를 플레이어 쪽으로 돌리게 함 |
|
| 특정 자세나 몹 변형을 설정함 |
|
플러그인의 전역 관리를 위해서는 플랫폼 명령어가 사용된다:
/fancynpcs reload— 시스템 구성을 다시 불러온다./fancynpcs save— 모든 NPC의 현재 상태를 데이터베이스 파일로 강제로 디스크에 기록한다.
상호작용 액션 시스템 (Actions)
FancyNpcs에는 플레이어가 캐릭터와 상호작용할 때 활성화되는 내장 액션 스크립팅 메커니즘이 포함되어 있다. 액션은 다양한 클릭 유형(LEFT_CLICK, RIGHT_CLICK, ANY_CLICK)에 대해 설정할 수 있다.
플러그인은 실행할 수 있는 다음과 같은 액션 유형을 제공한다:
message: 플레이어에게 메시지를 전송한다. MiniMessage(Hex 색상)와 PlaceholdersAPI 변수를 지원한다.player_command: 플레이어 명의로 명령어를 실행한다.player_command_as_op: 일시적으로 오퍼레이터 권한을 부여하여 플레이어 명의로 명령어를 실행한다(일반 플레이어가 사용할 수 없는 명령어를 활성화하기 위함).console_command: 서버 콘솔로 명령어를 실행한다. {player} 변수는 자동으로 플레이어의 이름으로 대체된다.send_to_server: 플레이어를 BungeeCord 또는 Velocity 네트워크의 다른 서버로 즉시 이동시킨다.wait: 액션 사이에 일시 정지를 생성한다(서버 틱 단위의 지연).block_until_done: 현재 액션 시나리오가 완료될 때까지 NPC를 반복적으로 클릭하는 것을 방지한다.execute_random_action: 목록의 다음 액션 중 하나를 무작위로 선택한다.
Bob이라는 이름의 NPC를 위한 복잡한 상호작용 시나리오 생성 예시:
환영 메시지 추가:
/npc action Bob RIGHT_CLICK add message <yellow>우리 서버에 오신 것을 환영합니다, %player_name%!</yellow>40틱(2초)의 일시 정지 추가:
/npc action Bob RIGHT_CLICK add wait 40콘솔로 플레이어를 스폰으로 텔레포트:
/npc action Bob RIGHT_CLICK add console_command teleport {player} 0 100 0
여러 개의 연속 단계를 추가하고 add_before, add_after 및 move_up/move_down으로 순서를 조정할 수 있는 기능 덕분에, 관리자는 Denizen이나 MyCommand 같은 추가 플러그인을 설치하지 않고도 완전한 대화 트리나 로비 서버 간의 복잡한 전환 메커니즘을 구축할 수 있다.
설정 파일 구조
모든 데이터는 plugins/FancyNpcs/ 디렉터리에 저장된다. 플러그인의 작동은 두 개의 파일에 기반한다:
1. config.yml
이 파일은 플러그인의 전역 동작을 정의하며 다음과 같은 설정을 포함한다:
turn_to_player_distance(기본값 5): 캐릭터가 고개를 플레이어 쪽으로 돌리는 블록 단위 반경. 이 매개변수를 낮추면 혼잡한 구역에서 네트워크 패킷 전송이 최적화된다.visibility_distance(기본값 20): NPC 출현 패킷이 클라이언트에 전송되는 블록 단위 거리. 줄이면 플레이어의 FPS를 절약하기 위해 캐릭터를 벽이나 렌더링 안개 뒤에 숨기는 데 도움이 된다.enable_autosave: 변경 사항을 디스크에 자동으로 주기적으로 기록함.
2. npcs.yml
이 파일에 플러그인은 생성된 NPC의 데이터베이스를 저장한다. 각 캐릭터는 별도의 데이터 블록으로 기술된다:
YAML
Bob: id: 104 type: PLAYER world: world x: 10.5 y: 64.0 z: -25.5 yaw: 90.0 pitch: 0.0 glowing: false turn_to_player: true skin: value: "eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUv..." signature: "d3G8h...==" actions: RIGHT_CLICK: - type: MESSAGE value: "<green>환영합니다!</green>" |
경고: npcs.yml 파일을 수동으로 편집하는 것은 구문 손상이나 좌표의 잘못된 정의 위험 때문에 매우 권장되지 않는다. NPC 구성의 모든 변경은 오직 게임 내 명령어를 통해서만 수행하고, 그런 다음 /fancynpcs save로 저장해야 한다.
결론
FancyNpcs 플러그인은 Minecraft Java Edition 서버에서 장식용 및 상호작용형 캐릭터를 생성하기 위한 현대적이고 효율적인 솔루션이다. 이는 구식 도구의 주요 문제, 즉 엔티티 유지를 위한 서버 프로세서 시간 소모를 제거한다.
플러그인의 주요 한계는 인공지능의 완전한 부재이다. 캐릭터는 클라이언트 측의 가상 투영이므로, 스스로 월드를 돌아다니거나 블록과 상호작용하거나 다른 몹을 공격할 수 없다.
복잡한 이동 메커니즘(웨이포인트 내비게이션)과 전투 시스템(Sentinel 모드)과의 통합을 지원하는 고전적인 Citizens 플러그인과 비교하면, FancyNpcs는 인공지능의 유연성 면에서 뒤떨어진다. 그러나 Citizens는 서버의 메인 스레드에 막대한 부하를 주며 Folia에서의 사용에는 사실상 부적합하다. FancyNpcs는 캐릭터에게 오직 정적인 존재감, 좋은 외형, 그리고 클릭 시 명령어의 빠른 실행만이 요구되는 로비 서버, Velocity 허브, 대규모 SMP 프로젝트를 위한 이상적인 대안을 제공한다.
설치
일반적인 설치는 약 5 분 정도 걸려요. 과정은 동일하고, Loader 와 그에 맞는 빌드만 달라요.
- 1Stop your Minecraft server.
- 2Drop the plugin .jar into the server /plugins folder.
- 3Start the server once so the plugin generates its config files.
- 4Edit /plugins/<name>/config.yml as needed, then run /reload confirm or restart.








