在物品类中添加 AfterCopy 方法,并且为 Copy 添加了复制 Others 的参数;添加任务类的转换器

This commit is contained in:
milimoe 2025-06-28 02:57:02 +08:00
parent 155b846aa5
commit 2ed01700ef
Signed by: milimoe
GPG Key ID: 9554D37E4B8991D0
4 changed files with 148 additions and 10 deletions

View File

@ -147,12 +147,12 @@ namespace Milimoe.FunGame.Core.Entity
Item newitem; Item newitem;
if (itemsDefined != null && itemsDefined.FirstOrDefault(i => i.GetIdName() == item.GetIdName()) is Item itemDefined) if (itemsDefined != null && itemsDefined.FirstOrDefault(i => i.GetIdName() == item.GetIdName()) is Item itemDefined)
{ {
newitem = itemDefined.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); newitem = itemDefined.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
item.SetPropertyToItemModuleNew(newitem); item.SetPropertyToItemModuleNew(newitem);
} }
else else
{ {
newitem = item.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); newitem = item.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
} }
newitem.Character = character; newitem.Character = character;
character.Items.Add(newitem); character.Items.Add(newitem);
@ -196,32 +196,32 @@ namespace Milimoe.FunGame.Core.Entity
{ {
if (mcp != null) if (mcp != null)
{ {
mcp = mcp.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); mcp = mcp.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(mcp); character.Equip(mcp);
} }
if (w != null) if (w != null)
{ {
w = w.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); w = w.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(w); character.Equip(w);
} }
if (a != null) if (a != null)
{ {
a = a.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); a = a.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(a); character.Equip(a);
} }
if (s != null) if (s != null)
{ {
s = s.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); s = s.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(s); character.Equip(s);
} }
if (ac1 != null) if (ac1 != null)
{ {
ac1 = ac1.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); ac1 = ac1.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(ac1); character.Equip(ac1);
} }
if (ac2 != null) if (ac2 != null)
{ {
ac2 = ac2.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); ac2 = ac2.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined);
character.Equip(ac2); character.Equip(ac2);
} }
} }

View File

