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

752 lines
23 KiB
C#
Raw Permalink 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.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
}
}