resourcepack: gate shader strip on declared maxFmt, not build target

베이스팩의 vanilla 셰이더는 manifest 의 mcVersion(resolved.format) 이 64 이하
라도, 우리가 supported_formats/max_format 으로 1.21.9+ 까지 호환을 선언하면
새 GLSL API 환경에서 로드돼 "리소스 새로고침 실패" 가 다시 난다. 셰이더 제거
판정 기준을 resolved.format > 64 에서 maxFmt > 64 로 옮기고, 그 계산을
mcmeta 작성보다 먼저 수행한다. 로그의 format 값도 maxFmt 를 표시해 어떤
호환 상한 때문에 제거됐는지 추적 가능하게 했다.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-05-14 21:49:11 +09:00
parent 1665f05c55
commit a8b9b689c2

View File

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