285 lines
7.4 KiB
C#
285 lines
7.4 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 lastSortTime;
|
|
public long lastUseTime;
|
|
|
|
/// <summary>
|
|
/// 套装
|
|
/// </summary>
|
|
public HashSet<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()
|
|
{
|
|
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<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;
|
|
|
|
// /// <summary>
|
|
// /// 星魂
|
|
// /// </summary>
|
|
// 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<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;
|
|
// this.starsoulId = equipItem.starSoulItemServerId;
|
|
}
|
|
}
|
|
} |