添加CharacterConverter,修改其他的Converter

This commit is contained in:
milimoe 2024-08-19 22:17:15 +08:00
parent 017bda3e92
commit e07d0abb90
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
10 changed files with 327 additions and 144 deletions

View File

@ -37,7 +37,14 @@ namespace Milimoe.FunGame.Core.Api.Utility
/// </summary> /// </summary>
/// <param name="str"></param> /// <param name="str"></param>
/// <returns></returns> /// <returns></returns>
public static bool IsUserName(string str) => Regex.IsMatch(str, @"^[\u4e00-\u9fa5A-Za-z0-9]+$"); public static bool IsUserName(string str) => Regex.IsMatch(str, @"^[\u4e00-\u9fffA-Za-z0-9]+$");
/// <summary>
/// 判断字符串是否是全中文的字符
/// </summary>
/// <param name="str"></param>
/// <returns></returns>
public static bool IsChineseName(string str) => Regex.IsMatch(str, @"^[\u4e00-\u9fff]+$");
/// <summary> /// <summary>
/// 获取用户名长度 /// 获取用户名长度

View File

@ -1,4 +1,3 @@
using System.Text;
using System.Text.Json; using System.Text.Json;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
@ -137,7 +136,7 @@ namespace Milimoe.FunGame.Core.Api.Utility
{ {
Directory.CreateDirectory(dpath); Directory.CreateDirectory(dpath);
} }
using StreamWriter writer = new(fpath, false, Encoding.Unicode); using StreamWriter writer = new(fpath, false, General.DefaultEncoding);
writer.WriteLine(json); writer.WriteLine(json);
writer.Flush(); writer.Flush();
} }

View File

@ -1,10 +1,16 @@
using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Entity namespace Milimoe.FunGame.Core.Entity
{ {
public class Character : BaseEntity, ICopyable<Character> public class Character : BaseEntity, ICopyable<Character>
{ {
/// <summary>
/// 角色的姓
/// </summary>
public override string Name { get; set; } = "";
/// <summary> /// <summary>
/// 角色的名字 /// 角色的名字
/// </summary> /// </summary>
@ -263,7 +269,8 @@ namespace Milimoe.FunGame.Core.Entity
public override string ToString() public override string ToString()
{ {
string str = (Name + " " + FirstName).Trim(); bool isChineseName = NetworkUtility.IsChineseName(Name + FirstName);
string str = isChineseName ? (Name + FirstName).Trim() : (Name + " " + FirstName).Trim();
if (NickName != "") if (NickName != "")
{ {
if (str != "") str += ", "; if (str != "") str += ", ";

View File

@ -2,8 +2,10 @@
namespace Milimoe.FunGame.Core.Interface.Base namespace Milimoe.FunGame.Core.Interface.Base
{ {
internal interface IEntityConverter<T> public interface IEntityConverter<T>
{ {
public void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref T? result); public T NewInstance();
public void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref T result);
} }
} }

View File

@ -16,6 +16,7 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture
if (reader.TokenType == JsonTokenType.PropertyName) if (reader.TokenType == JsonTokenType.PropertyName)
{ {
result ??= NewInstance();
string propertyName = reader.GetString() ?? ""; string propertyName = reader.GetString() ?? "";
reader.Read(); reader.Read();
ReadPropertyName(ref reader, propertyName, options, ref result); ReadPropertyName(ref reader, propertyName, options, ref result);
@ -25,6 +26,8 @@ namespace Milimoe.FunGame.Core.Library.Common.Architecture
return result; return result;
} }
public abstract void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref T? result); public abstract T NewInstance();
public abstract void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref T result);
} }
} }

View File