@ -400,6 +400,14 @@ namespace Milimoe.FunGame.Core.Entity
} }
/// <summary>
/// 物品完成复制后触发
/// </summary>
protected virtual void AfterCopy()
{
}
protected Item(ItemType type, bool isInGame = true) protected Item(ItemType type, bool isInGame = true)
{ {
ItemType = type; ItemType = type;
@ -602,7 +610,7 @@ namespace Milimoe.FunGame.Core.Entity
/// 复制一个物品 /// 复制一个物品
/// </summary> /// </summary>
/// <returns></returns> /// <returns></returns>
public Item Copy(bool copyLevel = false, bool copyGuid = false, bool copyProperty = true, IEnumerable<Item>? itemsDefined = null, IEnumerable<Skill>? skillsDefined = null) public Item Copy(bool copyLevel = false, bool copyGuid = false, bool copyProperty = true, bool copyOthers = true, IEnumerable<Item>? itemsDefined = null, IEnumerable<Skill>? skillsDefined = null)
{ {
Item item = Factory.OpenFactory.GetInstance<Item>(Id, Name, []); Item item = Factory.OpenFactory.GetInstance<Item>(Id, Name, []);
Item? itemDefined = null; Item? itemDefined = null;
@ -654,6 +662,14 @@ namespace Milimoe.FunGame.Core.Entity
{ {
item.Others[key] = itemDefined.Others[key]; item.Others[key] = itemDefined.Others[key];
} }
if (copyOthers)
{
foreach (string key in Others.Keys)
{
item.Others[key] = Others[key];
}
}
item.AfterCopy();
return item; return item;
} }

View File

@ -0,0 +1,122 @@
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 QuestConverter : BaseEntityConverter<Quest>
{
public override Quest NewInstance()
{
return new Quest();
}
public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Quest result, Dictionary<string, object> convertingContext)
{
switch (propertyName)
{
case nameof(Quest.Id):
result.Id = reader.GetInt64();
break;
case nameof(Quest.Guid):
result.Guid = NetworkUtility.JsonDeserialize<Guid>(ref reader, options);
break;
case nameof(Quest.Name):
result.Name = reader.GetString() ?? "";
break;
case nameof(Quest.Description):
result.Description = reader.GetString() ?? "";
break;
case nameof(Quest.Status):
result.Status = (QuestState)reader.GetInt32();
break;
case nameof(Quest.CharacterId):
result.CharacterId = reader.GetInt64();
break;
case nameof(Quest.RegionId):
result.RegionId = reader.GetInt64();
break;
case nameof(Quest.CreditsAward):
result.CreditsAward = reader.GetDouble();
break;
case nameof(Quest.MaterialsAward):
result.MaterialsAward = reader.GetDouble();
break;
case nameof(Quest.Awards):
List<Item> awards = NetworkUtility.JsonDeserialize<List<Item>>(ref reader, options) ?? [];
foreach (Item item in awards)
{
result.Awards.Add(item);
}
break;
case nameof(Quest.AwardsCount):
Dictionary<string, int> dict = NetworkUtility.JsonDeserialize<Dictionary<string, int>>(ref reader, options) ?? [];
foreach (string key in dict.Keys)
{
result.AwardsCount[key] = dict[key];
}
break;
case nameof(Quest.StartTime):
string startTimeStr = reader.GetString() ?? "";
if (DateTime.TryParseExact(startTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime startTime))
{
result.StartTime = startTime;
}
break;
case nameof(Quest.SettleTime):
string settleTimeStr = reader.GetString() ?? "";
if (DateTime.TryParseExact(settleTimeStr, General.GeneralDateTimeFormat, null, System.Globalization.DateTimeStyles.None, out DateTime settleTime))
{
result.SettleTime = settleTime;
}
break;
case nameof(Quest.QuestType):
result.QuestType = (QuestType)reader.GetInt32();
break;
case nameof(Quest.EstimatedMinutes):
result.EstimatedMinutes = reader.GetInt32();
break;
case nameof(Quest.Progress):
result.Progress = reader.GetInt32();
break;
case nameof(Quest.MaxProgress):
result.MaxProgress = reader.GetInt32();
break;
}
}
public override void Write(Utf8JsonWriter writer, Quest value, JsonSerializerOptions options)
{
writer.WriteStartObject();
writer.WriteNumber(nameof(Quest.Id), value.Id);
if (value.Guid != Guid.Empty)
{
writer.WritePropertyName(nameof(Quest.Guid));
JsonSerializer.Serialize(writer, value.Guid, options);
}
writer.WriteString(nameof(Quest.Name), value.Name);
writer.WriteString(nameof(Quest.Description), value.Description);
writer.WriteNumber(nameof(Quest.Status), (int)value.Status);
writer.WriteNumber(nameof(Quest.CharacterId), value.CharacterId);
writer.WriteNumber(nameof(Quest.RegionId), value.RegionId);
writer.WriteNumber(nameof(Quest.CreditsAward), value.CreditsAward);
writer.WriteNumber(nameof(Quest.MaterialsAward), value.MaterialsAward);
writer.WritePropertyName(nameof(Quest.Awards));
JsonSerializer.Serialize(writer, value.Awards, options);
writer.WritePropertyName(nameof(Quest.AwardsCount));
JsonSerializer.Serialize(writer, value.AwardsCount, options);
writer.WriteString(nameof(Quest.AwardsString), value.AwardsString);
if (value.StartTime != null) writer.WriteString(nameof(Quest.StartTime), value.StartTime.Value.ToString(General.GeneralDateTimeFormat));
if (value.SettleTime != null) writer.WriteString(nameof(Quest.SettleTime), value.SettleTime.Value.ToString(General.GeneralDateTimeFormat));
writer.WriteNumber(nameof(Quest.QuestType), (int)value.QuestType);
writer.WriteNumber(nameof(Quest.EstimatedMinutes), value.EstimatedMinutes);
writer.WriteNumber(nameof(Quest.Progress), value.Progress);
writer.WriteNumber(nameof(Quest.MaxProgress), value.MaxProgress);
writer.WriteEndObject();
}
}
}

View File

@ -22,7 +22,7 @@ namespace Milimoe.FunGame.Core.Service
Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(),
new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(), new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(),
new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter(), new InventoryConverter(), new NormalAttackConverter(), new ClubConverter(), new GoodsConverter(), new StoreConverter(),
new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter(), new ActivityConverter() new NovelOptionConverter(), new NovelNodeConverter(), new ShieldConverter(), new RoundRecordConverter(), new ActivityConverter(), new QuestConverter()
} }
}; };