【PLK Launcher 打开说明】 版本：v1.0.90

本版把服务器分成了两类：原版服（不加模组）和模组服（Forge，可以加模组）；
另外加了一键补模组，缺模组的玩家装完就能直接进服。

一、服务器分两类
打开【服务器】页 →【创建服务器】，内核下拉现在有三项：
1. 原版 Vanilla —— 不加模组，最省事；
2. Paper 高性能 —— 不加模组，但服端性能更好；
3. Forge 模组服 —— 可以加模组，创建时会多出一个 Forge 版本下拉，装好后就能往模组文件夹丢模组。
原版 / Paper 直接下服务端 jar 就能开；Forge 走的是 Forge 官方安装器，
依赖从国内镜像下，并且会先把原版服务端 jar 预置好，装完自动找到正确的启动入口。

二、模组服怎么加模组、怎么发给别人
选中模组服实例后，控制台下面会多出「服务器模组」卡片：
· 打开模组文件夹：把 .jar 模组丢进去，重启服务器生效；
· 从本机实例导入：直接把你启动页选中的那个实例里已有的模组拷过来；
· 导出模组包：打成一个 zip，方便直接发给朋友；
· 模组一键分发（默认开启）：服务器运行期间会开一个只读端口（默认游戏端口 + 1），
  对外提供模组清单和整包下载，别人用下面第三部分的功能就能自动补齐。

三、朋友想进你的模组服、但没装对应模组
让他打开【服务器】页最下面的「加入模组服（缺模组一键补齐）」卡片：
· 填服务器地址（局域网填你的内网 IP，外网填公网 IP 或域名）和游戏端口；
· 模组分发端口留空就行，默认是游戏端口 + 1；
· 点「检测并补模组」：会去服务器拉清单，比对本地实例，告诉你缺几个；
· 点「补模组并进服」：缺的模组自动下载装好，然后直接启动游戏连进去。
如果当前实例版本和服务器不一致、或者当前实例不是 Forge 实例，会直接提示先切到对应版本的 Forge 实例，
省得装了一堆模组却进不去。

下面这些是之前版本已修的问题，一并保留说明（编号沿用原文）。

一、自己建的服务器删不掉
原因一：停服之后立刻删目录。旧实现在 Stop 里等服务器进程 10 秒，超时就强杀并立刻返回，
删除紧跟着删目录；这时 Windows 上 java 往往还没松开 world/session.lock 和 server.jar 的句柄，
于是报文件被占用。旧代码把异常只写进日志，界面上只给一句「删除失败，请稍后重试」，
连是哪个文件卡住都不说。
原因二：启动器被强杀之后，认不出还在跑的 java。旧实现把 pid 文件放在被删的实例目录里，
删不动时按文件逐个擦，pid 文件本身被擦掉了；而 Stop 里「进程句柄为空」的早退分支又会无条件删 pid 文件，
这恰恰就是「启动器崩了、java 还在跑」的场景，等于先把唯一线索擦掉，之后怎么点都失败。
原因三：删不动就按文件擦目录。旧兜底会把 world、server.json、ops.json 擦掉，
留下一个删不掉也用不了的残骸。
现在：停服 → 等 12 秒 → 强杀 → 再等 5 秒；pid 文件只在确认进程真没了才删；
另外在服务器根目录（不在任何实例目录里）维护一份 .plk_live_pids.json 登记在跑的服务端进程，
按「实例目录 + 进程名必须是 java/javaw」核对，所以启动器崩了也能认出残留的 java。
删除挪到后台按 200/400/800/1600/3200 毫秒退避重试，删不动再逐文件兜底；
残留进程没退干净就直接回报失败，一个文件都不碰，并告诉你实际 PID。
实测：启动服务器 → 用任务管理器强杀启动器（java 成了孤儿）→ 重开 → 删除，
2 秒内成功，目录没了、没有残留 java，日志里能看到「发现残留的服务端进程（PID 22648，java）」。

二、服务器规则里加「允许作弊（你是管理员）」
Java 版服务端没有 allow-cheats 这个开关（那是基岩版的概念），对应的准确做法是
把房主设成本服管理员（OP）。所以这个开关落成 op：勾上并保存后写进服务器的 ops.json，
离线档案的 uuid 按 OfflinePlayer 规则推导；服务器在跑就当场补发 op，下次启动也会在加载完成后补发一次。
实测：勾上保存 → server.json 里 AllowCheats 为 true、ops.json 写入 Steve（等级 4）；
运行中保存 → 屏幕提示「允许作弊已立即生效」，服端日志打出 Made Steve a server operator。

下面这些是之前版本已修的问题，一并保留说明（编号沿用原文）。

