|
|
|
|
@@ -285,11 +285,12 @@ ipcMain.handle('finalResourcepack:install', async (): Promise<{ ok: boolean; pat
|
|
|
|
|
if (!pack) return { ok: false, message: t('errors.packNotFound2') }
|
|
|
|
|
const finalName = pack.pack.finalResourcepackPath
|
|
|
|
|
if (!finalName || finalName === '.') return { ok: false, message: 'no final resourcepack' }
|
|
|
|
|
let dest = ''
|
|
|
|
|
try {
|
|
|
|
|
const cleaned = path.basename(finalName.replace(/^\/+/, ''))
|
|
|
|
|
const url = `${state.baseUrl}/file/resourcepacks/outputs/${encodeURIComponent(cleaned)}`
|
|
|
|
|
const destDir = path.join(getAppDataDir(), getMcCustomDirName(), 'resourcepacks')
|
|
|
|
|
const dest = path.join(destDir, cleaned)
|
|
|
|
|
dest = path.join(destDir, cleaned)
|
|
|
|
|
await fsp.mkdir(destDir, { recursive: true })
|
|
|
|
|
sendLog(t('log.finalResourcepackDownload', { url }))
|
|
|
|
|
// 진행률(퍼센트)을 렌더러로 흘려보내며 스트리밍 다운로드.
|
|
|
|
|
@@ -307,6 +308,8 @@ ipcMain.handle('finalResourcepack:install', async (): Promise<{ ok: boolean; pat
|
|
|
|
|
sendLog(t('log.finalResourcepackSaved', { path: dest }))
|
|
|
|
|
return { ok: true, path: dest }
|
|
|
|
|
} catch (error) {
|
|
|
|
|
// 실패 시 부분/0바이트 zip 이 마인크래프트 리소스팩 목록에 깨진 채로 남지 않도록 삭제.
|
|
|
|
|
if (dest) await fsp.rm(dest, { force: true }).catch(() => {})
|
|
|
|
|
return { ok: false, message: (error as Error).message }
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
@@ -1352,7 +1355,13 @@ ipcMain.handle('client:install', async (_event, payload: ClientInstallPayload) =
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
await downloadModsFolder(pack.pack, customRoot)
|
|
|
|
|
await downloadResourcepackZip(pack.pack, customRoot)
|
|
|
|
|
// 최종 리소스팩이 등록돼 있으면(finalResourcepackPath !== "."), 완성본을 설치 마지막에
|
|
|
|
|
// 따로 받으므로 베이스 리소스팩은 받지 않는다("최종 리소스팩만 다운로드").
|
|
|
|
|
if (pack.pack.finalResourcepackPath && pack.pack.finalResourcepackPath !== '.') {
|
|
|
|
|
sendLog(t('log.skipBaseForFinal'))
|
|
|
|
|
} else {
|
|
|
|
|
await downloadResourcepackZip(pack.pack, customRoot)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (payload.skipMap) {
|
|
|
|
|
// 참가자 모드: 이전 설치 흐름에서 설치러가 풀어둔 맵이 있다면 제거한다.
|
|
|
|
|
|