Upload via GUI (194 Dateien)

This commit is contained in:
2026-10-07 07:32:02 +00:00
parent 7e7a2021ed
commit 3ac5a6c14d
20 changed files with 2196 additions and 489 deletions
+27 -7
View File
@@ -52,11 +52,20 @@ async function downloadIfNeeded(url, dest, sha1) {
if (!sha1 || sha1File(dest) === sha1) return { skipped: true, bytes: 0 };
}
ensureDir(path.dirname(dest));
const res = await fetch(url, { headers: { 'User-Agent': UA } });
if (!res.ok) throw new Error('Download HTTP ' + res.status + ': ' + url);
const buf = Buffer.from(await res.arrayBuffer());
fs.writeFileSync(dest, buf);
return { skipped: false, bytes: buf.length };
// Mojang (und die Loader) nennen zu jeder Datei die SHA-1 – geschrieben wird
// nur, was dazu passt. Ein Fehlversuch wird einmal wiederholt (abgebrochene
// Übertragung), dann gilt die Datei als beschädigt oder manipuliert.
for (let versuch = 1; ; versuch++) {
const res = await fetch(url, { headers: { 'User-Agent': UA } });
if (!res.ok) throw new Error('Download HTTP ' + res.status + ': ' + url);
const buf = Buffer.from(await res.arrayBuffer());
if (sha1 && crypto.createHash('sha1').update(buf).digest('hex') !== String(sha1).toLowerCase()) {
if (versuch < 2) continue;
throw new Error('Prüfsumme stimmt nicht – Datei verworfen (beschädigt oder manipuliert): ' + path.basename(dest));
}
fs.writeFileSync(dest, buf);
return { skipped: false, bytes: buf.length };
}
}
// begrenzte Parallelität für viele kleine Downloads (Assets)
@@ -254,8 +263,7 @@ async function prepareAssets(vj, sharedDir, onProgress) {
// ---------------------------------------------------------------------------
function pickJava(vj, preferredPath) {
const required = (vj.javaVersion && vj.javaVersion.majorVersion) || 8;
let preferred = null;
const required = (vj.javaVersion && vj.javaVersion.majorVersion) || 8; let preferred = null;
if (preferredPath && preferredPath.trim()) {
const info = services.probeJava(preferredPath);
if (info) {
@@ -546,6 +554,10 @@ async function prepareAndLaunch(opts, onProgress) {
else if (opts.mcWidth && opts.mcHeight) args.push('--width', String(opts.mcWidth), '--height', String(opts.mcHeight));
// Direkt einem Server beitreten: ab 1.20 per Quick Play, davor über die
// älteren Startparameter --server/--port (z. B. für "Beitreten" bei Freunden)
// Direkt in eine Einzelspieler-Welt (ab 1.20, z. B. nach einem Neustart über den Mod-Schalter)
if (!opts.quickPlayServer && opts.quickPlayWelt && !vorQuickPlay(opts.versionId)) {
args.push('--quickPlaySingleplayer', String(opts.quickPlayWelt));
}
if (opts.quickPlayServer) {
const adresse = String(opts.quickPlayServer).trim();
if (vorQuickPlay(opts.versionId)) {
@@ -559,6 +571,14 @@ async function prepareAndLaunch(opts, onProgress) {
ensureDir(opts.gameDir);
// AeroMC-Look im Spiel (Ressourcenpaket, siehe spieldesign.js) – braucht das
// fertig geladene Client-JAR, aus dem die Original-Knöpfe umgefärbt werden
if (opts.vorStart) {
try {
await opts.vorStart({ gameDir: opts.gameDir, version: opts.versionId, clientJar }, (line) => emit('log', { line: line + '\n' }));
} catch { /* darf den Start nie verhindern */ }
}
// Pre-Launch-Befehl (bricht bei Fehler ab)
if (opts.preLaunchCommand && opts.preLaunchCommand.trim()) {
emit('log', { line: '[Pre-Launch] ' + opts.preLaunchCommand + '\n' });