모드팩 제작

모드팩 직접 조립하기 — 빈 프로필에서 1.20.1 Forge 104개 쌓은 기록

기성 모드팩을 고치는 대신 빈 프로필에서 1.20.1 Forge 팩을 조립한 기록. 5단계 분할 조립법과 실제로 막혔던 지점 — CurseForge가 놓친 의존성, 로더 빌드 요구, 배포 jar와 저장소의 차이, 32767바이트 접속 오류, 서버에도 필요한 Xaero's까지.

#모드팩 제작#조립#Forge#1.20.1#모드 충돌

기성 모드팩을 고치는 것과 처음부터 조립하는 것

기성 모드팩에서 모드를 빼고 넣는 방식으로 오래 버티다가, 2026년 8월에 1.20.1 Forge로 팩 하나를 빈 프로필부터 조립했습니다. 3인 로컬 멀티가 목표였고 최종 구성은 클라이언트 104개, 서버 91개입니다.

기성 팩을 고치는 쪽이 빠를 것 같지만 문제가 하나 있습니다. 제작자가 손댄 config와 KubeJS 스크립트가 그대로 남아서, 문제가 생겼을 때 그게 원래 있던 것인지 내가 만든 것인지 구분이 안 됩니다. 빈 프로필에서 시작하면 모든 변수가 내가 넣은 것입니다.

이 글은 그 과정에서 실제로 막혔던 지점을 정리한 것입니다. 크래시 메시지와 버전 번호는 당시 로그 그대로입니다.

0단계 — 빈 프로필과 로더 버전

CurseForge 앱에서 Create Custom Profile로 새 프로필을 만듭니다. 기존 인스턴스를 복사해 쓰지 않는 것이 핵심입니다.

로더 버전은 처음에 Forge 47.3.x로 잡았는데, 4단계에서 이것 때문에 크래시가 났습니다. 자세한 건 아래 "로더 버전을 요구하는 모드"에 적었습니다. 1.20.1이라면 Forge의 Recommended 빌드인 47.4.10을 쓰는 편이 낫습니다.

클라이언트 RAM은 8GB로 잡았습니다. 12GB 이상 주면 GC 스파이크 때문에 오히려 끊기는 구간이 생깁니다.

5단계로 나눠 조립하기

한 번에 100개를 넣으면 크래시했을 때 원인을 찾을 수 없습니다. 다음 순서로 나눠 넣고, 단계마다 게임을 한 번씩 켰습니다.

  • 1단계 성능·기반 — Embeddium, Oculus, ModernFix, FerriteCore, Canary, Clumps, Connectivity, Packet Fixer 등
  • 2단계 편의성 — Sophisticated Backpacks, Xaero's Maps, JEI, Jade, Waystones, FTB Ultimine 등
  • 3단계 월드 생성·구조물 — Terralith, Tectonic, YUNG's Better 시리즈, When Dungeons Arise 등
  • 4단계 보스·아이템·전투 — Cataclysm, Bosses of Mass Destruction, Apotheosis, Iron's Spells 등
  • 5단계 RPG 시스템 — 스킬트리, FTB Quests, 검증이 덜 된 신생 모드

1단계에서 F3로 FPS를 기록해두면 이후 단계에서 무엇이 무거워졌는지 비교할 수 있습니다.

단계마다 게임을 켜는 이유

크래시가 났을 때 범인이 방금 넣은 그 단계 안에 있다는 것이 확정됩니다. 23개 중 하나라면 절반씩 줄이는 방식으로 5번이면 찾습니다. 100개를 한꺼번에 넣었다면 같은 탐색을 100개 전체에서 해야 하고, 모드끼리 얽힌 충돌이면 거의 못 찾습니다.

3단계부터는 테스트할 때마다 새 월드를 만들어야 합니다. 구조물은 이미 생성된 청크에 소급 적용되지 않아서, 기존 월드로 확인하면 "모드가 안 먹는다"고 오판하게 됩니다.

같이 넣을 수 없는 조합

