diff --git a/Entity/Item/Item.cs b/Entity/Item/Item.cs index 8e4b865..c1d67ad 100644 --- a/Entity/Item/Item.cs +++ b/Entity/Item/Item.cs @@ -347,12 +347,12 @@ namespace Milimoe.FunGame.Core.Entity if (Skills.Active != null) builder.AppendLine($"{Skills.Active.ToString()}"); foreach (Skill skill in Skills.Passives) { - builder.AppendLine($"{skill.ToString()}"); + builder.Append($"{skill.ToString()}"); } if (BackgroundStory != "") { - builder.AppendLine("\r\n" + BackgroundStory); + builder.AppendLine($"\"{BackgroundStory}\""); } return builder.ToString(); @@ -369,21 +369,21 @@ namespace Milimoe.FunGame.Core.Entity } /// - /// 设置一些属性给从 新建来的 - /// 通常,在使用 JSON 反序列化 Item,且从 中获取了实例后,需要使用此方法复制给新实例 + /// 设置一些属性给从 新建来的 + /// 对于还原存档而言,在使用 JSON 反序列化 Item,且从 中获取了实例后,需要使用此方法复制给新实例 /// - /// - public void SetPropertyToItemModuleNew(Item item) + /// + public void SetPropertyToItemModuleNew(Item newbyItemModule) { - item.WeaponType = WeaponType; - item.EquipSlotType = EquipSlotType; - item.Equipable = Equipable; - item.IsPurchasable = IsPurchasable; - item.Price = Price; - item.IsSellable = IsSellable; - item.NextSellableTime = NextSellableTime; - item.IsTradable = IsTradable; - item.NextTradableTime = NextTradableTime; + newbyItemModule.WeaponType = WeaponType; + newbyItemModule.EquipSlotType = EquipSlotType; + newbyItemModule.Equipable = Equipable; + newbyItemModule.IsPurchasable = IsPurchasable; + newbyItemModule.Price = Price; + newbyItemModule.IsSellable = IsSellable; + newbyItemModule.NextSellableTime = NextSellableTime; + newbyItemModule.IsTradable = IsTradable; + newbyItemModule.NextTradableTime = NextTradableTime; } /// diff --git a/Entity/Skill/Skill.cs b/Entity/Skill/Skill.cs index c22355f..e2039a1 100644 --- a/Entity/Skill/Skill.cs +++ b/Entity/Skill/Skill.cs @@ -2,6 +2,7 @@ using Milimoe.FunGame.Core.Api.Utility; using Milimoe.FunGame.Core.Interface.Base; using Milimoe.FunGame.Core.Interface.Entity; +using Milimoe.FunGame.Core.Library.Common.Addon; using Milimoe.FunGame.Core.Library.Constant; namespace Milimoe.FunGame.Core.Entity @@ -47,7 +48,7 @@ namespace Milimoe.FunGame.Core.Entity /// 技能类型 [ 此项为最高优先级 ] /// [InitRequired] - public SkillType SkillType { get; set; } + public SkillType SkillType { get; set; } = SkillType.Passive; /// /// 是否是主动技能 [ 此项为高优先级 ] @@ -168,6 +169,18 @@ namespace Milimoe.FunGame.Core.Entity /// internal Skill() { } + /// + /// 设置一些属性给从 新建来的 + /// 对于还原存档而言,在使用 JSON 反序列化 Skill,且从 中获取了实例后,需要使用此方法复制给新实例 + /// + /// + public void SetPropertyToItemModuleNew(Skill newbySkillModule) + { + newbySkillModule.Enable = Enable; + newbySkillModule.IsInEffect = IsInEffect; + newbySkillModule.CurrentCD = CurrentCD; + } + /// /// 触发技能升级 /// @@ -243,7 +256,7 @@ namespace Milimoe.FunGame.Core.Entity string type = IsSuperSkill ? "【爆发技】" : (IsMagic ? "【魔法】" : (IsActive ? "【主动】" : "【被动】")); string level = Level > 0 ? " - 等级 " + Level : " - 尚未学习"; builder.AppendLine(type + Name + level); - builder.AppendLine("技能描述:" + Description); + builder.AppendLine("技能描述:" + (Level == 0 && GeneralDescription.Trim() != "" ? GeneralDescription : Description)); if (CurrentCD > 0) { builder.AppendLine($"正在冷却:剩余 {CurrentCD:0.##} 时间"); diff --git a/Library/Common/Addon/ItemModule.cs b/Library/Common/Addon/ItemModule.cs index 74c253b..464ee47 100644 --- a/Library/Common/Addon/ItemModule.cs +++ b/Library/Common/Addon/ItemModule.cs @@ -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.Library.Constant; @@ -37,13 +38,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon private bool IsLoaded = false; /// - /// 必须重写此方法,用于还原物品后获取还原详细信息 + /// [可选实现] 在使用 后,可以按 id + name + type 来匹配已编码的物品 /// /// /// /// /// - public abstract Item? GetItem(long id, string name, ItemType type); + public virtual Item? GetItem(long id, string name, ItemType type) + { + return null; + } /// /// 加载模组 diff --git a/Library/Common/Addon/SkillModule.cs b/Library/Common/Addon/SkillModule.cs index b48a4ad..b1f01fa 100644 --- a/Library/Common/Addon/SkillModule.cs +++ b/Library/Common/Addon/SkillModule.cs @@ -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.Library.Constant; @@ -37,13 +38,16 @@ namespace Milimoe.FunGame.Core.Library.Common.Addon private bool IsLoaded = false; /// - /// 必须重写此方法,用于还原技能后获取还原详细信息 + /// [可选实现] 在使用 后,可以按 id + name + type 来匹配已编码的技能 /// /// /// /// /// - public abstract Skill? GetSkill(long id, string name, SkillType type); + public virtual Skill? GetSkill(long id, string name, SkillType type) + { + return null; + } /// /// 加载模组 diff --git a/Library/Common/JsonConverter/ItemConverter.cs b/Library/Common/JsonConverter/ItemConverter.cs index ce45eb2..b184e8b 100644 --- a/Library/Common/JsonConverter/ItemConverter.cs +++ b/Library/Common/JsonConverter/ItemConverter.cs @@ -23,6 +23,15 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Item.Name): result.Name = reader.GetString() ?? ""; 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): result.ItemType = (ItemType)reader.GetInt32(); break; @@ -32,6 +41,9 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Item.EquipSlotType): result.EquipSlotType = (EquipSlotType)reader.GetInt32(); break; + case nameof(Item.IsInGameItem): + result.IsInGameItem = reader.GetBoolean(); + break; case nameof(Item.Equipable): result.Equipable = reader.GetBoolean(); break; @@ -46,24 +58,30 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter break; case nameof(Item.NextSellableTime): 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; case nameof(Item.IsTradable): result.IsTradable = reader.GetBoolean(); break; case nameof(Item.NextTradableTime): 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; - case nameof(Character.Skills): + case nameof(Item.Skills): SkillGroup skills = NetworkUtility.JsonDeserialize(ref reader, options) ?? new(); result.Skills.Active = skills.Active; 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.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.WeaponType), (int)value.WeaponType); 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.IsPurchasable), value.IsPurchasable); writer.WriteNumber(nameof(Item.Price), value.Price); - writer.WriteBoolean(nameof(Item.IsSellable), value.IsSellable); - writer.WriteString(nameof(Item.NextSellableTime), value.NextSellableTime.ToString(General.GeneralDateTimeFormat)); - writer.WriteBoolean(nameof(Item.IsTradable), value.IsTradable); - writer.WriteString(nameof(Item.NextTradableTime), value.NextTradableTime.ToString(General.GeneralDateTimeFormat)); + if (!value.IsSellable) + { + writer.WriteBoolean(nameof(Item.IsSellable), value.IsSellable); + writer.WriteString(nameof(Item.NextSellableTime), value.NextSellableTime.ToString(General.GeneralDateTimeFormat)); + } + if (!value.IsTradable) + { + writer.WriteBoolean(nameof(Item.IsTradable), value.IsTradable); + writer.WriteString(nameof(Item.NextTradableTime), value.NextTradableTime.ToString(General.GeneralDateTimeFormat)); + } writer.WritePropertyName(nameof(Item.Skills)); JsonSerializer.Serialize(writer, value.Skills, options); diff --git a/Library/Common/JsonConverter/SkillConverter.cs b/Library/Common/JsonConverter/SkillConverter.cs index 312041a..67a06c1 100644 --- a/Library/Common/JsonConverter/SkillConverter.cs +++ b/Library/Common/JsonConverter/SkillConverter.cs @@ -1,4 +1,5 @@ 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; @@ -22,9 +23,56 @@ namespace Milimoe.FunGame.Core.Library.Common.JsonConverter case nameof(Skill.Name): result.Name = reader.GetString() ?? ""; 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): result.SkillType = (SkillType)reader.GetInt32(); 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 effects = NetworkUtility.JsonDeserialize>(ref reader, options) ?? []; + foreach (Effect effect in effects) + { + result.Effects.Add(effect); + } + break; + case nameof(Skill.OtherArgs): + Dictionary others = NetworkUtility.JsonDeserialize>(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.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); + 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(); } diff --git a/Library/SQLScript/Common/Common.cs b/Library/SQLScript/Common/Common.cs index d8e9b36..ddd1554 100644 --- a/Library/SQLScript/Common/Common.cs +++ b/Library/SQLScript/Common/Common.cs @@ -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}')"; } + + public static string Select_GetLastLoginTime() + { + return $"{Command_Select} Max({Column_LoginTime}) {Command_From} {TableName}"; + } } }