콘텐츠로 이동

플러그인 서버

바닐라 특성만 놓고 보면 플러그인 서버는 바닐라 테크니컬 서바이벌에 잘 맞지 않는다. Paper 문서에도 이렇게 적혀 있다.

Unfortunately, it currently is not possible to get a 100% Vanilla experience in Paper.

안타깝게도 현재 Paper에서는 100% 바닐라 경험을 얻을 수 없다.

그래도 넓은 플러그인 생태계와 괜찮은 최적화 덕분에 가벼운 테크니컬 서바이벌 정도라면 플러그인 서버를 쓰는 사람도 있다. 이 문서는 서버 설정을 조정해 플러그인 서버에서 바닐라 특성과 관련 동작을 최대한 복원하고, 가벼운 테크니컬 서바이벌이나 바닐라 서바이벌 경험에 가깝게 만드는 방법을 다룬다.

config/paper-world-defaults.yml
chunks:
# 청크 언로드를 지연할 시간. 10h(시간), 25m(분)처럼 숫자 뒤에 단위 하나를 붙인다. d, h, m, s 단위를 지원한다
# 0s로 설정하면 엔더 진주 정체형 귀환 장치를 쓸 수 있다
delay-chunk-unloads-by: 0s
# 틱당 자동 저장할 최대 청크 수
max-auto-save-chunks-per-tick: 200
collisions:
# 엔티티가 너무 많아 끼임(cramming)이 발생했을 때 플레이어가 피해를 받을지 여부
allow-player-cramming-damage: true
# 이 수에 도달하면 서버가 엔티티 충돌 처리를 멈춘다
# 2147483647이나 매우 큰 값으로 설정하면 밀집한 엔티티 충돌을 최대한 처리한다. 성능이 떨어질 수 있다
max-entity-collisions: 2147483647
entities:
behavior:
# 벌이 벌집을 떠나려다 실패했을 때 쿨다운을 둘지 여부
# 바닐라에서 벌은 벌집이 블록에 막혔는지와 날씨를 계속 확인해 떠날 수 있는지 판단한다
# false로 설정하면 벌집을 막던 울타리 문이 열리는 등 조건이 맞는 즉시 벌이 벌집을 떠난다
cooldown-failed-beehive-releases: false
# 높이가 같은 떨어진 아이템끼리만 합칠지 여부
only-merge-items-horizontally: true
# 크리에이티브 모드 플레이어 주변에서 팬텀 스폰을 막을지 여부
phantoms-do-not-spawn-on-creative-players: false
# 팬텀이 오랫동안 잠을 자지 않은 플레이어만 공격할지 여부
phantoms-only-attack-insomniacs: false
# 엔티티가 갇혔을 때 POI를 다시 찾기까지의 쿨다운(단위: 틱)
# disabled로 설정하면 추가 쿨다운을 두지 않는다
stuck-entity-poi-retry-delay: disabled
spawning:
# 화살이 사라지기까지의 최대 시간(단위: 틱)
# disabled로 설정하면 계속 움직이는 화살이 제거되지 않아, 이 메커니즘을 이용한 청크 로더 등의 장치를 쓸 수 있다
# 대신 플레이어가 이 메커니즘으로 렉 유발 장치를 만들 수도 있다
max-arrow-despawn-invulnerability: disabled
# 스포너에서 나온 몹과 기타 엔티티를 전역 몹 스폰 한도에 포함할지 여부
count-all-mobs-for-spawning: true
duplicate-uuid:
# UUID가 중복된 엔티티를 처리하는 방식. 다음 값을 지원한다
# SAFE_REGEN(UUID를 새로 부여하고, 비슷한 엔티티면 삭제)
# DELETE(엔티티 삭제)
# NOTHING(처리하지 않고 로그도 남기지 않음)
# WARN(처리하지 않고 로그만 남김)
mode: NOTHING
# 떨어지는 블록에서 특정 NBT 데이터를 제거할지 여부(일부 모험 맵은 이 옵션을 꺼야 하지만, 공개 서버에서는 끄는 것을 권장하지 않는다)
filter-bad-tile-entity-nbt-from-falling-blocks: false
# 아이템의 EntityTag에서 제거할 NBT 태그 목록. 형식은 바닐라 명령어에서 쓰는 것과 같다
# 빈 목록으로 설정하면 제거하지 않는다
filtered-entity-tag-nbt-paths: []
# 몹 스폰 한도를 플레이어별로 계산할지 여부(켜면 몹이 고르게 분포하고 한 플레이어가 스폰 한도를 독차지하지 않는다)
# false로 설정하면 바닐라 스폰 메커니즘을 따른다
per-player-mob-spawns: false
fixes:
# 떨어진 아이템이 벽을 사이에 두고 합쳐지는 문제를 고칠지 여부
# spigot.yml의 merge-radius.item 값이 클 때만 사용을 권장한다
# true로 설정. 바닐라 동작은 아니지만 테크니컬 장치에 도움이 될 수 있다
fix-items-merging-through-walls: true
hopper:
# 호퍼가 가득 찼을 때 짧은 쿨다운을 둬서 새 아이템을 계속 빨아들이려 하지 않게 할지 여부
cooldown-when-full: false
maps:
# 지도 하나에 허용되는 최대 커서(마커) 수. 마커가 너무 많으면 클라이언트 렉이 생긴다
item-frame-cursor-limit: 2147483647
misc:
# 엔더 드래곤 부활 전 엔드 수정 설치 위치를 확인하는 최적화를 끌지 여부
# true로 설정하면 원격으로 엔더 드래곤을 부활시키거나 드래곤 학살포 같은 장치를 쓸 수 있다
allow-remote-ender-dragon-respawning: true
# 블록 업데이트 시 주변 몹의 길찾기도 업데이트할지 여부
# true로 설정하면 블록 변경에 따른 길찾기 업데이트에 크게 의존하는 테크니컬 장치가 정상 동작한다
update-pathfinding-on-block-update: true
scoreboards:
# 플레이어가 아닌 엔티티를 항상 스코어보드 팀에 속한 것으로 볼지 여부
# true로 설정하면 일부 데이터팩 기능과 호환된다
allow-non-player-entities-on-scoreboards: true
# 바닐라 스코어보드의 플레이어 이름 색상을 쓸지 여부(바닐라 클라이언트용 모험 맵에 유용하다)
# true로 설정하면 일부 데이터팩 기능과 호환된다
use-vanilla-world-scoreboard-name-coloring: true
unsupported-settings:
# 월드에 플레이어나 강제 로드 청크가 없을 때 그 월드의 틱 연산을 멈출지 여부
disable-world-ticking-when-empty: true
# 무적 엔드 수정 버그(MC-108513)를 고칠지 여부
fix-invulnerable-end-crystal-exploit: false
config/paper-global.yml
commands:
# Tab 자동 완성 결과가 없을 때 접속 중인 플레이어 이름 목록을 보여줄지 여부
suggest-player-names-when-null-tab-completions: false
# /time 명령어를 모든 월드에 적용할지 여부. 아니면 실행한 사람이 있는 월드에만 적용된다
time-command-affects-all-worlds: true
item-validation:
book:
# 책 저자 이름 최대 길이(단위: 글자)
author: 214748364
# 책 최대 페이지 수(단위: 글자)
page: 2147483647
# 책 제목 최대 길이(단위: 글자)
title: 2147483647
book-size:
# 책 한 페이지에 허용되는 최대 바이트 수
# disabled로 설정하면 제한을 없앤다
page-max: disabled
# 아이템 표시 이름 최대 길이(단위: 글자)
display-name: 2147483647
# 아이템 설명(lore) 한 줄의 최대 길이(단위: 글자)
lore-line: 2147483647
# 책 안의 명령어 선택자를 해석할지 여부(켜면 크리에이티브 모드 아이템을 줄 때 서버 크래시가 날 수 있다)
resolve-selectors-in-books: true
misc:
# 엔드의 초원거리 지형 생성 문제(MC-159283)를 고칠지 여부
# false로 설정하면 엔드 링이 생성된다
fix-far-end-terrain-generation: false
# 틱당 허용되는 최대 접속 플레이어 수. 초과하면 접속이 지연된다(bukkit.yml의 연결 스로틀과는 별개)
max-joins-per-tick: 2147483647
packet-limiter:
# 아래 all-packets와 overrides에 있는 패킷의 interval을 -1로 설정하면
# 프린터, 빠른 조합 등 테크니컬 보조 모드의 기능을 쓸 수 있다
all-packets:
# 최대 패킷 속도가 적용되는 시간 간격(단위: 초)
interval: -1
# 특정 패킷의 속도 제한이 적용되는 시간 간격
# (상황에 따라 특정 패킷의 속도 제한만 끌 수 있다)
overrides:
minecraft:place_recipe:
interval: -1
spam-limiter:
# 받은 패킷이 이 기준을 넘으면 스팸으로 보고 무시한다
# disabled로 설정하면 기준을 없앤다
incoming-packet-threshold: disabled
unsupported-settings:
# 머리 없는 피스톤 생성을 허용할지 여부(주로 부술 수 없는 블록을 부수는 데 쓰인다)
allow-headless-pistons: true
# 바닐라 버그로 기반암, 엔드 포털 틀, 엔드 포털 블록 등 부술 수 없는 블록을 부수는 것을 허용할지 여부
allow-permanent-block-break-exploits: true
# TNT, 카펫, 레일 복사를 허용할지 여부(모래는 포함하지 않는다)
allow-piston-duplication: true
# 엔드 포털 버그를 이용한 텔레포트를 허용할지 여부
# true로 설정하면 모래 복사를 쓸 수 있다
allow-unsafe-end-portal-teleportation: true
# Paper 아이템 난독화의 대형 아이템 직렬화기가 아래 아이템 컴포넌트를 건너뛸지 여부
# 아래처럼 설정하면 일부 데이터팩의 아이템 모델이 바닐라와 똑같이 보인다
oversized-item-component-sanitizer:
dont-sanitize:
- minecraft:container
- minecraft:charged_projectiles
- minecraft:bundle_contents
# 사용자 이름을 검증할지 여부
# false로 설정하면 특수 문자가 들어간 이름을 허용하지만, 명령어나 플러그인에 문제가 생길 수 있다
perform-username-validation: false
# 철사 덫 갈고리 설치 검증을 건너뛸지 여부
# true로 설정하면 철사 덫 갈고리 복사를 쓸 수 있다
skip-tripwire-hook-placement-validation: true
# 방패로 막을 때 바닐라의 피해 틱 계산을 건너뛸지 여부
#
# 예전부터 많은 PVP 플레이어가 Spigot과 그 하위 포크에 오래 있던 문제를 이용해 왔다.
# 방패로 막을 때 피해 무적 프레임이 적용되지 않는데, 이는 바닐라 동작과 다르다
# 플레이어는 이를 이용해 상대의 방어를 잠시 "무력화"하고 공중으로 띄워 보낼 수 있었고, 1.9+ PVP의 독특한 플레이 방식이 되었다
#
# true로 설정하면 이 방패 스턴(Shield Stunning) 메커니즘을 쓸 수 있다
skip-vanilla-damage-tick-when-shield-blocked: true
# 플레이어가 동작할 때 장비를 업데이트할지 여부
# false로 설정하면 속성 스와핑 버그를 쓸 수 있다
update-equipment-on-player-actions: false
spigot.yml
world-settings:
default:
# 엔티티 활성화 범위
# 전체 또는 일부 몹을 -1로 설정하면 해당 몹의 활성화 범위 제한을 무시한다
entity-activation-range:
animals: -1
monsters: -1
raiders: -1
misc: -1
water: -1
villagers: -1
flying-monsters: -1
# 엔티티 추적 범위
# Spigot이 몹 추적 범위를 설정할 수 있게 바꾼 침습적인 변경 때문에 바닐라 동작으로 그대로 되돌릴 수는 없다
# 전체 또는 일부 몹을 아래 추천값으로 설정하면 바닐라 추적 범위에 최대한 가까워진다
entity-tracking-range:
players: 512
animals: 160
monsters: 256
misc: 160
display: 160
other: 512
# 서버가 틱당 처리하는 TNT 폭발 횟수
# 0 이하로 설정하면 제한을 없앤다
# 또는 2000처럼 아주 큰 값으로 설정하면 월드 이터처럼 TNT 폭발이 대량으로 일어나는 테크니컬 장치도 정상 동작한다
max-tnt-per-tick: 0
bukkit.yml
settings:
# 몹 스폰 한도
# bukkit.yml의 기본값이 바닐라 스폰 한도와 같다
# 스폰이 너무 적어 농장 효율이 낮다고 느껴지면 해당 몹 분류의 스폰 한도를 적당히 올려도 된다
spawn-limits:
monsters: 70
animals: 10
water-animals: 5
water-ambient: 20
water-underground-creature: 5
axolotls: 5
ambient: 15

