Releases: yzsyzdy/Minecraft-Terminal-Server-Launcher
Release list
MSTL正式版1.1.33
MSTL正式版1.1.32
新增功能
i18n国际化,目前支持zh和en
修复
Bug 1 server_manager.py zip slip:解压时未校验路径穿越(../../ 可能写到目标目录外) 提取前计算 os.path.abspath,校验必须以 target_abs + os.sep 开头,跳过不安全路径
Bug 2 download_msl.py 部分 CDN 对 HEAD 返回不支持 Range,但 GET 实际支持,导致不必要地回退单线程 移除 HEAD 的 Range 判断,直接尝试多线程,失败才回退
Bug 3 plugin_sources.py SpigotMC 下载 302 到 ForgeCDN 后因缺少 Referer 返回 403 请求中添加 Referer: https://www.spigotmc.org/
完成的优化
优化
Opt 1 constants.py (新) User-Agent 散落在 3 个文件中,彼此不一致 新建 constants.py,统一 USER_AGENT = "MSTL/1.0",各模块从常量文件导入
Opt 2 server_launcher.py _handle_sigint 用 sys.exit(0),在 PIPE 模式下子进程可能残留 改为 os._exit(0),直接终止进程,确保子进程被回收
Opt 3 i18n.py / start.py _detect_os_language() 定义在 start.py,无法被其他模块复用 移到 i18n.detect_os_language(),全局可用,start.py 改为调用该函数
Opt 4 plugin_sources.py / mod_sources.py / download_msl.py API 基础 URL(SPIGET_BASE、MODRI
MSTL正式版1.1.0
新增功能
| 序号 | 功能 |
|---|---|
| 1 | 新增服务器导出功能 |
| 2 | 通过curse.tools是不需要配置curseapikey也可以正常使用相关功能 |
代码优化
| 序号 | 位置 | 问题 | 建议 |
|---|---|---|---|
| 1 | mod_sources.py:15 | User-Agent 仍是 MinecraftServerLauncher/1.0,与 plugin_sources.py 和 download_msl.py 的 MSTL/1.0 不一致 | 统一为 MSTL/1.0 |
| 2 | server_launcher.py | start_minecraft_server() 和 start_server_interactive() 有大量重复代码(JVM 参数、命令拼接、错误检查) | 提取公共函数 _build_jvm_cmd() |
| 3 | menu.py | 插件和模组的删除/禁用启用/添加逻辑几乎是完全复制的两份 | 参数化为一个通用函数 |
| 4 | menu.py | from clear import clear_screen 在至少 6 个函数内重复 import | 提到文件顶部的模块级 import |
| 5 | java_tools.py | java_list.json 中写了 last_selected 字段但从未读取 | 要么真正使用(下次启动自动选中),要么去掉 |
| 6 | download_msl.py | multithreaded_download 的重试机制复杂且已坏,函数约 70 行 | 简化:去掉重试,失败直接回退到 _download_with_progress |
| 7 | start.py | _is_eula_unagreed() 只检查 eula=false 字符串,如果文件内容有 eula=false 作为注释或 url 的一部分会误触发 | 用正则或按行解析更精确 |
| 8 | 全局 | 多处 print("\u2588" * ...) 进度条代码重复(server_manager.py 解压、download_msl.py 下载) | 提取 _progress_bar() 公共工具函数 |
修复bug
| 序号 | 代码位置 | 问题描述 | 备注 |
|---|---|---|---|
| 1 | download_msl.py:201-215 multithreaded_download() | 重试逻辑在 with ThreadPoolExecutor() 块结束后调用 executor.submit(),此时 executor 已 shutdown,会抛出 RuntimeError | 分块下载失败后重试永远不会执行,静默失败 |
| 2 | server_manager.py:115-117 classify_server_type() | candidate in {"arclight"} and any(x in name for x in (...)) 是不可达的死代码——“arclight” 本身已在 _HYBRID_IDS 集合中,条件分支在前面已命中 | 逻辑冗余,不影响结果 |
| 3 | menu.py:221-222 _show_plugin_menu() 入口 | 函数开头 clear_screen() 一次,while 循环顶又 clear_screen() 一次,每次都清两次屏 | 界面闪烁,无实际效果损失 |
| 4 | menu.py:401-402 _show_mod_menu() 入口 | 同上,double clear | 同上 |
| 5 | menu.py:282 _search_and_download_mod() | from config import load_config 后通过 os.path.dirname(os.path.dirname(mods_dir)) 猜 project_dir,如果 mods_dir 不含 servers/ 路径前缀则拿不到 config | CurseForge key 可能读不到 |
| 6 | start.py:126-132 first_start 分支 | if first_start: 和 else: 分支打印完全相同的消息 | 无用代码 |
| 7 | java_tools.py:275 _download_jdk() | 解压后只 shutil.move 第一个根目录,如果压缩包内的根目录名和预期 jdk-{version} 不一致,不会 renaming 到标准路径 | 后续 os.path.isfile(java_exe) 检查可能通过(因为走 os.path.isdir(jdk_dir) 提前返回),但 JDK 路径不在预期位置 |
快速开始
运行start.py或解压压缩包,运行MSTL.exe(winamd64)
MSTL正式版1.0.0
MSTL v1.0.0 — Minecraft Terminal Server Launcher
一个零第三方依赖的 Minecraft 服务端管理器,在终端里搞定多服务器全生命周期管理。
核心能力
多服务器管理
每个服务器独立目录,独立配置 MC 版本、Java 版本、内存、JVM 参数。支持 30+ 种服务端类型(Paper、Purpur、Fabric、Forge、NeoForge……)。
Java 全自动处理
从环境变量和标准安装路径自动扫描已安装的 JDK,根据 MC 版本校验兼容性。系统没 Java 或版本不对?自动从镜像下载 GraalVM JDK(17 / 21 / 25)(Linux/win)。
服务端一键下载
通过 MSL 镜像源获取服务端核心,交互式选类型和版本,每日缓存避免重复请求。
插件管理
同时搜索 SpigotMC、Modrinth、Hangar 三个源,结果按下载量排序。选编号直接下载到 plugins/ 目录。也支持本地 jar 导入、启用/禁用。
模组管理
通过 Modrinth(免 API key)和 CurseForge(需申请 key)搜索,自动按当前服务器的 MC 版本和加载器(Fabric / Forge / NeoForge / Quilt)过滤。
EULA 智能处理
首次启动检测到 eula=false 时自动询问,同意后修改并重启,不用手动改文件再重新开。
压缩包导入
把已有的服务器压缩包拖进来,自动解压、识别核心 jar。
快速开始
使用exe二级制文件
下载MSTL1.0.0.zip并解压,运行MSTL.exe
编译
# Python 3.10+ 即可,零第三方依赖
python start.py
或者用 Nuitka 打包成单文件 exe:
pip install nuitka && python -m nuitka --standalone --assume-yes-for-downloads --enable-plugin=anti-bloat --windows-console-mode=force --windows-icon-from-ico=icon.png --output-dir=build --product-name=MSTL --file-description="Minecraft Terminal Server Launcher" --product-version="1.0.0" --file-version="1.0.0" --copyright="MSTL" start.py
已知限制
CurseForge 搜索需要手动申请 API key(填入 config.json)
全部使用标准库,无异步框架,下载大文件时终端会阻塞
控制台交互模式下服务器日志和输入在同一窗口,不支持 Tab 补全
没有 Web UI,纯终端操作
致谢
MSL 镜像源([api.mslmc.cn/v4](http://api.mslmc.cn/v4))提供服务端核心下载
FastMirror提供jdk镜像
Spiget API、Modrinth API、Hangar API 提供插件数据