Files
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

126 lines
4.2 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using PCL.Core.App.Localization;
namespace PCL.Core.Minecraft;
public static class McFormatter
{
private static readonly Dictionary<string, string> _WikiPrefixMap = new(StringComparer.Ordinal)
{
["de"] = "de",
["es"] = "es",
["fr"] = "fr",
["it"] = "it",
["ja"] = "ja",
["ko"] = "ko",
["lzh"] = "lzh",
["nl"] = "nl",
["pt"] = "pt",
["ru"] = "ru",
["th"] = "th",
["uk"] = "uk",
["zh"] = "zh"
};
/// <summary>
/// 根据当前 UI 语言返回 Minecraft Wiki 的基础 URL。
/// </summary>
public static string GetWikiBaseUrl()
{
var langCode = LocalizationService.CurrentLanguage.Code;
var prefix = (
from kvp in _WikiPrefixMap
where langCode.StartsWith(kvp.Key, StringComparison.Ordinal)
select kvp.Value)
.FirstOrDefault();
return prefix is null
? "https://minecraft.wiki"
: $"https://{prefix}.minecraft.wiki";
}
public static string GetWikiUrlSuffix(string gameVersion)
{
var formattedVersion = FormatVersion(gameVersion);
var langCode = LocalizationService.CurrentLanguage.Code;
// 非 zh 语言使用搜索 URL
if (!langCode.StartsWith("zh", StringComparison.Ordinal))
return $"/w/Special:Search?search={Uri.EscapeDataString($"Java Edition {formattedVersion}")}";
if (gameVersion.Contains('w')) return formattedVersion;
return "Java版" + formattedVersion;
}
public static string FormatVersion(string gameVersion)
{
var id = gameVersion.ToLowerInvariant();
switch (id)
{
case "0.30-1":
case "0.30-2":
case "c0.30_01c":
return "Classic_0.30";
case "in-20100206-2103":
return "Indev_20100206";
case "inf-20100630-1":
return "Infdev_20100630";
case "inf-20100630-2":
return "Alpha_v1.0.0";
case "1.19_deep_dark_experimental_snapshot-1":
return "1.19-exp1";
case "in-20100130":
return "Indev_0.31_20100130";
case "b1.6-tb3":
return "Beta_1.6_Test_Build_3";
case "1_14_combat-212796":
return "1.14.3_-_Combat_Test";
case "1_14_combat-0":
return "Combat_Test_2";
case "1_14_combat-3":
return "Combat_Test_3";
case "1_15_combat-1":
return "Combat_Test_4";
case "1_15_combat-6":
return "Combat_Test_5";
case "1_16_combat-0":
return "Combat_Test_6";
case "1_16_combat-1":
return "Combat_Test_7";
case "1_16_combat-2":
return "Combat_Test_7b";
case "1_16_combat-3":
return "Combat_Test_7c";
case "1_16_combat-4":
return "Combat_Test_8";
case "1_16_combat-5":
return "Combat_Test_8b";
case "1_16_combat-6":
return "Combat_Test_8c";
}
if (id.StartsWith("1.0.0-rc2")) return "RC2";
if (id.StartsWith("2.0") || id.StartsWith("2point0")) return "2.0";
if (id.StartsWith("b1.8-pre1")) return "Beta_1.8-pre1";
if (id.StartsWith("b1.1-")) return "Beta_1.1";
if (id.StartsWith("a1.1.0")) return "Alpha_v1.1.0";
if (id.StartsWith("a1.0.14")) return "Alpha_v1.0.14";
if (id.StartsWith("a1.0.13_01")) return "Alpha_v1.0.13_01";
if (id.StartsWith("in-20100214")) return "Indev_20100214";
if (id.Contains("experimental-snapshot")) return id.Replace("_experimental-snapshot-", "-exp");
if (id.StartsWith("inf-")) return "Infdev_" + id[4..];
if (id.StartsWith("in-")) return "Indev_" + id[3..];
if (id.StartsWith("rd-")) return "pre-Classic_" + id;
if (id.StartsWith('b')) return "Beta_" + id[1..];
if (id.StartsWith('a')) return "Alpha_v" + id[1..];
return id.StartsWith('c') ? ("Classic_" + id[1..]).Replace("st", "SURVIVAL_TEST") : id;
}
}