diff --git a/installer/renderer.js b/installer/renderer.js index c8dbaa3..1e213ec 100644 --- a/installer/renderer.js +++ b/installer/renderer.js @@ -1167,8 +1167,14 @@ function downloadFinalResourcepack() { if (res && res.ok) { bar.style.width = '100%' percentEl.textContent = '100%' - msg.textContent = tt('resourcepack.downloadDone') - msg.classList.add('success') + if (res.applied === false) { + // 다운로드는 됐지만 자동 적용(options.txt) 실패 → 직접 켜라고 경고. + msg.textContent = tt('resourcepack.downloadDoneNotApplied', { message: res.applyMessage || '' }) + msg.classList.add('error') + } else { + msg.textContent = tt('resourcepack.downloadDone') + msg.classList.add('success') + } actions.innerHTML = '' actions.querySelector('#rpNext').addEventListener('click', proceed) } else { diff --git a/locales/installer/ko-kr.json b/locales/installer/ko-kr.json index b52686e..276846d 100644 --- a/locales/installer/ko-kr.json +++ b/locales/installer/ko-kr.json @@ -168,6 +168,7 @@ "downloadHeading": "최종 리소스팩 다운로드", "downloading": "최종 리소스팩을 다운로드하는 중…", "downloadDone": "최종 리소스팩 다운로드 완료. 마인크래프트를 켜면 자동으로 적용됩니다.", + "downloadDoneNotApplied": "최종 리소스팩은 받았지만 자동 적용에 실패했습니다({{message}}). 마인크래프트 설정 → 리소스팩에서 직접 켜주세요.", "downloadFailed": "최종 리소스팩 다운로드 실패: {{message}}" }, "step5": { diff --git a/package.json b/package.json index 1793b10..27b7aef 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "minecraft-music-quiz-installer", - "version": "0.4.23", + "version": "0.4.24", "description": "마인크래프트 음악퀴즈 간편설치기 + 관리 사이트", "main": "dist/installer/main.js", "scripts": { diff --git a/src/installer/main.ts b/src/installer/main.ts index 9be1219..c157b63 100644 --- a/src/installer/main.ts +++ b/src/installer/main.ts @@ -280,7 +280,7 @@ ipcMain.handle('terms:listFinal', async (): Promise<{ ok: boolean; terms?: Array }) // 최종 리소스팩(zip)을 /file/resourcepacks/outputs/ 에서 받아 .mc_custom/resourcepacks/ 에 저장. -ipcMain.handle('finalResourcepack:install', async (): Promise<{ ok: boolean; path?: string; message?: string }> => { +ipcMain.handle('finalResourcepack:install', async (): Promise<{ ok: boolean; path?: string; message?: string; applied?: boolean; applyMessage?: string }> => { const pack = state.selectedKey ? state.packs.get(state.selectedKey) : undefined if (!pack) return { ok: false, message: t('errors.packNotFound2') } const finalName = pack.pack.finalResourcepackPath @@ -311,10 +311,14 @@ ipcMain.handle('finalResourcepack:install', async (): Promise<{ ok: boolean; pat try { await enableResourcePackInOptions(gameDir, cleaned) sendLog(t('log.finalResourcepackApplied', { name: cleaned })) + return { ok: true, path: dest, applied: true } } catch (err) { - sendLog(t('log.finalResourcepackApplyFail', { message: (err as Error).message })) + // 다운로드는 됐지만 자동 적용(options.txt)에 실패 → 성공으로 숨기지 말고 렌더러가 + // 경고를 띄우도록 applied=false 로 알린다(사용자가 직접 켤 수 있게). + const msg = (err as Error).message + sendLog(t('log.finalResourcepackApplyFail', { message: msg })) + return { ok: true, path: dest, applied: false, applyMessage: msg } } - return { ok: true, path: dest } } catch (error) { // 실패 시 부분/0바이트 zip 이 마인크래프트 리소스팩 목록에 깨진 채로 남지 않도록 삭제. if (dest) await fsp.rm(dest, { force: true }).catch(() => {}) diff --git a/src/installer/preload.ts b/src/installer/preload.ts index adb0759..8dc7fdc 100644 --- a/src/installer/preload.ts +++ b/src/installer/preload.ts @@ -20,8 +20,8 @@ const api = { // 최종 리소스팩 다운로드용 약관 목록 (showInFinalResourcepack 필터) getFinalTermsList: (): Promise<{ ok: boolean; terms?: Array<{ kind: string; label: string }>; message?: string }> => ipcRenderer.invoke('terms:listFinal'), - // 최종 리소스팩 다운로드 실행 - installFinalResourcepack: (): Promise<{ ok: boolean; path?: string; message?: string }> => + // 최종 리소스팩 다운로드 실행. applied=false 면 다운로드는 됐지만 자동 적용 실패. + installFinalResourcepack: (): Promise<{ ok: boolean; path?: string; message?: string; applied?: boolean; applyMessage?: string }> => ipcRenderer.invoke('finalResourcepack:install'), // 3-1