一、加入房间转圈半天，最后只弹一句「加入大厅失败」
房主建好房间，另一个玩家点「连接」→「加入房间」→ 输入编号 → 点「加入」，转一会儿就弹出报错。
查下来是提示被吃掉了：底层几乎所有失败都被收敛成「返回空」，上层能说的就剩下那一句「加入大厅失败」，
编号输错、网络打不通、对方房间已经关了，报的全是同一句话，玩家和作者都看不出卡在哪一步。
另外，连联机组网那一步最多重试 300 次、每次隔 1 秒，网络打不通时要盯着转圈等满 5 分钟才看到失败。
现在把失败按阶段拆开来说：编号格式不对、连不上房主的房间、房间一直没响应（超时）。
「连不上房主」这条会直接列出三种最常见的原因：房主已经把房间关了；
两边网络互相打不通（家里宽带没有公网 IP，或者两个人开了不同的加速器）；被房主那台机器的防火墙拦住。
等待上限也从 5 分钟压到 90 秒，不用再盯着转圈干等。

二、房间编号太长
以前的编号是 21 位：U/A7K2-M9QX-3PTR-5W8B。
其中开头的 U/ 和三根横线只是给人看的分隔符，真正的信息就是后面 16 个字符。
现在显示和复制都用 16 位连续字符：A7K2M9QX3PTR5W8B，短了一截，也没有斜杠了。
输入的时候照旧不挑格式：带不带横线、带不带 U/、大小写、全角字符、前后夹空格，都能认出来。
顺手还修了一个藏得很深的坑：判断开头的 U 是不是前缀时原来只按首字母算，
导致首字符恰好是 U 的合法编号会被削掉一位、判成无效——这类编号约占 3%，
玩家看到的就是「码明明是对的，朋友就是加不进去」。

下面这几件是之前玩家反馈的大事，一并都在本版里。

三、联机大厅朋友进不来
原因是程序里有一条写死的「私有模式」开关：开房和加入两边启动联机组网程序时都带着它。
私有模式的意思是「不许连公共中转节点」，只跟设置里点名的中继服务器通信。
而这份中继名单我们是从官方公告接口读的，本地构建拿不到那个地址，公告必定失败——
结果就是私有模式开着、名单里却一个中继都没有，两边只能靠点对点打洞去撞，
网络环境稍差（两边都在路由器后面、运营商给的是大内网）就永远撞不上。
现在改成：一个中继都没有时自动关掉私有模式，改连公共共享节点；名单里确实配了中继才保持私有模式。
顺带还修了两个旁边的小毛病：自定义中继节点不再越开房叠得越多；游戏窗口出现后不再每轮往日志里重复写一遍。

四、启动游戏后启动器没反应
玩家反馈游戏正常起来了、启动器那边怎么点都没反应。查下来是「启动后隐藏启动器」这个选项的问题：
原来的做法是把窗口挪到屏幕外一万像素、再从任务栏摘掉、再隐藏，窗口确实看不见了，但也彻底找不回来——
任务栏没图标，点桌面快捷方式只会在屏幕外再起一个，它自己只在游戏退出时才挪回来。
现在改成最小化到任务栏，游戏照常起来，启动器老实在任务栏里，点一下就回到前台。
默认设置（启动后什么都不做）本来就不受影响，这一条只影响主动勾了「启动后隐藏」的人。

五、缺前置的时候不再对着英文报错发愣
装完整合包会自动把缺的前置补齐，补完右上角提示一句「已自动补 N 个前置」；
下载单个模组也不再问要不要带前置，直接装上；
从 HMCL / MultiMC / Prism / MCBBS / 纯压缩包 / 直接拷进 versions 的实例，全都管；
点「启动」时会先纯本地查一眼缺什么，用中文列出来（这一眼只查不下载，不会让启动卡住）；
断网时改为完全离线读本地模组文件里的依赖声明，照样把缺什么列成中文清单。

六、以前记着的游戏文件夹被删了，不再弹英文报错
以前把 Minecraft 文件夹指到桌面或移动硬盘，后来那个位置没了，启动器每次打开都弹一大段
System.IO.DirectoryNotFoundException 加英文堆栈。现在直接跳过这条失效记录、只写一行日志，
并且自动把它从配置里清掉，下次不再提。

七、旧版本存档和崩溃日志改放到程序自己所在的盘
以前存在 C 盘用户目录，每发一版就堆一个一百多兆的 exe（实测已经堆到 4.3 GB、二十多个旧版本）。
现在装在哪就写在哪，升级时自动把 C 盘的旧存档搬过来，搬完才删原文件夹。

