Keep username changes

This commit is contained in:
Kei-Luna
2026-04-28 16:12:27 +09:00
parent ccdfbee828
commit f4ad74e00d
4 changed files with 88 additions and 7 deletions

View File

@@ -7,6 +7,8 @@ namespace MikuSB.Database.Player;
[SugarTable("Player")] [SugarTable("Player")]
public class PlayerGameData : BaseDatabaseDataHelper public class PlayerGameData : BaseDatabaseDataHelper
{ {
public const string DefaultDisplayName = "Miku";
public string? Name { get; set; } = ""; public string? Name { get; set; } = "";
public string? Signature { get; set; } = "MikuPS"; public string? Signature { get; set; } = "MikuPS";
public uint Level { get; set; } = 100; public uint Level { get; set; } = 100;
@@ -25,13 +27,30 @@ public class PlayerGameData : BaseDatabaseDataHelper
return result; return result;
} }
public static string NormalizeDisplayName(string? name)
{
var normalized = name?.Trim();
return string.IsNullOrWhiteSpace(normalized) ? DefaultDisplayName : normalized;
}
public bool EnsureDisplayName()
{
var normalized = NormalizeDisplayName(Name);
if (string.Equals(Name, normalized, StringComparison.Ordinal))
return false;
Name = normalized;
return true;
}
public PlayerProfile ToProfileProto() public PlayerProfile ToProfileProto()
{ {
var displayName = NormalizeDisplayName(Name);
var proto = new PlayerProfile var proto = new PlayerProfile
{ {
Pid = (uint)Uid, Pid = (uint)Uid,
Account = Name, Account = displayName,
Name = Name, Name = displayName,
Level = Level, Level = Level,
Sex = Gender, Sex = Gender,
Sign = Signature, Sign = Signature,

View File

@@ -43,7 +43,7 @@ public class PlayerInstance(PlayerGameData data)
{ {
// new player // new player
IsNewPlayer = true; IsNewPlayer = true;
Data.Name = AccountData.GetAccountByUid(uid)?.Username; Data.Name = PlayerGameData.NormalizeDisplayName(AccountData.GetAccountByUid(uid)?.Username);
DatabaseHelper.CreateInstance(Data); DatabaseHelper.CreateInstance(Data);
@@ -138,6 +138,7 @@ public class PlayerInstance(PlayerGameData data)
public async ValueTask OnEnterGame() public async ValueTask OnEnterGame()
{ {
if (!Initialized) await InitialPlayerManager(); if (!Initialized) await InitialPlayerManager();
Data.EnsureDisplayName();
await CharacterManager.RepairCharacterWeapons(); await CharacterManager.RepairCharacterWeapons();
await EnsureSupplies(); await EnsureSupplies();
} }
@@ -229,12 +230,13 @@ public class PlayerInstance(PlayerGameData data)
public Proto.Player ToPlayerProto() public Proto.Player ToPlayerProto()
{ {
var displayName = PlayerGameData.NormalizeDisplayName(Data.Name);
var proto = new Proto.Player var proto = new Proto.Player
{ {
Pid = (ulong)Data.Uid, Pid = (ulong)Data.Uid,
Account = Data.Name, Account = displayName,
Provider = Data.Name, Provider = displayName,
Name = Data.Name, Name = displayName,
Level = Data.Level, Level = Data.Level,
Sex = Data.Gender, Sex = Data.Gender,
Vigor = Data.Vigor, Vigor = Data.Vigor,
@@ -263,6 +265,11 @@ public class PlayerInstance(PlayerGameData data)
return proto; return proto;
} }
public void SetDisplayName(string? name)
{
Data.Name = PlayerGameData.NormalizeDisplayName(name);
}
public void SetShowItem(int index, ulong itemId) public void SetShowItem(int index, ulong itemId)
{ {
if (index <= 0) if (index <= 0)

View File

@@ -43,6 +43,8 @@ public class HandlerReqLogin : Handler
connection.State = SessionStateEnum.WAITING_FOR_LOGIN; connection.State = SessionStateEnum.WAITING_FOR_LOGIN;
var pd = DatabaseHelper.GetInstance<PlayerGameData>(account.Uid); var pd = DatabaseHelper.GetInstance<PlayerGameData>(account.Uid);
connection.Player = pd == null ? new PlayerInstance(account.Uid) : new PlayerInstance(pd); connection.Player = pd == null ? new PlayerInstance(account.Uid) : new PlayerInstance(pd);
if (connection.Player.Data.EnsureDisplayName())
DatabaseHelper.UpdateInstance(connection.Player.Data);
connection.DebugFile = Path.Combine(ConfigManager.Config.Path.LogPath, "Debug/", $"{account.Uid}/", connection.DebugFile = Path.Combine(ConfigManager.Config.Path.LogPath, "Debug/", $"{account.Uid}/",
$"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log"); $"Debug-{DateTime.Now:yyyy-MM-dd HH-mm-ss}.log");

View File

@@ -1,4 +1,6 @@
using MikuSB.Proto; using Google.Protobuf;
using MikuSB.Database;
using MikuSB.Proto;
namespace MikuSB.GameServer.Server.Packet.Recv.Login; namespace MikuSB.GameServer.Server.Packet.Recv.Login;
@@ -7,6 +9,57 @@ public class HandlerReqRename : Handler
{ {
public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo) public override async Task OnHandle(Connection connection, byte[] data, ushort seqNo)
{ {
var player = connection.Player;
if (player != null)
{
var requestedName = ParseDisplayName(data);
player.SetDisplayName(requestedName);
DatabaseHelper.UpdateInstance(player.Data);
await player.OnHeartBeat();
}
await connection.SendPacket(CmdIds.RspRename); await connection.SendPacket(CmdIds.RspRename);
} }
private static string? ParseDisplayName(byte[] data)
{
if (data.Length == 0)
return null;
try
{
var input = new CodedInputStream(data);
while (!input.IsAtEnd)
{
var tag = input.ReadTag();
if (tag == 0)
break;
if (WireFormat.GetTagWireType(tag) == WireFormat.WireType.LengthDelimited)
{
var value = input.ReadString();
if (!string.IsNullOrWhiteSpace(value))
return value;
}
else
{
input.SkipLastField();
}
}
}
catch
{
// Fall back to raw UTF-8 payload handling below.
}
try
{
var rawText = System.Text.Encoding.UTF8.GetString(data).Trim('\0', ' ', '\r', '\n', '\t');
return string.IsNullOrWhiteSpace(rawText) ? null : rawText;
}
catch
{
return null;
}
}
} }