Main/Assets/Code/Logic/Item/ItemBase.cs

752 lines
23 KiB
C#
Raw Normal View History

2025-01-25 04:38:09 +08:00
//**********************************************//
//作者:#何健#
//日期:#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
/// <summary>
/// 物品表ID
/// </summary>
public int CfgID
{
get
{
return _cfgId;
}
set
{
if (value < 0)
{
return;
}
_cfgId = value;
}
}
/// <summary>
/// 服务器数据库ID
/// </summary>
public ulong DBID
{
get { return _dbid; }
set { _dbid = value; }
}
/// <summary>
/// 背包位置
/// </summary>
public int Index
{
get
{
return _index;
}
set
{
if (value < 0)
{
return;
}
_index = value;
}
}
/// <summary>
/// 堆叠数
/// </summary>
public long Count
{
get
{
return _count;
}
set
{
if (value < 0)
{
//TODO 写日志
return;
}
_count = value;
}
}
/// <summary>
/// 过期时间
/// </summary>
public int LostTime
{
get
{
return _lostTime;
}
set
{
_lostTime = value;
}
}
/// <summary>
/// 是否绑定
/// </summary>
public bool IsBind
{
get
{
return _isBind && Type != ItemType.Money;
}
set
{
_isBind = value;
}
}
public float CDTime
{
get { return _cdTime; }
set { _cdTime = value; }
}
/// <summary>
/// 所在容器
/// </summary>
public ContainerType ContainerType
{
get
{
return _containerType;
}
set
{
_containerType = value;
}
}
/// <summary>
/// 物品类型
/// </summary>
public int Type
{
get
{
return GetItemType();
}
set { _itemType = value; }
}
public bool IsClear { get; set; }
public bool IsNew { get; set; }
#endregion
#region
/// <summary>
/// 初始化
/// </summary>
/// <returns></returns>
public virtual bool Initialization()
{
_isClear = false;
_itemType = GetItemTypeByModelID(CfgID);
return true;
}
/// <summary>
/// 反初始化
/// </summary>
/// <returns></returns>
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();
}
/// <summary>
/// 判断一个物品是否可用但是除开等级职业性别和时间CD判断
/// 如需要上述判断需要自己自行调用
/// </summary>
/// <param name="useType"></param>
/// <returns></returns>
public virtual bool IsCanUse(int useType = ItemOpertion.Use)
{
return true;
}
public virtual bool CheckClass()
{
return false;
}
/// <summary>
/// 检测物品是否满足等级
/// </summary>
/// <param name="level">用于检测的等级</param>
/// <returns></returns>
public virtual bool CheckLevel(int level)
{
return true;
}
/// <summary>
/// 检测物品是否满足特定职业
/// </summary>
/// <param name="career">检测的职业</param>
/// <returns></returns>
public virtual bool CheckCareer(int career)
{
return GameCenter.GameSceneSystem.GetLocalPlayer().Occ == career;
}
/// <summary>
/// 检测是否过期
/// </summary>
/// <returns></returns>
public virtual bool isTimeOut()
{
if (LostTime > 0)
return LostTime < GameCenter.HeartSystem.ServerTime;
return false;
}
/// <summary>
/// 检测是否满足性别
/// </summary>
/// <param name="sex">检测的性别</param>
/// <returns></returns>
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;
}
/// <summary>
/// 检测是否需要二次确认,这里的二次确认就是会弹出一个确认框
/// </summary>
/// <param name="useType">操作类型</param>
/// <returns></returns>
public virtual bool IsNeedSecond(int useType = ItemOpertion.Use)
{
return false;
}
/// <summary>
///是否可以批量使用
/// </summary>
/// <returns></returns>
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;
}
/// <summary>
/// 获取物品品质color
/// </summary>
/// <param name="quality">物品品质</param>
/// <returns></returns>
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;
}
/// <summary>
/// 获取物品品质RGB值
/// </summary>
/// <param name="quality">物品品质</param>
/// <returns></returns>
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";
}
}
/// <summary>
/// 根据品质获取品质框图片名
/// </summary>
/// <param name="quality"></param>
/// <returns></returns>
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;
}
/// <summary>
/// 根据配置表ID生成模板数据
/// </summary>
/// <param name="cfgID"></param>
/// <returns></returns>
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);
}
}
/// <summary>
/// 根据lua端msgitem生成模板数据
/// </summary>
/// <param name="msgTable"></param>
/// <returns></returns>
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
}
}