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}";
+ }
}
}