Add Minecraft 26.x support and version Java artifacts

This commit is contained in:
2026-10-07 13:18:31 +05:00
parent 48b34db6f1
commit dac8650ac1
50 changed files with 813 additions and 162 deletions

View File

@@ -2,7 +2,11 @@ import { mkdir, readFile, writeFile } from "node:fs/promises";
import { createHash } from "node:crypto";
import { unzipSync } from "fflate";
export const assetsRoot = ".cache/minecraft/1.21.11";
const completionMarker = `${assetsRoot}/.minegeo-assets.json`;
export function assetsDirectory(version = "1.21.11") {
if (!/^(?:1\.21\.11|26\.[12](?:\.\d+)*)$/.test(version))
throw new Error("Unsupported Minecraft asset version");
return `.cache/minecraft/${version}`;
}
const requiredAssets = [
"blockstates/grass_block.json",
"blockstates/stone.json",
@@ -14,12 +18,14 @@ const requiredAssets = [
"textures/block/stone.png",
"textures/block/water_still.png",
];
async function assetsReady() {
async function assetsReady(minecraftVersion) {
const assetsRoot = assetsDirectory(minecraftVersion);
const completionMarker = `${assetsRoot}/.minegeo-assets.json`;
try {
const marker = JSON.parse(await readFile(completionMarker, "utf8"));
if (
marker.format !== "minegeo-assets/v2" ||
marker.minecraftVersion !== "1.21.11" ||
marker.minecraftVersion !== minecraftVersion ||
!marker.files
)
return false;
@@ -39,10 +45,12 @@ async function assetsReady() {
return false;
}
}
export async function prepareAssets() {
if (await assetsReady()) return;
export async function prepareAssets(minecraftVersion = "1.21.11") {
const assetsRoot = assetsDirectory(minecraftVersion);
const completionMarker = `${assetsRoot}/.minegeo-assets.json`;
if (await assetsReady(minecraftVersion)) return assetsRoot;
console.log(
"Preparing Minecraft 1.21.11 models and textures for terrain rendering…",
`Preparing Minecraft ${minecraftVersion} models and textures for terrain rendering…`,
);
const manifest = await (
await fetch(
@@ -50,13 +58,14 @@ export async function prepareAssets() {
{ signal: AbortSignal.timeout(60000) },
)
).json();
const entry = manifest.versions.find((v) => v.id === "1.21.11");
if (!entry) throw new Error("Official Minecraft 1.21.11 metadata missing");
const entry = manifest.versions.find((v) => v.id === minecraftVersion);
if (!entry)
throw new Error(`Official Minecraft ${minecraftVersion} metadata missing`);
const version = await (
await fetch(entry.url, { signal: AbortSignal.timeout(60000) })
).json();
await mkdir(".cache/minecraft", { recursive: true });
const jarPath = ".cache/minecraft/client-1.21.11.jar";
const jarPath = `.cache/minecraft/client-${minecraftVersion}.jar`;
let jar;
try {
jar = await readFile(jarPath);
@@ -101,16 +110,17 @@ export async function prepareAssets() {
completionMarker,
JSON.stringify({
format: "minegeo-assets/v2",
minecraftVersion: "1.21.11",
minecraftVersion,
clientSha1: version.downloads.client.sha1,
files: Object.keys(entries).length,
}),
);
if (!(await assetsReady()))
if (!(await assetsReady(minecraftVersion)))
throw new Error(
"Minecraft rendering assets are incomplete or corrupt. Run npm run setup to repair them.",
);
console.log(
`Prepared ${Object.keys(entries).length} verified vanilla model/texture assets.`,
);
return assetsRoot;
}