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

285 lines
7.4 KiB
C#
Raw Normal View History

2021-04-08 20:09:59 +08:00
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]
2021-05-01 22:06:12 +08:00
public sealed partial class Bag: Entity, ISerializeToEntity
2021-04-08 20:09:59 +08:00
{
/// <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>();
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
/// <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;
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
/// <summary>
/// 套装
/// </summary>
public HashSet<int> suitAttributes = new();
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
[BsonIgnore]
public bool CanAddNewItem => ItemCount < MaxItemCount;
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public override void EndInit()
{
base.EndInit();
ItemDic.OnDeserialization();
foreach (var idic in ItemDic)
{
idic.Value.index = idic.Key.Key;
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
foreach (var item in WornEquipDic)
{
item.Value.index = item.Key;
}
}
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public class Item
{
[BsonIgnore]
public int index;
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public ItemData data;
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
[BsonIgnore]
2021-05-01 22:06:12 +08:00
public int ItemId
{
get => IsEmpty? 0 : data.itemId;
set
{
data.itemId = value;
}
}
2021-04-08 20:09:59 +08:00
[BsonIgnore]
2021-05-01 22:06:12 +08:00
public int Count
{
get => IsEmpty? 0 : data.count;
set
{
data.count = value;
}
}
2021-04-08 20:09:59 +08:00
[BsonIgnore]
2021-05-01 22:06:12 +08:00
public ItemType ItemType
{
get => IsEmpty? ItemType.NoneItem : data.itemType;
set
{
data.itemType = value;
}
}
2021-04-08 20:09:59 +08:00
[BsonIgnore]
2021-05-01 22:06:12 +08:00
public bool IsLock
{
get => IsEmpty? false : data.isLock;
set
{
data.isLock = value;
}
}
2021-04-08 20:09:59 +08:00
[BsonIgnore]
public long ServerId
{
2021-05-01 22:06:12 +08:00
get => IsEmpty? 0 : data is EquipItem equipItem? equipItem.serverId : 0;
2021-04-08 20:09:59 +08:00
set
{
if (data is EquipItem equipItem) equipItem.serverId = value;
}
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
[BsonIgnore]
public string getSource
{
2021-05-01 22:06:12 +08:00
get => IsEmpty? "未知" : data is EquipItem equipItem? equipItem.getSource : "未知";
2021-04-08 20:09:59 +08:00
set
{
if (data is EquipItem equipItem) equipItem.getSource = value;
}
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public Item()
{
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public Item(int index)
{
this.index = index;
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public Item(int index, ItemData data, int count)
{
this.index = index;
this.data = data.Clone();
this.data.count = count;
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public Item(ItemData data)
{
this.data = data;
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public static Item Empty(int index)
{
return new Item(index);
}
2021-05-01 22:06:12 +08:00
public bool IsEmpty => data == null;
2021-04-08 20:09:59 +08:00
}
2021-05-01 22:06:12 +08:00
public abstract class ItemData: Object
2021-04-08 20:09:59 +08:00
{
public int itemId;
public ItemType itemType;
public int count;
public bool isLock;
2021-05-01 22:06:12 +08:00
public ItemData()
{
}
2021-04-08 20:09:59 +08:00
public virtual ItemData Clone()
{
2021-04-11 19:50:39 +08:00
ItemData newData = MemberwiseClone() as ItemData;
2021-04-08 20:09:59 +08:00
return newData;
}
}
2021-05-01 22:06:12 +08:00
public class UsableItem: ItemData
2021-04-08 20:09:59 +08:00
{
2021-05-01 22:06:12 +08:00
public UsableItem()
{
}
2021-04-08 20:09:59 +08:00
public override ItemData Clone()
{
return base.Clone();
}
}
2021-05-01 22:06:12 +08:00
public class EquipItem: UsableItem
2021-04-08 20:09:59 +08:00
{
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;
2021-05-01 22:06:12 +08:00
2021-05-05 13:36:19 +08:00
// /// <summary>
// /// 星魂
// /// </summary>
// public long starSoulItemServerId;
2021-05-01 22:06:12 +08:00
public EquipItem()
{
}
2021-04-08 20:09:59 +08:00
public override ItemData Clone()
{
2021-05-01 22:06:12 +08:00
EquipItem equipItem = (EquipItem) base.Clone();
2021-04-08 20:09:59 +08:00
equipItem.serverId = serverId;
2021-05-05 13:36:19 +08:00
// equipItem.starSoulItemServerId = starSoulItemServerId;
2021-04-08 20:09:59 +08:00
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;
}
}
2021-05-01 22:06:12 +08:00
public class GoodsItem: UsableItem
2021-04-08 20:09:59 +08:00
{
2021-05-01 22:06:12 +08:00
public GoodsItem()
{
}
2021-04-08 20:09:59 +08:00
public override ItemData Clone()
{
return base.Clone();
}
}
2021-05-01 22:06:12 +08:00
public class MaterialItem: UsableItem
2021-04-08 20:09:59 +08:00
{
2021-05-01 22:06:12 +08:00
public MaterialItem()
{
}
2021-04-08 20:09:59 +08:00
public override ItemData Clone()
{
return base.Clone();
}
}
2021-05-01 22:06:12 +08:00
2021-04-08 20:09:59 +08:00
public partial class EquipTransMessage
{
2021-05-01 22:06:12 +08:00
public EquipTransMessage()
{
}
2021-04-08 20:09:59 +08:00
public EquipTransMessage(EquipItem equipItem)
{
EquipId = equipItem.itemId;
2021-05-01 22:06:12 +08:00
specialKey = (int) equipItem.specialKey;
2021-04-08 20:09:59 +08:00
specialId = equipItem.specialId;
2021-05-01 22:06:12 +08:00
if (equipItem.mainAttribute != null)
foreach (var kv in equipItem.mainAttribute)
2021-04-08 20:09:59 +08:00
{
2021-05-01 22:06:12 +08:00
mainAttribute.Add(new AttributeMap { Key = kv.Key, Value = kv.Value });
}
2021-04-08 20:09:59 +08:00
if (equipItem.randomAttributes != null)
randomAttributes.AddRange(equipItem.randomAttributes);
2021-05-01 22:06:12 +08:00
if (equipItem.addtionalAttributes != null)
addtionalAttributes.AddRange(equipItem.addtionalAttributes);
2021-04-08 20:09:59 +08:00
GemList.AddRange(equipItem.gemList);
2021-05-01 22:06:12 +08:00
Quality = (int) equipItem.quality;
2021-04-08 20:09:59 +08:00
Star = equipItem.star;
Level = equipItem.equipLevel;
2021-05-05 13:36:19 +08:00
// this.starsoulId = equipItem.starSoulItemServerId;
2021-04-08 20:09:59 +08:00
}
}
2021-05-01 22:06:12 +08:00
}