Upload via GUI (324 Dateien)
This commit is contained in:
+26
-3
@@ -684,7 +684,8 @@ ipcMain.handle('recording:delete', (_e, instanceName, dateiname) => {
|
|||||||
ipcMain.handle('recording:open', (_e, instanceName, dateiname) => {
|
ipcMain.handle('recording:open', (_e, instanceName, dateiname) => {
|
||||||
if (!istDateiname(dateiname)) return false;
|
if (!istDateiname(dateiname)) return false;
|
||||||
const ziel = path.join(aufzeichnungsOrdner(instanceName), dateiname);
|
const ziel = path.join(aufzeichnungsOrdner(instanceName), dateiname);
|
||||||
if (fs.existsSync(ziel)) shell.openPath(ziel);
|
// nur Videos öffnen, keine beliebigen Dateien aus dem Aufnahmen-Ordner
|
||||||
|
if (/\.(mp4|webm|mkv)$/i.test(ziel) && fs.existsSync(ziel)) shell.openPath(ziel);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -3672,7 +3673,8 @@ ipcMain.handle('instance:screenshotData', (_e, id, name) => {
|
|||||||
|
|
||||||
ipcMain.handle('instance:openScreenshot', (_e, id, name) => {
|
ipcMain.handle('instance:openScreenshot', (_e, id, name) => {
|
||||||
const target = safeSub(id, 'screenshots', name);
|
const target = safeSub(id, 'screenshots', name);
|
||||||
if (target && fs.existsSync(target)) shell.openPath(target);
|
// nur Bilder öffnen – im Ordner abgelegte Programme (.exe, .bat …) würden sonst ausgeführt
|
||||||
|
if (target && /\.(png|jpe?g|gif|webp)$/i.test(target) && fs.existsSync(target)) shell.openPath(target);
|
||||||
return true;
|
return true;
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -4086,11 +4088,13 @@ async function importCurseForge(buf, zip, zugang) {
|
|||||||
const modsDir = path.join(gameDir, 'mods');
|
const modsDir = path.join(gameDir, 'mods');
|
||||||
let geladen = 0;
|
let geladen = 0;
|
||||||
const fehlend = [];
|
const fehlend = [];
|
||||||
|
// Dateien, die der Autor nicht über Launcher freigibt: nicht laden, nur melden
|
||||||
|
const gesperrtIds = new Set((aufgeloest.gesperrt || []).map((g) => g.fileID));
|
||||||
let i = 0;
|
let i = 0;
|
||||||
for (const f of dateien) {
|
for (const f of dateien) {
|
||||||
i++;
|
i++;
|
||||||
const info = aufgeloest.get(Number(f.fileID));
|
const info = aufgeloest.get(Number(f.fileID));
|
||||||
if (!info) { fehlend.push(f.fileID); continue; }
|
if (!info) { if (!gesperrtIds.has(Number(f.fileID))) fehlend.push(f.fileID); continue; }
|
||||||
const dest = path.join(modsDir, path.basename(info.fileName));
|
const dest = path.join(modsDir, path.basename(info.fileName));
|
||||||
if (!inside(dest)) continue;
|
if (!inside(dest)) continue;
|
||||||
melde('Mods laden', i, dateien.length);
|
melde('Mods laden', i, dateien.length);
|
||||||
@@ -4114,12 +4118,28 @@ async function importCurseForge(buf, zip, zugang) {
|
|||||||
fs.writeFileSync(dest, forge.readZipEntry(buf, zip[name]));
|
fs.writeFileSync(dest, forge.readZipEntry(buf, zip[name]));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Liste mit Links zum Selbstladen in den Spielordner legen
|
||||||
|
const gesperrt = aufgeloest.gesperrt || [];
|
||||||
|
if (gesperrt.length) {
|
||||||
|
try {
|
||||||
|
const zeilen = [
|
||||||
|
'Diese Mods dürfen laut ihren Autoren nicht über Launcher wie AeroMC geladen werden.',
|
||||||
|
'Bitte von der jeweiligen CurseForge-Seite laden und in den Ordner "mods" legen:',
|
||||||
|
'',
|
||||||
|
...gesperrt.map((g) => `${g.fileName}\n ${g.seite}`),
|
||||||
|
'',
|
||||||
|
];
|
||||||
|
fs.writeFileSync(path.join(gameDir, 'GESPERRTE-MODS.txt'), zeilen.join('\r\n'), 'utf8');
|
||||||
|
} catch { /* Hinweisdatei ist nur eine Hilfe */ }
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
ok: true,
|
ok: true,
|
||||||
instance: store.getInstance(created.id),
|
instance: store.getInstance(created.id),
|
||||||
fileCount: dateien.length,
|
fileCount: dateien.length,
|
||||||
geladen,
|
geladen,
|
||||||
fehlend: fehlend.length,
|
fehlend: fehlend.length,
|
||||||
|
gesperrt: gesperrt.length,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -4385,6 +4405,9 @@ async function importInstanceZipFromPath(filePath) {
|
|||||||
if (!fs.existsSync(path.join(base, 'instance.json'))) {
|
if (!fs.existsSync(path.join(base, 'instance.json'))) {
|
||||||
const mmc = mmcimport.scanSingle(tmp);
|
const mmc = mmcimport.scanSingle(tmp);
|
||||||
if (mmc.ok) {
|
if (mmc.ok) {
|
||||||
|
// Wie beim AeroMC-Export oben: kein Java-Pfad aus einem fremden Archiv (instance.cfg
|
||||||
|
// könnte auf ein beliebiges Programm oder einen Netzwerkpfad zeigen, das beim Start läuft)
|
||||||
|
mmc.instance.javaPath = '';
|
||||||
const done = mmcimport.importOne(store, mmc.instance, false);
|
const done = mmcimport.importOne(store, mmc.instance, false);
|
||||||
const quellen = mmcimport.kopierQuellen(mmc.instance);
|
const quellen = mmcimport.kopierQuellen(mmc.instance);
|
||||||
if (quellen.length) await verschiebeInhalt(mmc.instance.gameDir, store.gameDir(done.id), quellen.map((q) => q.name));
|
if (quellen.length) await verschiebeInhalt(mmc.instance.gameDir, store.gameDir(done.id), quellen.map((q) => q.name));
|
||||||
|
|||||||
+3
-2
@@ -508,13 +508,13 @@ const el = (id) => document.getElementById(id);
|
|||||||
function show(id) { el(id).classList.remove('hidden'); }
|
function show(id) { el(id).classList.remove('hidden'); }
|
||||||
function hide(id) { el(id).classList.add('hidden'); }
|
function hide(id) { el(id).classList.add('hidden'); }
|
||||||
|
|
||||||
function toast(msg, isError = false) {
|
function toast(msg, isError = false, dauerMs = 2800) {
|
||||||
const t = el('toast');
|
const t = el('toast');
|
||||||
t.textContent = msg;
|
t.textContent = msg;
|
||||||
t.classList.toggle('err', isError);
|
t.classList.toggle('err', isError);
|
||||||
t.classList.remove('hidden');
|
t.classList.remove('hidden');
|
||||||
clearTimeout(toast._t);
|
clearTimeout(toast._t);
|
||||||
toast._t = setTimeout(() => t.classList.add('hidden'), 2800);
|
toast._t = setTimeout(() => t.classList.add('hidden'), dauerMs);
|
||||||
}
|
}
|
||||||
|
|
||||||
function fmtDate(iso) {
|
function fmtDate(iso) {
|
||||||
@@ -778,6 +778,7 @@ async function runModpackImport() {
|
|||||||
toast(`Modpack importiert: ${res.instance.name} (${res.fileCount} Dateien)`);
|
toast(`Modpack importiert: ${res.instance.name} (${res.fileCount} Dateien)`);
|
||||||
// CurseForge gibt nicht jede Datei heraus – ehrlich benennen statt verschweigen
|
// CurseForge gibt nicht jede Datei heraus – ehrlich benennen statt verschweigen
|
||||||
if (res.fehlend) toast(`${res.fehlend} Datei(en) konnten nicht geladen werden und fehlen in der Instanz.`, true);
|
if (res.fehlend) toast(`${res.fehlend} Datei(en) konnten nicht geladen werden und fehlen in der Instanz.`, true);
|
||||||
|
if (res.gesperrt) toast(`${res.gesperrt} Mod(s) dürfen laut Autor nicht über Launcher geladen werden. Liste mit Links: GESPERRTE-MODS.txt im Spielordner der Instanz.`, true, 10000);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
toast(res.message || 'Modpack-Import fehlgeschlagen.', true);
|
toast(res.message || 'Modpack-Import fehlgeschlagen.', true);
|
||||||
|
|||||||
+907
-896
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user