Files
MRCC/launcher/PCL-CE/PCL.Core/Minecraft/McVersionClassifier.cs
T
xyou f70b061d1a
CI / Go Backend (push) Canceled after 0s
feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块

Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
2026-08-08 14:07:56 +08:00

185 lines
5.7 KiB
C#

using System;
using System.Text.Json.Nodes;
using PCL.Core.App.Localization;
using PCL.Core.Utils;
namespace PCL;
public enum McVersionCategory
{
Release,
Snapshot,
BeforeRelease,
AprilFools
}
public static class McVersionClassifier
{
public static string GetCategoryDisplayName(McVersionCategory cat)
{
return cat switch
{
McVersionCategory.Release => Lang.Text("Download.Version.Type.Release"),
McVersionCategory.Snapshot => Lang.Text("Download.Version.Type.Development"),
McVersionCategory.BeforeRelease => Lang.Text("Download.Version.Type.BeforeRelease"),
McVersionCategory.AprilFools => Lang.Text("Download.Version.Type.AprilFools"),
_ => throw new ArgumentOutOfRangeException(nameof(cat))
};
}
public static McVersionCategory ClassifyVersion(JsonObject version)
{
var type = _GetString(version, "type");
var idLower = _GetString(version, "id").ToLowerInvariant();
return type switch
{
"release" => McVersionCategory.Release,
"special" => _RefreshAprilFools(version, idLower),
"snapshot" or "pending" => _ClassifySnapshotOrPending(version, idLower),
_ => McVersionCategory.BeforeRelease
};
}
private static McVersionCategory _RefreshAprilFools(JsonObject version, string idLower)
{
_TryMarkAprilFoolsVersion(version, idLower);
return McVersionCategory.AprilFools;
}
public static DateTime GetReleaseTime(JsonObject version)
{
return _GetDateTime(version, "releaseTime");
}
private static McVersionCategory _ClassifySnapshotOrPending(JsonObject version, string idLower)
{
var category = McVersionCategory.Snapshot;
if (
idLower.StartsWith("1.") &&
!idLower.Contains("combat") &&
!idLower.Contains("rc") &&
!idLower.Contains("experimental") &&
idLower != "1.2" &&
!idLower.Contains("pre")
)
{
category = McVersionCategory.Release;
version["type"] = "release";
}
return _TryMarkAprilFoolsVersion(version, idLower)
? McVersionCategory.AprilFools
: category;
}
private static bool _TryMarkAprilFoolsVersion(JsonObject version, string idLower)
{
switch (idLower)
{
case "2point0_blue":
case "2point0_red":
case "2point0_purple":
case "2.0_blue":
case "2.0_red":
case "2.0_purple":
case "2.0":
version["id"] = _GetString(version, "id").Replace("point", ".");
_MarkAsAprilFools(version, true);
return true;
case "20w14infinite":
case "20w14∞":
version["id"] = "20w14∞";
_MarkAsAprilFools(version, true);
return true;
case "3d shareware v1.34":
case "1.rv-pre1":
case "15w14a":
case "22w13oneblockatatime":
case "23w13a_or_b":
case "24w14potato":
case "25w14craftmine":
case "26w14a":
_MarkAsAprilFools(version, true);
return true;
default:
var releaseDate = GetReleaseTime(version).ToUniversalTime().AddHours(2d);
if (releaseDate is not { Month: 4, Day: 1 }) return false;
_MarkAsAprilFools(version, false);
return true;
}
}
private static void _MarkAsAprilFools(JsonObject version, bool addLore)
{
version["type"] = "special";
if (addLore)
version["lore"] = GetMcFoolName(_GetString(version, "id"));
}
public static string GetMcFoolName(string name)
{
name = name.ToLowerInvariant();
return name switch
{
_ when name.StartsWith("2.0") || name.StartsWith("2point0")
=> Lang.Text("Minecraft.Fool.Description.2013") + name switch
{
_ when name.EndsWith("red")
=> Lang.Text("Minecraft.Fool.Tag.Red"),
_ when name.EndsWith("blue")
=> Lang.Text("Minecraft.Fool.Tag.Blue"),
_ when name.EndsWith("purple")
=> Lang.Text("Minecraft.Fool.Tag.Purple"),
_ => ""
},
"15w14a" => Lang.Text("Minecraft.Fool.Description.2015"),
"1.rv-pre1" => Lang.Text("Minecraft.Fool.Description.2016"),
"3d shareware v1.34" => Lang.Text("Minecraft.Fool.Description.2019"),
_ when name.StartsWith("20w14inf") || name == "20w14∞"
=> Lang.Text("Minecraft.Fool.Description.2020"),
"22w13oneblockatatime" => Lang.Text("Minecraft.Fool.Description.2022"),
"23w13a_or_b" => Lang.Text("Minecraft.Fool.Description.2023"),
"24w14potato" => Lang.Text("Minecraft.Fool.Description.2024"),
"25w14craftmine" => Lang.Text("Minecraft.Fool.Description.2025"),
"26w14a" => Lang.Text("Minecraft.Fool.Description.2026"),
_ => ""
};
}
private static DateTime _GetDateTime(JsonObject obj, string key)
{
return JsonCompat.TryGetDateTime(obj[key], out var dateTime)
? dateTime
: DateTime.MinValue;
}
private static string _GetString(JsonObject obj, string key)
{
var node = obj[key];
if (node is null) return "";
return node is JsonValue value && value.TryGetValue<string>(out var result)
? result
: node.ToString();
}
}