조립 전에 정리해두면 나중에 원인 모를 문제를 겪지 않습니다.

  • OptiFine — 1.20.1 모드팩에서는 쓰지 않습니다. 셰이더는 Embeddium + Oculus 조합으로 대체합니다
  • Embeddium과 Rubidium — 같은 역할입니다. Embeddium 하나만 씁니다
  • JEI와 REI — 같은 역할입니다
  • Xaero's Maps와 JourneyMap — 같은 역할입니다
  • Epic Fight와 Better Combat — 둘 다 근접 전투를 교체합니다. 하나만 남겨야 합니다
  • Terralith와 William Wythers' Overhauled Overworld — 지형 생성이 직접 충돌합니다
  • 스킬트리 모드 중복 — Pufferfish's Skills, Passive Skill Trees, Project MMO는 레벨링 축이 겹칩니다

CurseForge 자동 설치가 놓치는 의존성

3단계를 마치고 실행했을 때 이 화면이 떴습니다.

Mod tectonic requires lithostitched 1.4.11 or above
Currently, lithostitched is not installed

CurseForge 앱은 모드 제작자가 페이지에 필수 의존성으로 등록해둔 것만 자동 설치합니다. 등록이 빠졌거나 나중에 추가된 의존성은 딸려오지 않습니다. Tectonic의 Lithostitched가 그 경우였습니다.

이런 크래시는 오히려 다루기 쉽습니다. 화면에 모드 이름과 필요한 버전이 그대로 나오므로, 그 이름을 검색해서 설치하면 끝납니다.

한 가지 함정이 있습니다. Lithostitched의 CurseForge 파일 목록에는 v1.4.11 ~ Forge 1.20 이라고 표시되는데, 실제 파일명은 lithostitched-forge-1.20.1-1.4.11.jar 이고 1.20.1을 지원합니다. 표기가 "1.20"이라 다른 버전으로 보여 놓치기 쉽습니다.

로더 버전을 요구하는 모드

4단계에서 두 번째 크래시가 났습니다.

Mod irons_spellbooks requires forge 47.4.0 or above
Currently, forge is 47.3.39

모드가 마인크래프트 버전뿐 아니라 로더 빌드 번호까지 요구할 수 있습니다. 같은 1.20.1 안에서도 Forge 47.3과 47.4는 다릅니다.

프로필 → ... → Profile Options → Modloader에서 버전을 바꾸면 mods 폴더는 그대로 유지됩니다. 같은 마인크래프트 버전 안에서 마이너 업그레이드는 기존 모드에 영향을 주지 않았습니다.

서버를 운영한다면 서버 Forge도 같은 빌드여야 합니다. 클라이언트와 로더 버전이 다르면 접속이 거부됩니다.

배포 jar가 GitHub 저장소보다 정확하다

Annoying Villagers를 넣기 전에 의존성을 확인하려고 제작자의 GitHub 저장소에서 mods.toml을 읽었습니다. 필수 의존성이 forge와 minecraft뿐이라고 되어 있었습니다.

그런데 실제로 배포된 jar(1.4.7)를 열어보니 달랐습니다.

annoyingvillagers -> 필수: epicfight, wom, combat_evolution, player_mobs

저장소가 배포본보다 낡아 있었습니다. 결과적으로 Epic Fight가 강제로 들어왔고, Epic Fight와 Better Combat은 같이 쓸 수 없으므로 4단계에 넣었던 Better Combat을 빼야 했습니다.

의존성은 저장소가 아니라 실제 다운로드한 jar의 META-INF/mods.toml로 확인하는 것이 정확합니다. jar는 zip이므로 압축 프로그램으로 열면 바로 보입니다.

내장 의존성 — 없는 것처럼 보이지만 있는 경우

반대 방향의 함정도 있습니다. 설치된 모드 전체의 mods.toml을 훑어 의존성을 점검했더니 두 건이 누락으로 잡혔습니다.

  • Artifacts가 요구하는 expandability
  • Xaero's Minimap과 World Map이 요구하는 xaerolib

둘 다 실제로는 문제가 아니었습니다. 부모 jar 안에 jar-in-jar 방식으로 내장되어 있었기 때문입니다. Artifacts는 META-INF/jars/expandability-forge-9.0.4.jar를, Xaero's는 META-INF/jarjar/xaerolib-forge-1.20.1-1.7.1.jar를 품고 있었습니다.

모드 목록에 안 보인다고 없는 것이 아닙니다. 설치하라고 안내하기 전에 부모 jar 내부를 확인해야 합니다.

클라이언트 전용처럼 보이지만 서버에도 필요한 모드

