zxl
/
CTT
forked from Cal/CTT
1
0
Fork 0
CTT/Server/Model/Game/Entity/Bag.cs

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()
{
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;
public EquipItem() { }
public override ItemData Clone()
{
EquipItem 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;
}
}
}