diff --git a/src/installer-rp/pack.ts b/src/installer-rp/pack.ts index 2ab5f6b..03d297d 100644 --- a/src/installer-rp/pack.ts +++ b/src/installer-rp/pack.ts @@ -65,11 +65,17 @@ export async function buildResourcepackZip(opts: BuildResourcepackOptions): Prom opts.log?.(t('log.packFormatFallback', { format: resolved.format, version: opts.mcVersion })) } - // 1-a) pack_format > 64 (1.21.9+) 에서는 vanilla 셰이더 GLSL API 가 바뀌어 - // 구버전 베이스팩의 assets/minecraft/shaders/* 가 컴파일 자체가 실패한다. - // 결과적으로 "리소스 새로고침 실패" 가 다시 뜨므로, 이 경우엔 해당 디렉터리를 - // 결과 zip 에서 제거한다. 텍스처/모델 등 나머지 자산은 그대로 유지. - if (opts.baseZipPath && resolved.format > 64) { + // 호환 범위는 1.21.6 (=MIN_SUPPORTED_FORMAT) 부터 알려진 최신까지 선언한다. + // 빌드 타깃이 LATEST_KNOWN_FORMAT 보다 높으면(테이블 갱신 전 신버전) 그 값까지 확장. + // (셰이더 제거 판정에도 maxFmt 를 쓰므로 mcmeta 작성보다 먼저 계산해 둔다.) + const minFmt = Math.min(MIN_SUPPORTED_FORMAT, resolved.format) + const maxFmt = Math.max(LATEST_KNOWN_FORMAT, resolved.format) + + // 1-a) 선언 호환 범위의 max 가 64 를 넘으면(=1.21.9+ 클라이언트에서도 로드 가능) + // 구버전 베이스팩의 assets/minecraft/shaders/* 가 새 GLSL API 와 충돌해 컴파일에 + // 실패한다. 결과적으로 "리소스 새로고침 실패" 가 다시 뜨므로, 이 경우엔 해당 + // 디렉터리를 결과 zip 에서 제거한다. 텍스처/모델 등 나머지 자산은 그대로 유지. + if (opts.baseZipPath && maxFmt > 64) { const vanillaShaderDir = path.join(root, 'assets', 'minecraft', 'shaders') try { const stat = await fs.stat(vanillaShaderDir) @@ -80,7 +86,7 @@ export async function buildResourcepackZip(opts: BuildResourcepackOptions): Prom opts.log?.(t('log.baseShaderOverrideStripped', { path: entries.join(', '), mc: opts.mcVersion, - format: resolved.format + format: maxFmt })) } } @@ -88,10 +94,6 @@ export async function buildResourcepackZip(opts: BuildResourcepackOptions): Prom // 없으면 정상. 무시. } } - // 호환 범위는 1.21.6 (=MIN_SUPPORTED_FORMAT) 부터 알려진 최신까지 선언한다. - // 빌드 타깃이 LATEST_KNOWN_FORMAT 보다 높으면(테이블 갱신 전 신버전) 그 값까지 확장. - const minFmt = Math.min(MIN_SUPPORTED_FORMAT, resolved.format) - const maxFmt = Math.max(LATEST_KNOWN_FORMAT, resolved.format) // pack_format <= 64 인 MC 는 supported_formats 를, > 64 인 MC 는 min_format/max_format 을 // 읽는다. 어느 한쪽만 두면 반대편 클라이언트에서 거부되므로 양쪽 모두 기록한다. const packMeta: Record = {