Main/Assets/Code/Logic/Equipment/Equipment.cs
2025-01-25 04:38:09 +08:00

618 lines
18 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

//**********************************************//
//作者:#何健#
//日期:#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
{
/// <summary>
/// 类Equipment说明
/// </summary>
public class Equipment: ItemBase
{
#region//静态变量
public static Dictionary<int, Dictionary<int, ulong>> EquipBaseAttDic = null;
public static Dictionary<int, Dictionary<int, ulong>> EquipSpecialAttDic = null;
public static Dictionary<int, Dictionary<int, ulong>> EquipGodAttDic = null;
#endregion
#region //私有变量
private DeclareEquip _equip; //装备表数据
private int _suitID; //当前套装ID
private DeclareEquipSuit _suitCfg; //当前套装配置
private int _curSuitEquipCount;//当前装备的套装数量
private int _curLevelSuitEquipCount; //当前套装等级的套装数量
private List<int> _activeSuitNums; //激活的套装数量列表
private List<int> _activeSuitIds; //激活的套装的id列表
private uint _power;
//基础属性
private Dictionary<int, ulong> _baseAttrs;
private Dictionary<int, ulong> _specialAttrs;
private Dictionary<int, ulong> _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<int> ActiveSuitNums
{
get
{
if (_activeSuitNums == null)
{
_activeSuitNums = new List<int>();
}
return _activeSuitNums;
}
}
public List<int> ActiveSuitIds
{
get
{
if (_activeSuitIds == null)
{
_activeSuitIds = new List<int>();
}
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();
}
/// <summary>
/// 获取装备的最基本的属性值
/// </summary>
/// <returns>属性类型,属性值</returns>
public Dictionary<int , ulong> GetBaseAttribute()
{
if (_baseAttrs != null)
return _baseAttrs;
return new Dictionary<int, ulong>();
}
/// <summary>
/// 获取装备的最基本的属性值
/// </summary>
/// <returns>属性类型,属性值</returns>
public Dictionary<int, ulong> GetSpecialAttribute()
{
if (_specialAttrs != null)
return _specialAttrs;
return new Dictionary<int, ulong>();
}
/// <summary>
/// 获取装备的最基本的属性值
/// </summary>
/// <returns>属性类型,属性值</returns>
public Dictionary<int, ulong> GetGodAttribute()
{
if (_godAttrs != null)
return _godAttrs;
return new Dictionary<int, ulong>();
}
//是否有效
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//私有方法
/// <summary>
/// 计算当前装备的属性值
/// </summary>
/// <param name="level"></param>
/// <returns>属性类型,增加的属性值</returns>
private void SetAttribute()
{
if (EquipBaseAttDic == null)
{
EquipBaseAttDic = new Dictionary<int, Dictionary<int, ulong>>(512);
}
if(EquipBaseAttDic.ContainsKey(_equip.Id))
{
_baseAttrs = EquipBaseAttDic[_equip.Id];
}
else
{
if (_baseAttrs == null)
_baseAttrs = new Dictionary<int, ulong>();
_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<int, Dictionary<int, ulong>>(512);
}
if (EquipSpecialAttDic.ContainsKey(_equip.Id))
{
_specialAttrs = EquipSpecialAttDic[_equip.Id];
}
else
{
if (_specialAttrs == null)
_specialAttrs = new Dictionary<int, ulong>();
_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<int, Dictionary<int, ulong>>(512);
}
if (EquipGodAttDic.ContainsKey(_equip.Id))
{
_godAttrs = EquipGodAttDic[_equip.Id];
}
else
{
if (_godAttrs == null)
_godAttrs = new Dictionary<int, ulong>();
_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);
}
/// <summary>
/// 阶数转换,输入等阶
/// </summary>
/// <param name="level"></param>
/// <returns></returns>
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
}
}