大家好我是皇鱼,又复活了
今天我们讲一下Forge的下载与启动
那么开始
非常感谢bmclapi使我的下载速度提升

获取Forge支持的版本列表

https://files.minecraftforge.net/net/minecraftforge/forge/index_1.2.4.html

访问这个页面,获取其源码,使用正则表达式匹配<a href="index_1.3.2.html">这样的字段,提取其中1.3.2的值。
这篇文章中并没有介绍1.5.1及以下没有安装器版本的安装方法,感兴趣的可以去翻翻pcl和hmcl源代码

C#代码示例:

public static async Task<List<string>> GetForgeVersionList()
    {
        var versionList = new List<string>();
        var html = await HttpUtils.GetString("https://files.minecraftforge.net/net/minecraftforge/forge/index_1.2.4.html");
        string pattern = @"<a href=""index_([^""]+(?:\.[^""]+){1,2})\.html"">";
//        string pattern = @"<a href=""index_(\d+\.\d+\.\d+)\.html"">";

        MatchCollection mc = Regex.Matches(html, pattern);
        foreach (Match m in mc)
        {
            versionList.Add(m.Groups[1].Value);
        }
        return versionList;
    }

看其中的注释部分,为什么不用注释掉的那一行呢
因为有个1.7.10-pre4。。。
mojang不是人

BMCLAPI

直接请求https://bmclapi2.bangbang93.com/forge/minecraft,返回一个json数组

获取Forge版本列表

(使用官方源获取过于抽象,只能硬生生解析HTML,建议使用bmclapi)
首先,访问https://files.minecraftforge.net/net/minecraftforge/forge/index_${mc版本号}.html
如果版本是1.7.10-pre4,要把-替换成_
然后,找到下面这一段
2025-01-09T02:08:43.png
你要的所有信息都在这里了,注意<i class="promo-latest fa" aria-hidden="true"></i>
如果是latest(该mc版本的最后一个forge),则会显示promo-latest
如果是recommend(推荐版),则会显示promo-recommend
也会出现两者皆有的情况,分别contains就行了,参考下面代码

代码示例

   class VersionInfo
    {
        public string Version { get; set; }
        public string ReleaseDate { get; set; }
        public bool IsRecommended { get; set; }
        public bool isLatest { get; set; }
    }
    static List<VersionInfo> ParseHtml(string html)
    {
        var versionInfoList = new List<VersionInfo>();

        string[] lines = html.Split(new[]{"\n", "\r\n"}, StringSplitOptions.RemoveEmptyEntries);
        bool inVersion = false;
        string ver = "";
        string time = "";
        bool recommended = false;
        bool latest = false;
        for (int i = 0; i < lines.Length; i++)
        {
            if(i + 1 >= lines.Length) break;
            if (lines[i].Contains("class=\"download-version\"") && !inVersion)
            {
                inVersion = true;
                ver = lines[i + 1].Trim();
            }

            if (lines[i].Contains("promo-recommended") && inVersion)
            {
                recommended = true;
            }
            if (lines[i].Contains("promo-latest") && inVersion)
            {
                latest = true;
            }

            if(lines[i].Contains("class=\"download-time\"") && inVersion){
                time = Between(lines[i], "title=\"", "\"").Trim();
                versionInfoList.Add(new VersionInfo{
                    Version = ver,
                    ReleaseDate = time,
                    IsRecommended = recommended,
                    isLatest = latest
                });
                inVersion = false;
                recommended = false;
                latest = false;
                time = "";
                ver = "";
            }
            
        }

        return versionInfoList;
    }

    static string Between(string source, string start, string end)
    {
        int startIndex = source.IndexOf(start) + start.Length;
        int endIndex = source.IndexOf(end, startIndex);
        if (startIndex >= start.Length && endIndex > startIndex)
        {
            return source.Substring(startIndex, endIndex - startIndex);
        }
        return "";
    }

BMCLAPI

访问这个url https://bmclapi2.bangbang93.com/forge/minecraft/${mc版本}
返回如下数组

[
    {
        "branch": "1.9",
        "build": 1766,
        "mcversion": "1.9",
        "modified": "2016-03-18T07:44:28.000Z",
        "version": "12.16.0.1766",
        "_id": "57047535e914dfb05c6a346f",
        "files": [
            {
                "format": "zip",
                "category": "mdk",
                "hash": "a6612cab2c4ae3c3bba0acc089bbffc1",
                "_id": "57047535e914dfb05c6a3475"
            },
            {
                "format": "txt",
                "category": "changelog",
                "hash": "e67f1af901089faf424b5e98b02d44a9",
                "_id": "57047535e914dfb05c6a3474"
            },
            {
                "format": "jar",
                "category": "universal",
                "hash": "da088a119849ea5cee274d116e2614b1",
                "_id": "57047535e914dfb05c6a3473"
            },
            {
                "format": "jar",
                "category": "userdev",
                "hash": "f681db67f356e912a7baff1fa440c2a4",
                "_id": "57047535e914dfb05c6a3472"
            },
            {
                "format": "exe",
                "category": "installer-win",
                "hash": "ee4cce09bcfd70aa87884c5c96f46871",
                "_id": "57047535e914dfb05c6a3471"
            },
            {
                "format": "jar",
                "category": "installer",
                "hash": "e4e0b0e1af095519e21de667f6f30b33",
                "_id": "57047535e914dfb05c6a3470"
            }
        ]
    }
]

下载安装器

https://maven.minecraftforge.net/net/minecraftforge/forge/${mcVer}-${forgeVer}/forge-${mcVer}-${forgeVer}-installer.jar

上述是forge安装器的下载链接,将${mcVer}和${forgeVer}分别替换成mc版本和forge版本,但是建议用上面获取的
BMCLAPI可以参考https://bmclapidoc.bangbang93.com/#api-Forge-ForgeDownload

下载下来后,解压,获取其中的install_profile.json
获取libraries数组,按照原版的方法解析它

未完待续
(这东西真的太抽象了)


参考资料

Minecraft Wiki:https://zh.minecraft.wiki
Forge:https://files.minecraftforge.net/
BMCLAPI:https://bmclapidoc.bangbang93.com/
PCL2源码:https://github.com/Hex-Dragon/PCL2


最后修改:2025-05-06 16:49
本文链接:https://blog.huangyu.win/index.php/archives/42/
版权声明:本文 如何编写一个Minecraft Java版启动器 | Part 2 Forge下载 (1) | 3-2 为 皇鱼 原创。著作权归作者所有,如无特殊声明,本文将依据CC BY-NC-SA 4.0发布,请注意版权。
转载说明:请依据CC BY-NC-SA 4.0进行转载。
最后修改:2025 年 05 月 06 日
如果觉得我的文章对你有用,请留言/点赞