八、启动时的系统环境检查不再悄悄失效
以前只写 powershell.exe 让系统按 PATH 去找，有些玩家 PATH 被别的软件改过就找不到，
整个检查直接失败、缺运行库也永远不提醒。现在直接拿 C:\Windows\System32\WindowsPowerShell\v1.0\ 的绝对路径。


九、装 26.x + Forge 卡在「下载原版 Json 文件 77%」不再卡死
总进度停在 76.52%、速度 0 B/s、剩余文件 0，「安装 Forge（方式 A）」也同步定在 8%，界面上既不往前也不报错，重装多少次都是同一个画面。
卡的不是网络，是 Forge 安装线程在等「原版 Json / 支持库」下完时用的判断条件写错了：它筛的是「状态不等于已完成的项」，而下载失败会把状态变成 Failed——Failed 同样「不等于已完成」，于是这个等待循环永远退不出去，后台守护线程每 50 毫秒重算一遍，界面就定格在 77%、0 B/s、剩余 0。
现在只要有任何一项进入失败或中止状态，立刻中止安装并写出下载器给出的真实原因；全部完成才放行继续装；另外加了一条 10 分钟兜底，超时同样中止并提示检查网络。


十、实例设置 → 模组页一直显示「尚未安装资源」（1.0.84）
本版修的是「实例设置 → 模组页一直显示『尚未安装资源』」这一件事：玩家点「从文件安装」选了一个 jar，提示安装成功，界面却还停在空白页，一个模组都不显示。
文件其实已经复制进实例的 mods 文件夹了，问题出在列资源那一步：程序要先判断「这个文件是不是直接放在 mods 根目录下」，比较时一边的路径末尾带反斜杠、另一边不带，两个字符串永远对不上，于是根目录下的每个 jar 都被当成「要跳过的嵌套文件」丢掉，扫描结果恒为空，界面就一直渲染空态。
现在改成两边都先规范成绝对路径、去掉尾部分隔符再比较，大小写也不再敏感。手动放进 mods 的模组、以及从文件安装的模组，都会正常出现在列表里。
从任意旧版本升级直接覆盖即可，配置、实例、账号都会保留。


如果启动器在窗口出现之前出错，会弹出提示框说明原因，并把错误日志自动保存到程序目录下：
    PLK\Logs\StartupCrash-时间.txt
（PLK 就是 PLK Launcher.exe 所在的那个文件夹。以前存在 C 盘用户目录，本版起改到程序自己所在的盘。）
把这份日志发给开发者，就能定位问题；日志里「初始化阶段」一行会写明卡在启动流程的哪一步。

游戏启动过程中的日志在：
    PLK\Log\Launch-时间.log

系统要求：Windows 10 / 11（64 位）。Windows 7 / 8 无法运行本启动器。

启动器同时内置「PLK 精选」：光影包、资源包、模组、整合包、数据包、地图六类资源放在同一个页面，
可以搜索、按来源筛选。资源来自 MGC 中文图形站（国产光影与资源包）、CurseForge 和 Modrinth，
卡片上点「一键安装」就能装进实例：光影 / 资源包 / 模组 / 地图会自动匹配当前实例的版本和加载器；
整合包会自动下载并新建一个实例，不动你现有的实例；数据包会直接写进存档的 datapacks。
入口在左侧「下载」的「PLK 精选」。

注意：MGC 的部分资源需要先在浏览器里完成人机验证才能下载，这是站方强制的验证，启动器无法代办；
CurseForge 与 Modrinth 的资源都在启动器内直接下载。

如果双击 PLK Launcher.exe 没有任何反应或提示被拦截，通常是杀毒软件或 Windows 误报（程序未做数字签名），请按下面步骤放行：

1. 杀毒软件（360 / 腾讯电脑管家 / 火绒等）
   打开杀毒软件的「隔离区 / 信任区 / 恢复区」，找到被拦截的 PLK Launcher.exe，
   选择「恢复」后，右键它 →「添加信任 / 加入白名单」。

2. Windows 安全中心
   开始菜单搜索「Windows 安全中心」→ 病毒和威胁防护 → 保护历史记录，
   找到对 PLK Launcher 的拦截记录 → 操作 → 允许。

3. 如果弹出「Windows 已保护你的电脑」
   点击「更多信息」→「仍要运行」即可打开。

4. 解除锁定
   右键压缩包或 PLK Launcher.exe → 属性 → 如果底部有「解除锁定」，
   勾选后点确定，再双击运行。

5. 仍无法打开？
   先检查上面提到的日志文件是否存在（程序目录下的 PLK\Logs），有的话一并发给我们，能更快定位；
   加官方交流群：1134020839，带上截图和日志反馈，我们会尽快帮你解决。