Mojang은 1.21.2의 첫 스냅샷 24w33a에서 레드스톤 가루의 신호 업데이트 방식을 바꿨다(실험적 기능이긴 하다).

코드를 보면 Mojang의 최적화 방식은 Alternate Current와 매우 비슷하므로 서버에서 켜는 것을 고려해 볼 만하다. 레드스톤 최적화를 참고하자.

Purpur는 더 많은 설정 항목을 제공한다. 아래 항목을 조정해 일부 바닐라 특성을 복원할 수 있다.

purpur.yml
settings:
# TPS 따라잡기(catch-up)를 켤지 여부
# false로 설정하면 TPS가 떨어졌을 때 몹이 갑자기 빨라져 게임 경험을 해치는 일을 막는다
tps-catchup: false
world-settings:
default:
settings:
entity:
# 공유 난수 생성기를 쓸지 여부
# false로 설정하면 RNG 예측을 쓸 수 있다
shared-random: false
gameplay-mechanics:
player:
# 1.21.4 스냅샷 24w44a 이전의 주민 보이드 거래(MC-50614)를 되살릴지 여부
# true로 설정하면 주민이 상호작용 범위를 벗어나도 거래 창이 닫히지 않는다
allow-void-trading: true

Leaves는 테크니컬 플레이어에 초점을 맞춘 Minecraft 서버로, 업스트림에서 망가진 바닐라 특성을 복원하는 것을 목표로 한다. 현재 플러그인 서버 코어 중 테크니컬 서바이벌에 가장 잘 맞는 코어다.

