feat: add world chat UI

This commit is contained in:
ud18010
2026-07-28 11:54:07 +08:00
parent 09c89aadf0
commit 48aed26725
28 changed files with 5308 additions and 99 deletions
+39
View File
@@ -21,6 +21,7 @@ namespace XWorld.Server.Gateway
private readonly Matchmaker _matchmaker;
private readonly ChannelsNS.Channel<ServerCommand> _cmds =
ChannelsNS.Channel.CreateUnbounded<ServerCommand>();
private const int MaxWorldChatTextLength = 200;
private readonly Dictionary<string, List<int>> _roomPlayers = new Dictionary<string, List<int>>();
private readonly Dictionary<int, LobbyPlayerMsg> _lobbyPlayers = new Dictionary<int, LobbyPlayerMsg>();
private readonly Dictionary<string, int> _playerCountCache = new Dictionary<string, int>(); // "gameId@version" -> playerCount
@@ -156,6 +157,9 @@ namespace XWorld.Server.Gateway
case FrameworkOpcode.LobbyLeave:
if (_lobbyPlayers.Remove(pid)) BroadcastLobbyState();
break;
case FrameworkOpcode.WorldChatSend:
HandleWorldChatSend(pid, frame.Payload);
break;
}
}
@@ -213,6 +217,41 @@ namespace XWorld.Server.Gateway
}
}
private void HandleWorldChatSend(int pid, byte[] payload)
{
if (!_sessions.IsConnected(pid))
{
return;
}
var req = WorldChatSendMsg.Decode(payload);
string text = (req.Text ?? string.Empty).Trim();
if (text.Length == 0)
{
return;
}
if (text.Length > MaxWorldChatTextLength)
{
text = text.Substring(0, MaxWorldChatTextLength);
}
string name = _lobbyPlayers.TryGetValue(pid, out var player) && !string.IsNullOrWhiteSpace(player.Name)
? player.Name
: $"P{pid}";
var msg = new WorldChatMessageMsg
{
PlayerId = pid,
PlayerName = name,
Text = text,
ServerTimeMs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
};
byte[] encoded = msg.Encode();
foreach (int targetPid in _sessions.ConnectedPlayerIds())
{
SendFramework(targetPid, FrameworkOpcode.WorldChatMessage, encoded);
}
}
private void BroadcastLobbyState()
{
if (_lobbyPlayers.Count == 0) return;