feat: 项目初始化 + 3D方块世界原型 + AI助搭系统
CI / Go Backend (push) Canceled after 0s

初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器

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

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

AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
This commit is contained in:
xyou
2026-08-08 14:07:56 +08:00
parent 9500c4c80a
commit f70b061d1a
1972 changed files with 159760 additions and 6 deletions
@@ -0,0 +1,176 @@
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using PCL.Core.App;
using PCL.Core.App.Configuration;
using PCL.Core.App.Localization;
using PCL.Core.Link.Scaffolding.EasyTier;
namespace PCL;
public partial class PageSetupGameLink
{
private bool isFirstLoad = true;
private new bool isLoaded;
public PageSetupGameLink()
{
InitializeComponent();
TextUdpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.UdpNatType", Lang.Text("Setup.GameLink.NetworkTest.NotTested"));
TextTcpNatType.Text = Lang.Text("Setup.GameLink.NetworkTest.TcpNatType", Lang.Text("Setup.GameLink.NetworkTest.NotTested"));
TextIpv6Status.Text = Lang.Text("Setup.GameLink.NetworkTest.Ipv6Status", Lang.Text("Setup.GameLink.NetworkTest.NotTested"));
Loaded += PageSetupLink_Loaded;
Loaded += (_, _) => Reload();
}
private void PageSetupLink_Loaded(object sender, RoutedEventArgs e)
{
// 重复加载部分
PanBack.ScrollToHome();
// 非重复加载部分
if (isLoaded)
return;
isLoaded = true;
ModAnimation.AniControlEnabled += 1;
Reload();
ModAnimation.AniControlEnabled -= 1;
}
public void Reload()
{
TextLinkUsername.Text = Config.Link.Username;
// TextLinkRelay.Text = Config.Link.RelayServer
// ComboRelayType.SelectedIndex = Config.Link.RelayType
// ComboServerType.SelectedIndex = Config.Link.ServerType
CheckLatencyFirstMode.Checked = Config.Link.UseLatencyFirstMode;
ComboPreferProtocol.SelectedIndex = (int)Config.Link.ProtocolPreference;
CheckTryPunchSym.Checked = Config.Link.TryPunchSym;
CheckEnableIPv6.Checked = Config.Link.EnableIPv6;
CheckEnableCliOutput.Checked = Config.Link.EnableCliOutput;
// TextRelays.Text = "正在获取信息..."
// Do While Not (PageLinkLobby.LobbyAnnouncementLoader.State = LoadState.Finished OrElse PageLinkLobby.LobbyAnnouncementLoader.State = LoadState.Failed)
// Thread.Sleep(500)
// Loop
// If ETRelay.RelayList.Count > 0 Then
// TextRelays.Text = ""
// For Each Relay In ETRelay.RelayList
// Select Case Relay.Type
// Case ETRelayType.Community
// TextRelays.Text += "[社区] "
// Case ETRelayType.Selfhosted
// TextRelays.Text += "[自有] "
// Case Else 'ETRelayType.Custom
// TextRelays.Text += "[自定义] "
// End Select
// TextRelays.Text += Relay.Name & ""
// Next
// TextRelays.Text = TextRelays.Text.BeforeLast("")
// Else
// TextRelays.Text = "暂无,你可能需要手动添加中继服务器"
// End If
}
// 初始化
public void Reset()
{
try
{
Config.Link.Reset();
ModBase.Log("[Setup] 已初始化联机页设置");
HintService.Hint(Lang.Text("Setup.GameLink.Initialized"), HintType.Success, false);
Reload();
}
catch (Exception ex)
{
ModBase.Log(
ex,
Lang.Text("Setup.GameLink.Error.InitFailed"),
ModBase.LogLevel.Msgbox,
userSummary: Lang.Text("Setup.GameLink.Error.InitFailed"));
}
Reload();
}
// 将控件改变路由到设置改变
private void TextBoxChange(object senderRaw, TextChangedEventArgs e)
{
var sender = (MyTextBox)senderRaw;
if (ModAnimation.AniControlEnabled == 0)
SetByTag(sender.Tag?.ToString(), sender.Text);
}
private static void ComboBoxChange(MyComboBox sender, object e)
{
if (ModAnimation.AniControlEnabled == 0)
SetByTag(sender.Tag?.ToString(), sender.SelectedIndex);
}
private void CheckBoxChange(object senderRaw, bool user)
{
var sender = (MyCheckBox)senderRaw;
if (ModAnimation.AniControlEnabled == 0)
SetByTag(sender.Tag?.ToString(), sender.Checked);
}
private static void SetByTag(string tag, object value)
=> ConfigService.TrySetValue(tag, value);
private void LinkProtocolPerferenceChange(object sender, SelectionChangedEventArgs e)
{
if (ModAnimation.AniControlEnabled == 0)
try
{
var selection = (LinkProtocolPreference)((MyComboBox)sender).SelectedIndex;
Config.Link.ProtocolPreference = selection;
}
catch (Exception ex)
{
ModBase.Log(
ex,
Lang.Text("Setup.GameLink.Error.ConfigChangeFailed"),
ModBase.LogLevel.Hint,
userSummary: Lang.Text("Setup.GameLink.Error.ConfigChangeFailed"));
}
}
// 网络测试
private void BtnNetTest_Click(object sender, MouseButtonEventArgs e)
{
try
{
BtnNetTest.IsEnabled = false;
BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Testing");
ModBase.RunInNewThread(() =>
{
var status = CliNetTest.GetNetStatusAsync().GetAwaiter().GetResult();
ModBase.RunInUi(() =>
{
TextUdpNatType.Text =
Lang.Text("Setup.GameLink.NetworkTest.UdpNatType", CliNetTest.GetNatTypeString(status.UdpNatType));
TextTcpNatType.Text =
Lang.Text("Setup.GameLink.NetworkTest.TcpNatType", CliNetTest.GetNatTypeString(status.TcpNatType));
TextIpv6Status.Text = Lang.Text("Setup.GameLink.NetworkTest.Ipv6Status",
status.SupportIPv6
? Lang.Text("Setup.GameLink.NetworkTest.Supported")
: Lang.Text("Setup.GameLink.NetworkTest.Unsupported"));
BtnNetTest.IsEnabled = true;
BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Start");
});
});
}
catch (Exception ex)
{
ModBase.Log(ex,
"[Link] 获取网络测试结果失败",
ModBase.LogLevel.Hint,
userSummary: Lang.Text("Setup.GameLink.Error.NetworkTestFailed"));
BtnNetTest.IsEnabled = true;
BtnNetTest.Text = Lang.Text("Setup.GameLink.NetworkTest.Start");
}
}
}