为技能和物品添加更多的序列化内容

This commit is contained in:
milimoe 2024-10-23 00:10:22 +08:00
parent 671e3eee40
commit 0e6e64a638
Signed by: milimoe
GPG Key ID: 05D280912DA6C69E
7 changed files with 151 additions and 34 deletions

View File

@ -347,12 +347,12 @@ namespace Milimoe.FunGame.Core.Entity
if (Skills.Active != null) builder.AppendLine($"{Skills.Active.ToString()}"); if (Skills.Active != null) builder.AppendLine($"{Skills.Active.ToString()}");
foreach (Skill skill in Skills.Passives) foreach (Skill skill in Skills.Passives)
{ {
builder.AppendLine($"{skill.ToString()}"); builder.Append($"{skill.ToString()}");
} }
if (BackgroundStory != "") if (BackgroundStory != "")
{ {
builder.AppendLine("\r\n" + BackgroundStory); builder.AppendLine($"\"{BackgroundStory}\"");
} }
return builder.ToString(); return builder.ToString();
@ -369,21 +369,21 @@ namespace Milimoe.FunGame.Core.Entity
} }
/// <summary> /// <summary>
/// 设置一些属性给从 <see cref="ItemModule"/> 新建来的 <paramref name="item"/><para/> /// 设置一些属性给从 <see cref="ItemModule"/> 新建来的 <paramref name="newbyItemModule"/><para/>
/// 通常,在使用 JSON 反序列化 Item且从 <see cref="ItemModule.GetItem(long, string, ItemType)"/> 中获取了实例后,需要使用此方法复制给新实例 /// 对于还原存档而言,在使用 JSON 反序列化 Item且从 <see cref="ItemModule.GetItem"/> 中获取了实例后,需要使用此方法复制给新实例
/// </summary> /// </summary>
/// <param name="item"></param> /// <param name="newbyItemModule"></param>
public void SetPropertyToItemModuleNew(Item item) public void SetPropertyToItemModuleNew(Item newbyItemModule)
{ {
item.WeaponType = WeaponType; newbyItemModule.WeaponType = WeaponType;
item.EquipSlotType = EquipSlotType; newbyItemModule.EquipSlotType = EquipSlotType;
item.Equipable = Equipable; newbyItemModule.Equipable = Equipable;
item.IsPurchasable = IsPurchasable; newbyItemModule.IsPurchasable = IsPurchasable;
item.Price = Price; newbyItemModule.Price = Price;
item.IsSellable = IsSellable; newbyItemModule.IsSellable = IsSellable;
item.NextSellableTime = NextSellableTime; newbyItemModule.NextSellableTime = NextSellableTime;
item.IsTradable = IsTradable; newbyItemModule.IsTradable = IsTradable;
item.NextTradableTime = NextTradableTime; newbyItemModule.NextTradableTime = NextTradableTime;
} }
/// <summary> /// <summary>

View File

