From 8a2927026ce2e1b98920ea3520775ef8d0ae7c4b Mon Sep 17 00:00:00 2001
From: yxsj245 <17737475682@163.com>
Date: Wed, 29 Oct 2025 16:43:03 +0800
Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=E5=90=AF=E5=8A=A8=E5=91=BD?=
=?UTF-8?q?=E4=BB=A4=E8=AF=86=E5=88=AB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
client/src/pages/GameDeploymentPage.tsx | 125 +++++++++++++++++-
client/src/utils/api.ts | 5 +
server/data/games/installgame.json | 3 +-
.../modules/gameConfig/GameConfigManager.ts | 25 +++-
server/src/routes/gameDeployment.ts | 104 +++++++++++++++
5 files changed, 250 insertions(+), 12 deletions(-)
diff --git a/client/src/pages/GameDeploymentPage.tsx b/client/src/pages/GameDeploymentPage.tsx
index f172467..f02815c 100644
--- a/client/src/pages/GameDeploymentPage.tsx
+++ b/client/src/pages/GameDeploymentPage.tsx
@@ -167,6 +167,7 @@ const GameDeploymentPage: React.FC = () => {
const [instanceName, setInstanceName] = useState('')
const [instanceDescription, setInstanceDescription] = useState('')
const [instanceStartCommand, setInstanceStartCommand] = useState('')
+ const [startCommandEdited, setStartCommandEdited] = useState(false)
const [creatingInstance, setCreatingInstance] = useState(false)
// 更多游戏部署相关状态
@@ -1683,14 +1684,97 @@ const GameDeploymentPage: React.FC = () => {
try {
setCreatingInstance(true)
- // 生成启动命令,考虑选中的Java版本
- let finalStartCommand = instanceStartCommand || generateStartCommand(selectedServer, selectedMinecraftJava)
+ // 首先扫描Minecraft目录以智能检测启动文件
+ console.log('[Minecraft实例创建] 开始扫描目录:', downloadResult.targetDirectory)
+ console.log('[Minecraft实例创建] 用户输入的启动命令:', instanceStartCommand)
+ console.log('[Minecraft实例创建] 选择的Java版本:', selectedMinecraftJava)
+
+ let finalStartCommand = ''
+ let scanSuccess = false
+
+ try {
+ const scanResult = await apiClient.scanMinecraftDirectory(downloadResult.targetDirectory)
+
+ console.log('[Minecraft实例创建] 扫描API响应:', scanResult)
+
+ if (scanResult.success && scanResult.data) {
+ console.log('[Minecraft实例创建] 扫描数据:', {
+ jarFiles: scanResult.data.jarFiles,
+ batFiles: scanResult.data.batFiles,
+ shFiles: scanResult.data.shFiles,
+ recommendedStartCommand: scanResult.data.recommendedStartCommand,
+ startMethod: scanResult.data.startMethod,
+ platform: scanResult.data.platform
+ })
+
+ if (scanResult.data.recommendedStartCommand) {
+ const recommendedCommand = scanResult.data.recommendedStartCommand
+ scanSuccess = true
+ console.log('[Minecraft实例创建] 扫描成功,推荐命令:', recommendedCommand)
+
+ // 优先使用推荐命令,除非用户手动修改过启动命令
+ const useRecommended = !startCommandEdited || !instanceStartCommand.trim()
+ if (useRecommended) {
+ console.log('[Minecraft实例创建] 启动命令未被手动修改,使用智能检测结果')
+
+ // 根据扫描结果的启动方式决定如何生成命令
+ if (scanResult.data.startMethod === 'jar_file' && selectedMinecraftJava !== 'default') {
+ const javaExecutable = getSelectedJavaExecutable(selectedMinecraftJava)
+ finalStartCommand = recommendedCommand.replace(/^java\b/, javaExecutable)
+ console.log('[Minecraft实例创建] 替换Java路径:', javaExecutable)
+ } else {
+ finalStartCommand = recommendedCommand
+ console.log('[Minecraft实例创建] 直接使用推荐命令')
+ }
+
+ console.log('[Minecraft实例创建] 最终启动命令:', finalStartCommand)
+
+ // 同步到输入框,便于用户确认
+ setInstanceStartCommand(finalStartCommand)
- // 如果用户手动输入了启动命令且选择了特定Java版本,替换其中的java
- if (instanceStartCommand && selectedMinecraftJava !== 'default') {
- finalStartCommand = replaceJavaInCommand(instanceStartCommand, selectedMinecraftJava)
+ const startMethodText = scanResult.data.startMethod === 'bat_script' ? 'BAT脚本' :
+ scanResult.data.startMethod === 'sh_script' ? 'SH脚本' :
+ 'JAR文件'
+ } else {
+ console.log('[Minecraft实例创建] 检测到用户已修改启动命令,保留用户输入')
+ finalStartCommand = selectedMinecraftJava !== 'default'
+ ? replaceJavaInCommand(instanceStartCommand, selectedMinecraftJava)
+ : instanceStartCommand
+ }
+ } else {
+ console.log('[Minecraft实例创建] 未检测到推荐的启动命令')
+ }
+ } else {
+ console.log('[Minecraft实例创建] 扫描API返回失败或无数据')
+ }
+ } catch (scanError: any) {
+ console.error('[Minecraft实例创建] 目录扫描异常:', scanError)
+ console.error('[Minecraft实例创建] 错误详情:', scanError.message, scanError.stack)
+ scanSuccess = false
}
+ // 如果扫描失败或没有检测到启动文件,使用默认生成的启动命令
+ if (!scanSuccess || !finalStartCommand) {
+ console.log('[Minecraft实例创建] 使用默认启动命令生成逻辑')
+ finalStartCommand = instanceStartCommand || generateStartCommand(selectedServer, selectedMinecraftJava)
+
+ // 如果用户手动输入了启动命令且选择了特定Java版本,替换其中的java
+ if (instanceStartCommand && selectedMinecraftJava !== 'default') {
+ finalStartCommand = replaceJavaInCommand(instanceStartCommand, selectedMinecraftJava)
+ }
+
+ console.log('[Minecraft实例创建] 默认启动命令:', finalStartCommand)
+
+ addNotification({
+ type: 'info',
+ title: '使用默认启动命令',
+ message: `启动命令: ${finalStartCommand}`,
+ duration: 3000
+ })
+ }
+
+ console.log('[Minecraft实例创建] 准备创建实例,启动命令:', finalStartCommand)
+
const response = await apiClient.createInstance({
name: instanceName.trim(),
description: instanceDescription.trim() || `Minecraft ${selectedServer} ${selectedVersion}`,
@@ -1720,6 +1804,7 @@ const GameDeploymentPage: React.FC = () => {
setInstanceName('')
setInstanceDescription('')
setInstanceStartCommand('')
+ setStartCommandEdited(false)
// 跳转到实例管理页面
navigate('/instances')
@@ -1828,6 +1913,7 @@ const GameDeploymentPage: React.FC = () => {
// 更新Minecraft实例启动命令
if (selectedServer && selectedVersion && selectedMinecraftJava) {
setInstanceStartCommand(generateStartCommand(selectedServer, selectedMinecraftJava))
+ setStartCommandEdited(false)
}
}, [selectedMinecraftJava, selectedServer])
@@ -3697,6 +3783,7 @@ const GameDeploymentPage: React.FC = () => {
// 自动生成启动命令
if (version && selectedServer) {
setInstanceStartCommand(generateStartCommand(selectedServer, selectedMinecraftJava))
+ setStartCommandEdited(false)
// 自动更新安装路径
setMinecraftInstallPath(generateMinecraftPath(selectedServer, version))
}
@@ -3862,9 +3949,33 @@ const GameDeploymentPage: React.FC = () => {
{selectedServer} {selectedVersion} 已成功下载到 {downloadResult.targetDirectory}