설정 파일 leaves.yml은 성능 최적화, 버그 수정, 바닐라 메커니즘 복원, 플레이 기능 강화 등 테크니컬 서바이벌 친화적인 다양한 설정 항목을 제공한다.

각 설정의 사용법은 Leaves 문서를 읽고, 서버에 필요한 대로 조정하자.

Leaf는 Paper의 포크로, 성능이 매우 높으면서(Folia를 빼면 Paper 계열 중 사실상 가장 빠르다) 바닐라 특성을 크게 망가뜨리지 않는다.

더 많은 플레이어를 받고 싶다면 Leaf를 고려해 보자.

바닐라 동작에 맞추기 위한 설정 조정 방법은 Leaf 문서를 참고하자. 나머지 설정 파일은 위 내용을 참고해 수정하면 된다.

Luminol은 Folia의 포크로, Folia보다 성능이 좋고 더 많은 특성을 복원할 수 있다.

luminol_config/luminol_global_config.toml
[fixes.poi_range_fixes]
# 청크가 로드되지 않았을 때 주민이 같은 POI를 두고 경쟁하는 계산을 하지 않을지 여부
# true로 설정하면 대형 철 농장처럼 주민이 들어간 대형 장치로 인한 렉 문제 일부가 해결된다
# 자세한 내용은 https://github.com/PaperMC/Folia/issues/292 참고
do_not_compete_poi_if_unloaded = true
[fixes.allow_unsafe_teleportation]
# 엔드 포털 버그를 이용한 텔레포트를 허용할지 여부
# true로 설정하면 모래 복사를 쓸 수 있다
# 문제가 생길 수 있다. 자세한 내용은 https://github.com/PaperMC/Folia/issues/297 참고
enabled = true
[fixes.collision_behavior]
# 서버가 사용할 엔티티 충돌 계산 방식
# 선택지:
# VANILLA - 바닐라 계산 방식만 사용. 성능이 떨어질 수 있지만 바닐라 동작과 완전히 같다
# BLOCK_SHAPE_VANILLA - 블록에는 Paper 계산 방식, 나머지는 바닐라 계산 방식을 사용. 최적화와 바닐라 동작을 모두 챙긴다
# PAPER - Paper 계산 방식만 사용. 최적화는 좋지만 일부 바닐라 동작이 망가진다
mode = "BLOCK_SHAPE_VANILLA"
[fixes.fix_high_velocity_issue]
# 고속 엔티티가 여러 틱 리전을 가로질러 이동하면서 서버 크래시가 나는 문제를 고칠지 여부
# true로 설정하면 진주포처럼 엔티티가 빠르게 먼 거리를 이동해야 하는 장치를 쓸 수 있다
enabled = true
[fixes.use_vanilla_random_source]
# 엔티티에 바닐라 난수 생성기를 쓸지 여부
# true로 설정하면 RNG 예측을 쓸 수 있다
enable_for_player_entity = true
[function.tripwire_dupe]
# 1.21.2 스냅샷 24w33a와 24w36a에서 수정된 철사 덫 복사 버그(MC-59471)를 되살릴지 여부
enabled = true
# 선택지:
# VANILLA20
# VANILLA21
# MIXED
behavior_mode = "VANILLA21"
[misc.disable_moved_wrongly_threshold]
# 엔티티 이동 속도 제한을 끌지 여부
enabled = true
[misc.force_disable_packet_limiter_of_paper]
# Paper 내장 패킷 속도 제한을 끌지 여부
# true로 설정하면 프린터, 빠른 조합 등 테크니컬 보조 모드의 기능을 쓸 수 있다
# 패킷 속도 제한을 끄면 패킷 전송 공격으로 서버 렉이 걸릴 위험이 있으니 신중히 생각하자!
force_disable = true
[optimizations.lithium_sleeping_block_entity]
# Lithium의 블록 엔티티 최적화를 쓸지 여부
# true로 설정하면 바닐라 특성을 유지하면서 호퍼 등 블록 엔티티의 성능을 높인다
enabled = true