@ -0,0 +1,202 @@
using System.Text.Json;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
{
public class CharacterConverter : BaseEntityConverter<Character>
{
public override Character NewInstance()
{
return Factory.GetCharacter();
}
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Character result)
{
switch (propertyName)
{
case nameof(Character.Name):
result.Name = reader.GetString() ?? "";
break;
case nameof(Character.FirstName):
result.FirstName = reader.GetString() ?? "";
break;
case nameof(Character.NickName):
result.NickName = reader.GetString() ?? "";
break;
case nameof(Character.MagicType):
result.MagicType = (MagicType)reader.GetInt32();
break;
case nameof(Character.FirstRoleType):
result.FirstRoleType = (RoleType)reader.GetInt32();
break;
case nameof(Character.SecondRoleType):
result.SecondRoleType = (RoleType)reader.GetInt32();
break;
case nameof(Character.ThirdRoleType):
result.ThirdRoleType = (RoleType)reader.GetInt32();
break;
case nameof(Character.RoleRating):
result.RoleRating = (RoleRating)reader.GetInt32();
break;
case nameof(Character.Promotion):
result.Promotion = reader.GetInt32();
break;
case nameof(Character.Level):
result.Level = reader.GetInt32();
break;
case nameof(Character.EXP):
result.EXP = reader.GetDecimal();
break;
case nameof(Character.BaseHP):
result.BaseHP = reader.GetDecimal();
break;
case nameof(Character.HP):
result.HP = reader.GetDecimal();
break;
case nameof(Character.BaseMP):
result.BaseMP = reader.GetDecimal();
break;
case nameof(Character.MP):
result.MP = reader.GetDecimal();
break;
case nameof(Character.EP):
result.EP = reader.GetDecimal();
break;
case nameof(Character.BaseATK):
result.BaseATK = reader.GetDecimal();
break;
case nameof(Character.ATK):
result.ATK = reader.GetDecimal();
break;
case nameof(Character.BaseDEF):
result.BaseDEF = reader.GetDecimal();
break;
case nameof(Character.DEF):
result.DEF = reader.GetDecimal();
break;
case nameof(Character.PDR):
result.PDR = reader.GetDecimal();
break;
case nameof(Character.MDF):
result.MDF = reader.GetDecimal();
break;
case nameof(Character.PhysicalPenetration):
result.PhysicalPenetration = reader.GetDecimal();
break;
case nameof(Character.MagicalPenetration):
result.MagicalPenetration = reader.GetDecimal();
break;
case nameof(Character.HR):
result.HR = reader.GetDecimal();
break;
case nameof(Character.MR):
result.MR = reader.GetDecimal();
break;
case nameof(Character.ER):
result.ER = reader.GetDecimal();
break;
case nameof(Character.BaseSTR):
result.BaseSTR = reader.GetDecimal();
break;
case nameof(Character.BaseAGI):
result.BaseAGI = reader.GetDecimal();
break;
case nameof(Character.BaseINT):
result.BaseINT = reader.GetDecimal();
break;
case nameof(Character.STR):
result.STR = reader.GetDecimal();
break;
case nameof(Character.AGI):
result.AGI = reader.GetDecimal();
break;
case nameof(Character.INT):
result.INT = reader.GetDecimal();
break;
case nameof(Character.STRGrowth):
result.STRGrowth = reader.GetDecimal();
break;
case nameof(Character.AGIGrowth):
result.AGIGrowth = reader.GetDecimal();
break;
case nameof(Character.INTGrowth):
result.INTGrowth = reader.GetDecimal();
break;
case nameof(Character.SPD):
result.SPD = reader.GetDecimal();
break;
case nameof(Character.ActionCoefficient):
result.ActionCoefficient = reader.GetDecimal();
break;
case nameof(Character.AccelerationCoefficient):
result.AccelerationCoefficient = reader.GetDecimal();
break;
case nameof(Character.ATR):
result.ATR = reader.GetDecimal();
break;
case nameof(Character.CritRate):
result.CritRate = reader.GetDecimal();
break;
case nameof(Character.CritDMG):
result.CritDMG = reader.GetDecimal();
break;
case nameof(Character.EvadeRate):
result.EvadeRate = reader.GetDecimal();
break;
}
}
public override void Write(Utf8JsonWriter writer, Character value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteString(nameof(Character.Name), value.Name);
writer.WriteString(nameof(Character.FirstName), value.FirstName);
writer.WriteString(nameof(Character.NickName), value.NickName);
writer.WriteNumber(nameof(Character.MagicType), (int)value.MagicType);
writer.WriteNumber(nameof(Character.FirstRoleType), (int)value.FirstRoleType);
writer.WriteNumber(nameof(Character.SecondRoleType), (int)value.SecondRoleType);
writer.WriteNumber(nameof(Character.ThirdRoleType), (int)value.ThirdRoleType);
writer.WriteNumber(nameof(Character.RoleRating), (int)value.RoleRating);
writer.WriteNumber(nameof(Character.Promotion), value.Promotion);
writer.WriteNumber(nameof(Character.Level), value.Level);
writer.WriteNumber(nameof(Character.EXP), value.EXP);
writer.WriteNumber(nameof(Character.BaseHP), value.BaseHP);
writer.WriteNumber(nameof(Character.HP), value.HP);
writer.WriteNumber(nameof(Character.BaseMP), value.BaseMP);
writer.WriteNumber(nameof(Character.MP), value.MP);
writer.WriteNumber(nameof(Character.EP), value.EP);
writer.WriteNumber(nameof(Character.BaseATK), value.BaseATK);
writer.WriteNumber(nameof(Character.ATK), value.ATK);
writer.WriteNumber(nameof(Character.BaseDEF), value.BaseDEF);
writer.WriteNumber(nameof(Character.DEF), value.DEF);
writer.WriteNumber(nameof(Character.PDR), value.PDR);
writer.WriteNumber(nameof(Character.MDF), value.MDF);
writer.WriteNumber(nameof(Character.PhysicalPenetration), value.PhysicalPenetration);
writer.WriteNumber(nameof(Character.MagicalPenetration), value.MagicalPenetration);
writer.WriteNumber(nameof(Character.HR), value.HR);
writer.WriteNumber(nameof(Character.MR), value.MR);
writer.WriteNumber(nameof(Character.ER), value.ER);
writer.WriteNumber(nameof(Character.BaseSTR), value.BaseSTR);
writer.WriteNumber(nameof(Character.BaseAGI), value.BaseAGI);
writer.WriteNumber(nameof(Character.BaseINT), value.BaseINT);
writer.WriteNumber(nameof(Character.STR), value.STR);
writer.WriteNumber(nameof(Character.AGI), value.AGI);
writer.WriteNumber(nameof(Character.INT), value.INT);
writer.WriteNumber(nameof(Character.STRGrowth), value.STRGrowth);
writer.WriteNumber(nameof(Character.AGIGrowth), value.AGIGrowth);
writer.WriteNumber(nameof(Character.INTGrowth), value.INTGrowth);
writer.WriteNumber(nameof(Character.SPD), value.SPD);
writer.WriteNumber(nameof(Character.ActionCoefficient), value.ActionCoefficient);
writer.WriteNumber(nameof(Character.AccelerationCoefficient), value.AccelerationCoefficient);
writer.WriteNumber(nameof(Character.ATR), value.ATR);
writer.WriteNumber(nameof(Character.CritRate), value.CritRate);
writer.WriteNumber(nameof(Character.CritDMG), value.CritDMG);
writer.WriteNumber(nameof(Character.EvadeRate), value.EvadeRate);
writer.WriteEndObject();
}
}
}

