Files
mir_server/sdk/commonLib/def/UserItem.h

240 lines
6.9 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#pragma once
#include<string>
//禁止编译器对此结构进行字节对齐
#pragma pack (push, 1)
//这里表示物品的存储位置与db通信用的
enum tagItemStorageType
{
itItemBag=1, //背包物品
itItemEquip =2, //装备物品
itItemDepot =3, //仓库物品
itItem4 = 4,
itItemHero =5, //玩家的宠物的物品
itItem6 = 6,
itItemOfflineEquip =7, //装载玩家的离线装备数据
itItem8 = 8,
itItem9 = 9,
};
#define SMITH_COUNT_BYTE_ID 0 //精锻度保存的那个reserver
#define DEPORT_BAG_ID_BYTE_ID 5 //物品reserver数据里存储的仓库背包的id的那个字节
#define MAX_WING_ITEM_NUM 4 //翅膀吞噬材料最大的种类
struct CUserItem
{
public:
static const INT_PTR MaxSmithAttrCount = 5; //物品的精锻属性数量
/** 物品系列号数据类型定义
**
**/
CUserItem()
{
memset(this, 0, sizeof(*this));
}
union ItemSeries
{
LONG64 llId;
struct
{
unsigned int time; //31-0位表示物品产生的日期和时间值为短日期类型单位是秒
WORD wSeries; //47-32位表示在一秒内的序列每产生一个物品则序列值+1一秒后序列值归零
WORD btServer; //55-48位表示服务器ID
}t;
public:
//转换为LONG64的类型转换运算符
inline operator LONG64 () const
{
return llId;
}
//提供对物品系列号是否相等的运算符重载
inline bool operator == (const ItemSeries& series) const
{
return llId == series.llId;
}
//提供对物品系列号是否不等的运算符重载
inline bool operator != (const ItemSeries& series) const
{
return llId != series.llId;
}
};
/**
**
**/
struct ItemInlayHole
{
public:
static const WORD HoleOpenFlag = 0x8000;//镶嵌槽是否已经开启的标志
static const WORD HoleItemMask = 0x7FFF;//镶嵌槽镶嵌的物品id的掩码位
public:
WORD wData;
public:
//判断镶嵌槽是否已经开启
inline bool opened() const
{
return (wData & HoleOpenFlag) != 0;
}
//开启或关闭镶嵌孔注意★★★关闭镶嵌孔后之前镶嵌的物品ID会继续保留
inline void open(const bool boOpened)
{
if ( boOpened )
wData = wData | HoleOpenFlag;
else wData = wData & HoleItemMask;
}
//获取镶嵌槽中镶嵌的物品的ID
inline WORD getInlayedItemId() const
{
return (wData & HoleItemMask);
}
//设置镶嵌槽中镶嵌的物品的ID
inline ItemInlayHole& setInlayedItem(const INT_PTR wItemId)
{
wData = (wData & HoleOpenFlag) | (wItemId & HoleItemMask);
return *this;
}
};
public:
//判断物品是否已经被绑定或者不可交易
inline bool binded() const { return btFlag != ufUnBind; }
//是否禁止交易
inline bool IsDenyDeal() const { return btFlag == ufDenyDeal; }
void setSource(int nSourceType,int nTime, int nSceneId = 0, int nMonsterId = 0, const char* pKillerName = NULL)
{
memset(&this->cSourceName, 0, sizeof(this->cSourceName));
if(pKillerName)
memcpy(&this->cSourceName, pKillerName, sizeof(this->cSourceName));
this->nAreaId = nSceneId;
this->nCreatetime = nTime;//GetGlobalLogicEngine()->getMiniDateTime();
this->bInSourceType =nSourceType;// tagItemSource::iqKillMonster;
this->nDropMonsterId = nMonsterId;
}
void setSource(CUserItem* pUserItem)
{
if(pUserItem) {
memset(&this->cSourceName, 0, sizeof(this->cSourceName));
memcpy(&this->cSourceName, pUserItem->cSourceName, sizeof(this->cSourceName));
this->nAreaId = pUserItem->nAreaId;
this->nCreatetime = pUserItem->nCreatetime;
this->bInSourceType =pUserItem->bInSourceType;// tagItemSource::iqKillMonster;
this->nDropMonsterId = pUserItem->nDropMonsterId;
}
}
void operator >> (CDataPacket& pack)
{
pack<< this->series.llId;
pack<< this->wItemId;
pack<< this->btQuality;
pack<< this->btStrong;
pack<< this->wCount;
pack<< this->bLostStar;
pack<< this->bInSourceType;
pack<< this->wIdentifySlotNum;
pack<< this->wStar;
pack<< this->nCreatetime;
for (int i = 0; i < MaxSmithAttrCount; i++)
{
pack<< (unsigned int)this->smithAttrs[i].nValue;
}
pack<< this->nAreaId;
pack<< this->btFlag;
pack<< this->btLuck;
pack<< this->nDropMonsterId;
pack<< this->btDeportId;
pack<< this->btHandPos;
pack<< (BYTE)1;//this->btSharp;/* */
pack<< this->wPackageType;
pack.writeString((const char*)cBestAttr);
pack.writeString((const char*)Refining);
pack.writeString((const char*)cSourceName);
}
void operator << (CDataPacketReader& pack)
{
pack >>this->series.llId;
pack >> this->wItemId;
pack >> this->btQuality;
pack >> this->btStrong;
pack >> this->wCount;
pack >> this->bLostStar;
pack >> this->bInSourceType;
pack >> this->wIdentifySlotNum;
pack >> this->wStar;
pack >> this->nCreatetime;
for (int i = 0; i < MaxSmithAttrCount; i++)
{
pack >> this->smithAttrs[i].nValue;
}
//pack<< this->smithAttrs;
pack >> this->nAreaId;
pack >> this->btFlag;
pack >>this->btLuck;
pack >> this->nDropMonsterId;
pack >> this->btDeportId;
pack >> this->btHandPos;
pack >> this->btSharp;//this->btSharp;/* */
pack >> this->wPackageType;
pack.readString(cBestAttr, ArrayCount(cBestAttr));
cBestAttr[sizeof(cBestAttr)-1] = 0;
pack.readString(Refining, ArrayCount(Refining));
Refining[sizeof(Refining)-1] = 0;
pack.readString(cSourceName, ArrayCount(cSourceName));
cSourceName[sizeof(cSourceName)-1] = 0;
}
public:
ItemSeries series; //物品唯一系列号
WORD wItemId; //对应的标准物品ID
BYTE btQuality; //物品的品质等级
unsigned int wCount; //物品数量
WORD wStar; //强化星级
BYTE btFlag; //绑定标记 0不绑定1绑定2不可交易(见UserItemFlag)
WORD wPackageType; //包裹类别
char cBestAttr[200]; //极品属性
char Refining[200]; //洗炼属性
BYTE btStrong; //物品的强化等级ZGame保留不使用--暂时没用
BYTE bLostStar; //[ZGame使用]当前强化损失的星级(强化) --暂时没用
WORD wIdentifySlotNum; //[ZGame使用]鉴定属性槽被解锁的数量 --暂时没用
PACKEDGAMEATTR smithAttrs[MaxSmithAttrCount]; //鉴定生成属性的值 --暂时没用
char btLuck; //动态的幸运值或者诅咒值,祝福油加幸运,杀人减幸运 --暂时没用
BYTE btDeportId; //装备穿戴的位置 --暂时没用
BYTE btHandPos; //是左右还是右手 --暂时没用
BYTE btSharp; //锋利值 --暂时没用
//---来源
BYTE bInSourceType; //来源
WORD nDropMonsterId; //怪物id
int nAreaId; //场景id
char cSourceName[200]; //归属昵称
CMiniDateTime nCreatetime; //物品的创建时间类型为CMiniDateTime
int nType ;//
//整个useritem的大小为53个字节。
};
/// 衣橱物品
struct CAlmirahItem
{
WORD nModelId;
byte btTakeOn; //是否已经穿上
int nLv; //等级
CAlmirahItem()
{
memset(this, 0, sizeof(*this));
}
};
#pragma pack(pop)