213 lines
6.8 KiB
C#
213 lines
6.8 KiB
C#
|
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
|
|||
|
{
|
|||
|
/// <summary>
|
|||
|
/// 第一个int是Index
|
|||
|
/// 第一个int是Id
|
|||
|
/// </summary>
|
|||
|
[BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
|
|||
|
public DoubleDictionary<int, int, Item> ItemDic { get; set; } = new DoubleDictionary<int, int, Item>();
|
|||
|
/// <summary>
|
|||
|
/// 第一个int是Index
|
|||
|
/// </summary>
|
|||
|
[BsonDictionaryOptions(MongoDB.Bson.Serialization.Options.DictionaryRepresentation.ArrayOfArrays)]
|
|||
|
public SortedDictionary<int, Item> WornEquipDic { get; set; } = new SortedDictionary<int, Item>();
|
|||
|
|
|||
|
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 CurrEquipServerId;
|
|||
|
public long lastSortTime;
|
|||
|
public long lastUseTime;
|
|||
|
/// <summary>
|
|||
|
/// 套装
|
|||
|
/// </summary>
|
|||
|
public List<int> 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()
|
|||
|
{
|
|||
|
var 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<int, float> mainAttribute;
|
|||
|
|
|||
|
public List<int> randomAttributes;
|
|||
|
public List<int> addtionalAttributes;
|
|||
|
public int[] gemList;
|
|||
|
public string getSource = "未知";
|
|||
|
public EquipDetialType detialType;
|
|||
|
public int star;
|
|||
|
public Quality quality;
|
|||
|
public int equipLevel;
|
|||
|
public EquipItem() { }
|
|||
|
public override ItemData Clone()
|
|||
|
{
|
|||
|
var equipItem = (EquipItem)base.Clone();
|
|||
|
equipItem.serverId = serverId;
|
|||
|
if (mainAttribute != null)
|
|||
|
equipItem.mainAttribute = new Dictionary<int, float>(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;
|
|||
|
}
|
|||
|
}
|
|||
|
}
|