View File

@ -1,84 +1,60 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
{ {
public class RoomConverter : JsonConverter<Room> public class RoomConverter : BaseEntityConverter<Room>
{ {
public override bool CanConvert(Type objectType) public override Room NewInstance()
{ {
return objectType == typeof(Room); return Factory.GetRoom();
} }
public override Room Read(ref Utf8JsonReader reader, Type type, JsonSerializerOptions options) public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Room result)
{ {
Room room = Factory.GetRoom(); switch (propertyName)
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject) break;
if (reader.TokenType == JsonTokenType.PropertyName)
{
string property = reader.GetString() ?? "";
reader.Read();
switch (property)
{ {
case RoomQuery.Column_ID: case RoomQuery.Column_ID:
room.Id = reader.GetInt64(); result.Id = reader.GetInt64();
break; break;
case RoomQuery.Column_RoomID: case RoomQuery.Column_RoomID:
room.Roomid = reader.GetString() ?? ""; result.Roomid = reader.GetString() ?? "";
break; break;
case RoomQuery.Column_CreateTime: case RoomQuery.Column_CreateTime:
string dateString = reader.GetString() ?? ""; string dateString = reader.GetString() ?? "";
if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime result)) if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime date))
{ {
room.CreateTime = result; result.CreateTime = date;
} }
else room.CreateTime = General.DefaultTime; else result.CreateTime = General.DefaultTime;
break; break;
case RoomQuery.Column_RoomMaster: case RoomQuery.Column_RoomMaster:
string master = reader.GetString() ?? ""; string master = reader.GetString() ?? "";
room.RoomMaster = JsonSerializer.Deserialize<User>(master, options) ?? General.UnknownUserInstance; result.RoomMaster = JsonSerializer.Deserialize<User>(master, options) ?? General.UnknownUserInstance;
break; break;
case RoomQuery.Column_RoomType: case RoomQuery.Column_RoomType:
room.RoomType = (RoomType)reader.GetInt64(); result.RoomType = (RoomType)reader.GetInt64();
break; break;
case RoomQuery.Column_GameModule: case RoomQuery.Column_GameModule:
room.GameModule = reader.GetString() ?? ""; result.GameModule = reader.GetString() ?? "";
break; break;
case RoomQuery.Column_GameMap: case RoomQuery.Column_GameMap:
room.GameMap = reader.GetString() ?? ""; result.GameMap = reader.GetString() ?? "";
break; break;
case RoomQuery.Column_RoomState: case RoomQuery.Column_RoomState:
room.RoomState = (RoomState)reader.GetInt64(); result.RoomState = (RoomState)reader.GetInt64();
break; break;
case RoomQuery.Column_IsRank: case RoomQuery.Column_IsRank:
room.IsRank = reader.GetBoolean(); result.IsRank = reader.GetBoolean();
break; break;
case RoomQuery.Column_Password: case RoomQuery.Column_Password:
room.Password = reader.GetString() ?? ""; result.Password = reader.GetString() ?? "";
break; break;
} }
}
}
return room;
} }
public override void Write(Utf8JsonWriter writer, Room value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, Room value, JsonSerializerOptions options)