전용 서버를 세울 때 클라이언트 전용 모드를 제외했습니다. Embeddium, Oculus 같은 렌더링 모드는 서버에서 크래시하므로 빼는 것이 맞습니다.

그런데 Xaero's Minimap과 World Map까지 클라이언트 전용으로 분류해 뺐더니 문제가 생겼습니다. 월드맵에서 텔레포트를 시도하면 이 메시지가 나왔습니다.

You are trying to teleport to a map that is not connected to the current confirmed/auto one.

원인을 찾는 데 오래 걸렸습니다. Xaero's 공식 설명에 답이 있었습니다.

The mod is mostly client-sided, and installing it on the server side is optional for some additional features like world identification.

서버에 Xaero's가 없으면 world ID가 전달되지 않고, 그러면 지금 보고 있는 맵이 현재 월드가 맞는지 확인할 수 없어 텔레포트가 차단됩니다. 클라이언트 설정 파일에서 ignoreServerLevelId를 켜거나 맵 데이터를 지우는 방법으로는 해결되지 않았고, 서버에 모드를 설치하는 것이 근본 해결이었습니다.

증상만 보면 클라이언트 문제 같지만 원인은 서버에 있었습니다.

멀티플레이에서만 드러나는 문제

혼자 켜서는 멀쩡했는데 다른 사람이 접속하자 바로 끊겼습니다.

lost connection: Internal Exception: io.netty.handler.codec.DecoderException:
java.lang.IllegalArgumentException: Payload may not be larger than 32767 bytes

이 문제로 Connectivity 모드가 있으면 해결된다고 생각했는데 아니었습니다. Connectivity가 푸는 것은 로그인 패킷 한도(1048576 바이트)와 압축 패킷, 타임아웃입니다. 32767은 문자열 하나의 최대 길이 제한으로 성격이 다릅니다. 실제로 Connectivity는 이 오류를 로그에 기록만 하고 막지는 못했습니다.

해결책은 Packet Fixer였습니다. 이 한도를 올려주는 모드로, 클라이언트와 서버 양쪽에 설치해야 하고 함께 플레이하는 사람 전원이 넣어야 합니다. 한 명이라도 빠지면 그 사람만 계속 튕깁니다.

Simple Voice Chat을 쓴다면 방화벽에 TCP 25565 외에 UDP 24454도 열어야 합니다. 서버 로그에 Voice chat server started at port 24454로 찍힙니다.

구조물 모드를 여럿 넣었을 때

구조물 모드를 16개 넣었더니 서버 로그에 이런 경고가 반복해서 올라왔습니다.

Non-unique structure_set salt:499672 potentially creating overlapping structures detected.
Structure sets: [bosses_of_mass_destruction:obsidilith_arena, bosses_of_mass_destruction:gauntlet_arena]

같은 salt 값을 쓰는 구조물끼리 같은 자리에 생성될 수 있다는 뜻입니다. 보스 아레나 두 개가 겹치면 둘 다 망가집니다.

Structure Essentials 모드의 minimumStructureDistance 설정을 켜면(기본값은 꺼짐) 구조물 사이 최소 거리를 강제할 수 있습니다. 이미 생성된 청크에는 적용되지 않으므로 월드를 만들기 전에 켜두는 것이 좋습니다.

정리

빈 프로필에서 조립하면서 겪은 크래시와 접속 실패는 전부 다음 네 가지 중 하나였습니다.

  • 의존성이 빠짐 (CurseForge가 자동 설치하지 못한 경우)
  • 로더 빌드 번호가 모자람
  • 같은 역할의 모드가 중복됨
  • 서버와 클라이언트의 모드 구성이 어긋남

전부 에러 메시지가 원인을 알려주는 종류였습니다. 단계별로 나눠 넣었기 때문에 범인이 있는 범위가 항상 좁았고, 그것이 100개 규모의 팩을 하루에 조립할 수 있었던 이유입니다.

함께 읽으면 좋은 글

  • 모드 충돌 해결 가이드 — 크래시 리포트 읽는 법과 이분 검색법
  • 모드팩에 모드 추가 설치하기 — 기성 팩에 추가할 때의 절차
  • 모드팩 멀티플레이 서버 만들기 — LAN·자체 호스팅·유료 호스팅 비교
  • 메모리·JVM 인자 설정 가이드 — RAM 할당과 Aikar's Flags

📦 관련 모드팩