Upload via GUI (143 Dateien)

This commit is contained in:
2026-10-04 18:46:00 +00:00
parent 7e1fb616aa
commit 6a0e92eb0f
17 changed files with 2786 additions and 1686 deletions
+40 -8
View File
@@ -88,6 +88,8 @@ const DEFAULT_SETTINGS = {
bgSkin: '', // '' = aus, 'active' = aktives Konto, sonst Konto-UUID
bgSkinOpacity: 55, // Deckkraft des Hintergrund-Skins in %
bgSkinPose: 'walking', // Pose des 3D-Renders (falls der Pose-Dienst erreichbar ist)
startAnimation: true, // drehendes Logo + Fensteraufbau beim Öffnen des Launchers
uiAnimationen: true, // bewegte Oberfläche: lebende Skin-Figur, aufwachsende Fenster, Einblenden, Überblenden
bgSkinModel: 'auto', // Armform der Figur: 'auto' (vom Konto), 'classic' (Steve), 'slim' (Alex)
bgSkinCycle: false, // bei 2+ angemeldeten Konten automatisch durchwechseln
bgSkinCycleSeconds: 30, // Sekunden zwischen zwei Kontowechseln
@@ -424,6 +426,35 @@ function createInstance(data) {
return writeInstance(inst);
}
/*
* Große Instanzordner nicht synchron löschen (das fror den Launcher bei vielen
* GB minutenlang ein): sofort in einen versteckten Papierkorb im Instanzordner
* verschieben – das ist nur eine Umbenennung – und dort im Hintergrund löschen.
* Reste (z. B. nach einem Absturz) räumt raeumePapierkorbAuf() beim Start weg.
*/
const PAPIERKORB = '.aeromc-papierkorb';
function entsorgeOrdner(p) {
if (!fs.existsSync(p)) return;
const korb = path.join(path.dirname(p), PAPIERKORB);
const ziel = path.join(korb, path.basename(p) + '-' + Date.now());
try {
ensureDir(korb);
fs.renameSync(p, ziel);
} catch {
// Umbenennen klappt nicht (z. B. Datei gerade geöffnet): instance.json sofort
// weg, damit die Instanz aus der Liste verschwindet – den Rest im Hintergrund
try { fs.rmSync(path.join(p, 'instance.json'), { force: true }); } catch { /* egal */ }
fs.promises.rm(p, { recursive: true, force: true }).catch(() => { /* bleibt liegen, stört nicht */ });
return;
}
fs.promises.rm(ziel, { recursive: true, force: true }).catch(() => { /* beim nächsten Start erneut */ });
}
function raeumePapierkorbAuf() {
const korb = path.join(getInstancesDir(), PAPIERKORB);
if (fs.existsSync(korb)) fs.promises.rm(korb, { recursive: true, force: true }).catch(() => {});
}
function createOrReplaceImportedInstance(data) {
const existing = findInstanceByName(data && data.name);
if (!existing) return createInstance(data);
@@ -435,8 +466,7 @@ function createOrReplaceImportedInstance(data) {
inst.totalPlaySeconds = existing.totalPlaySeconds || 0;
inst.launchCount = existing.launchCount || 0;
const p = instancePath(existing.id);
if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true });
entsorgeOrdner(instancePath(existing.id));
return writeInstance(inst);
}
@@ -452,12 +482,11 @@ function updateInstance(id, patch) {
}
function deleteInstance(id) {
const p = instancePath(id);
if (fs.existsSync(p)) fs.rmSync(p, { recursive: true, force: true });
entsorgeOrdner(instancePath(id));
return true;
}
function duplicateInstance(id) {
function duplicateInstance(id, ohneSpieldaten) {
const src = getInstance(id);
if (!src) throw new Error('Instanz nicht gefunden: ' + id);
const copy = JSON.parse(JSON.stringify(src));
@@ -469,9 +498,11 @@ function duplicateInstance(id) {
copy.launchCount = 0;
ensureDir(gameDir(copy.id));
// Spielinhalte mitkopieren (Mods/Configs) – ohne Fehler wenn leer
try {
fs.cpSync(gameDir(id), gameDir(copy.id), { recursive: true });
} catch { /* Quelle evtl. leer */ }
if (!ohneSpieldaten) {
try {
fs.cpSync(gameDir(id), gameDir(copy.id), { recursive: true });
} catch { /* Quelle evtl. leer */ }
}
writeJson(instanceFile(copy.id), copy);
return copy;
}
@@ -500,5 +531,6 @@ module.exports = {
createOrReplaceImportedInstance,
updateInstance,
deleteInstance,
raeumePapierkorbAuf,
duplicateInstance,
};