240 lines
6.9 KiB
C
240 lines
6.9 KiB
C
|
|
#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)
|