1
0
Fork 0
GoodPlanCraftLaunCher/preload.js

190 lines
6.9 KiB
JavaScript

/*
* CaelLab BY-SA Code License
* Copyright (c) 2026 Yunyun(云云) By 虚舟实验室(CaelLab) / CaelLabGameTS
* Source: https://github.com/yunyun-3782/GoodPlanCraftLauncher
*/
const { contextBridge, ipcRenderer } = require('electron');
contextBridge.exposeInMainWorld('gpcl', {
// 获取游戏目录路径
getGameDir: () => ipcRenderer.invoke('get-game-dir'),
// 扫描本地已安装版本
scanVersions: (gameDir, silent) => ipcRenderer.invoke('scan-versions', gameDir, silent),
// 启动游戏
launch: (options) => ipcRenderer.invoke('launch-minecraft', options),
// 获取远程版本列表
getVersionManifest: () => ipcRenderer.invoke('get-version-manifest'),
// 下载指定版本
downloadVersion: (versionId, maxConcurrent) => ipcRenderer.invoke('download-version', versionId, maxConcurrent),
// 监听游戏日志
onGameLog: (callback) => {
ipcRenderer.on('game-log', (event, text) => callback(text));
},
// 监听游戏关闭
onGameClosed: (callback) => {
ipcRenderer.on('game-closed', (event, code) => callback(code));
},
// 监听启动错误
onGameError: (callback) => {
ipcRenderer.on('game-error', (event, message) => callback(message));
},
// 监听下载进度
onDownloadProgress: (callback) => {
ipcRenderer.on('download-progress', (event, data) => callback(data));
},
// 监听关闭确认询问
onConfirmCloseWhileDownloading: (callback) => {
ipcRenderer.on('confirm-close-while-downloading', () => callback());
},
// 读取玩家名
getPlayerName: () => ipcRenderer.invoke('get-player-name'),
// 保存玩家名
savePlayerName: (name) => ipcRenderer.invoke('save-player-name', name),
// 显示消息对话框
showMessageDialog: (options) => ipcRenderer.invoke('show-message-dialog', options),
// 确认关闭并清理下载
confirmCloseDownload: () => ipcRenderer.invoke('confirm-close-download'),
// 取消下载(只清理,不关闭窗口)
cancelDownloadOnly: () => ipcRenderer.invoke('cancel-download-only'),
// 获取Java镜像源设置
getJavaMirrorSettings: () => ipcRenderer.invoke('get-java-mirror-settings'),
// 获取Java版本对应的下载URL
getJavaDownloadUrl: (javaVersion) => ipcRenderer.invoke('get-java-download-url', javaVersion),
// 取消关闭
cancelClose: () => ipcRenderer.invoke('cancel-close'),
// 检查Java是否已安装
checkJava: (versionId) => ipcRenderer.invoke('check-java', versionId),
// 显示Java安装对话框
showJavaInstallDialog: (callback) => {
ipcRenderer.on('show-java-install-dialog', (event, data) => callback(data));
},
// 选择Java版本
selectJavaVersion: (data) => ipcRenderer.invoke('select-java-version', data),
// 安装Java
installJava: (javaVersion) => ipcRenderer.invoke('install-java', javaVersion),
// 卸载Java
uninstallJava: (javaVersion) => ipcRenderer.invoke('uninstall-java', javaVersion),
// 监听Java安装对话框
onJavaInstallDialog: (callback) => {
ipcRenderer.on('show-java-install-dialog', (event, data) => callback(data));
},
// 监听Java下载完成
onJavaDownloadCompleted: (callback) => {
ipcRenderer.on('java-download-completed', (event, data) => callback(data));
},
// 监听Java下载失败
onJavaDownloadFailed: (callback) => {
ipcRenderer.on('java-download-failed', (event, data) => callback(data));
},
// 监听游戏窗口创建成功
onGameWindowCreated: (callback) => {
ipcRenderer.on('game-window-created', (event, data) => callback(data));
},
// 移除所有监听器(避免重复绑定)
minimizeWindow: () => ipcRenderer.invoke('window-minimize'),
focusWindow: () => ipcRenderer.invoke('window-focus'),
closeWindow: () => ipcRenderer.invoke('window-close'),
deleteVersion: (versionId) => ipcRenderer.invoke('delete-version', versionId),
getVersionSettings: (versionId) => ipcRenderer.invoke('get-version-settings', versionId),
saveVersionSettings: (versionId, settings) => ipcRenderer.invoke('save-version-settings', versionId, settings),
selectDirectory: () => ipcRenderer.invoke('select-directory'),
cancelLaunch: () => ipcRenderer.invoke('cancel-launch'),
checkForUpdates: () => ipcRenderer.invoke('check-for-updates'),
getAppVersion: () => ipcRenderer.invoke('get-app-version'),
openExternal: (url) => ipcRenderer.invoke('open-external', url),
// 获取设置
getSettings: () => ipcRenderer.invoke('get-settings'),
// 保存设置
saveSettings: (settings) => ipcRenderer.invoke('save-settings', settings),
// 重置设置
resetSettings: () => ipcRenderer.invoke('reset-settings'),
// 播放启动动画
playStartupAnimation: () => ipcRenderer.invoke('play-startup-animation'),
// 关闭启动动画
dismissStartupAnimation: () => ipcRenderer.invoke('dismiss-startup-animation'),
// 开发者模式
setDeveloperMode: (enabled) => ipcRenderer.invoke('set-developer-mode', enabled),
// 重启应用
restartApp: () => ipcRenderer.invoke('restart-app'),
// 文件读写
readJsonFile: (subPath, fileName) => ipcRenderer.invoke('read-json-file', subPath, fileName),
writeJsonFile: (subPath, fileName, data) => ipcRenderer.invoke('write-json-file', subPath, fileName, data),
// 模组加载器版本获取
getForgeVersions: (mcVersion) => ipcRenderer.invoke('get-forge-versions', mcVersion),
getFabricVersions: (mcVersion) => ipcRenderer.invoke('get-fabric-versions', mcVersion),
getOptiFineVersions: (mcVersion) => ipcRenderer.invoke('get-optifine-versions', mcVersion),
// 下载带模组加载器的版本
downloadWithModLoader: (versionId, loaderType, loaderVersion, maxConcurrent) =>
ipcRenderer.invoke('download-with-modloader', versionId, loaderType, loaderVersion, maxConcurrent),
// 读取版本配置
getVersionConfig: (versionId) => ipcRenderer.invoke('get-version-config', versionId),
getVersionDisplayName: (versionId) => ipcRenderer.invoke('get-version-display-name', versionId),
getLaunchDisplayName: (versionId) => ipcRenderer.invoke('get-launch-display-name', versionId),
removeAllListeners: () => {
ipcRenderer.removeAllListeners('game-log');
ipcRenderer.removeAllListeners('game-closed');
ipcRenderer.removeAllListeners('game-error');
ipcRenderer.removeAllListeners('download-progress');
ipcRenderer.removeAllListeners('confirm-close-while-downloading');
ipcRenderer.removeAllListeners('show-java-install-dialog');
ipcRenderer.removeAllListeners('java-download-completed');
ipcRenderer.removeAllListeners('java-download-failed');
ipcRenderer.removeAllListeners('game-window-created');
}
});
// 屏蔽开发者工具快捷键(生产环境)
window.addEventListener('keydown', e => {
const key = (e.key || '').toLowerCase();
if (key === 'f12' ||
(e.ctrlKey && e.shiftKey && key === 'i') ||
(e.metaKey && e.altKey && key === 'i')) {
e.preventDefault();
}
}, { capture: true });
window.addEventListener('contextmenu', e => {
e.preventDefault();
}, { capture: true });