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:
@@ -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> = {
|
||||||
|
|||||||
Reference in New Issue
Block a user