//**********************************************// //作者:#何健# //日期:#2016.10.14# //简述:#装备数据结构# //*********************************************// using UnityEngine; using System; using System.Collections.Generic; using Thousandto.Cfg.Data; using Thousandto.Code.Global; using Thousandto.Code.Center; using Thousandto.Plugins.Common; namespace Thousandto.Code.Logic { /// /// 类Equipment说明 /// public class Equipment: ItemBase { #region//静态变量 public static Dictionary> EquipBaseAttDic = null; public static Dictionary> EquipSpecialAttDic = null; public static Dictionary> EquipGodAttDic = null; #endregion #region //私有变量 private DeclareEquip _equip; //装备表数据 private int _suitID; //当前套装ID private DeclareEquipSuit _suitCfg; //当前套装配置 private int _curSuitEquipCount;//当前装备的套装数量 private int _curLevelSuitEquipCount; //当前套装等级的套装数量 private List _activeSuitNums; //激活的套装数量列表 private List _activeSuitIds; //激活的套装的id列表 private uint _power; //基础属性 private Dictionary _baseAttrs; private Dictionary _specialAttrs; private Dictionary _godAttrs; private MSG_backpack.ItemInfo _itemInfoFromServer; #endregion #region //属性 public DeclareEquip ItemInfo { get { return _equip; } } public int SuitID { get { return _suitID; } } public DeclareEquipSuit SuitCfg { get { return _suitCfg; } } public int CurSuitEquipCount { get { return _curSuitEquipCount; } set { _curSuitEquipCount = value; } } public int CurLevelSuitEquipCount { get { return _curLevelSuitEquipCount; } set { _curLevelSuitEquipCount = value; } } public List ActiveSuitNums { get { if (_activeSuitNums == null) { _activeSuitNums = new List(); } return _activeSuitNums; } } public List ActiveSuitIds { get { if (_activeSuitIds == null) { _activeSuitIds = new List(); } return _activeSuitIds; } } #endregion #region//继承父类 public override bool Initialization() { base.Initialization(); _equip = DeclareEquip.Get( CfgID ); if (_equip == null) { Debug.LogError("equip info initialization declareequip is null id = " + CfgID); } _suitID = 0; _suitCfg = null; return true; } public override void UnInitialization() { _baseAttrs.Clear(); } public override int GetItemType() { return ItemType.Equip; } public override string GetName() { string ret = ""; if (null != ItemInfo) { if (SuitCfg != null) { ret = SuitCfg.Prefix + ItemInfo.Name; } else { ret = ItemInfo.Name; } } return ret; } public override int GetIcon() { int ret = -1; if (ItemInfo != null) ret = ItemInfo.Icon; return ret; } public override int GetEffect() { int ret = -1; if (ItemInfo != null) ret = ItemInfo.Effect; return ret; } public override int GetQuality() { int ret = -1; if (ItemInfo != null) ret = ItemInfo.Quality; return ret; } public override int GetStarNum() { var ret = 0; if (ItemInfo != null) ret = ItemInfo.DiamondNumber; return ret; } public override string GetOcc() { if (ItemInfo != null) { return ItemInfo.Gender; } return ""; } public override int GetPart() { var ret = -1; if (ItemInfo != null) ret = ItemInfo.Part; return ret; } public override int GetGrade() { var ret = 0; if (ItemInfo != null) ret = ItemInfo.Grade; return ret; } public override uint GetPower() { return _power; } public override bool IsCanUse( int useType = ItemOpertion.Use ) { return base.IsCanUse( useType ); } public override bool CheckLevel( int level ) { return ItemInfo.Level <= level; } public override bool CheackOcc( int sex ) { if (Occ.IndexOf("9") >= 0) return true; bool ret = false; if ( ItemInfo.Gender.IndexOf(sex.ToString()) >= 0 ) { ret = true; } else { ret = false; } return ret; } public override bool CheckBetterThanDress() { var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part); if(dressEquip != null) { return Power > dressEquip.Power; } return true; } public override bool CheckCanEquip() { return GameCenter.EquipmentSystem.OnCheckCanEquip(this); } public override bool CheckClass() { if (ItemInfo.Classlevel <= 0) return true; else { LocalPlayer p = GameCenter.GameSceneSystem.GetLocalPlayer(); if (p != null) { if (p.ChangeJobLevel >= ItemInfo.Classlevel) { return true; } else { return false; } } } return false; } public override bool isTimeOut() { return base.isTimeOut(); } public override bool IsNeedSecond( int useType = ItemOpertion.Use ) { bool ret= false; if (ItemInfo == null) { return false; } switch ( useType ) { case ItemOpertion.Use: ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示 break; case ItemOpertion.Split: ret = false; break; case ItemOpertion.Sell: case ItemOpertion.Stall: case ItemOpertion.Resolve: ret = ItemInfo.Quality >= 4; //紫色以上装备就需要提示 break; } return ret; } public override bool IsUsedInBatches() { return false; } //检测是否可以上架 public override bool CanAuction() { if (!GameCenter.MainFunctionSystem.FunctionIsVisible(FunctionStartIdCode.Auchtion)) return false; if (IsBind) return false; if (ItemInfo.AuctionMaxPrice == 0) return false; return true; } //使用物品 public override void UseItem() { GameCenter.EquipmentSystem.RequestEquipWear(this); } //获取和已穿戴装备的战斗力差 public override int GetDressPowerDiff() { var dressEquip = GameCenter.EquipmentSystem.GetPlayerDressEquip(Part); if (dressEquip != null) { return (int)Power - (int)dressEquip.Power; } return (int)Power; } //判断是否是首饰 public bool IsJewelry() { if (Part == EquipmentType.FingerRing || Part == EquipmentType.Necklace) return true; return false; } #endregion #region//公共接口 public Equipment( MSG_backpack.ItemInfo info ): base(info) { Initialization(); _suitID = info.suitId; _suitCfg = DeclareEquipSuit.Get(_suitID); SetAttribute(); _itemInfoFromServer = info; } public Equipment( Equipment info ): base(info) { Initialization(); _suitID = info._suitID; _suitCfg = info._suitCfg; SetAttribute(); _itemInfoFromServer = info._itemInfoFromServer; } public string ToProtoBufferBytes() { byte[] bytes = Plugins.Common.ProtoBufUtils.Serialize(_itemInfoFromServer); return Convert.ToBase64String(bytes); } public static Equipment ToEquipment(string str) { Equipment result; byte[] message = Convert.FromBase64String(str); MSG_backpack.ItemInfo itemInfo = new MSG_backpack.ItemInfo(); ProtoBufUtils.Deserialize(itemInfo, message); result = new Equipment(itemInfo); return result; } public Equipment(int id) : base(id) { Initialization(); _suitID = 0; _suitCfg = null; SetAttribute(); } /// /// 获取装备的最基本的属性值 /// /// 属性类型,属性值 public Dictionary GetBaseAttribute() { if (_baseAttrs != null) return _baseAttrs; return new Dictionary(); } /// /// 获取装备的最基本的属性值 /// /// 属性类型,属性值 public Dictionary GetSpecialAttribute() { if (_specialAttrs != null) return _specialAttrs; return new Dictionary(); } /// /// 获取装备的最基本的属性值 /// /// 属性类型,属性值 public Dictionary GetGodAttribute() { if (_godAttrs != null) return _godAttrs; return new Dictionary(); } //是否有效 public override bool IsValid() { return _equip != null; } //增加套装激活数 public void AddSuitActiveNum(int num, int id) { if(!ActiveSuitNums.Contains(num)) { ActiveSuitNums.Add(num); ActiveSuitIds.Add(id); } } //清除套装激活数 public void ClearSuitActiveNum() { ActiveSuitNums.Clear(); ActiveSuitIds.Clear(); } #endregion #region//私有方法 /// /// 计算当前装备的属性值 /// /// /// 属性类型,增加的属性值 private void SetAttribute() { if (EquipBaseAttDic == null) { EquipBaseAttDic = new Dictionary>(512); } if(EquipBaseAttDic.ContainsKey(_equip.Id)) { _baseAttrs = EquipBaseAttDic[_equip.Id]; } else { if (_baseAttrs == null) _baseAttrs = new Dictionary(); _baseAttrs.Clear(); if (_equip == null) return; var attrsArr = _equip.Attribute1.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < attrsArr.Length; i++) { string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries); if (attrs.Length == 2) { int iType = int.Parse(attrs[0]); int baseAttr = int.Parse(attrs[1]); if (_baseAttrs.ContainsKey(iType)) continue; _baseAttrs.Add(iType, (ulong)baseAttr); } } //将属性缓存起来,下次使用的时候不会再次GC EquipBaseAttDic[_equip.Id] = _baseAttrs; } if (EquipSpecialAttDic == null) { EquipSpecialAttDic = new Dictionary>(512); } if (EquipSpecialAttDic.ContainsKey(_equip.Id)) { _specialAttrs = EquipSpecialAttDic[_equip.Id]; } else { if (_specialAttrs == null) _specialAttrs = new Dictionary(); _specialAttrs.Clear(); var attrsArr = _equip.Attribute2.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < attrsArr.Length; i++) { string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries); if (attrs.Length == 2) { int iType = int.Parse(attrs[0]); int baseAttr = int.Parse(attrs[1]); if (_specialAttrs.ContainsKey(iType)) continue; _specialAttrs.Add(iType, (ulong)baseAttr); } } //将属性缓存起来,下次使用的时候不会再次GC EquipSpecialAttDic[_equip.Id] = _specialAttrs; } if (EquipGodAttDic == null) { EquipGodAttDic = new Dictionary>(512); } if (EquipGodAttDic.ContainsKey(_equip.Id)) { _godAttrs = EquipGodAttDic[_equip.Id]; } else { if (_godAttrs == null) _godAttrs = new Dictionary(); _godAttrs.Clear(); var attrsArr = _equip.Attribute3.Split(GameDefine.SplitSemicolon, StringSplitOptions.RemoveEmptyEntries); for (int i = 0; i < attrsArr.Length; i++) { string[] attrs = attrsArr[i].Split(GameDefine.SplitUnderline, StringSplitOptions.RemoveEmptyEntries); if (attrs.Length == 2) { int iType = int.Parse(attrs[0]); int baseAttr = int.Parse(attrs[1]); if (_godAttrs.ContainsKey(iType)) continue; _godAttrs.Add(iType, (ulong)baseAttr); } } //将属性缓存起来,下次使用的时候不会再次GC EquipGodAttDic[_equip.Id] = _godAttrs; } _power = FightPowerHelper.GetPropetryPower(_baseAttrs) + FightPowerHelper.GetPropetryPower(_specialAttrs) + FightPowerHelper.GetPropetryPower(_godAttrs); } #endregion #region //辅助方法 此为静态方法 //装备职业名字 public static string GetOccNameWithOcc( string gender) { if (!string.IsNullOrEmpty(gender)) { string rest = null; var arr = gender.Split('_'); for(int i = 0; i < arr.Length; i++) { //如果在配置文件中找到,那么就返回名字,如果找不到,返回通用 var cfg = DeclarePlayerOccupation.Get(int.Parse(arr[i])); if (cfg != null) { if (string.IsNullOrEmpty(rest)) rest = cfg.JobName; else rest = string.Format("{0},{1}", rest, cfg.JobName); } else { return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON); } } return rest; } return DeclareMessageString.Get(DeclareMessageString.C_ITEM_OCC_NAME_COMMON); } /// /// 阶数转换,输入等阶 /// /// /// public static string LevelConvert(int level) { string str = ""; switch(level) { case 1: case 2: case 3: case 4: str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_1 + level - 1); break; case 5: case 6: case 7: case 8: case 9: case 10: case 11: case 12: case 13: case 14: case 15: str = DeclareMessageString.Get(DeclareMessageString.C_GUILD_SORT_LEVEL_5 + level - 5); break; } return str; } #endregion } }