@ -2,6 +2,7 @@
using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Interface.Base;
using Milimoe.FunGame.Core.Interface.Entity; using Milimoe.FunGame.Core.Interface.Entity;
using Milimoe.FunGame.Core.Library.Common.Addon;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
namespace Milimoe.FunGame.Core.Entity namespace Milimoe.FunGame.Core.Entity
@ -47,7 +48,7 @@ namespace Milimoe.FunGame.Core.Entity
/// 技能类型 [ 此项为最高优先级 ] /// 技能类型 [ 此项为最高优先级 ]
/// </summary> /// </summary>
[InitRequired] [InitRequired]
public SkillType SkillType { get; set; } public SkillType SkillType { get; set; } = SkillType.Passive;
/// <summary> /// <summary>
/// 是否是主动技能 [ 此项为高优先级 ] /// 是否是主动技能 [ 此项为高优先级 ]
@ -168,6 +169,18 @@ namespace Milimoe.FunGame.Core.Entity
/// </summary> /// </summary>
internal Skill() { } internal Skill() { }
/// <summary>
/// 设置一些属性给从 <see cref="SkillModule"/> 新建来的 <paramref name="newbySkillModule"/><para/>
/// 对于还原存档而言,在使用 JSON 反序列化 Skill且从 <see cref="SkillModule.GetSkill"/> 中获取了实例后,需要使用此方法复制给新实例
/// </summary>
/// <param name="newbySkillModule"></param>
public void SetPropertyToItemModuleNew(Skill newbySkillModule)
{
newbySkillModule.Enable = Enable;
newbySkillModule.IsInEffect = IsInEffect;
newbySkillModule.CurrentCD = CurrentCD;
}
/// <summary> /// <summary>
/// 触发技能升级 /// 触发技能升级
/// </summary> /// </summary>
@ -243,7 +256,7 @@ namespace Milimoe.FunGame.Core.Entity
string type = IsSuperSkill ? "【爆发技】" : (IsMagic ? "【魔法】" : (IsActive ? "【主动】" : "【被动】")); string type = IsSuperSkill ? "【爆发技】" : (IsMagic ? "【魔法】" : (IsActive ? "【主动】" : "【被动】"));
string level = Level > 0 ? " - 等级 " + Level : " - 尚未学习"; string level = Level > 0 ? " - 等级 " + Level : " - 尚未学习";
builder.AppendLine(type + Name + level); builder.AppendLine(type + Name + level);
builder.AppendLine("技能描述:" + Description); builder.AppendLine("技能描述:" + (Level == 0 && GeneralDescription.Trim() != "" ? GeneralDescription : Description));
if (CurrentCD > 0) if (CurrentCD > 0)
{ {
builder.AppendLine($"正在冷却:剩余 {CurrentCD:0.##} 时间"); builder.AppendLine($"正在冷却:剩余 {CurrentCD:0.##} 时间");

View File

@ -1,4 +1,5 @@
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Addons; using Milimoe.FunGame.Core.Interface.Addons;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
@ -37,13 +38,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
private bool IsLoaded = false; private bool IsLoaded = false;
/// <summary> /// <summary>
/// 必须重写此方法,用于还原物品后获取还原详细信息 /// [可选实现] 在使用 <see cref="EntityModuleConfig{Item}"/> 后,可以按 id + name + type 来匹配已编码的物品
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <returns></returns> /// <returns></returns>
public abstract Item? GetItem(long id, string name, ItemType type); public virtual Item? GetItem(long id, string name, ItemType type)
{
return null;
}
/// <summary> /// <summary>
/// 加载模组 /// 加载模组

View File

@ -1,4 +1,5 @@
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Interface.Addons; using Milimoe.FunGame.Core.Interface.Addons;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
@ -37,13 +38,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon
private bool IsLoaded = false; private bool IsLoaded = false;
/// <summary> /// <summary>
/// 必须重写此方法,用于还原技能后获取还原详细信息 /// [可选实现] 在使用 <see cref="EntityModuleConfig{Skill}"/> 后,可以按 id + name + type 来匹配已编码的技能
/// </summary> /// </summary>
/// <param name="id"></param> /// <param name="id"></param>
/// <param name="name"></param> /// <param name="name"></param>
/// <param name="type"></param> /// <param name="type"></param>
/// <returns></returns> /// <returns></returns>
public abstract Skill? GetSkill(long id, string name, SkillType type); public virtual Skill? GetSkill(long id, string name, SkillType type)
{
return null;
}
/// <summary> /// <summary>
/// 加载模组 /// 加载模组

View File

@ -23,6 +23,15 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
case nameof(Item.Name): case nameof(Item.Name):
result.Name = reader.GetString() ?? ""; result.Name = reader.GetString() ?? "";
break; break;
case nameof(Item.Description):
result.Description = reader.GetString() ?? "";
break;
case nameof(Item.GeneralDescription):
result.GeneralDescription = reader.GetString() ?? "";
break;
case nameof(Item.BackgroundStory):
result.BackgroundStory = reader.GetString() ?? "";
break;
case nameof(Item.ItemType): case nameof(Item.ItemType):
result.ItemType = (ItemType)reader.GetInt32(); result.ItemType = (ItemType)reader.GetInt32();
break; break;
@ -32,6 +41,9 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
case nameof(Item.EquipSlotType): case nameof(Item.EquipSlotType):
result.EquipSlotType = (EquipSlotType)reader.GetInt32(); result.EquipSlotType = (EquipSlotType)reader.GetInt32();
break; break;
case nameof(Item.IsInGameItem):
result.IsInGameItem = reader.GetBoolean();
break;
case nameof(Item.Equipable): case nameof(Item.Equipable):
result.Equipable = reader.GetBoolean(); result.Equipable = reader.GetBoolean();
break; break;
@ -46,24 +58,30 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
break; break;
case nameof(Item.NextSellableTime): case nameof(Item.NextSellableTime):
string dateString = reader.GetString() ?? ""; string dateString = reader.GetString() ?? "";
if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime date)) if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime sellableDate))
{ {
result.NextSellableTime = date; result.NextSellableTime = sellableDate;
}
else
{
result.NextSellableTime = DateTime.MinValue;
} }
else result.NextSellableTime = DateTime.MinValue;
break; break;
case nameof(Item.IsTradable): case nameof(Item.IsTradable):
result.IsTradable = reader.GetBoolean(); result.IsTradable = reader.GetBoolean();
break; break;
case nameof(Item.NextTradableTime): case nameof(Item.NextTradableTime):
dateString = reader.GetString() ?? ""; dateString = reader.GetString() ?? "";
if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out date)) if (DateTime.TryParseExact(dateString, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime tradableDate))
{ {
result.NextTradableTime = date; result.NextTradableTime = tradableDate;
}
else
{
result.NextTradableTime = DateTime.MinValue;
} }
else result.NextTradableTime = DateTime.MinValue;
break; break;
case nameof(Character.Skills): case nameof(Item.Skills):
SkillGroup skills = NetworkUtility.JsonDeserialize<SkillGroup>(ref reader, options) ?? new(); SkillGroup skills = NetworkUtility.JsonDeserialize<SkillGroup>(ref reader, options) ?? new();
result.Skills.Active = skills.Active; result.Skills.Active = skills.Active;
result.Skills.Passives = skills.Passives; result.Skills.Passives = skills.Passives;
@ -77,16 +95,26 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
writer.WriteNumber(nameof(Item.Id), (int)value.Id); writer.WriteNumber(nameof(Item.Id), (int)value.Id);
writer.WriteString(nameof(Item.Name), value.Name); writer.WriteString(nameof(Item.Name), value.Name);
writer.WriteString(nameof(Item.Description), value.Description);
writer.WriteString(nameof(Item.GeneralDescription), value.GeneralDescription);
writer.WriteString(nameof(Item.BackgroundStory), value.BackgroundStory);
writer.WriteNumber(nameof(Item.ItemType), (int)value.ItemType); writer.WriteNumber(nameof(Item.ItemType), (int)value.ItemType);
writer.WriteNumber(nameof(Item.WeaponType), (int)value.WeaponType); writer.WriteNumber(nameof(Item.WeaponType), (int)value.WeaponType);
writer.WriteNumber(nameof(Item.EquipSlotType), (int)value.EquipSlotType); writer.WriteNumber(nameof(Item.EquipSlotType), (int)value.EquipSlotType);
writer.WriteBoolean(nameof(Item.IsInGameItem), value.IsInGameItem);
writer.WriteBoolean(nameof(Item.Equipable), value.Equipable); writer.WriteBoolean(nameof(Item.Equipable), value.Equipable);
writer.WriteBoolean(nameof(Item.IsPurchasable), value.IsPurchasable); writer.WriteBoolean(nameof(Item.IsPurchasable), value.IsPurchasable);
writer.WriteNumber(nameof(Item.Price), value.Price); writer.WriteNumber(nameof(Item.Price), value.Price);
if (!value.IsSellable)
{
writer.WriteBoolean(nameof(Item.IsSellable), value.IsSellable); writer.WriteBoolean(nameof(Item.IsSellable), value.IsSellable);
writer.WriteString(nameof(Item.NextSellableTime), value.NextSellableTime.ToString(General.GeneralDateTimeFormat)); writer.WriteString(nameof(Item.NextSellableTime), value.NextSellableTime.ToString(General.GeneralDateTimeFormat));
}
if (!value.IsTradable)
{
writer.WriteBoolean(nameof(Item.IsTradable), value.IsTradable); writer.WriteBoolean(nameof(Item.IsTradable), value.IsTradable);
writer.WriteString(nameof(Item.NextTradableTime), value.NextTradableTime.ToString(General.GeneralDateTimeFormat)); writer.WriteString(nameof(Item.NextTradableTime), value.NextTradableTime.ToString(General.GeneralDateTimeFormat));
}
writer.WritePropertyName(nameof(Item.Skills)); writer.WritePropertyName(nameof(Item.Skills));
JsonSerializer.Serialize(writer, value.Skills, options); JsonSerializer.Serialize(writer, value.Skills, options);

