From 2ed01700efd3f543449e61f5eceb303465dcecd3 Mon Sep 17 00:00:00 2001 From: milimoe Date: Sat, 28 Jun 2025 02:57:02 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E7=89=A9=E5=93=81=E7=B1=BB=E4=B8=AD?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=20AfterCopy=20=E6=96=B9=E6=B3=95=EF=BC=8C?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E4=B8=BA=20Copy=20=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BA=86=E5=A4=8D=E5=88=B6=20Others=20=E7=9A=84=E5=8F=82?= =?UTF-8?q?=E6=95=B0=EF=BC=9B=E6=B7=BB=E5=8A=A0=E4=BB=BB=E5=8A=A1=E7=B1=BB?= =?UTF-8?q?=E7=9A=84=E8=BD=AC=E6=8D=A2=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Entity/Character/CharacterBuilder.cs | 16 +-- Entity/Item/Item.cs | 18 ++- .../Common/JsonConverter/QuestConverter.cs | 122 ++++++++++++++++++ Service/JsonManager.cs | 2 +- 4 files changed, 148 insertions(+), 10 deletions(-) create mode 100644 Library/Common/JsonConverter/QuestConverter.cs diff --git a/Entity/Character/CharacterBuilder.cs b/Entity/Character/CharacterBuilder.cs index 106def0..b3a3760 100644 --- a/Entity/Character/CharacterBuilder.cs +++ b/Entity/Character/CharacterBuilder.cs @@ -147,12 +147,12 @@ namespace Milimoe.FunGame.Core.Entity Item newitem; 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); } else { - newitem = item.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + newitem = item.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); } newitem.Character = character; character.Items.Add(newitem); @@ -196,32 +196,32 @@ namespace Milimoe.FunGame.Core.Entity { if (mcp != null) { - mcp = mcp.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + mcp = mcp.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(mcp); } if (w != null) { - w = w.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + w = w.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(w); } if (a != null) { - a = a.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + a = a.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(a); } if (s != null) { - s = s.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + s = s.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(s); } if (ac1 != null) { - ac1 = ac1.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + ac1 = ac1.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(ac1); } if (ac2 != null) { - ac2 = ac2.Copy(true, !newItemGuid, true, itemsDefined, skillsDefined); + ac2 = ac2.Copy(true, !newItemGuid, true, true, itemsDefined, skillsDefined); character.Equip(ac2); } } diff --git a/Entity/Item/Item.cs b/Entity/Item/Item.cs index 16415fb..ac24fe3 100644 --- a/Entity/Item/Item.cs +++ b/Entity/Item/Item.cs @@ -400,6 +400,14 @@ namespace Milimoe.FunGame.Core.Entity } + /// + /// 物品完成复制后触发 + /// + protected virtual void AfterCopy() + { + + } + protected Item(ItemType type, bool isInGame = true) { ItemType = type; @@ -602,7 +610,7 @@ namespace Milimoe.FunGame.Core.Entity /// 复制一个物品 /// /// - public Item Copy(bool copyLevel = false, bool copyGuid = false, bool copyProperty = true, IEnumerable? itemsDefined = null, IEnumerable? skillsDefined = null) + public Item Copy(bool copyLevel = false, bool copyGuid = false, bool copyProperty = true, bool copyOthers = true, IEnumerable? itemsDefined = null, IEnumerable? skillsDefined = null) { Item item = Factory.OpenFactory.GetInstance(Id, Name, []); Item? itemDefined = null; @@ -654,6 +662,14 @@ namespace Milimoe.FunGame.Core.Entity { item.Others[key] = itemDefined.Others[key]; } + if (copyOthers) + { + foreach (string key in Others.Keys) + { + item.Others[key] = Others[key]; + } + } + item.AfterCopy(); return item; } diff --git a/Library/Common/JsonConverter/QuestConverter.cs b/Library/Common/JsonConverter/QuestConverter.cs new file mode 100644 index 0000000..02f7645 --- /dev/null +++ b/Library/Common/JsonConverter/QuestConverter.cs @@ -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 + { + public override Quest NewInstance() + { + return new Quest(); + } + + public override void ReadPropertyName(ref Utf8JsonReader reader, string propertyName, JsonSerializerOptions options, ref Quest result, Dictionary convertingContext) + { + switch (propertyName) + { + case nameof(Quest.Id): + result.Id = reader.GetInt64(); + break; + case nameof(Quest.Guid): + result.Guid = NetworkUtility.JsonDeserialize(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 awards = NetworkUtility.JsonDeserialize>(ref reader, options) ?? []; + foreach (Item item in awards) + { + result.Awards.Add(item); + } + break; + case nameof(Quest.AwardsCount): + Dictionary dict = NetworkUtility.JsonDeserialize>(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(); + } + } +} diff --git a/Service/JsonManager.cs b/Service/JsonManager.cs index d8d614b..af92148 100644 --- a/Service/JsonManager.cs +++ b/Service/JsonManager.cs @@ -22,7 +22,7 @@ namespace Milimoe.FunGame.Core.Service Converters = { new DateTimeConverter(), new DataTableConverter(), new DataSetConverter(), new UserConverter(), new RoomConverter(), new CharacterConverter(), new MagicResistanceConverter(), new EquipSlotConverter(), new SkillConverter(), new EffectConverter(), new ItemConverter(), 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() } };