//**********************************************// //作者:#何健# //日期:#2016.10.12# //简述:#物品数据结构# //*********************************************// using Thousandto.Code.Global; using Thousandto.Code.Center; using Thousandto.Cfg.Data; using MSG_backpack; using UnityEngine; using MSG_HolyEquip; using System; using Thousandto.Plugins.Common; using XLua; namespace Thousandto.Code.Logic { public class ItemBase : UIItemShow { #region Member private int _cfgId; //物品表ID private int _index; //背包位置 private long _count; //堆叠数 private ulong _dbid; //服务器数据库ID private int _lostTime; //过期时间 private bool _isBind; //是否绑定 private ContainerType _containerType; //所在容器 private int _itemType; //物品类型 private bool _isClear; //是否正在清理 private float _cdTime; //CD冷却 #endregion #region 属性获取公有接口 /// /// 物品表ID /// public int CfgID { get { return _cfgId; } set { if (value < 0) { return; } _cfgId = value; } } /// /// 服务器数据库ID /// public ulong DBID { get { return _dbid; } set { _dbid = value; } } /// /// 背包位置 /// public int Index { get { return _index; } set { if (value < 0) { return; } _index = value; } } /// /// 堆叠数 /// public long Count { get { return _count; } set { if (value < 0) { //TODO 写日志 return; } _count = value; } } /// /// 过期时间 /// public int LostTime { get { return _lostTime; } set { _lostTime = value; } } /// /// 是否绑定 /// public bool IsBind { get { return _isBind && Type != ItemType.Money; } set { _isBind = value; } } public float CDTime { get { return _cdTime; } set { _cdTime = value; } } /// /// 所在容器 /// public ContainerType ContainerType { get { return _containerType; } set { _containerType = value; } } /// /// 物品类型 /// public int Type { get { return GetItemType(); } set { _itemType = value; } } public bool IsClear { get; set; } public bool IsNew { get; set; } #endregion #region 私有接口 /// /// 初始化 /// /// public virtual bool Initialization() { _isClear = false; _itemType = GetItemTypeByModelID(CfgID); return true; } /// /// 反初始化 /// /// public virtual void UnInitialization() { } #endregion #region 公有接口 public ItemBase(int cfgId, ulong dbid = 0) { _cfgId = cfgId; _dbid = dbid; Initialization(); } public ItemBase(ItemInfo info) { CfgID = info.itemModelId; DBID = info.itemId; Count = info.num; Index = info.gridId; IsBind = info.isbind; LostTime = info.lostTime; CDTime = info.cdTime; if (LostTime < 0) { LostTime = 0; } ContainerType = ContainerType.UnDefine; Initialization(); } public ItemBase(HolyEquipItem info) { CfgID = info.itemId; DBID = info.uid; Count = 1; Index = 0; IsBind = info.isBind; LostTime = 0; CDTime = 0; if (LostTime < 0) { LostTime = 0; } ContainerType = ContainerType.UnDefine; Initialization(); } public ItemBase(ItemBase info) { if (null != info) { CfgID = info.CfgID; DBID = info.DBID; Count = info.Count; Index = info.Index; IsBind = info.IsBind; LostTime = info.LostTime; CDTime = info.CDTime; ContainerType = info.ContainerType; Initialization(); } } public ItemBase(LuaTable msgTable) { var msg = new ItemInfo(); if (!msgTable.TryGet("itemId", out msg.itemId))//物品唯一ID值 return; if (!msgTable.TryGet("itemModelId", out msg.itemModelId))//物品模板ID值 return; if (!msgTable.TryGet("num", out msg.num))//数量 return; msgTable.TryGet("gridId", out msg.gridId);//所在格子编号 msgTable.TryGet("isbind", out msg.isbind);//是否绑定 1是0否 msgTable.TryGet("lostTime", out msg.lostTime);//过期时间 msgTable.TryGet("cdTime", out msg.cdTime);//物品CD msgTable.TryGet("suitId", out msg.suitId);//套装Id msgTable.TryGet("strengLv", out msg.strengLv);//强化等级 CfgID = msg.itemModelId; DBID = msg.itemId; Count = msg.num; Index = msg.gridId; IsBind = msg.isbind; LostTime = msg.lostTime; CDTime = msg.cdTime; if (LostTime < 0) { LostTime = 0; } ContainerType = ContainerType.UnDefine; Initialization(); } /// /// 判断一个物品是否可用,但是除开等级,职业,性别,和时间CD判断, /// 如需要上述判断需要自己自行调用 /// /// /// public virtual bool IsCanUse(int useType = ItemOpertion.Use) { return true; } public virtual bool CheckClass() { return false; } /// /// 检测物品是否满足等级 /// /// 用于检测的等级 /// public virtual bool CheckLevel(int level) { return true; } /// /// 检测物品是否满足特定职业 /// /// 检测的职业 /// public virtual bool CheckCareer(int career) { return GameCenter.GameSceneSystem.GetLocalPlayer().Occ == career; } /// /// 检测是否过期 /// /// public virtual bool isTimeOut() { if (LostTime > 0) return LostTime < GameCenter.HeartSystem.ServerTime; return false; } /// /// 检测是否满足性别 /// /// 检测的性别 /// public virtual bool CheackOcc(int sex) { return true; } //检测是否比身上穿的战斗力高 public virtual bool CheckBetterThanDress() { return false; } //检测是否可以装备 public virtual bool CheckCanEquip() { return false; } //检测是否可以上架 public virtual bool CanAuction() { return false; } /// /// 检测是否需要二次确认,这里的二次确认就是会弹出一个确认框 /// /// 操作类型 /// public virtual bool IsNeedSecond(int useType = ItemOpertion.Use) { return false; } /// ///是否可以批量使用 /// /// public virtual bool IsUsedInBatches() { return false; } //是否有效 public virtual bool IsValid() { return false; } public virtual int GetItemType() { return _itemType; } //使用物品 public virtual void UseItem() { } //获取和已穿戴装备的战斗力差 public virtual int GetDressPowerDiff() { return 0; } #endregion #region static Methods static public string GetQualityString(int quality) { string ret = ""; switch (quality) { case QualityCode.White: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_1); break; case QualityCode.Green: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_2); break; case QualityCode.Blue: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_3); break; case QualityCode.Violet: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_4); break; case QualityCode.Orange: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_5); break; case QualityCode.Golden: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_6); break; case QualityCode.Red: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_7); break; case QualityCode.Pink: ret = Thousandto.Cfg.Data.DeclareMessageString.Get(Thousandto.Cfg.Data.DeclareMessageString.C_QUALITY_8); break; } return ret; } /// /// 获取物品品质color /// /// 物品品质 /// static public Color GetQualityColor(int quality) { Color retColor; switch (quality) { case QualityCode.White: retColor = Color.white; break; case QualityCode.Green: retColor = new Color(31 / 255.0f, 127 / 255.0f, 26 / 255.0f); break; case QualityCode.Blue: retColor = new Color(46 / 255.0f, 115 / 255.0f, 255 / 255.0f); break; case QualityCode.Violet: retColor = new Color(165 / 255.0f, 14 / 255.0f, 243 / 255.0f); break; case QualityCode.Orange: retColor = new Color(246 / 255.0f, 133 / 255.0f, 0 / 255.0f); break; case QualityCode.Golden: retColor = new Color(255 / 255.0f, 145 / 255.0f, 16 / 255.0f); break; case QualityCode.Red: retColor = new Color(255 / 255.0f, 42 / 255.0f, 42 / 255.0f); break; case QualityCode.Pink: retColor = new Color(254 / 255.0f, 60 / 255.0f, 179 / 255.0f); break; case QualityCode.DarkGolden: retColor = new Color(166 / 255.0f, 105 / 255.0f, 0 / 255.0f); break; case QualityCode.Colorful: retColor = Color.white; break; default: retColor = Color.black; break; } return retColor; } /// /// 获取物品品质RGB值 /// /// 物品品质 /// static public string GetQualityStrColor(int quality) { switch (quality) { case QualityCode.White: return "FFFFFF"; case QualityCode.Green: return "1f7f1a"; case QualityCode.Blue: return "2e73ff"; case QualityCode.Violet: return "a50ef3"; case QualityCode.Orange: return "f68500"; case QualityCode.Golden: return "ff9110"; case QualityCode.Red: return "ff2a2a"; case QualityCode.Pink: return "fe3cb3"; case QualityCode.DarkGolden: return "a66900"; case QualityCode.Colorful: return "FFFFFF"; default: return "FFFFFF"; } } /// /// 根据品质获取品质框图片名 /// /// /// static public string GetQualitySpriteName(int quality) { switch (quality) { case QualityCode.Green: return "bag_back_green"; case QualityCode.Blue: return "n_pinzhikuang_1"; case QualityCode.Violet: return "n_pinzhikuang_2"; case QualityCode.Orange: return "n_pinzhikuang_3"; case QualityCode.Golden: return "n_pinzhikuang_3"; case QualityCode.Red: return "n_pinzhikuang_4"; case QualityCode.Pink: return "n_pinzhikuang_5"; case QualityCode.DarkGolden: return "n_pinzhikuang_6"; case QualityCode.Colorful: return "n_pinzhikuang_7"; default: return ""; } } //TIPS上背景图需要根据物品品质修改 public static Color GetQualityBackColor(int quality) { Color retColor; switch (quality) { case QualityCode.White: retColor = Color.white; break; case QualityCode.Green: retColor = new Color(57 / 255.0f, 160 / 255.0f, 161 / 255.0f); break; case QualityCode.Blue: retColor = new Color(69 / 255.0f, 94 / 255.0f, 173 / 255.0f); break; case QualityCode.Violet: retColor = new Color(120 / 255.0f, 58 / 255.0f, 169 / 255.0f); break; case QualityCode.Orange: retColor = new Color(193 / 255.0f, 92 / 255.0f, 18 / 255.0f); break; case QualityCode.Golden: retColor = new Color(197 / 255.0f, 151 / 255.0f, 32 / 255.0f); break; case QualityCode.Red: retColor = new Color(178 / 255.0f, 21 / 255.0f, 38 / 255.0f); break; case QualityCode.Pink: retColor = new Color(231 / 255.0f, 27 / 255.0f, 121 / 255.0f); break; case QualityCode.DarkGolden: retColor = new Color(139 / 255.0f, 65 / 255.0f, 31 / 255.0f); break; case QualityCode.Colorful: retColor = Color.white; break; default: retColor = Color.black; break; } return retColor; } //物品名称 public static string GetItemName(int id) { var item = DeclareItem.Get(id); if (item != null) { int length = item.Name.LastIndexOf("_"); if (length == -1) { return item.Name; } else { return item.Name.Substring(0, length + 1); } } var equip = DeclareEquip.Get(id); if (equip != null) { int length = equip.Name.LastIndexOf("_"); if (length == -1) { return equip.Name; } else { return equip.Name.Substring(0, length + 1); } } return "Unknow"; } public static int GetItemTypeByModelID(int cfgID) { if (cfgID >= 2000000 && cfgID < 3000000) return ItemType.Equip; if (cfgID >= 4000000 && cfgID < 5000000) return ItemType.HolyEquip; if (cfgID >= 5000000 && cfgID < 6000000) return ItemType.ImmortalEquip; if (cfgID >= 6000000 && cfgID < 7000000) return ItemType.LingPo; if (cfgID >= 7000000 && cfgID < 7010000) return ItemType.PetEquip; if (cfgID >= 7010000) return ItemType.SoulPearl; DeclareItem item = DeclareItem.Get(cfgID); if (null != item) { return item.Type; } return ItemType.UnDefine; } /// /// 根据配置表ID,生成模板数据 /// /// /// public static ItemBase CreateItemBase(int cfgID, bool callLua = false) { var type = GetItemTypeByModelID(cfgID); switch (type) { case ItemType.Equip: return new Equipment(cfgID); case ItemType.MonsterSoulEquip: case ItemType.MonsterSoulMaterial: return new MonsterSoulEquipData(cfgID); case ItemType.HolyEquip: return new HolyEquip(cfgID); case ItemType.ImmortalEquip: return new ImmortalEquip(cfgID); case ItemType.LingPo: return new ItemLingPo(cfgID); case ItemType.UnDefine: return null; default: if(callLua) { var result = GameCenter.LuaSystem.Adaptor.CreateItembaseByCfgId(cfgID); if(result != null) { return result; } } return new ItemModel(cfgID); } } /// /// 根据lua端msgitem,生成模板数据 /// /// /// public static ItemBase CreateItemBaseByLuaMsg(LuaTable msgTable) { var msg = new ItemInfo(); if (!msgTable.TryGet("itemId", out msg.itemId))//物品唯一ID值 return null; if (!msgTable.TryGet("itemModelId", out msg.itemModelId))//物品模板ID值 return null; if (!msgTable.TryGet("num", out msg.num))//数量 return null; msgTable.TryGet("gridId", out msg.gridId);//所在格子编号 msgTable.TryGet("isbind", out msg.isbind);//是否绑定 1是0否 msgTable.TryGet("lostTime", out msg.lostTime);//过期时间 msgTable.TryGet("cdTime", out msg.cdTime);//物品CD msgTable.TryGet("suitId", out msg.suitId);//套装Id msgTable.TryGet("strengLv", out msg.strengLv);//强化等级 var type = GetItemTypeByModelID(msg.itemModelId); switch (type) { case ItemType.Equip: return new Equipment(msg); case ItemType.MonsterSoulEquip: return new MonsterSoulEquipData(msg); case ItemType.HolyEquip: return new HolyEquip(msg); case ItemType.ImmortalEquip: return new ImmortalEquip(msg); case ItemType.LingPo: return new ItemLingPo(msg); case ItemType.UnDefine: return null; default: return new ItemModel(msg); } } public static ItemBase ToItemBase(string str) { ItemBase result = null; byte[] message = Convert.FromBase64String(str); ItemInfo itemInfo = new ItemInfo(); ProtoBufUtils.Deserialize(itemInfo, message); var itembase = new ItemBase(itemInfo); switch(itembase.Type) { case ItemType.Equip: result = new Equipment(itemInfo); break; case ItemType.ImmortalEquip: result = new ImmortalEquip(itemInfo); break; case ItemType.HolyEquip: result = new HolyEquip(itemInfo); break; case ItemType.MonsterSoulEquip: result = new MonsterSoulEquipData(itemInfo); break; default: result = GameCenter.LuaSystem.Adaptor.CreateItembaseByCfgId(itemInfo.itemModelId); if(result == null) { result = new ItemModel(itemInfo); } break; } return result; } #endregion } }