호환성
Poly 모드 로더는 다른 로더의 모드를 진단 우선으로 다룹니다. 로더 브리지는 Poly 모드 로더가 제공하지 못하는 기능을 하나씩 발견 항목으로 보고하며, 실행을 막는 항목이 하나라도 있으면 그 모드를 로드하지 않습니다.
지원 상태
| 로더 | 상태 | 내용 |
|---|---|---|
| Poly 모드 로더 Native | Verified | poly.mod.json 모드. Native API 게임 테스트 52개, 클라이언트·서버·월드 저장을 확인했습니다 |
| Fabric (엔트리포인트, Fabric Loader API, 언어 어댑터, 중첩 jar) | Verified | preLaunch·main·client·server 엔트리포인트(:: 값 포함)를 Fabric Loader와 같은 시점에 실행합니다. 다른 Poly 모드·Fabric 모드에 의존해도 됩니다 |
Fabric (Mixin·MixinExtras, class tweaker의 accessible·extendable·mutable·inject-interface·extend-enum 줄, @Environment) | Verified | Fabric Loader와 같은 순서로 적용합니다. 26.2의 실제 인기 모드로 140개(실제 Fabric 모드 138개와 테스트 모드 2개)가 클라이언트에서 저장된 월드를 플레이하고 저장한 뒤 나오고, 100개가 실제 전용 서버 시작을, 98개가 게임 테스트 서버에서 월드 생성·틱·저장을 통과했습니다. 26.1도 같은 검사를 통과합니다(아래) |
| Fabric (Fabric Loader 내부 클래스) | Partial | 실제 모드가 쓰는 것은 제공합니다: FabricLauncherBase.getLauncher()(addToClassPath 등), FabricLoaderImpl.getGameProvider(). 그 밖의 내부 클래스와 멤버는 링크 검사가 막습니다(111) |
Quilt (quilt.mod.json) | Untested | 아직 읽지 않습니다. quilt.mod.json만 든 jar는 모드로 인식되지 않아 로드하지 않고(POLY-DISCOVERY-002), fabric.mod.json도 든 jar는 Fabric 모드로 판정합니다. Quilt 지원은 목표에 있습니다 |
NeoForge (META-INF/neoforge.mods.toml) | Blocked | 기본적으로 진단과 함께 뺍니다(POLY-COMPAT-200..205). 기본값이 꺼진 실험 기능으로, -Dpoly.neoforge=on을 주면 NeoForge 자신의 FML을 실행합니다. 아직 26.2 서버에서만 확인했고, Fabric 모드와 함께는 안 됩니다(아래) |
Forge (META-INF/mods.toml) | Verified | Poly 모드 로더가 Forge와 FML을 그대로 실행합니다(26.1은 Forge 62.0.9, 26.1.2는 64.1.5, 26.2는 65.1.5). 세 버전 모두 인기 Forge 모드가 클라이언트에서 저장된 월드에 들어가 틱을 돌리고 저장한 뒤 나오며(26.2는 40개), 게임 테스트 서버에서 월드를 만들고 틱을 돌리고 저장하고(26.2는 38개 중 32개), 실제 전용 서버를 시작합니다(26.2는 41개 중 35개). Fabric 모드와 함께도 되고, 설치한 런처 프로필과 서버에서도 실행됩니다. Forge가 거부하거나 멈출 모드는 이유와 함께 먼저 뺍니다(POLY-COMPAT-209): 서버의 클라이언트 전용 모드, 다른 Forge 버전용 모드, Forge의 Mixin이 읽지 못하는 Mixin 설정. 자세한 내용은 아래에, Fabric 모드와 함께 쓰는 법은 Fabric 모드와 Forge 모드 함께 쓰기에 있습니다 |
상태 정의: Verified / Partial / Experimental / Blocked / Untested. jar가 로드됐다는 사실만으로 Verified라고 쓰지 않습니다.
크래시 대신 시작 전 판정
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입니다.
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) | 39개 중 33개 | 37개 중 21개 | 35개 중 30개 |
설치한 런처 프로필(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) Fabric 모드 90개가 Forge 모드와 함께 월드를 만들고 GameTest를 통과하고 저장합니다. 서로의 모드 목록도 보입니다. FML의 ModList.getModFileById·isLoaded는 Fabric 모드와 Poly 모드를, Fabric의 isModLoaded는 Forge 모드를, Poly 모드의 ModContext.mods()는 모든 로더의 모드를 봅니다. getModContainerById는 Forge 모드만 돌려줍니다. Forge 패치가 옮기거나 없앤 코드를 겨냥한 Fabric mixin은 POLY-COMPAT-138로 보고합니다(2026-10-23 기준 실행되지 않는 주입 지점 25곳). 목록은 Fabric 모드와 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–214. 오류 코드를 보세요.
NeoForge (실험)
NeoForge 모드는 기본적으로 진단만 하고 로드하지 않습니다. 진단 항목은 메타데이터, FML 언어 공급자, Mixin, Access Transformer, 의존성(경고), 라이브러리 jar입니다(POLY-COMPAT-200..205). 한 jar에 든 여러 [[mods]]의 ID를 모두 보고합니다. 그래서 이 ID를 필요로 하는 다른 로더의 모드에는 "설치됐지만 차단됨"이라는 정확한 이유가 표시됩니다.
NeoForge 자신의 로더를 실행하는 실험 기능이 있습니다. 아직 검증 전이라 기본값은 꺼짐이고, -Dpoly.neoforge=on으로 켭니다.
- NeoForge 26.2.0.93의 FML이 전용 서버에서 NeoForge 모드를 로드합니다(
neoForgeServerBoot). - 2026-10-24: 게임 테스트 서버에서 월드를 만들고
always_pass를 통과한 뒤 저장합니다(neoForgeGameTest. NeoForge는 운영 환경에서 게임 테스트를 돌리지 않으므로 테스트 하네스 모드가 필요합니다). 묶음의 서버용 NeoForge 모드 20개가 NeoForge 자신의 설치와 같은 모드 목록(24개)으로 실행됩니다(corpusNeoForgeRun, 26.2만). - FML이 거부할 모드는 FML이 시작하기 전에 뺍니다(
POLY-COMPAT-217). - 같은 게임에 Fabric 모드가 있으면 NeoForge 모드를 뺍니다(
POLY-COMPAT-216). - 아직 확인하지 않은 것: 클라이언트, 26.1, 묶음 전체.
실제 인기 모드로 확인한 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에 있습니다.
확인 방법
- 로드되지 않은 모드는
run/<side>/.poly/startup-report.json의blockedFiles·foreignMods에 이유가 기록됩니다. - 브리지가 없는 로더의 jar는
POLY-COMPAT-001로 차단됩니다. - Poly 모드 로더는 혼합 실행, 로더를 넘는 의존, 차단 연쇄, 중첩 jar, Fabric Loader API, class tweaker, 실제 인기 모드 묶음을 릴리스마다 자동으로 검증합니다.
혼합 실행이 어려운 이유
| 위험 | 이유 |
|---|---|
| 게임 클래스 소유권 | 여러 로더가 모두 net.minecraft를 직접 정의하려 함. 한 로더만 소유 가능 |
| Mixin 서비스 중복 | 로더마다 Mixin 서비스를 등록하지만 Mixin 상태는 전역 |
| 모듈 레이어 대 평면 클래스 경로 | FML은 모듈 레이어, Fabric 모드는 평면 클래스 경로 전제 |
| 변환 순서 | 로더마다 변환 순서 모델이 다름 |
| 레지스트리 시점 | 등록할 수 있는 시점이 로더마다 다름 |
| 네트워크 협상 | 필수 채널·레지스트리 동기화 방식이 다름 |
Minecraft 26.x는 난독화되지 않아 세 로더의 모드가 같은 이름 공간(Mojang 원래 이름)을 씁니다. 그 덕분에 매핑 충돌 위험이 크게 줄었습니다.