CTT/Server/Model/Game/Entity/Bag/Bag.cs

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;
}
}
}