5 Commits
Author SHA1 Message Date
M_Viper 425b94fd93 Upload via GUI (44 Dateien) 2026-08-14 08:17:05 +00:00
M_Viper e0bdcb01fb Edit README.md via Git Manager GUI 2026-08-09 08:07:12 +00:00
M_Viper c840a49f75 Edit README.md via Git Manager GUI 2026-08-09 08:07:11 +00:00
M_Viper c535d8b830 Edit README.md via Git Manager GUI 2026-08-09 08:07:07 +00:00
Git Manager GUI 248a387f01 Upload via GUI (45 Dateien) 2026-08-09 10:06:39 +02:00
8 changed files with 978 additions and 957 deletions
+1 -1
View File
@@ -6,7 +6,7 @@
Ein Minecraft-Launcher für Windows mit getrennten Instanzen, Mod-Unterstützung und Microsoft-Anmeldung. Ein Minecraft-Launcher für Windows mit getrennten Instanzen, Mod-Unterstützung und Microsoft-Anmeldung.
Aktueller Stand: Version 1.0.8 Aktueller Stand: Version 1.0.9
</div> </div>
+3 -3
View File
@@ -1,13 +1,13 @@
{ {
"name": "aeromc", "name": "aeromc",
"version": "1.0.7", "version": "1.0.9",
"lockfileVersion": 3, "lockfileVersion": 3,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "aeromc", "name": "aeromc",
"version": "1.0.7", "version": "1.0.9",
"license": "MIT", "license": "SEE LICENSE IN LICENSE",
"dependencies": { "dependencies": {
"archiver": "^7.0.1", "archiver": "^7.0.1",
"skinview3d": "^3.4.2", "skinview3d": "^3.4.2",
+1 -1
View File
@@ -1,7 +1,7 @@
{ {
"name": "aeromc", "name": "aeromc",
"productName": "AeroMC", "productName": "AeroMC",
"version": "1.0.8", "version": "1.0.9",
"description": "AeroMC Instanz-basierter Minecraft-Launcher (à la MultiMC/Prism)", "description": "AeroMC Instanz-basierter Minecraft-Launcher (à la MultiMC/Prism)",
"homepage": "https://m-viper.de", "homepage": "https://m-viper.de",
"launcherWebsite": "https://aeromc.viper.ipv64.net", "launcherWebsite": "https://aeromc.viper.ipv64.net",
+21 -9
View File
@@ -354,6 +354,10 @@ async function restoreGlobalBackup(options) {
const settingsFile = path.join(userDataDir, 'settings.json'); const settingsFile = path.join(userDataDir, 'settings.json');
const rollbackSettings = path.join(rollbackDir, 'settings.json'); const rollbackSettings = path.join(rollbackDir, 'settings.json');
let settingsPreviouslyExisted = false; let settingsPreviouslyExisted = false;
// wird erst true, sobald der aktuelle Stand tatsächlich weggesichert wurde -
// vorher darf der Rollback nichts anfassen, sonst löscht ein früher Fehler
// (z. B. ungültiges Archiv) den unveränderten, intakten Originalbestand
let originalMovedAway = false;
try { try {
ensureDir(extractDir); ensureDir(extractDir);
@@ -382,6 +386,7 @@ async function restoreGlobalBackup(options) {
endPercent: 40, endPercent: 40,
detailPrefix: 'Sichere aktuelle Instanzen', detailPrefix: 'Sichere aktuelle Instanzen',
}); });
originalMovedAway = true;
settingsPreviouslyExisted = fs.existsSync(settingsFile); settingsPreviouslyExisted = fs.existsSync(settingsFile);
if (settingsPreviouslyExisted) fs.copyFileSync(settingsFile, rollbackSettings); if (settingsPreviouslyExisted) fs.copyFileSync(settingsFile, rollbackSettings);
@@ -414,16 +419,23 @@ async function restoreGlobalBackup(options) {
restoredSettings, restoredSettings,
}; };
} catch (err) { } catch (err) {
try { // Nur zurückrollen, wenn wir den ursprünglichen Bestand überhaupt schon
if (fs.existsSync(instancesDir)) fs.rmSync(instancesDir, { recursive: true, force: true }); // angefasst haben (siehe originalMovedAway oben). Schlägt die
if (fs.existsSync(rollbackInstances)) fs.cpSync(rollbackInstances, instancesDir, { recursive: true }); // Wiederherstellung vorher fehl (ungültiges/beschädigtes Archiv o. Ä.),
else ensureDir(instancesDir); // ist instancesDir noch der unveränderte Originalbestand - den lassen wir
// dann bewusst in Ruhe, statt ihn zu löschen.
if (originalMovedAway) {
try {
if (fs.existsSync(instancesDir)) fs.rmSync(instancesDir, { recursive: true, force: true });
if (fs.existsSync(rollbackInstances)) fs.cpSync(rollbackInstances, instancesDir, { recursive: true });
else ensureDir(instancesDir);
if (includeSettings) { if (includeSettings) {
if (fs.existsSync(rollbackSettings)) fs.copyFileSync(rollbackSettings, settingsFile); if (fs.existsSync(rollbackSettings)) fs.copyFileSync(rollbackSettings, settingsFile);
else if (!settingsPreviouslyExisted && fs.existsSync(settingsFile)) fs.rmSync(settingsFile, { force: true }); else if (!settingsPreviouslyExisted && fs.existsSync(settingsFile)) fs.rmSync(settingsFile, { force: true });
} }
} catch { /* ignore rollback errors */ } } catch { /* ignore rollback errors */ }
}
throw err; throw err;
} finally { } finally {
try { fs.rmSync(tmp, { recursive: true, force: true }); } catch { /* ignore */ } try { fs.rmSync(tmp, { recursive: true, force: true }); } catch { /* ignore */ }
+10 -1
View File
@@ -269,7 +269,16 @@ function destroyTray() {
// Windows-Autostart-Eintrag setzen/entfernen + Tray-Symbol passend ein-/ausblenden // Windows-Autostart-Eintrag setzen/entfernen + Tray-Symbol passend ein-/ausblenden
function applyAutostart(enabled) { function applyAutostart(enabled) {
try { try {
app.setLoginItemSettings({ openAtLogin: !!enabled, args: enabled ? ['--hidden'] : [] }); // Gleiches Problem wie bei den Desktop-Verknüpfungen (siehe verknuepfungsArgs
// weiter oben): im Entwicklungsmodus zeigt process.execPath nur auf die nackte
// electron.exe, die ohne Pfadangabe ihren eigenen leeren Startbildschirm zeigt
// statt AeroMC zu laden. Zusätzlich: bei der Portable-Fassung zeigt
// process.execPath auf den entpackten Temp-Ordner der wäre morgen tot,
// deshalb wie bei den Verknüpfungen über verknuepfungsZiel() auflösen.
const args = enabled
? (app.isPackaged ? ['--hidden'] : [path.join(__dirname, '..'), '--hidden'])
: [];
app.setLoginItemSettings({ openAtLogin: !!enabled, path: verknuepfungsZiel(), args });
} catch { /* z. B. in portabler Umgebung ohne Schreibrechte auf die Registry */ } } catch { /* z. B. in portabler Umgebung ohne Schreibrechte auf die Registry */ }
if (enabled) createTray(); if (enabled) createTray();
else destroyTray(); else destroyTray();