using Cal; using Cal.DataTable; using MongoDB.Bson; using MongoDB.Bson.Serialization.Attributes; using MongoDB.Bson.Serialization.Serializers; using System; using System.Collections.Generic; using System.Text; namespace ET { [BsonIgnoreExtraElements] public sealed partial class Bag: Entity, ISerializeToEntity { /// /// 第一个int是Index /// 第一个int是Id /// [BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)] public DoubleDictionary ItemDic { get; set; } = new DoubleDictionary(); /// /// 第一个int是Index /// [BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)] public SortedDictionary WornEquipDic { get; set; } = new SortedDictionary(); public readonly int MaxItemCount = 48; public readonly int MaxWornEquipCount = 12; public readonly int SortTimeInterval = 60 * 1000; public const int UseTimeInterval = 30 * 1000; public int ItemCount; public long lastSortTime; public long lastUseTime; /// /// 套装 /// public HashSet suitAttributes = new(); [BsonIgnore] public bool CanAddNewItem => ItemCount < MaxItemCount; public override void EndInit() { base.EndInit(); ItemDic.OnDeserialization(); foreach (var idic in ItemDic) { idic.Value.index = idic.Key.Key; } foreach (var item in WornEquipDic) { item.Value.index = item.Key; } } } public class Item { [BsonIgnore] public int index; public ItemData data; [BsonIgnore] public int ItemId { get => IsEmpty? 0 : data.itemId; set { data.itemId = value; } } [BsonIgnore] public int Count { get => IsEmpty? 0 : data.count; set { data.count = value; } } [BsonIgnore] public ItemType ItemType { get => IsEmpty? ItemType.NoneItem : data.itemType; set { data.itemType = value; } } [BsonIgnore] public bool IsLock { get => IsEmpty? false : data.isLock; set { data.isLock = value; } } [BsonIgnore] public long ServerId { get => IsEmpty? 0 : data is EquipItem equipItem? equipItem.serverId : 0; set { if (data is EquipItem equipItem) equipItem.serverId = value; } } [BsonIgnore] public string getSource { get => IsEmpty? "未知" : data is EquipItem equipItem? equipItem.getSource : "未知"; set { if (data is EquipItem equipItem) equipItem.getSource = value; } } public Item() { } public Item(int index) { this.index = index; } public Item(int index, ItemData data, int count) { this.index = index; this.data = data.Clone(); this.data.count = count; } public Item(ItemData data) { this.data = data; } public static Item Empty(int index) { return new Item(index); } public bool IsEmpty => data == null; } public abstract class ItemData: Object { public int itemId; public ItemType itemType; public int count; public bool isLock; public ItemData() { } public virtual ItemData Clone() { ItemData newData = MemberwiseClone() as ItemData; return newData; } } public class UsableItem: ItemData { public UsableItem() { } public override ItemData Clone() { return base.Clone(); } } public class EquipItem: UsableItem { public long serverId; public AttributeType specialKey; public int specialId; [BsonRepresentation(MongoDB.Bson.BsonType.Double, AllowTruncation = true)] [MongoDB.Bson.Serialization.Attributes.BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)] public Dictionary mainAttribute; public List randomAttributes; public List addtionalAttributes; public int[] gemList; public string getSource = "未知"; public EquipDetialType detialType; public int star; public Quality quality; public int equipLevel; // /// // /// 星魂 // /// // public long starSoulItemServerId; public EquipItem() { } public override ItemData Clone() { EquipItem equipItem = (EquipItem) base.Clone(); equipItem.serverId = serverId; // equipItem.starSoulItemServerId = starSoulItemServerId; if (mainAttribute != null) equipItem.mainAttribute = new Dictionary(mainAttribute); if (addtionalAttributes != null) equipItem.addtionalAttributes = new(addtionalAttributes); if (randomAttributes != null) equipItem.randomAttributes = new(randomAttributes); if (gemList != null) equipItem.gemList = gemList.Clone() as int[]; equipItem.getSource = getSource.Clone() as string; return equipItem; } } public class GoodsItem: UsableItem { public GoodsItem() { } public override ItemData Clone() { return base.Clone(); } } public class MaterialItem: UsableItem { public MaterialItem() { } public override ItemData Clone() { return base.Clone(); } } public partial class EquipTransMessage { public EquipTransMessage() { } public EquipTransMessage(EquipItem equipItem) { EquipId = equipItem.itemId; specialKey = (int) equipItem.specialKey; specialId = equipItem.specialId; if (equipItem.mainAttribute != null) foreach (var kv in equipItem.mainAttribute) { mainAttribute.Add(new AttributeMap { Key = kv.Key, Value = kv.Value }); } if (equipItem.randomAttributes != null) randomAttributes.AddRange(equipItem.randomAttributes); if (equipItem.addtionalAttributes != null) addtionalAttributes.AddRange(equipItem.addtionalAttributes); GemList.AddRange(equipItem.gemList); Quality = (int) equipItem.quality; Star = equipItem.star; Level = equipItem.equipLevel; // this.starsoulId = equipItem.starSoulItemServerId; } } }