[{"data":1,"prerenderedAt":751},["ShallowReactive",2],{"post-/2026/20261021-1":3,"surround-/2026/20261021-1":745},{"id":4,"title":5,"body":6,"categories":714,"date":716,"description":717,"draft":718,"extension":719,"image":720,"meta":721,"navigation":723,"path":724,"permalink":725,"podcastAudio":726,"podcastLyric":727,"podcastTitle":728,"published":725,"readingTime":729,"recommend":691,"references":725,"seo":734,"sitemap":735,"stem":736,"tags":737,"type":742,"updated":743,"__hash__":744},"content/posts/2026/20261021-1.md","PCL 2.99 二改 恢复游戏下载，移除自更新",{"type":7,"value":8,"toc":690},"minimark",[9,14,18,26,34,45,79,83,86,109,116,123,126,129,136,139,142,156,160,167,170,180,183,189,192,198,201,212,215,218,221,226,231,237,240,244,251,254,262,281,284,288,294,308,311,315,318,325,329,340,346,349,353,360,363,367,370,380,388,391,394,413,416,423,427,430,437,443,458,461,481,492,552,555,605,608,616,619,622,625,645,648,651,658,664,667,670,673,687],[10,11,13],"h1",{"id":12},"pcl-299-二改记录恢复-minecraft-本体下载移除启动器自更新","PCL 2.99 二改记录：恢复 Minecraft 本体下载，移除启动器自更新",[15,16,17],"p",{},"好久没更新博客了。",[15,19,20,21,25],{},"这次想写的不是一个从零开始的新项目，而是前段时间折腾的一件小事：我给 ",[22,23,24],"code",{"code":24},"PCL 2.99.0.0"," 做了一个个人二改版本，把 Minecraft 本体下载入口恢复了回来，同时把启动器自更新相关的残留链路彻底移除。",[15,27,28,29,33],{},"先把话说在前面：",[30,31,32],"strong",{},"这是非官方构建，和 PCL 官方团队没有任何关系。"," 文章记录的是我自己的源码修改、构建过程和成品校验结果，不代表官方立场。",[35,36,39,42],"alert",{"title":37,"type":38},"非官方构建说明","warning",[15,40,41],{},"本文提到的二改版基于 PCL 2.99.0.0 源码修改，不是 PCL 官方发布版本，也不包含任何 Minecraft 游戏本体文件。",[15,43,44],{},"如果你只准备使用官方版本，请直接前往 PCL 官方网站获取。二改版仅用于个人学习、研究和自身使用场景。",[46,47,50],"folding",{":open":48,"title":49},"true","所需文件与下载地址",[51,52,53],"ul",{},[54,55,56,57],"li",{},"PCL 2.99 二改版（单文件 EXE）\n",[51,58,59,69,76],{},[54,60,61,62],{},"网盘下载：",[63,64,68],"a",{"href":65,"rel":66},"https://cloud.jiugg.cn/s/VhZ9r0_KThd9NgTgKNWt3Uz4XGLsMVxd",[67],"nofollow","点击打开",[54,70,71,72,75],{},"说明：打开后请先确认地址栏域名是 ",[22,73,74],{"code":74},"cloud.jiugg.cn","，再下载文件",[54,77,78],{},"校验：文件大小和 SHA256 见下方“下载与文件校验”",[80,81,82],"h2",{"id":82},"先说结论",[15,84,85],{},"这次改动主要就两件事：",[87,88,89,103],"ol",{},[54,90,91,94,95,98,99,102],{},[30,92,93],{},"恢复 Minecraft 本体下载入口。"," 原版通过 ",[22,96,97],{"code":97},"RestrictMcDownload = True"," 屏蔽了相关入口，我把它改回 ",[22,100,101],{"code":101},"False","，原本就存在的下载与安装流程随之恢复。",[54,104,105,108],{},[30,106,107],{},"移除启动器自更新链路。"," 不只是删除设置页里的按钮，而是把更新区域、事件、启动参数、启动加载器、退出重启、更新日志和相关提示一起清理掉。",[15,110,111,112,115],{},"最终成品是单文件 EXE，压缩包里只有一个 ",[22,113,114],{"code":114},"Plain Craft Launcher 2.exe","。启动器不会检查新版本，不会弹更新提示，也不会在退出后替换自身。",[15,117,118,119,122],{},"需要特别说明的是：",[30,120,121],{},"恢复 Minecraft 下载，不等于重新实现了一个下载器。"," 下载、安装、整合包处理这些代码原本就完整存在于 PCL 源码中，只是被一个功能开关挡住了。我做的只是把开关恢复，并没有绕开官方下载源，也没有把游戏文件塞进启动器。",[80,124,125],{"id":125},"为什么会有这个二改",[15,127,128],{},"前段时间，PCL 2.99.0.0 不再提供 Minecraft 本体下载入口。具体原因我不清楚，所以这篇文章不猜，也不替官方解释。",[15,130,131,132,135],{},"我看到的实际问题是：对一部分用户来说，启动器仍然能管理和启动已有游戏，但想重新下载一个版本时会发现入口不见了。既然源码里下载逻辑还在，只是被 ",[22,133,134],{"code":134},"RestrictMcDownload"," 这个开关拦住，那么在自己的构建里把入口恢复，就是一个比较直接的解决办法。",[15,137,138],{},"另一个问题则是更新。PCL 2.99.0.0 的更新实现其实已经变成了提示或空方法，但源码里仍然留着设置页、关于页、事件枚举、启动参数、启动加载和退出重启等入口。它们未必真的会完成更新，却会让“这个版本到底还会不会更新”变得不够明确。",[15,140,141],{},"所以这次二改的目标很明确：",[51,143,144,147,150,153],{},[54,145,146],{},"游戏下载功能要能用；",[54,148,149],{},"启动器更新链路要真的不存在；",[54,151,152],{},"最终分发尽量简单，只给一个 EXE；",[54,154,155],{},"所有改动都要能解释清楚，不靠猜。",[80,157,159],{"id":158},"恢复-minecraft-本体下载","恢复 Minecraft 本体下载",[15,161,162,163,166],{},"关键改动只有一行，位置在 ",[22,164,165],{"code":165},"Modules\\ModSecret.vb","。",[15,168,169],{},"原版：",[171,172,178],"pre",{"className":173,"code":175,"language":176,"meta":177},[174],"language-vb","Public Const RestrictMcDownload As Boolean = True\n","vb","",[22,179,175],{"__ignoreMap":177},[15,181,182],{},"二改版：",[171,184,187],{"className":185,"code":186,"language":176,"meta":177},[174],"Public Const RestrictMcDownload As Boolean = False\n",[22,188,186],{"__ignoreMap":177},[15,190,191],{},"这行代码的意义不是“打开一个隐藏彩蛋”，而是解除源码中对 Minecraft 下载功能的统一限制。",[15,193,194,195,197],{},"PCL 里多个位置都会读取这个值。例如下载安装页会根据它决定是否抛出“暂时不再提供 MC 下载功能”的异常，整合包安装入口也会做类似检查。因此把它改回 ",[22,196,101],{"code":101}," 之后，原有的下载、安装和整合包流程就重新走通了。",[15,199,200],{},"这里有两个边界需要讲清楚：",[51,202,203,209],{},[54,204,205,208],{},[30,206,207],{},"恢复的是启动器入口和原有流程","，不是破解 Minecraft，也不是提供盗版游戏文件。",[54,210,211],{},"实际下载仍然走 PCL 原本使用的官方或镜像来源，二改版没有内置游戏资源。",[15,213,214],{},"换句话说，这更像是把一扇原本装好的门重新打开，而不是另外造了一扇门。",[80,216,217],{"id":217},"把启动器更新链路整段移除",[15,219,220],{},"如果只是把“检查更新”按钮隐藏，代码里仍然可能保留事件、参数和调用入口。这样的处理我不太满意，所以这次是把整条链路一起清理。",[222,223,225],"h3",{"id":224},"_1-清空更新核心区域","1. 清空更新核心区域",[15,227,228,230],{},[22,229,165],{"code":165}," 里的更新区域现在只保留一句说明：",[171,232,235],{"className":233,"code":234,"language":176,"meta":177},[174],"#Region \"更新\"\n\n'启动器自动更新功能已从构建中彻底移除。\n\n#End Region\n",[22,236,234],{"__ignoreMap":177},[15,238,239],{},"原本用于检查、下载、替换和重启的方法都不再保留。",[222,241,243],{"id":242},"_2-替换联网配置加载器","2. 替换联网配置加载器",[15,245,246,247,250],{},"原版启动时会调用 ",[22,248,249],{"code":249},"ServerLoader.Start()","，这个加载器与联网配置和更新检查有关。二改版把它换成了一个兼容占位对象，只记录“联网配置加载已停用”，不下载公告、不读取更新版本，也不触发替换。",[15,252,253],{},"这样既不会因为删除对象导致其它代码编译失败，也不会真的去访问更新服务器。",[222,255,257,258,261],{"id":256},"_3-删除-update-启动参数","3. 删除 ",[22,259,260],{"code":260},"--update"," 启动参数",[15,263,264,265,267,268,271,272,271,275,278,279,166],{},"原版启动逻辑里可以识别 ",[22,266,260],{"code":260},"，用于进入更新替换流程。二改版只保留 ",[22,269,270],{"code":270},"--gpu","、",[22,273,274],{"code":274},"--memory",[22,276,277],{"code":277},"--wait"," 等正常参数，不再识别 ",[22,280,260],{"code":260},[15,282,283],{},"即使外部程序仍然传入这个旧参数，也不会进入任何更新流程。",[222,285,287],{"id":286},"_4-删除启动加载与退出重启","4. 删除启动加载与退出重启",[15,289,290,293],{},[22,291,292],{"code":292},"FormMain.xaml.vb"," 中原本有两处关键调用：",[51,295,296,302],{},[54,297,298,299,301],{},"启动时的 ",[22,300,249],{"code":249},"；",[54,303,304,305,166],{},"退出时的 ",[22,306,307],{"code":307},"If IsUpdateWaitingRestart Then UpdateRestart(False)",[15,309,310],{},"这两处都已经删除。启动器启动时不会加载更新配置，退出时也不会检查“等待更新重启”状态。",[222,312,314],{"id":313},"_5-删除更新-ui-和更新日志","5. 删除更新 UI 和更新日志",[15,316,317],{},"设置页里的“启动器更新”下拉框、“检查更新”按钮，以及关于页里的更新按钮都已经移除。对应的选择变更和点击事件也一并删除。",[15,319,320,321,324],{},"版本升级时原本还会调用 ",[22,322,323],{"code":323},"ShowUpdateLog"," 显示更新日志。这个方法及其调用同样已经删除。正常的设置迁移仍然保留，但不会再把更新日志弹窗误当成更新提示。",[222,326,328],{"id":327},"_6-强制视为当前版本","6. 强制视为当前版本",[15,330,331,332,335,336,339],{},"设置页里的 ",[22,333,334],{"code":334},"IsLauncherNewest()"," 现在直接返回 ",[22,337,338],{"code":338},"True","：",[171,341,344],{"className":342,"code":343,"language":176,"meta":177},[174],"Public Shared Function IsLauncherNewest() As Boolean?\n    '自动更新通道已移除，始终视为当前版本。\n    Return True\nEnd Function\n",[22,345,343],{"__ignoreMap":177},[15,347,348],{},"这样即使旧配置或其它页面查询“是否最新版”，也不会再触发更新引导。",[222,350,352],{"id":351},"_7-清理残留事件和提示","7. 清理残留事件和提示",[15,354,355,356,359],{},"此外还删除了 ",[22,357,358],{"code":358},"EventType.检查更新"," 枚举值及对应分支，并清理了日志、崩溃报告、反馈页面和联机错误提示中“更新 PCL 或许能解决”之类的引导。",[15,361,362],{},"这些提示本身不一定能触发更新，但既然构建目标是不包含启动器更新，就没有必要继续保留。",[80,364,366],{"id":365},"怎么确认不是只删了一个按钮","怎么确认不是“只删了一个按钮”",[15,368,369],{},"源码改完之后，我做了几轮检查。",[15,371,372,373,271,376,379],{},"第一轮是源码入口扫描。在排除 ",[22,374,375],{"code":375},"obj",[22,377,378],{"code":378},"bin"," 等生成目录后，搜索下面这些标识，没有发现可执行入口：",[171,381,386],{"className":382,"code":384,"language":385,"meta":177},[383],"language-text","UpdateCheckByButton\nIsUpdateWaitingRestart\nUpdateRestart\nUpdateReplace\nDownloadLatestPCL\nServerLoader.Start\n--update\nEventType.检查更新\n","text",[22,387,384],{"__ignoreMap":177},[15,389,390],{},"第二轮是成品二进制扫描。对最终 EXE 的 ASCII 和 UTF-16 字符串进行检查，上述启动器更新标识均为 0 次。",[15,392,393],{},"这里有两个容易误判的地方，也顺便说明一下：",[51,395,396,410],{},[54,397,398,399,271,402,405,406,409],{},"二进制里仍可能出现 ",[22,400,401],{"code":401},"CheckUpdateRelease",[22,403,404],{"code":404},"CheckUpdateSnapshot","，但它们对应的是 ",[30,407,408],{},"Minecraft 正式版/测试版更新提示","，属于游戏版本设置，不是启动器自更新。",[54,411,412],{},"源码里还有一个可选主页预设叫“PCL 更新摘要”，那只是社区主页内容，不会主动检查或替换启动器。除非用户手动选择该主页，否则不会运行。",[15,414,415],{},"第三轮是启动日志检查。最终单文件版在空目录中启动成功，日志里没有启动器更新、强制更新或联网配置更新记录。",[15,417,418,419,422],{},"启动时确实会访问 Mojang 的 ",[22,420,421],{"code":421},"version_manifest.json","，但这是恢复后的 Minecraft 本体下载功能所需请求，用于获取游戏版本列表，不是 PCL 启动器在检查新版本。这一点我觉得有必要单独讲清楚，免得看到网络请求就误判。",[80,424,426],{"id":425},"单文件-exe-是怎么来的","单文件 EXE 是怎么来的",[15,428,429],{},"单文件版不是另外写了一个打包器，也不是把依赖 DLL 删掉后假装还能用。",[15,431,432,433,436],{},"PCL 项目原本就有资源嵌入和程序集解析机制。依赖 DLL 会作为资源嵌入 EXE，运行时 .NET Framework 找不到外部程序集，就会触发 ",[22,434,435],{"code":435},"AssemblyResolve","，PCL 再从内嵌资源中把程序集加载出来。",[15,438,439,440,442],{},"所以分发时只需要一个 ",[22,441,114],{"code":114},"。压缩包内也确实只有这一个文件。",[15,444,445,446,449,450,453,454,457],{},"不过要注意，单文件说的是",[30,447,448],{},"分发形式","。启动器运行后仍然可能在 ",[22,451,452],{"code":452},"PCL"," 目录生成配置、日志、缓存，或者按需释放 ",[22,455,456],{"code":456},"libwebp.dll"," 这类原生组件。这些是运行数据，不代表压缩包里还藏着别的文件。",[80,459,460],{"id":460},"下载与文件校验",[46,462,463],{":open":48,"title":49},[51,464,465],{},[54,466,56,467],{},[51,468,469,474,478],{},[54,470,61,471],{},[63,472,68],{"href":65,"rel":473},[67],[54,475,71,476,75],{},[22,477,74],{"code":74},[54,479,480],{},"校验：文件大小和 SHA256 见下方表格",[35,482,485],{"title":483,"type":484},"文件来源说明","info",[15,486,487,488,491],{},"本次文章对应的是",[30,489,490],{},"带二改作者标注版","。如果你在其它地方看到转载，请以本站页面给出的地址和校验值为准。",[493,494,495,508],"table",{},[496,497,498],"thead",{},[499,500,501,505],"tr",{},[502,503,504],"th",{},"项目",[502,506,507],{},"内容",[509,510,511,521,531,542],"tbody",{},[499,512,513,517],{},[514,515,516],"td",{},"文件名",[514,518,519],{},[22,520,114],{"code":114},[499,522,523,526],{},[514,524,525],{},"版本",[514,527,528],{},[22,529,530],{"code":530},"2.99.0.0",[499,532,533,536],{},[514,534,535],{},"文件大小",[514,537,538,541],{},[22,539,540],{"code":540},"5,868,032"," bytes",[499,543,544,547],{},[514,545,546],{},"SHA256",[514,548,549],{},[22,550,551],{"code":551},"DB1621661E8AB680EB7066CCAE328E80AA93D4A1A3BE9BBAA21D5995184F9FDF",[15,553,554],{},"单文件 ZIP：",[493,556,557,565],{},[496,558,559],{},[499,560,561,563],{},[502,562,504],{},[502,564,507],{},[509,566,567,576,585,595],{},[499,568,569,571],{},[514,570,516],{},[514,572,573],{},[22,574,575],{"code":575},"PCL-2.99-NoUpdate-Author-PageAnnotation-Single.zip",[499,577,578,581],{},[514,579,580],{},"ZIP 内文件",[514,582,583],{},[22,584,114],{"code":114},[499,586,587,590],{},[514,588,589],{},"ZIP 大小",[514,591,592,541],{},[22,593,594],{"code":594},"2,653,305",[499,596,597,600],{},[514,598,599],{},"ZIP SHA256",[514,601,602],{},[22,603,604],{"code":604},"CA383CACF58AE2665F8FDF2065A0E7BFB1F43E6731CBFE652997CCF46ADE20D3",[15,606,607],{},"下载后可以在 PowerShell 里校验：",[171,609,614],{"className":610,"code":612,"language":613,"meta":177},[611],"language-powershell","Get-FileHash -LiteralPath '.\\Plain Craft Launcher 2.exe' -Algorithm SHA256\n","powershell",[22,615,612],{"__ignoreMap":177},[15,617,618],{},"计算出的值应当与上面的 SHA256 完全一致。",[15,620,621],{},"如果你下载的是 ZIP，也可以先校验 ZIP，再解压确认里面只有一个 EXE。压缩包内的 EXE 与单独分发版本的 SHA256 是一致的。",[80,623,624],{"id":624},"使用说明和已知现象",[51,626,627,630,633,636,639],{},[54,628,629],{},"首次启动可能显示用户协议确认窗口，这是正常流程，不是更新提示。",[54,631,632],{},"如果电脑上已经有 PCL 实例在运行，单实例互斥可能让新实例直接退出，这不代表单文件包损坏。",[54,634,635],{},"二改版不会自动更新。后续如果官方发布新版本，需要自行决定是否更换回官方版。",[54,637,638],{},"如果 Windows SmartScreen 或杀毒软件给出提示，请先核对文件来源和 SHA256，不要为了运行程序直接关闭安全防护。",[54,640,641,642,644],{},"建议在替换启动器前备份原有的 ",[22,643,452],{"code":452}," 配置目录，避免版本切换后需要重新调整设置。",[80,646,647],{"id":647},"关于版权和修改边界",[15,649,650],{},"PCL 原项目版权归原作者及成都瓜皮龙科技有限公司所有。二改版没有冒用官方身份，也没有改写、删除原作者的版权声明来宣称自己拥有版权。",[15,652,653,654,657],{},"成品文件属性里的 ",[22,655,656],{"code":656},"LegalCopyright"," 字段被清空，只是为了避免二改版继续显示原版权字符串造成混淆，并不表示二改作者取得了原项目版权。文件说明、产品名称和备注等字段则保留了二改版标识。",[15,659,660,661],{},"再次强调：",[30,662,663],{},"二改版与 PCL 官方无关，不包含 Minecraft 游戏文件，也不提供任何绕过正版验证的能力。",[80,665,666],{"id":666},"写在最后",[15,668,669],{},"这次二改没有多么复杂的“黑科技”，真正花时间的不是改那一行开关，而是把更新相关的残留入口逐一确认、删除和验证。",[15,671,672],{},"我对这个版本的定位很简单：",[51,674,675,678,681,684],{},[54,676,677],{},"想下载 Minecraft 时，入口能用；",[54,679,680],{},"日常启动游戏时，不被启动器更新打扰；",[54,682,683],{},"分发时只有一个 EXE，不需要额外带一堆 DLL；",[54,685,686],{},"所有行为都能从源码和日志里解释清楚。",[15,688,689],{},"文章先写到这里。下载地址和校验值都已经放在上面的“下载与文件校验”一节。如果你也在使用这个版本，遇到问题可以在评论区留言，尽量带上系统版本、启动器日志和复现步骤，这样更方便排查。",{"title":177,"searchDepth":691,"depth":691,"links":692},4,[693,695,696,697,708,709,710,711,712,713],{"id":82,"depth":694,"text":82},2,{"id":125,"depth":694,"text":125},{"id":158,"depth":694,"text":159},{"id":217,"depth":694,"text":217,"children":698},[699,701,702,704,705,706,707],{"id":224,"depth":700,"text":225},3,{"id":242,"depth":700,"text":243},{"id":256,"depth":700,"text":703},"3. 删除 --update 启动参数",{"id":286,"depth":700,"text":287},{"id":313,"depth":700,"text":314},{"id":327,"depth":700,"text":328},{"id":351,"depth":700,"text":352},{"id":365,"depth":694,"text":366},{"id":425,"depth":694,"text":426},{"id":460,"depth":694,"text":460},{"id":624,"depth":694,"text":624},{"id":647,"depth":694,"text":647},{"id":666,"depth":694,"text":666},[715],"技术","2026-10-21 21:40:00","记录一次基于 PCL 2.99.0.0 源码的个人二改：恢复被关闭的 Minecraft 本体下载入口，并移除残留的启动器更新 UI、参数、加载与重启链路，最终生成单文件 EXE。",false,"md","https://dev.jiugg.top/i/4b4162d2-e846-46f3-a19c-9d3c85cd6020.webp",{"slots":722},{},true,"/2026/20261021-1",null,"https://cdn.jiugg.top/boke/2026/PCL.mp3","https://cdn.jiugg.top/boke/2026/PCL.lrc","AI播客",{"text":730,"minutes":731,"time":732,"words":733},"16 min read",15.815,948900,3163,{"title":5,"description":717},{"loc":724},"posts/2026/20261021-1",[452,738,739,740,741],"PCL2","Minecraft","启动器","二改","tech","2026-10-21 22:10:00","utwuAePXszTD8chLi7Ar439UJTeOh4PFMFKXtCTuIXI",[746,725],{"title":747,"path":748,"stem":749,"date":750,"type":742,"children":-1},"次元姬小说在线搜索下载器","/2026/20260728-1","posts/2026/20260728-1","2026-07-28 22:48:39",1792578391291]