View File

@ -1,88 +1,74 @@
using System.Text.Json; using System.Text.Json;
using System.Text.Json.Serialization;
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.SQLScript.Entity; using Milimoe.FunGame.Core.Library.SQLScript.Entity;
namespace Milimoe.FunGame.Core.Library.Common.JsonConverter namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
{ {
public class UserConverter : JsonConverter<User> public class UserConverter : BaseEntityConverter<User>
{ {
public override bool CanConvert(Type objectType) public override User NewInstance()
{ {
return objectType == typeof(User); return Factory.GetUser();
} }
public override User Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options) public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref User result)
{ {
User user = Factory.GetUser();
while (reader.Read())
{
if (reader.TokenType == JsonTokenType.EndObject) break;
if (reader.TokenType == JsonTokenType.PropertyName)
{
string propertyName = reader.GetString() ?? "";
reader.Read();
switch (propertyName) switch (propertyName)
{ {
case UserQuery.Column_UID: case UserQuery.Column_UID:
user.Id = reader.GetInt64(); result.Id = reader.GetInt64();
break; break;
case UserQuery.Column_Username: case UserQuery.Column_Username:
user.Username = reader.GetString() ?? ""; result.Username = reader.GetString() ?? "";
break; break;
case UserQuery.Column_RegTime: case UserQuery.Column_RegTime:
string regTime = reader.GetString() ?? ""; string regTime = reader.GetString() ?? "";
if (DateTime.TryParseExact(regTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime RegTime)) if (DateTime.TryParseExact(regTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime RegTime))
{ {
user.RegTime = RegTime; result.RegTime = RegTime;
} }
else user.RegTime = General.DefaultTime; else result.RegTime = General.DefaultTime;
break; break;
case UserQuery.Column_LastTime: case UserQuery.Column_LastTime:
string lastTime = reader.GetString() ?? ""; string lastTime = reader.GetString() ?? "";
if (DateTime.TryParseExact(lastTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime LastTime)) if (DateTime.TryParseExact(lastTime, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime LastTime))
{ {
user.LastTime = LastTime; result.LastTime = LastTime;
} }
else user.LastTime = General.DefaultTime; else result.LastTime = General.DefaultTime;
break; break;
case UserQuery.Column_Email: case UserQuery.Column_Email:
user.Email = reader.GetString() ?? ""; result.Email = reader.GetString() ?? "";
break; break;
case UserQuery.Column_Nickname: case UserQuery.Column_Nickname:
user.NickName = reader.GetString() ?? ""; result.NickName = reader.GetString() ?? "";
break; break;
case UserQuery.Column_IsAdmin: case UserQuery.Column_IsAdmin:
user.IsAdmin = reader.GetBoolean(); result.IsAdmin = reader.GetBoolean();
break; break;
case UserQuery.Column_IsOperator: case UserQuery.Column_IsOperator:
user.IsOperator = reader.GetBoolean(); result.IsOperator = reader.GetBoolean();
break; break;
case UserQuery.Column_IsEnable: case UserQuery.Column_IsEnable:
user.IsEnable = reader.GetBoolean(); result.IsEnable = reader.GetBoolean();
break; break;
case UserQuery.Column_Credits: case UserQuery.Column_Credits:
user.Credits = reader.GetDecimal(); result.Credits = reader.GetDecimal();
break; break;
case UserQuery.Column_Materials: case UserQuery.Column_Materials:
user.Materials = reader.GetDecimal(); result.Materials = reader.GetDecimal();
break; break;
case UserQuery.Column_GameTime: case UserQuery.Column_GameTime:
user.GameTime = reader.GetDecimal(); result.GameTime = reader.GetDecimal();
break; break;
case UserQuery.Column_AutoKey: case UserQuery.Column_AutoKey:
user.AutoKey = reader.GetString() ?? ""; result.AutoKey = reader.GetString() ?? "";
break; break;
} }
} }
}
return user;
}
public override void Write(Utf8JsonWriter writer, User value, JsonSerializerOptions options) public override void Write(Utf8JsonWriter writer, User value, JsonSerializerOptions options)
{ {

View File

@ -292,10 +292,10 @@ namespace Milimoe.FunGame.Core.Library.Constant
public enum RoleType public enum RoleType
{ {
Core, Core,
Guardian,
Vanguard, Vanguard,
Logistics, Guardian,
Assistant Support,
Medic
} }
public enum RoleRating public enum RoleRating

View File

@ -18,7 +18,8 @@ namespace Milimoe.FunGame.Core.Service
WriteIndented = true, WriteIndented = true,
Encoder = JavaScriptEncoder.Create(UnicodeRanges.All), Encoder = JavaScriptEncoder.Create(UnicodeRanges.All),
ReferenceHandler = ReferenceHandler.IgnoreCycles, ReferenceHandler = ReferenceHandler.IgnoreCycles,
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter() } Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(),
new CharacterConverter() }
}; };
/// <summary> /// <summary>