View File

@ -1,4 +1,5 @@
using System.Text.Json; using System.Text.Json;
using Milimoe.FunGame.Core.Api.Utility;
using Milimoe.FunGame.Core.Entity; using Milimoe.FunGame.Core.Entity;
using Milimoe.FunGame.Core.Library.Common.Architecture; using Milimoe.FunGame.Core.Library.Common.Architecture;
using Milimoe.FunGame.Core.Library.Constant; using Milimoe.FunGame.Core.Library.Constant;
@ -22,9 +23,56 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
case nameof(Skill.Name): case nameof(Skill.Name):
result.Name = reader.GetString() ?? ""; result.Name = reader.GetString() ?? "";
break; break;
case nameof(Skill.Description):
result.Description = reader.GetString() ?? "";
break;
case nameof(Skill.GeneralDescription):
result.GeneralDescription = reader.GetString() ?? "";
break;
case nameof(Skill.Level):
result.Level = reader.GetInt32();
break;
case nameof(Skill.SkillType): case nameof(Skill.SkillType):
result.SkillType = (SkillType)reader.GetInt32(); result.SkillType = (SkillType)reader.GetInt32();
break; break;
case nameof(Skill.Enable):
result.Enable = reader.GetBoolean();
break;
case nameof(Skill.IsInEffect):
result.IsInEffect = reader.GetBoolean();
break;
case nameof(Skill.MPCost):
result.MPCost = reader.GetDouble();
break;
case nameof(Skill.EPCost):
result.EPCost = reader.GetDouble();
break;
case nameof(Skill.CastTime):
result.CastTime = reader.GetDouble();
break;
case nameof(Skill.CD):
result.CD = reader.GetDouble();
break;
case nameof(Skill.CurrentCD):
result.CurrentCD = reader.GetDouble();
break;
case nameof(Skill.HardnessTime):
result.HardnessTime = reader.GetDouble();
break;
case nameof(Skill.Effects):
HashSet<Effect> effects = NetworkUtility.JsonDeserialize<HashSet<Effect>>(ref reader, options) ?? [];
foreach (Effect effect in effects)
{
result.Effects.Add(effect);
}
break;
case nameof(Skill.OtherArgs):
Dictionary<string, object> others = NetworkUtility.JsonDeserialize<Dictionary<string, object>>(ref reader, options) ?? [];
foreach (string key in others.Keys)
{
result.OtherArgs.Add(key, others[key]);
}
break;
} }
} }
@ -34,7 +82,22 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter
writer.WriteNumber(nameof(Skill.Id), (int)value.Id); writer.WriteNumber(nameof(Skill.Id), (int)value.Id);
writer.WriteString(nameof(Skill.Name), value.Name); writer.WriteString(nameof(Skill.Name), value.Name);
writer.WriteString(nameof(Skill.Description), value.Description);
if (value.GeneralDescription.Length > 0) writer.WriteString(nameof(Skill.GeneralDescription), value.GeneralDescription);
if (value.Level > 0) writer.WriteNumber(nameof(Skill.Level), value.Level);
writer.WriteNumber(nameof(Skill.SkillType), (int)value.SkillType); writer.WriteNumber(nameof(Skill.SkillType), (int)value.SkillType);
if (!value.Enable) writer.WriteBoolean(nameof(Skill.Enable), value.Enable);
if (value.IsInEffect) writer.WriteBoolean(nameof(Skill.IsInEffect), value.IsInEffect);
if (value.MPCost > 0) writer.WriteNumber(nameof(Skill.MPCost), value.MPCost);
if (value.EPCost > 0) writer.WriteNumber(nameof(Skill.EPCost), value.EPCost);
if (value.CastTime > 0) writer.WriteNumber(nameof(Skill.CastTime), value.CastTime);
if (value.CD > 0) writer.WriteNumber(nameof(Skill.CD), value.CD);
if (value.CurrentCD > 0) writer.WriteNumber(nameof(Skill.CurrentCD), value.CurrentCD);
if (value.HardnessTime > 0) writer.WriteNumber(nameof(Skill.HardnessTime), value.HardnessTime);
writer.WritePropertyName(nameof(Skill.Effects));
JsonSerializer.Serialize(writer, value.Effects, options);
writer.WritePropertyName(nameof(Skill.OtherArgs));
JsonSerializer.Serialize(writer, value.OtherArgs, options);
writer.WriteEndObject(); writer.WriteEndObject();
} }

View File

@ -40,5 +40,10 @@ namespace Milimoe.FunGame.Core.Library.SQLScript.Common
{ {
return $"{Command_Insert} {Command_Into} {TableName} ({Column_ServerName}, {Column_ServerKey}, {Column_LoginTime}) {Command_Values} ('{ServerName}', '{ServerKey}', '{DateTime.Now}')"; return $"{Command_Insert} {Command_Into} {TableName} ({Column_ServerName}, {Column_ServerKey}, {Column_LoginTime}) {Command_Values} ('{ServerName}', '{ServerKey}', '{DateTime.Now}')";
} }
public static string Select_GetLastLoginTime()
{
return $"{Command_Select} Max({Column_LoginTime}) {Command_From} {TableName}";
}
} }
} }