호환성
Poly 모드 로더는 다른 로더의 모드를 진단 우선으로 다룹니다. 로더 브리지는 Poly 모드 로더가 제공하지 못하는 기능을 하나씩 발견 항목으로 보고하며, 실행을 막는 항목이 하나라도 있으면 그 모드를 로드하지 않습니다.
지원 상태
| 로더 | 상태 | 내용 |
|---|---|---|
| Poly 모드 로더 Native | 검증 완료 | poly.mod.json 모드. Native API 게임 테스트 52개, 클라이언트·서버·월드 저장을 확인했습니다 |
| Fabric (엔트리포인트, Fabric Loader API, 언어 어댑터, 중첩 jar) | 검증 완료 | preLaunch·main·client·server 엔트리포인트(:: 값 포함)를 Fabric Loader와 같은 시점에 실행합니다. 다른 Poly 모드·Fabric 모드에 의존해도 됩니다 |
Fabric (Mixin·MixinExtras, class tweaker의 accessible·extendable·mutable·inject-interface·extend-enum 줄, @Environment) | 검증 완료 | Fabric Loader와 같은 순서로 적용합니다. 26.2의 실제 인기 모드로 140개(실제 Fabric 모드 138개와 테스트 모드 2개)가 클라이언트에서 저장된 월드를 플레이하고 저장한 뒤 나오고, 100개가 실제 전용 서버 시작을, 98개가 게임 테스트 서버에서 월드 생성·틱·저장을 통과했습니다. 26.1도 같은 검사를 통과합니다(아래) |
| Fabric (Fabric Loader 내부 클래스) | 일부 지원 | 실제 모드가 쓰는 것은 제공합니다: FabricLauncherBase.getLauncher()(addToClassPath 등), FabricLoaderImpl.getGameProvider(). 그 밖의 내부 클래스와 멤버는 링크 검사가 막습니다(111) |
Quilt (quilt.mod.json) | 검증 완료 | 26.1~26.3(2026-10-24, 실제 모드 묶음은 26.1·26.1.2·26.2, 26.3은 2026-10-27 헤드리스, 아래). quilt.mod.json을 Quilt Loader의 의미로 읽고, Quilt Loader 0.31.0-beta.4 공개 API를 제공하며, Quilt 모드의 중첩 jar·진입점·Mixin·access widener가 동작합니다. 버전마다 Modrinth의 Quilt 전용 빌드 전체를 클라이언트, 게임 테스트 서버, 전용 서버에서 실행했고, 실제 Quilt Loader와 비교했습니다. 설치한 서버와 런처 프로필에서도 Quilt 모드가 실행됩니다. QSL이 필요한 모드는 빼고(POLY-COMPAT-114와 308), fabric.mod.json과 quilt.mod.json이 모두 든 jar는 Fabric 모드로 실행합니다(310). 자세한 내용은 아래에 있습니다 |
NeoForge (META-INF/neoforge.mods.toml) | 검증 완료 | 26.1~26.3에서(2026-10-24, 실제 모드 묶음은 26.1·26.1.2·26.2, 26.3은 2026-10-27 헤드리스, 아래). Poly 모드 로더가 기본으로 NeoForge 자신의 FML 11을 실행합니다(26.1은 NeoForge 26.1.0.19-beta, 26.1.1은 26.1.1.15-beta, 26.1.2는 26.1.2.122, 26.2는 26.2.0.93, 26.3은 26.3.0.98). 인기 NeoForge 모드가 클라이언트에서 저장된 월드에 들어가 틱을 돌리고 저장한 뒤 나오며(26.2는 54개), 게임 테스트 서버에서 월드를 만들고 틱을 돌리고 저장하고(26.2는 38개), 실제 전용 서버를 시작합니다(26.2는 37개). 설치한 런처 프로필과 서버에서도 실행됩니다. 빠지는 모드는 NeoForge 자신의 서버에서도 멈추거나 거부되는 경우뿐이며, FML이 거부할 모드는 먼저 뺍니다(POLY-COMPAT-217). Fabric·Quilt 모드와 한 게임에서는 일부 지원입니다(다음 줄). Forge 모드와 한 게임에서는 실행되지 않습니다(POLY-COMPAT-221). 자세한 내용은 아래에 있습니다 |
Forge (META-INF/mods.toml) | 검증 완료 | Poly 모드 로더가 Forge와 FML을 그대로 실행합니다(26.1은 Forge 62.0.9, 26.1.1은 63.0.2, 26.1.2는 64.1.5, 26.2는 65.1.5, 26.3은 66.1.0). 26.1, 26.1.2, 26.2 모두 인기 Forge 모드가 클라이언트에서 저장된 월드에 들어가 틱을 돌리고 저장한 뒤 나오며(26.2는 40개), 게임 테스트 서버에서 월드를 만들고 틱을 돌리고 저장하고(26.2는 38개 중 32개), 실제 전용 서버를 시작합니다(26.2는 41개 중 35개). 설치한 런처 프로필과 서버에서도 실행됩니다. 26.3(2026-10-27, 헤드리스): 게임 테스트 서버 38개 중 30개, 전용 서버 41개 중 33개. Fabric 모드와 함께일 때는 일부 지원입니다(다음 줄). Forge가 거부하거나 멈출 모드는 이유와 함께 먼저 뺍니다(POLY-COMPAT-209): 서버의 클라이언트 전용 모드, 다른 Forge 버전용 모드, Forge의 Mixin이 읽지 못하는 Mixin 설정. 자세한 내용은 아래에, Fabric 모드와 함께 쓰는 법은 Fabric 모드와 Forge 모드 함께 쓰기에 있습니다 |
| NeoForge·Forge 모드와 함께인 Fabric·Quilt 모드 | 일부 지원 | 2026-10-25부터(ADR-0030). 호스트 로더가 패치한 게임에서 mixin이 쓰인 대로 동작할 수 없는 Fabric·Quilt 모드는 로드하지 않고(POLY-COMPAT-224), 그 모드가 필요한 모드도 빠집니다(114). 로그와 타이틀 화면은 이것이 Poly 모드 로더의 한계이며 모드의 버그가 아니라고 알립니다. 호스트가 같은 것을 옮긴 곳으로 옮긴 mixin은 그대로 실행됩니다(226, 212, 222). 26.2: Forge 옆에서는 빠지는 Fabric API 모듈이 없지만 Fabric 모드 3개(Architectury, Balm, Lithium)가 빠지고 외래 모드 88개 로드, 78개 제외(1.2.5, 2026-10-28). NeoForge 옆에서는(2026-10-27) Fabric API 모듈 10개가 빠지고 외래 모드 40개 로드, 76개 제외. 나머지로 게임 테스트 서버가 실행됩니다. NeoForge에서는 Forgified Fabric API(forgified-fabric-api) 투입도 지원합니다. 26.3에서도 1.2.5부터 로더를 섞어 쓸 수 있습니다(아래). 2026-10-25 전에는 맞지 않는 부분을 건너뛴 채 실행했고, 이를 Verified로 적었습니다. 자세한 내용: Forge, NeoForge |
상태 정의: 검증 완료(Verified) / 일부 지원(Partial) / 실험적(Experimental) / 차단됨(Blocked) / 미테스트(Untested). jar가 로드됐다는 사실만으로 검증 완료라고 쓰지 않습니다.
Minecraft 26.3
2026-10-27, 헤드리스로 측정. 26.3 인기 모드 묶음(mod-corpus-26.3.json: Fabric 43개, Forge 42개, NeoForge 44개, 그리고 Quilt 전용 판 91개의 Quilt 묶음)이 로더 하나씩 통과했습니다. Fabric은 게임 테스트 서버에서 98개 로드 / 73개 제외, 전용 서버에서 100 / 74. Forge 66.1.0은 38개 중 30개, 41개 중 33개(빠지는 8개는 클라이언트 전용 모드 7개와, 26.3 판이 없는 libIPN이 필요한 InventoryProfilesNext이며 실제 Forge도 거부). NeoForge의 FML 12는 50개와 49개를 로드. Quilt는 전용 서버에서 112개 로드 / 34개 제외(Quilt 전용 판 91개 중 73개)이고, 실제 Quilt Loader와 91개 중 89개가 같은 판정입니다. Quilt 게임 테스트 서버 실행은 26.2 형식 데이터를 담은 PurpurPacks 데이터 팩 모드 5개를 빼면 통과합니다(모드 쪽 문제). 26.3의 로더 섞어 쓰기는 1.2.5부터 됩니다(2026-10-28, 헤드리스, 묶음의 혼합 로더 실행 모두 통과, 225 없음). 1.2.4에서는 이런 게임이 모두 시작에서 멈췄습니다(FML 12가 더한 Mixin 처리기를 공유 Mixin 패치가 채우지 않았고, Forge 66이 Fabric API가 쓰는 호출·레지스트리·코덱을 바꿈). Forge 옆 Fabric 모드: 80개 로드, 86개 제외, 224로 Architectury, Balm, Lithium, Puzzles Lib과 Fabric API 모듈 3개(data-generation, entity-events, item). Forge 옆 Quilt 모드: 95개 로드, 86개 제외. NeoForge 옆 Fabric 모드: 40개 로드, 76개 제외(26.2와 같은 Fabric API 모듈 10개), 게임 테스트 서버·전용 서버·네트워크 접속. NeoForge 옆 Quilt 모드: 83개 로드, 96개 제외. 26.3의 창 실행은 아직 하지 않았습니다.
크래시 대신 시작 전 판정
Poly 모드 로더는 게임 코드가 돌기 전에 모든 모드를 "로드" 또는 "이유와 함께 빼기"로 정합니다. 실행할 수 없는 모드 때문에 게임 도중 NoClassDefFoundError나 NoSuchMethodError가 나는 일을 막기 위해서입니다.
- 로더를 넘는 의존성: Poly 모드는 Fabric 모드에, Fabric 모드는 Native·Fabric 모드에 의존할 수 있습니다. Fabric의
provides별칭도 인정합니다. 버전 조건은 각 로더의 규칙으로 판정합니다. Fabric 조건은 Fabric Loader의 버전 해석기를 그대로 씁니다. - 연쇄로 빠지는 모드: 필요한 모드가 없거나 차단됐거나 버전이 맞지 않으면 그 모드를 빼고(
POLY-COMPAT-114), 빠진 모드를 필요로 하는 모드도 이어서 뺍니다. 빠진 모드마다 모든 이유가 기록되며, 예를 들면 "requires 'fabric-api' …, which is installed but not loaded: Fabric mod fabric-api … is BLOCKED: [POLY-COMPAT-103]"처럼 표시됩니다. minecraft·java조건: 다른 Minecraft 버전용 Fabric 모드는 빠집니다.breaks·conflicts·중복 ID:breaks는 빼기(115),conflicts는 경고(116)입니다. 같은 ID를 다른 모드가 쓰면 외부 모드를 뺍니다(117).- 링크 검사: 로드하려는 외부 모드의 클래스가 참조하는 Minecraft 클래스·메서드·필드가 이 게임 버전에 있는지(
112), class tweaker의 대상이 있는지 확인하고(이 게임에 없는 대상은 Fabric Loader처럼 빼고 적용137경고, 게임 jar 밖 클래스는 차단128), 제공하지 않는 Fabric Loader 런타임을 쓰는지도 확인합니다(111). 모드가 주입하는 인터페이스와 Mixin이 더하는 인터페이스는 상위 형식으로 셉니다. 설치되지 않은 모드와의 선택 연동, 서버에서 클라이언트 클래스나 클라이언트 전용 모드의 클래스를 참조하는 경우에는 경고만 남깁니다(113). 참조만 검사할 뿐 실제 실행 경로는 분석하지 않습니다. - 손상된 파일: 형식이 틀린 메타데이터(
100·200), 깨진 jar(POLY-DISCOVERY-003), NeoForge 라이브러리 jar(205)는 그 파일만 빼고 나머지를 계속 판정합니다. - 엔트리포인트 순서: 같은 로더 안에서는 의존 대상이 먼저 실행됩니다. Poly 모드는 게임 시작 전에 초기화합니다. Fabric 모드는 Fabric Loader와 같이 Minecraft bootstrap 뒤에 초기화합니다: Mixin 준비 직후
preLaunch, 그다음main, 그다음client또는server. 그래서 Poly 모드가 Fabric 모드에 의존하면 로드 순서와 클래스는 보장되지만, Poly 모드가 초기화될 때 그 Fabric 모드는 아직 초기화되지 않았습니다. - Poly 모드가 차단된 외부 모드를 필요로 하면, 게임 코드가 돌기 전에 시작을 멈추고 이유를 알립니다(
POLY-DEPENDENCY-009).
Fabric 브리지
- Fabric Loader 자체는 시작하지 않습니다. 대신 Fabric Loader의 공개 API(
FabricLoader.getInstance())를 Poly 모드 로더가 직접 제공합니다. 제공하는 기능은 모드 목록과 조회(Poly 모드도 보임), 메타데이터와custom값, 모든 키의 엔트리포인트(getEntrypoints), 공유 객체, 설정 폴더, 실행 환경, 언어 어댑터입니다.getMappingResolver는 매핑 없는 Fabric Loader처럼official이름 공간과 이름을 그대로 돌려줍니다.getGameInstance는 클라이언트의Minecraft객체를, 서버에서는 실행을 시작한 전용 서버를 돌려줍니다(그 전에는 Fabric Loader처럼 null). Fabric Loader 내부 클래스(net.fabricmc.loader.impl)는 제공하지 않으며, 이것을 쓰는 모드는 시작 전에 빠집니다(111). - 언어 어댑터(
fabric-language-kotlin등)는languageAdapters로 선언한 모드가 로드돼 있을 때만 쓸 수 있습니다. 그 모드가 없으면 어댑터를 쓰는 모드는 이유와 함께 빠집니다(114). - 모드 클래스는 Poly 모드 로더의 게임 클래스로더가 정의합니다. 다른 로더의 모드가 로드되면 이 클래스로더가 Minecraft 라이브러리 jar도 맡아서, Fabric Loader처럼 Mixin이 라이브러리도 바꿀 수 있습니다.
fabricloader의존성은 클래스 경로에 둔 Fabric Loader API 버전으로 판정합니다.mixinextras는 내장(0.5.5)이며, 모드 안에 중첩된 사본은 쓰지 않습니다(122).- Mixin: 로드되는 Fabric 모드에 Mixin 설정이 있으면 Mixin 0.8.7(Fabric Loader 0.19.5가 쓰는 FabricMC 빌드 0.17.4)과 MixinExtras 0.5.5를 시작합니다. Fabric Loader처럼 모드마다 그 모드의 호환 수준으로 설정을 더합니다. 클래스는 Fabric Loader와 같은 순서로 바꿉니다: 환경 제거(
@Environment)와 인터페이스 주입, 그다음 Mixin.- 없거나 읽을 수 없거나 JSON 객체가 아닌 설정은 Fabric Loader에서처럼 Mixin이 오류를 남기고 건너뜁니다(
136, 경고).required설정이 더 새 Mixin을 요구하면 Mixin이 게임을 멈추므로 그 모드를 막습니다(132). - 적용에 실패한 Mixin은 Fabric Loader처럼 대상 클래스를 로드할 때 실패합니다. 오류에 변환기, 클래스, Mixin, 그 모드가 나옵니다(
133). - Poly 모드 로더 자신의 변환은 Mixin이 겨냥하는 바닐라 호출을 남깁니다. Poly 모드 로더 규칙이 바꾸는 호출을 Mixin
@Redirect나@WrapOperation이 이미 가져갔으면, 그 클래스에서만 Poly 모드 로더 규칙을 빼고 경고합니다(POLY-TRANSFORM-011).
- 없거나 읽을 수 없거나 JSON 객체가 아닌 설정은 Fabric Loader에서처럼 Mixin이 오류를 남기고 건너뜁니다(
- class tweaker(access widener):
fabric.mod.json의accessWidener로 class tweaker를 지정한 Fabric 모드도 이제 그 이유만으로 막히지 않습니다. 브리지가 Fabric Loader 0.19.5와 같은 문법(accessWidener v1/v2,classTweaker v1/v2,transitive-줄)으로 파일을 읽고,accessible·extendable·mutable줄을 Poly 모드 로더 접근 확대로 바꿉니다. 멤버를 넓힐 때 Fabric이 함께 넓히는 클래스 접근도 똑같이 더합니다.- 모드를 로드하기 전에 링크 검사가 모든 대상을 게임 jar와 대조합니다. 이 게임에 없는 클래스나 멤버는 Fabric Loader처럼 빼고 적용합니다(
137, 경고). 게임 jar 밖의 클래스면 그 모드와 그 모드에 의존하는 모드가 막힙니다(128). 전용 서버에서는 클라이언트 클래스를 대상으로 한 줄을 빼고 적용합니다(130, 경고). - 파일이 있고 형식이 맞아야 하며(
125, 잘못된 줄마다 줄 번호 표시), 이름 공간은official이어야 합니다(126). inject-interface줄은 Fabric Loader처럼 Minecraft 클래스에 인터페이스를 붙입니다(제네릭·중첩 인터페이스 포함). 설치된 jar 어디에도 없는 인터페이스면 그 모드를 막습니다(135).extend-enum줄은 Fabric Loader처럼 Minecraft enum에 빈 상수를 더하고, 값은 그 모드의 Mixin이 넣습니다.- Fabric 모드에는 권한 모델이 없으므로 class tweaker 자체를 선언으로 봅니다. Poly 모드에 필요한
internal.member.access권한은 요구하지 않습니다.
- 모드를 로드하기 전에 링크 검사가 모든 대상을 게임 jar와 대조합니다. 이 게임에 없는 클래스나 멤버는 Fabric Loader처럼 빼고 적용합니다(
- 중첩 jar(jar-in-jar):
jars에 적힌 jar를 풀어 각각 하나의 모드로 판정합니다. 여러 겹 중첩도 따라갑니다. Fabric Loader와 같이 바깥 모드가 로드될 때만 안쪽 모드도 로드합니다(121). 같은 모드의 사본이 여럿이면 직접 설치한 것을 쓰고, 직접 설치한 것이 없으면 가장 높은 버전 하나를 씁니다(122). 안쪽 모드 일부가 막힌 바깥 모드에는 일부만 동작한다는 경고(124)가 붙으며, 전용 서버에서 클라이언트 전용 하위 모듈 7개가 빠지는fabric-api가 그 예입니다(108).
Fabric 진단 항목
| 코드 | 항목 |
|---|---|
POLY-COMPAT-100 | 메타데이터(형식 오류, 읽을 수 없는 버전 조건) |
POLY-COMPAT-107 | 기타 엔트리포인트(경고) |
POLY-COMPAT-108 | 실행 환경 |
POLY-COMPAT-110 | 엔트리포인트가 예외를 던짐(시작을 멈춤) |
POLY-COMPAT-111–119 | 링크 검사·의존성·중복 ID(오류 코드) |
POLY-COMPAT-120–124 | 중첩 jar |
POLY-COMPAT-125·126 | class tweaker: 읽을 수 없거나 형식이 틀린 파일, official이 아닌 이름 공간 |
POLY-COMPAT-128·130·135·137 | class tweaker 링크 검사: 게임 jar 밖 대상(차단), 전용 서버에서 빼는 클라이언트 대상(경고), 없는 주입 인터페이스(차단), 이 게임 버전에 없는 대상(빼고 적용, 경고) |
POLY-COMPAT-129 | class tweaker가 넓히는 접근(정보) |
POLY-COMPAT-131–134·136 | Mixin: 이쪽에 적용할 설정(정보), 더 새 Mixin이 필요한 required 설정(차단), 클래스에서 Mixin 실패, Mixin 시작 실패, 건너뛰는 설정(경고) |
POLY-COMPAT-104(다른 모드 의존 자체를 차단), 103(중첩 jar 자체를 차단), 102(class tweaker 자체를 차단)는 2026-10-21에, 101(Mixin), 105(preLaunch), 106(:: 엔트리포인트), 127(inject-interface, 그다음 extend-enum)은 2026-10-22에 폐기했습니다.
Forge
Poly 모드 로더가 Forge와 FML을 그대로 실행하고, 찾은 Forge 모드를 FML에 넘깁니다. Forge 모드를 넣고 처음 실행할 때 Forge 파일을 다운로드합니다. Forge 버전은 26.1이 62.0.9, 26.1.1이 63.0.2, 26.1.2가 64.1.5, 26.2가 65.1.5, 26.3이 66.1.0입니다.
Forge 완전 지원 점검(2026-10-23)은 모드 묶음이 따로 있는 세 버전에서 했습니다. 26.1.1은 Forge 63.0.2로 실행하지만 묶음을 따로 두지 않았습니다.
| 26.2 (Forge 65.1.5) | 26.1 (Forge 62.0.9) | 26.1.2 (Forge 64.1.5) | |
|---|---|---|---|
클라이언트(corpusForgeClient, 게임 창이 열림): 저장된 월드 입장, 200틱, 저장 후 종료 | Forge 모드 40개, 통과 | 26개(36개 중 10개는 Forge 64 이상 요구 등으로 209), 통과 | 36개, 통과 |
게임 테스트 서버(corpusForge): 월드 생성, GameTest, 저장 | 38개 중 32개 | 36개 중 18개 | 34개 중 28개 |
전용 서버(corpusForgeServer): Forge의 실행 핸들러로 EULA 확인까지 | 41개 중 35개 | 37개 중 19개 | 37개 중 31개 |
Fabric 모드와 함께(corpusFabricForge), 게임 테스트 서버 | 2026-10-28(1.2.5): 다른 로더의 모드 88개 로드, 78개 제외(1.2.4에서는 87개와 79개, 2026-10-25에는 42개와 124개, 그 전에는 Forge 모드 39개 중 33개) | 2026-10-28(1.3.0): 다른 로더의 모드 76개 로드, 80개 제외 | 2026-10-28(1.3.0): 83개 로드, 81개 제외 |
설치한 런처 프로필(launcherProfileForgeTest, 게임 창이 열림) | Forge 테스트 모드 3개 | - | 묶음의 Forge 모드 36개 |
설치한 서버(serverInstallTest) | forge_hello로 게임 테스트 서버·전용 서버 | - | Forge만(forge_hello는 Forge 65 이상용) |
| Forge 런타임 기능 | access transformer, Mixin, 변환 서비스, 모드 위치 지정자. JS coremod는 Forge 26.x에 없음 | 같음 | 같음 |
| 성능 | 측정 6 | 같은 코드 경로, 따로 재지 않음 | 같음 |
빠지는 Forge 모드(POLY-COMPAT-209)는 실제 Forge에서도 빠지거나 실행되지 않는 경우뿐입니다. 이유마다 Forge의 바이트코드와 실제 Forge로 확인했습니다.
- 서버에 넣은 클라이언트 전용 모드(세 버전 모두 6개 안팎). 클라이언트에서는 실행됩니다.
- Forge·Minecraft·언어 로더 버전 범위(26.1에서 9개, 모두 26.1.2용 빌드). FML은 이런 모드가 하나라도 있으면 모드 로딩 전체를 멈추지만, Poly 모드 로더는 그 모드만 뺍니다.
- Mixin 0.8.7이 시작을 멈추는 Mixin 설정(없는 설정 파일,
JAVA_25): Balm, Boatiview, No Chat Reports.
실제 Forge에서도 실패하는 빌드는 묶음 실행에서 뺐습니다.
Fabric 모드와 함께(26.2, corpusFabricForge, 2026-10-28에 1.2.5로 측정). 의존성 판정 전에 Poly 모드 로더가 Fabric mixin을 Forge가 패치한 클래스와 하나씩 비교합니다. 패치가 옮기기만 한 곳을 겨냥한 mixin은 함께 옮깁니다(226). 쓰인 대로 동작할 수 없는 mixin이 있는 Fabric 모드는 로드하지 않고(224), 그 모드가 필요한 모드도 빠지며(114), 타이틀 화면에 그 수가 나옵니다. 1.2.2의 호스트 패치 조정 뒤로 224로 빠지는 Fabric API 모듈은 없고, Fabric 모드 3개(Architectury, Balm, Lithium)가 빠집니다(Puzzles Lib은 1.2.5부터 로드). 외래 모드 88개가 로드되고 78개가 빠지며, 게임 테스트 서버가 월드를 만들고 GameTest를 통과하고 저장합니다. 게임 중 Mixin 실패(225)는 없었습니다. 2026-10-25에는 42개 로드, 124개 제외였고 그중 14개가 224였습니다(Fabric API 모듈 10개와 위 네 모드). 1.2.2 노트의 "6개"는 묶음을 다시 실행하지 않고 적은 수였습니다. Forge 옆의 실제 Fabric API 테스트(forgeFabricApiGameTest)는 2026-10-25 뒤로 다시 실행하지 않았습니다. 2026-10-25 전에는 맞지 않는 주입 지점 25곳을 건너뛰고 모드의 나머지를 실행했고(138, 폐기), 그때 적은 기능 확인은 더 이상 맞지 않습니다. 26.1·26.1.2에서는(1.3.0, 2026-10-28) 외래 모드 76개, 83개가 로드되고 게임 테스트 서버가 통과합니다. 1.3.0 전에는 Forge가 Fabric API lifecycle 이벤트가 붙잡는 지역 변수 이름을 바꿔 게임이 시작에서 멈췄습니다(225). 서로의 모드 목록도 보입니다. FML의 ModList.getModFileById·isLoaded는 Fabric 모드와 Poly 모드를, Fabric의 isModLoaded는 Forge 모드를, Poly 모드의 ModContext.mods()는 모든 로더의 모드를 봅니다. getModContainerById는 Forge 모드만 돌려줍니다. 한 모드의 Fabric용과 Forge용 빌드가 한 jar에 함께 들어 있으면 Forge용 빌드로 실행합니다(139).
알아 둘 것:
- 어떤 모드든 Forge에 로딩 경고를 내면, Forge는 경고 화면을 띄우기 전에 기본 이벤트 버스를 끄고 다시 켜지 않습니다. 그 뒤로는 게임 이벤트가 어떤 모드에도 가지 않습니다. 실제 Forge와 같은 동작이지만, 경고를 내는 모드 하나 때문에 다른 모드가 아무 표시 없이 동작하지 않을 수 있습니다.
- 모드마다 기능을 하나하나 써 본 것은 아닙니다. 로드, 초기화, 월드 입장, 틱, 저장, 종료까지 확인했습니다.
- 실제 Minecraft Launcher로 실행한 기록은 없습니다. 런처 프로필 실행은 런처가 게임을 시작하는 방식을 재현한 것입니다.
Forge 진단: POLY-COMPAT-200–205(메타데이터, FML 언어 공급자, Mixin, Access Transformer, 의존성, 라이브러리 jar), 206(Forge 파일을 준비하지 못함), 208(FML 시작 실패), 209(FML 시작 전에 뺌), 211, Forge와 함께인 Fabric mixin의 212, 222–226(138, 213, 214는 폐기). 오류 코드를 보세요.
NeoForge
Poly 모드 로더가 NeoForge와 그 로더 FML 11을 그대로 실행하고, 찾은 NeoForge 모드를 FML에 넘깁니다. 기본으로 이렇게 동작하며, NeoForge 모드를 넣고 처음 실행할 때 NeoForge 파일을 다운로드합니다. NeoForge 버전은 26.1이 26.1.0.19-beta, 26.1.1이 26.1.1.15-beta, 26.1.2가 26.1.2.122, 26.2가 26.2.0.93, 26.3이 26.3.0.98입니다. NeoForge는 26.1과 26.1.1용으로 베타 빌드만 있어서, Poly 모드 로더는 그중 마지막 빌드를 씁니다.
-Dpoly.neoforge=off 옵션을 주면 예전처럼 동작합니다. NeoForge 모드를 진단만 하고 뺍니다(메타데이터, FML 언어 공급자, Mixin, Access Transformer, 의존성(경고), 라이브러리 jar, POLY-COMPAT-200..205). 한 jar에 든 여러 [[mods]]의 ID를 모두 보고하므로, 그 ID가 필요한 다른 로더의 모드에는 "설치됐지만 차단됨"이라는 정확한 이유가 표시됩니다.
NeoForge 완전 지원 점검(2026-10-24)은 모드 묶음이 따로 있는 세 버전에서 했습니다. 26.1.1은 NeoForge 26.1.1.15-beta로 실행하고 월드 테스트와 설치한 서버로 확인했지만, 묶음을 따로 두지 않았습니다.
| 26.2 (NeoForge 26.2.0.93) | 26.1 (26.1.0.19-beta) | 26.1.2 (26.1.2.122) | |
|---|---|---|---|
클라이언트(corpusNeoForgeClient, 게임 창이 열림): 저장된 월드 입장, 200틱, 저장 후 종료 | NeoForge 모드 54개(jar 44개, FancyMenu·Sodium·Iris 포함), 통과 | 36개(jar 37개), 통과 | 55개(jar 45개), 통과 |
게임 테스트 서버(corpusNeoForge): 월드 생성, GameTest, 저장 | 38개(묶음 36개 + 테스트 하네스 모드 + 확인용 모드), 통과 | 35개 중 31개(217로 4개 뺌), 통과 | 40개(묶음 38개 + 하네스 + 확인용 모드), 통과 |
전용 서버(corpusNeoForgeServer): NeoForge가 게임을 시작해 EULA 확인까지 | 37개, 통과 | 34개 중 30개, 통과 | 39개, 통과 |
설치한 런처 프로필(launcherProfileNeoForgeTest, 게임 창이 열림) | neoforge_hello와 세션 테스트 모드 | - | 묶음의 NeoForge 모드 54개(jar 44개) |
설치한 서버(serverInstallTest) | neoforge_hello와 하네스로 게임 테스트 서버·전용 서버 | 하네스로 같음 | 하네스로 같음 |
| NeoForge 런타임 기능 | FML의 처리기(access transformer, enum 확장, Mixin, ServiceLoader 처리기), JarJar, 언어 공급자(Kotlin), FML 플러그인 라이브러리, 초기 서비스가 실제 모드에서 동작(서버) | 같음 | 같음 |
| 성능 | 측정 8 | 같은 코드 경로, 따로 재지 않음 | 같음 |
확인용 모드를 빼면 게임 레이어 모듈 수가 같은 jar로 NeoForge 자신의 설치가 만든 것과 같습니다(26.2는 56개, 26.1은 45개, 26.1.2는 58개). 빠지는 NeoForge 모드는 NeoForge 자신의 서버에서도 멈추거나 거부되는 경우뿐이며, 모두 같은 jar와 하네스로 NeoForge 자신의 설치 서버에서 확인했습니다.
- 서버를 멈추는 클라이언트 모드: Sodium(FML 초기 서비스가 LWJGL을 찾음), Sodium Extra·Reese's Sodium Options·Iris(Mixin 플러그인이 Sodium 클래스를 찾음), 26.2의 ImmediatelyFast 1.16.5, Zoomify. 서버 실행에서만 빼고 클라이언트에서는 실행합니다. NeoForge 메타데이터에는 클라이언트 전용 표시가 없어서, Poly 모드 로더도 NeoForge처럼 이런 모드를 스스로 빼지 않습니다.
- 26.1의 NeoForge 버전 범위(
POLY-COMPAT-217): Forge Config API Port, JEI, Puzzles Lib는 26.1.2의 NeoForge를 요구합니다. NeoForge는 이런 모드가 하나라도 있으면 모드 로딩 전체를 멈추지만, Poly 모드 로더는 그 모드와 그 모드가 필요한 모드만 뺍니다. - 26.1의 Architectury 20.0.4, Veinminer 2.10.4, Jade 26.1.12는
neoforge.mods.toml로는 맞지만 NeoForge 자신의 서버에서도 멈추므로 묶음 실행에서 뺍니다. - 26.1 클라이언트에서만: Lambda Dynamic Lights 4.11.2+26.1.2는 26.1.0.19-beta에 없는 NeoForge 클래스를 씁니다(실제 NeoForge도 여기서 멈춤). 26.1 서버에서는 실행됩니다.
알아 둘 것:
- NeoForge 모드는 Fabric·Quilt 모드와 한 게임에서 실행됩니다. 다만 mixin이 NeoForge 패치와 맞지 않는 Fabric·Quilt 모드는 빠집니다(
224, 아래). Forge 모드와 함께 넣으면 Forge가 실행되고 NeoForge 모드는 이유와 함께 빠집니다(POLY-COMPAT-221). - FML이 거부할 모드는 FML이 시작하기 전에 빼므로 나머지 모드는 그대로 실행됩니다(
POLY-COMPAT-217). - FML의
ModList.getModFileById·isLoaded가 Poly 모드에도 답합니다(NeoForge의ModList가 Poly 모드 로더가 확인한 코드와 다르면POLY-COMPAT-218). 로그와 타이틀 화면에는 NeoForge 모드 수가 따로 나옵니다. - NeoForge는 운영 환경에서 Mojang의 게임 테스트를 돌리지 않습니다(NeoForge 자신의 설치에서도 같음). 그래서 게임 테스트 서버 확인에는 테스트 하네스 모드를 씁니다.
- NeoForge와 함께일 때는 브랜드·타이틀 화면·크리에이티브 탭을 다루는 Poly 모드 로더 자체 규칙이 꺼집니다. NeoForge가 직접 하기 때문입니다. 페이로드 코덱 규칙도 꺼지므로, NeoForge와 함께일 때 Poly 모드의 네트워크 채널은 확인하지 않았고 동작하지 않을 수 있습니다.
- 모드마다 기능을 하나하나 써 본 것은 아닙니다. 실제 Minecraft Launcher로 실행한 기록은 없습니다. 런처 프로필 실행은 런처가 게임을 시작하는 방식을 재현한 것입니다.
Fabric·Quilt 모드와 함께
Forge와 Fabric 모드를 함께 실행할 때처럼 하나의 Mixin(Fabric의 것)이 NeoForge 모드도 맡고, NeoForge의 FML은 자기 Mixin을 시작하지 않으며, Fabric 모드는 NeoForge의 레지스트리가 열린 채로 초기화됩니다. 수는 Fabric / Quilt / NeoForge 모드 수이며 중첩 jar를 포함합니다.
2026-10-25부터(ADR-0030) NeoForge가 패치한 게임에서 mixin이 쓰인 대로 동작할 수 없는 Fabric·Quilt 모드는 로드하지 않고(224), 그 모드가 필요한 모드도 빠집니다(114). 메시지와 타이틀 화면은 이것이 Poly 모드 로더의 한계이며 모드의 버그가 아니라는 것, Poly 모드 로더에 알려 달라는 것을 적습니다.
2026-10-27에 1.2.4로 다시 측정(26.2, 헤드리스, 통과, 225 없음). 1.2.2부터 [modproperties.<id>] 표가 있는 NeoForge 모드가 빠지던 회귀(217: JEI, Kotlin for Forge, Lambda Dynamic Lights, Lithium, MoreCulling과 이것들이 필요한 모드), MezzConfig의 Fabric 판과 NeoForge 판이 함께 실행되던 문제, 아무것도 옮기지 않던 1.2.3의 NeoForge 주입 지점 4개를 고친 뒤의 결과입니다.
| 확인 항목 (26.2, 2026-10-27) | 외래 모드 로드 / 제외 | NeoForge 모드 | 224로 빠진 모드 |
|---|---|---|---|
게임 테스트 서버(corpusFabricNeoForge): 월드 생성, GameTest, 저장 | 40 / 76 | 40 | Fabric API 모듈 10개: block, content-registries, crash-report-info, data-generation, entity-events, events-interaction, item, registry-sync, resource-conditions, transfer. fabric-menu-api-v1은 224 판정은 없어졌지만 fabric-registry-sync-v0의 클래스가 없어 111로 빠짐 |
NeoForge 모드만(corpusNeoForge) | (Fabric 모드 없음) | 38, 217 0개 | — |
아래 2026-10-25 표의 다른 줄은 다시 실행하지 않았습니다.
2026-10-25에 26.2에서 다시 실행한 결과입니다(헤드리스, 모두 통과, 게임 중 Mixin 실패 225 없음).
| 확인 항목 (26.2) | Fabric / Quilt / NeoForge | 224로 빠진 모드 |
|---|---|---|
게임 테스트 서버(corpusFabricNeoForge): 월드 생성, GameTest, 저장 | 28 / 0 / 48(전에는 54 / 0 / 48) | Fabric API 모듈 16개: block, content-registries, crash-report-info, data-generation, entity-events, events-interaction, item, lifecycle-events, menu, object-builder, particles, registry-sync, resource-conditions, resource-loader, tag, transfer |
Fabric 빌드만 NeoForge 위에서(corpusFabricOnNeoForge, Sinytra Connector가 맡는 구성) | 37 / 0 / 7(전에는 96 / 0 / 7) | 20개: 위 모듈과 Architectury, Balm, Lithium, Puzzles Lib. Forge Config API Port의 Fabric 빌드는 쓰는 Fabric API 모듈이 로드되지 않아 링크 검사에서 빠짐(111) |
Quilt 묶음과 NeoForge 모드(corpusQuiltNeoForge), 게임 테스트 서버 | 15 / 12 / 56(전에는 50 / 73 / 56) | 17개: 위 모듈과 All Stacks Infinite. Better Shulker Boxes도 빠짐 |
네트워크 접속(corpusFabricNeoForgeJoin): 로그인·설정·플레이 단계, 두 로더의 페이로드 주고받기 | 29 / 0 / 48, 통과 | 16개. Fabric API 레지스트리 동기화가 로드되지 않아 서버가 fabric: 채널을 등록하지 않음 |
창 없는 클라이언트(corpusFabricNeoForgeClientMixins) | 27 / 0 / 52, 통과 | 24개(클라이언트 모듈 포함) |
26.1·26.1.2는 이 변경 뒤에 다시 실행하지 않았고, 창을 여는 클라이언트(corpusFabricNeoForgeClient)도 다시 실행하지 않았습니다. 아래 표는 맞지 않는 주입을 건너뛰던 2026-10-24~25의 기록이며, 그 수는 지금 동작이 아닙니다.
| 확인 항목 (2026-10-25 전) | 26.2 (NeoForge 26.2.0.93) | 26.1 (26.1.0.19-beta) | 26.1.2 (26.1.2.122) |
|---|---|---|---|
클라이언트(corpusFabricNeoForgeClient, 창이 열림): 저장된 월드 입장, 200틱, 저장 후 종료 | 62 / 0 / 53, 통과 | 81 / 0 / 35, 통과 | 61 / 0 / 54, 통과 |
창 없는 클라이언트(corpusFabricNeoForgeClientMixins): 두 로더의 Mixin 설정이 겨냥하는 클래스를 모두 로드 | 62 / 0 / 52, 설정 134개, 클래스 766개, 실패 0 | 81 / 0 / 34, 실패 0 | 61 / 0 / 53, 실패 0 |
네트워크 접속(corpusFabricNeoForgeJoin): 로그인·설정·플레이 단계, 두 로더의 페이로드 주고받기 | 통과 | 통과 | 통과 |
게임 테스트 서버(corpusFabricNeoForge): 월드 생성, GameTest, 저장 | 54 / 0 / 48, 통과 | 68 / 0 / 38, 통과 | 53 / 0 / 50, 통과 |
Fabric 빌드만 NeoForge 위에서(corpusFabricOnNeoForge, Sinytra Connector가 맡는 구성) | 96 / 0 / 7, 통과 | 89 / 0 / 7, 통과 | 95 / 0 / 7, 통과 |
전용 서버(corpusFabricNeoForgeServer), EULA 확인까지 | 53 / 0 / 47, 통과 | 70 / 0 / 36, 통과 | 52 / 0 / 49, 통과 |
Quilt 묶음과 NeoForge 모드(corpusQuiltNeoForge), 게임 테스트 서버 | 50 / 73 / 56, 통과 | 48 / 65 / 40, 통과 | 46 / 21 / 53, 통과 |
- NeoForge 옆의 Fabric API. 네이티브 패치 조정(파티클 생성 리타겟 및 낙하 데미지 훅 등)과 더불어, Poly 모드 로더는 모드 폴더 또는 JarJar에 Sinytra의 Forgified Fabric API(
forgified-fabric-api)가 제공되면 이를 완벽하게 인식하고 지원하여 Fabric API 모듈들을 NeoForge 네이티브 훅 및 이벤트 시스템으로 깔끔하게 매핑합니다. Forgified Fabric API가 없는 경우에도 호환 가능한 모듈들은 자체 패치 조정을 통해 실행되며, 완전히 변경된 바이트코드로 동작할 수 없는 모듈만 런타임 크래시 대신224로 안전하게 제외됩니다. 2026-10-25 전에는 이런 주입을 건너뛰고138(폐기)로 알렸습니다. - 두 로더용으로 만든 같은 모드. NeoForge 빌드가 실행되고 Fabric 빌드는 빠집니다(
139). 로더마다 ID 표기가 달라도 같습니다(Cloth Config는 Fabric에서cloth-config, NeoForge에서cloth_config). 두 빌드가 대부분 같은 코드이면, 빠진 빌드가 필요한 모드는 NeoForge 빌드가 대신 충족합니다. - 그 밖의 한계. Mixin이 설정을 고르기 전에 로드된 클래스로의 NeoForge 모드 mixin은 적용되지 않습니다(
220. 26.2 클라이언트에서 1개로, Iris와 함께일 때 Lithium의BlockGetterMixin이며 NeoForge만 넣어도 적용되지 않음). NeoForge 패치 때문에 하위 클래스의 재정의가 부르게 된 메서드로의 Fabric 주입은 바닐라에서와 같은 수신 객체에서만 실행됩니다(222). NeoForge 패치와 Fabric 모드가 같은 메서드의 default를 둘 준 게임 인터페이스는 NeoForge 것을 씁니다(223). - 알려진 차이. Fabric의 Mixin은 FML의 access transformer와 NeoForge coremod보다 먼저 적용됩니다. 클라이언트에서는 Fabric 모드가 NeoForge의 모드 로딩 뒤에 초기화되므로, NeoForge가 등록 직후에 하는 일(크리에이티브 탭 정렬 등)이 Fabric 모드의 항목을 보지 못할 수 있으며 확인하지 않았습니다. Fabric·Quilt 모드가 있으면 Fabric Loader API가 NeoForge 모드에도 보이므로, 그것으로 로더를 고르는 여러 로더용 라이브러리는 Fabric 쪽 경로를 탑니다.
- Forge 모드와 함께는 안 됩니다. Forge가 실행되고 NeoForge 모드는 이유와 함께 빠집니다(
221). 26.2 서버 jar에서 두 로더가 다 바꾸는 바닐라 메서드 2,342개 중 736개를 두 로더가 서로 다르게 바꾸고,Entity·Level등 6개 클래스의 상위 클래스도 서로 다르게 바꿉니다.
NeoForge 진단: POLY-COMPAT-200–205(NeoForge를 실행하지 않을 때), 215–218, 220–226. 오류 코드를 보세요.
Quilt
Poly 모드 로더는 Minecraft 26.1, 26.1.2, 26.2에서 Quilt 모드를 실행합니다. Quilt Loader는 따로 설치하지 않아도 됩니다. Poly 모드 로더가 quilt.mod.json을 읽고 Quilt Loader API를 제공합니다.
실행되는 것:
quilt.mod.json을 Quilt Loader의 의미로 읽습니다. 버전만 쓰면^로 보고, 의존성의optional, any/all 묶음,unless와provides도 읽습니다.quilt_loader.jars의 중첩 모드. 필요할 때만 로드하는 중첩 모드를 아무 모드도 필요로 하지 않으면 Quilt Loader처럼 로드하지 않습니다(POLY-COMPAT-307).- Quilt Loader 0.31.0-beta.4의 공개 API(
org.quiltmc.loader.api). 제공하지 않는 내부 클래스는 링크 검사가 막습니다(111). - 진입점
main,client,server,pre_launch. - Quilt 모드의 Mixin, access widener, 환경별 클래스 제거.
quilt_loader를 요구하는 Quilt용 Fabric jar(Better Shulker Boxes, F34, InvSearch Storage Indexer, MTA NYC Subway Signs). Quilt Loader처럼 받습니다.FabricLoader.isModLoaded("quilt_loader")는 Fabric Loader처럼false입니다.
실행되지 않는 것:
- QSL 진입점(
init,client_init,server_init)은 실행하지 않습니다(POLY-COMPAT-303). Quilt Standard Libraries(QSL)는 26.x 판이 없어서 Quilt Loader도 실행하지 않습니다. - QSL이나 Quilted Fabric API에 의존하는 모드는 뺍니다(
POLY-COMPAT-114, 이유는308). - Quilt Loader 플러그인(
301), Quilt 언어 어댑터(302), 수정 가능한 파일 시스템 오버레이(306)는 제공하지 않으며, 이것이 필요한 모드는 막힙니다.
Quilt Loader와 일부러 다르게 정한 것:
fabric.mod.json과quilt.mod.json이 모두 든 jar는 Fabric 모드로 실행합니다(310). 이미 Fabric 모드로 실행되던 jar가 그대로 실행되게 하려는 것입니다. Quilt Loader라면quilt.mod.json을 읽습니다.- Maven
group:id형식의 의존은 ID로만 맞춥니다.
Quilt 완전 지원 점검(2026-10-24)은 26.2, 26.1, 26.1.2에서 했습니다. 테스트 묶음은 그 Minecraft 버전에 Quilt 판은 있고 Fabric 판은 없는 Modrinth 프로젝트 전부와, 그 판들이 필수로 요구하는 모드입니다. 26.2는 114개와 필수 모드 3개(Fabric API, Cloth Config, Fusion), 26.1은 97개와 1개(Fabric API), 26.1.2는 50개와 1개입니다. 대부분(26.2에서 65개)은 데이터 팩을 모드로 묶은 리소스 모드이고, 클래스가 있는 모드는 30여 개입니다.
| 26.2 | 26.1 | 26.1.2 | |
|---|---|---|---|
게임 테스트 서버(corpusQuilt): 월드 생성, GameTest, 저장. 저장된 월드에 Quilt 모드의 데이터 팩이 켜져 있음 | 외부 모드 135개(Quilt 80개, 중첩·필수 모드 포함). Simple Voice Chat의 음성 서버 시작 | 118개(Quilt 69개) | 73개(Quilt 25개) |
전용 서버(corpusQuiltServer): EULA 확인까지 | 133개 | 116개 | 71개 |
| Quilt 전용 판 중 서버에서 로드 | 114개 중 93개 | 97개 중 79개 | 50개 중 34개 |
Quilt 전용 판 중 클라이언트 판정에서 로드 가능(corpusAssessmentQuilt, 게임 없이) | 114개 중 103개 | 97개 중 81개 | 50개 중 38개 |
클라이언트(corpusQuiltClient, 게임 창이 열림): 저장된 월드 입장, 200틱, 저장 후 종료 | 통과: 외부 모드 155개(Quilt 88개, Fabric 67개) | 통과: 131개(Quilt 73개) | 통과: 88개(Quilt 30개) |
클라이언트 쪽 Mixin 전부 적용(mixinAuditQuiltClient, 게임 없이) | 통과(대상 클래스 461개) | 통과(408개) | 통과(411개) |
Forge 모드와 함께(corpusQuiltForge, Forge 묶음과 한 게임) | 통과(2026-10-25): Fabric 22개, Quilt 13개, Forge 42개(전에는 51, 73, 42개) | 2026-10-25 뒤로 다시 실행하지 않음(전에는 통과, 외부 모드 113개, Forge 모드 파일 40개 중 24개) | 2026-10-25 뒤로 다시 실행하지 않음(전에는 통과, 68개, 38개 중 33개) |
설치한 서버(serverInstallTest, quilt_hello로 게임 테스트 서버와 전용 서버) | 통과 | 통과 | 통과 |
설치한 런처 프로필(launcherProfileTest에 quilt_hello, 게임 창이 열림) | 통과 | - | - |
테스트 모드 시나리오(quiltOnly, quiltFabricPoly, quiltBlocked: Quilt·Fabric·Poly 모드 함께) | 통과 | 통과 | 26.1 모듈과 같음 |
실제 Quilt Loader 0.31.0-beta.4와 비교(quiltLoaderReference, 전용 서버) | 114개 중 113개 같음 | 97개 중 96개 같음 | 50개 중 48개 같음 |
| 성능 | 측정 7 | 같은 코드 경로, 따로 재지 않음 | 같음 |
빠지는 Quilt 모드는 실제 Quilt Loader에서도 빠지거나 실행되지 않는 경우뿐입니다. 26.2의 서버에서 빠지는 21개는 다음과 같습니다.
- Quilt Loader도 거부하는 메타데이터 7개(
300):intermediate_mappings가 없음 3개, 실험 기능인 Mojang 매핑 요구 1개, SPDX가 아닌 라이선스 문자열 2개, JSON이 아닌quilt.mod.json1개. ">=26.2 <26.3"처럼 공백으로 이은 버전 범위 2개. Quilt 규칙으로는 비교 하나라서 26.2를 받지 않습니다(114). Quilt Loader도 시작을 멈춥니다.- 서버에 넣은 클라이언트 전용 모드 11개(
305,108). 그중 Armor Visibility는 Quilt Loader가 서버에서도 로드하지만 클라이언트 코드만 있어, Quilt Loader에서도 서버에서는 아무 코드도 실행되지 않습니다. - 모드가 아닌 jar 1개(Paper 플러그인,
POLY-DISCOVERY-002).
26.1·26.1.2에는 하나가 더 있습니다. Yeth's TPA는 Minecraft 1.21의 intermediary 이름으로 컴파일된 빌드라 Poly 모드 로더가 뺍니다(112). Quilt Loader는 로드하지만 26.x에서는 모드를 다시 매핑하지 않으므로 실행하자마자 실패합니다.
알아 둘 것:
- 리소스 모드와 QSL. 26.2의 리소스 모드 65개는
fabric-resource-loader-v0가 없을 때만quilt_resource_loader에 의존합니다. Fabric API가 있으면 Quilt Loader도 Poly 모드 로더도 이 의존을 따지지 않고, Fabric API의 리소스 로더가 데이터 팩을 만듭니다. Fabric API가 없으면 Quilt Loader에서처럼 빠집니다(114와308). - Forge·NeoForge 모드와 함께일 때는
224를 포함해 Fabric 모드와 같은 규칙입니다. Quilt와 Forge 메타데이터가 모두 든 jar는 Forge용 빌드로 실행하고, Forge가 자기 빌드를 로드하는 Simple Voice Chat의 Quilt 빌드는 빠집니다(139). - Mixin 자신이 거부하는 Mixin. 26.1·26.1.2의 Even Better Moon and Sun은 Mixin 0.8.7이 거부하는 주입 지점이 있어 게임 시작 전에 빠집니다(
140). NeoFullbright 1.0+mc26.2는 어느 로더에서든 클라이언트에서 Mixin이 거부하는 Mixin이 있어 클라이언트 실행에서 뺐습니다. Fabric Loader와 Quilt Loader도 같은 Mixin을 씁니다. - 로드되지만 모드 자체에 결함이 있는 것. Omni는 몹이 뛰는 순간 서버가
NoClassDefFoundError로 멈추고, Craftable Bucket of Sulfur Cube는minecraft:tick에 없는 함수를 적어 게임이 그 태그를 거부하므로 어떤 데이터 팩의 틱 함수도 돌지 않습니다. 실제 Quilt Loader에서도 같습니다. - 클라이언트는 실제 Quilt Loader로 실행해 비교하지 않았습니다. 모드마다 기능을 하나하나 써 본 것은 아닙니다.
Quilt 진단 코드는 POLY-COMPAT-300–310입니다. 오류 코드를 보세요.
실제 인기 모드로 확인한 Fabric 결과 (2026-10-21, 2026-10-22 갱신)
Modrinth에서 26.2용으로 가장 많이 받은 Fabric·NeoForge·Forge 모드 각 40개와 그 필수 의존 모드를 시험했습니다. jar는 125개이고 외부 모드는 123개입니다. 클라이언트와 서버 각각에서 모드를 하나씩 판정하고 전부 함께도 판정했으며, 게임 테스트 서버에서도 실행했습니다.
- 판정 중 예외와 게임 크래시: 0건. 모든 jar가 로드되거나 이유와 함께 빠졌습니다.
- 로드 가능한 모드: 0개(중첩 jar 지원 전). 로드를 막은 이유는 많은 순서대로 Mixin(Fabric 45, FML 34), FML 런타임(71), 중첩 jar(26), class tweaker(26)였습니다.
- 중첩 jar 지원 뒤: 중첩 모드 142개를 새로 판정하게 됩니다. 직접 설치한 모드 중에서는
fabric-api가 로드되지만 하위 모듈은 44개 중 1개만 로드됩니다(일부만 동작,124). - Fabric Loader API 제공 뒤: 로드 가능한 외부 모드가 17개입니다(
placeholder-api,fabric-language-kotlin과 Kotlin 라이브러리 13개, 일부만 동작하는fabric-api). 이 상태에서 게임이 정상적으로 시작합니다. - class tweaker 지원 뒤:
- class tweaker 때문에 막힌 모드(
102): 직접 설치 26개·중첩 54개에서 0개가 됐습니다(102폐기). - 시험한 모드들의 class tweaker 80개를 모두 읽었습니다. 형식 오류(
125), 다른 이름 공간(126), 26.2에 없는 대상(128)은 0건입니다. - interface injection(
127)으로 막힌 모드: 직접 설치 2개, 중첩 40개. 모두 Mixin(101)도 씁니다. - class tweaker가 있는 모드를 여전히 막는 이유: 74개는 Mixin입니다. 나머지는
cloth-config(::엔트리포인트,106),veinminer(로드되지 않은 Fabric API 클래스,111), 중첩된pridelib(바깥 jar·의존 모드 차단,121·114, 서버에서는108), 사본 하나(122)입니다. - 함께 로드할 수 있는 외부 모드: 17개 → 18개(그중 직접 설치 3개). 새로 로드되는 것은
fabric-api안의fabric-transitive-access-wideners-v1입니다. - 게임 테스트 서버:
corpusFabric18개 로드·156개 빠짐,corpusAll19개·247개(이전 17·157, 18·248). 접근 확대 433개를 적용하고(거부 0) 정상적으로 시작합니다. - 판정 중 예외와 게임 크래시: 0건.
- class tweaker를 쓰는 모드 대부분이 Mixin도 써서 로드 가능한 모드는 하나만 늘었습니다. 이 결과가 보여 주는 것은 실제 파일 80개를 Fabric과 같은 문법으로 오류 없이 읽고 26.2 jar와 대조할 수 있다는 점, 그리고 접근 확대 433개를 적용해도 서버가 정상적으로 시작한다는 점입니다. 그 모드들의 기능이 동작한다는 뜻은 아닙니다.
- class tweaker 때문에 막힌 모드(
- Mixin 지원 뒤(2026-10-22):
- 함께 로드할 수 있는 직접 설치 Fabric 모드: 클라이언트 3개 → 52개 중 42개, 전용 서버 3개 → 28개. 중첩 모드를 포함한 전체 외부 모드: 클라이언트 18개 → 127개, 서버 100개.
- Fabric API 하위 모듈: 클라이언트 44개 전부, 서버 37개(나머지 7개는 클라이언트 전용,
108). - 모든 Fabric 모드를 넣은 실제 전용 서버 시작(
net.minecraft.server.Main): 99개가 로드되고, Mixin 적용·모드 초기화·Fabric API 레지스트리 동결을 거쳐 EULA 확인까지 갑니다. - 게임 테스트 서버: 97개(Xaero 모드 2개 제외)로 월드 생성, GameTest 통과, 틱, 저장까지 됩니다.
- 클라이언트에서 아직 막히는 것: 시험 묶음에 여러 로더용으로 두 번 이상 들어 있는 모드 4개(
collective,iris,lambdynlights,zoomify. 같은 ID117, 실제 설치에서는 생기지 않음)와customskinloader-bootstrap(Fabric Loader 내부 클래스,111). 서버에서는 대부분 클라이언트 전용 모드입니다(108). - 판정 중 예외와 게임 크래시: 0건.
- 클라이언트(
corpusFabricClient, 게임 창이 열림): 137개가 로드·초기화되고, Sodium·Iris가 시작되며, 저장된 월드에 들어갑니다. 여기까지 오는 데 고친 것은 하나입니다. 게임 전에 도는 모드 코드(FabricpreLaunch, Mixin 설정 플러그인)가 Fabric Loader에서처럼 문맥 클래스로더로 게임 클래스로더를 보게 했습니다. - 이 결과는 모드가 로드되고 시작·틱·저장되며 클라이언트에서 월드에 들어간다는 뜻입니다. 모든 모드의 기능을 하나하나 확인했다는 뜻은 아니며, 화면에 그려진 결과는 아직 사람이 보지 않았습니다.
- Fabric 완전 지원 점검(2026-10-22, 26.1과 26.2):
- 클라이언트(
corpusFabricClient, 게임 창이 열림): 모든 Fabric 모드를 넣고 저장된 월드에 들어가 200틱을 보내고, "저장 후 타이틀로"로 나간 뒤 클라이언트가 꺼집니다. 26.2는 140개(실제 모드 138개와 테스트 모드 2개), 26.1은 128개(실제 모드 126개와 같은 테스트 모드 2개). - 실제 전용 서버 시작: 26.2는 100개, 26.1은 93개. 게임 테스트 서버: 98개와 91개.
- 설치 프로그램이 만든 런처 프로필이 Fabric 모드를 넣은 채로 게임을 시작합니다.
- 직접 설치한 Fabric 모드 중 남은 차단: 시험 묶음에 든 같은 모드의 여러 로더용 사본(
117), 서버의 클라이언트 전용 모드(108), 26.1에서 Minecraft 26.1.2나 더 새 Sodium이 필요한 모드(114). - 이 과정에서 고친 것: CustomSkinLoader(Fabric Loader 실행기 사용,
version.json을 읽어 규칙 선택), 그리고 NeoForge 코드만 쓰는 Minecraft 메서드 때문에 막히던collective. - CustomSkinLoader가 있으면 클라이언트를 끈 뒤 "Client shutdown from post-main" 크래시 리포트가 남습니다. 이 모드가 스레드를 1분 동안 남겨 두는데 Minecraft의 종료 감시는 15초 뒤에 리포트를 씁니다. 월드는 이미 저장된 뒤이고, Fabric Loader에서도 같습니다.
- 클라이언트(
- 이 기록은 Fabric 모드에 관한 것입니다. Forge 결과는 Forge에, NeoForge 결과는 NeoForge에 있습니다.
확인 방법
- 로드되지 않은 모드는
.poly/startup-report.json의blockedFiles·foreignMods에 이유가 기록됩니다. 설치한 게임은 런처 폴더, 서버는 서버 폴더, 모드 프로젝트의 개발 실행은run/<side>/아래에 있습니다. - 브리지가 없는 로더의 jar는
POLY-COMPAT-001로 차단됩니다. - Poly 모드 로더는 혼합 실행, 로더를 넘는 의존, 차단 연쇄, 중첩 jar, Fabric Loader API, class tweaker, 실제 인기 모드 묶음을 릴리스마다 자동으로 검증합니다.
혼합 실행이 어려운 이유
| 위험 | 이유 |
|---|---|
| 게임 클래스 소유권 | 여러 로더가 모두 net.minecraft를 직접 정의하려 함. 한 로더만 소유 가능 |
| Mixin 서비스 중복 | 로더마다 Mixin 서비스를 등록하지만 Mixin 상태는 전역 |
| 모듈 레이어 대 평면 클래스 경로 | FML은 모듈 레이어, Fabric 모드는 평면 클래스 경로 전제 |
| 변환 순서 | 로더마다 변환 순서 모델이 다름 |
| 레지스트리 시점 | 등록할 수 있는 시점이 로더마다 다름 |
| 네트워크 협상 | 필수 채널·레지스트리 동기화 방식이 다름 |
Minecraft 26.x는 난독화되지 않아 세 로더의 모드가 같은 이름 공간(Mojang 원래 이름)을 씁니다. 그 덕분에 매핑 충돌 위험이 크게 줄었습니다.