스레드 수도 조정해야 한다. 잘 알려져 있듯 Folia의 기본 스레드 수는 매우 보수적이라, 코어 하나가 고생하는 동안 나머지 여덟 개는 구경만 하는 상황이 생긴다.

Paper 전역 설정에서 threaded-regions.threads를 찾자. 보통 청크 틱 스레드 수는 물리 CPU 코어 수의 80% 정도로 잡으면 된다.

Lophine은 Luminol 기반 포크로, Luminol보다 테크니컬 서바이벌에 쓸모 있는 기능과 설정 가능한 바닐라 특성이 더 많다. Folia에서 테크니컬 관련 메커니즘을 더 많이 구현하는 것이 목표다.

lophine_config/lophine_global_config.toml
[experiment.redstone]
# 1.19 이전의 즉시 블록 업데이트 메커니즘을 되살릴지 여부
instant-block-updater = true
# ClassCastException을 이용한 업데이트 억제를 허용할지 여부
cce-update-suppression = true
# 다음 메커니즘을 되살릴지 여부:
# 1.20 이전: 레드스톤 가루가 주변의 열린 다락문 위에 있는 레드스톤 가루와 연결되지 않음
# 1.20.2 이전: 레드스톤 가루, 레드스톤 중계기, 레드스톤 비교기가 아래쪽에서 상태 업데이트를 받아도 부착 여부를 확인하지 않음
redstone-ignore-upwards-update = true
[function.old-feature]
# 1.21.4 이전 메커니즘을 되살릴지 여부: 플레이어가 접속한 뒤 몇 초간 피해를 받지 않음
spawn_invulnerable_time = true
# 1.21 이전 습격 메커니즘을 되살릴지 여부
# true로 설정하면 대부분의 습격 농장 설계가 다시 동작한다
old_raid_behavior = true
# 1.21.2 이전 메커니즘을 되살릴지 여부: 좀비 주민, 허스크, 드라운드, 좀비 피글린이 피해를 받으면 일반 좀비 증원이 스폰됨
old_zombie_reinforcement = true
# 1.21.2-1.21.5에서 TNT가 물에 닿았지만 폭발 중심이 물 속이 아닐 때, 블록은 부수지만 떨어진 아이템 엔티티는 파괴하지 않던 특성을 되살릴지 여부
old_explosion_damage_calculator = true
# 1.21.4 스냅샷 24w44a 이전의 주민 보이드 거래(MC-50614)를 되살릴지 여부
# true로 설정하면 주민이 상호작용 범위를 벗어나도 거래 창이 닫히지 않는다
villager-void-trade = true
[misc.item-entity]
# 아이템의 틱 순서를 기준으로 떨어진 아이템을 합칠지 여부. Spigot이 오래전부터 써 온 기본 동작이다
#
# Spigot에서는 나중에 틱되는 아이템 엔티티가 먼저 틱된 엔티티 쪽으로 합쳐진다
# 합치기 반경이 비교적 크면 떨어진 아이템이 예상치 못한 이상한 위치에 끼는 것을 막을 수 있다
# 그래서 떨어진 아이템이 대량으로 나오는 몹 파밍 타워나 레드스톤 장치에 매우 유용하다
# 반면 바닐라에서는 아이템 개수를 기준으로 합치며, 개수가 적은 더미가 많은 더미로 합쳐진다
#
# true로 설정. 바닐라 동작은 아니지만 떨어진 아이템 합치기가 일부 테크니컬 장치에 더 잘 맞게 된다
follow-tick-sequence-merge = true