Files
aixianling 5c9f1dae4a init
2025-01-09 17:45:40 +08:00

574 lines
18 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.

#pragma once
#define ITEM_SUNWATER 349 //太阳水
#define ITEM_SUPER_SUNWATER 350 //强效太阳水
class CAnimal;
class CUserBag :
public CUserItemContainer,
public CEntitySubSystem<enBagSystemID, CUserBag, CAnimal>
{
friend class CUserEquipment;
public:
typedef CUserItemContainer Inherited;
typedef CEntitySubSystem<enBagSystemID, CUserBag, CAnimal> InheritedSybSystem;
friend class CEntitySubSystem<enBagSystemID, CUserBag, CAnimal>;
const static int s_nMaxItemCDGroupCount = 30;
enum enLuckAwardOpt
{
laoGetBigGift,// 0:领取百服庆典福利
laoviewBigGift,//1:查看百服庆典福利领取情况
laoRequestConsumeRank,// 2:请求消费排名
laoProperty,// 3:查看属性大提升的次数
laoExchange,//4:纪念币兑换
laoGetLeftTime,//5查询活动剩余时间
laoGetLLKScore,//6查看连连看分数最高玩家
laogetActivityStatus,//7查询百服缤纷兑换状态
};
enum enOpId
{
enGetBigGift =3,//获取庆典福利
enViewBigGift=4,//查看庆典福利领取情况
enViewPropertyCount=5,//查看属性大提升完成情况
enAddPropertyCount=6,//增加属性大提升 完成次数
enExchangeCoin=7,//兑换纪念币
enSetLLKScore=8,//设置连连看积分
enViewLLKScore= 9,//查看连连看分数
enViewActivityStatus=10,//查看百服缤纷状态
enUpdateNewHundredRank = 11, // 更新新百服活动排行榜
};
public:
/*** 覆盖CEntitySubSystem父类的函数集 ***/
//初始化
virtual bool Initialize(void *data,SIZE_T size);
//析构
virtual VOID Destroy();
//发送物品变动日志
void SendItemChangeLog(int nType, int nCount, int nItemId, int nLogId = 0,LPCSTR sDes= NULL);
//获取品质的颜色描述字符串
static char * GetQualityColorStr(int nQuality)
{
switch(nQuality)
{
case CStdItem::iqItemWhite:
return "FFFFFFFF";
break;
case CStdItem::iqItemGreen:
return "FF0AB41E";
break;
case CStdItem::iqItemBlue:
return "FF147ED7";
break;
case CStdItem::iqItemPurple:
return "FFBC40F6";
break;
case CStdItem::iqItemRed:
return "FFFF4848";
break;
case CStdItem::iqItemOrange:
return "FFFF8F45";
break;
default:
return "FFFFFFFF";
break;
}
}
/*
* Comments: 玩家的数据存盘
* Param PACTORDBDATA pData:角色数据指针
* @Return void:
*/
virtual void Save(PACTORDBDATA pData);
/*
* Comments: 处理网络数据包
* Param INT_PTR nCmd: 命令码
* Param CDataPacketReader & packet: 数据
* @Return VOID:
*/
virtual VOID ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet );
/*
* Comments: db 返回数据
* Param INT_PTR nCmd:命令码
* Param INT_PTR nErrorCode:错误码
* Param CDataPacketReader & reader:数据读取器
* @Return VOID:
*/
virtual VOID OnDbRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader );
/*
* Comments: 会话 返回数据
* Param INT_PTR nCmd:命令码
* Param INT_PTR nErrorCode:错误码
* Param CDataPacketReader & reader:数据读取器
* @Return VOID:
*/
virtual VOID OnSsRetData(INT_PTR nCmd,INT_PTR nErrorCode,CDataPacketReader &reader );
/* 定时处理函数
* 主要用于检查哪些物品的时间是否已经到期
*/
virtual VOID OnTimeCheck(TICKCOUNT nTickCount);
void OnEnterGame();
/*
* Comments: 修改背包里的一件装备的属性
* Param CUserItem * pUserItem:装备的指针
* Param INT_PTR nPropertyID: 属性ID
* Param INT_PTR nValue: 新的数值
* @Return bool:成功返回true,否则返回false
*/
bool SetItemProperty(CUserItem * pUserItem,INT_PTR nPropertyID,INT_PTR nValue);
/*
* Comments:获取物品的链接
* Param WORD wItemId:物品ID
*Param CUserItem * pUserItem,物品的指针,普通物品可以为空
* @Return char *: 返回物品的描述"装备的话<#b%s/v%d,%d,%lld>,普通物品<#b%s/v%d>
*/
static char * GetItemLink(WORD wItemId, const CUserItem * pUserItem =NULL);
//获取useritem链接的格式
static char * GetUseItemLinkFormat(const CUserItem* pUserItem);
//获取寄卖物品的链接,点击弹出购买框
static char * GetConsignItemLink(const CUserItem *pUserItem, unsigned int nPrice);
/*
* Comments:获取一件物品的详细的日志信息,包括强化,品质以及开孔的数目,宝石的信息
* Param CUserItem * pUserItem:物品的指针
* @Return char *:返回一个字符串包括物品的信息count:quality:strong_holecount:ddiamond1:diamond2:diamond3
*/
static char * GetItemDetailLogStr(const CUserItem *pUserItem );
/*
* Comments:获取一件物品中的部分属性放到MidStr0字段上
* Param const CUserItem * pUserItem:
* @Return char *:
*/
static char * GetItemMidStr1(const CUserItem * pUserItem);
/*
* Comments:获取一件物品中的部分属性放到MidStr1字段上
* Param const CUserItem * pUserItem:
* @Return char *:
*/
static char * GetItemMidStr2(const CUserItem * pUserItem);
//添加一个卖给商店的物品如果成功返回true
bool AddSellItem(CUserItem * itemPtr);
//删除一个卖给物品的指针如果成功返回true
bool DelSellItem(CUserItem *pUserItem);
//获得卖给商店的物品的指针
CUserItem * GetSellItem(unsigned long long guid);
//通知客户端一个装备的数据改变了
virtual void NotifyItemChange(CUserItem *pUserItem);
/*
* Comments: 玩家进入场景处理
* @Return void:
*/
void OnEnterScene();
/*
* Comments:玩家扩展背包
* Param int nGridCount:扩充的背包的数量
* @Return bool:成功返回true否则返回false
*/
bool EnlargeBag(int nGridCount);
/*
* Comments: 删除指定类型的物品
* Param int nType: 物品类型
* Param const char * sComment: 注释
* Param int nLogId: 日志Id
* @Return INT_PTR: 返回删除的物品数目
* @Remark:
*/
INT_PTR RemoveItemByType(int nType, const char * sComment, int nLogId);
/*
* Comments: 查询指定类型的物品
* Param int nType: 物品类型
* @Return CUserItem*: 返回第一个搜索到的物品对象指针。如果没找到返回NULL
* @Remark:
*/
CUserItem* GetItemByType(int nType);
/*
* Comments:是否有装备强化达到了指定的等级。一般任务系统使用到
* Param INT_PTR nStrong:强化值
* @Return bool:
*/
bool IsStrongLevel(INT_PTR nStrong);
/*
* Comments:是否有精锻过的物品,一般任务系统使用到
* @Return bool:
*/
//bool IsForgeItem();
/*
* Comments:获取耐久度满的物品
* Param INT_PTR nItemId:物品id
* @Return CUserItem*:返回NULL表示没有
*/
CUserItem* GetDuraFullItemById(INT_PTR nItemId);
//设置数据是否修改过了
virtual VOID OnDataModified()
{
SetDataModifyFlag(true);
}
/*
* Comments: 获取限时物品 限时时间
* Param CUserItem * pUserItem: 物品指针
* @Return unsigned int: 返回限时时间
*/
unsigned int GetItemLeftTime(CUserItem *pUserItem);
/*
* Comments: 减少物品使用的次数(耐久)
* Param CUserItem * pUserItem: 物品的指针
* Param int nCount:删除物品耐久数量级 nCount*m_dwUseDurDrop
* Param LPCSTR sComment: 备注
* Param int nLogID: 物品的日志号
* Param bool bNeedFreeMemory: 是否需要释放内存
* @Return int: 减少的次数
*/
INT_PTR RemoveItemDura(CUserItem * pUserItem, INT_PTR nCount,LPCSTR sComment,INT_PTR nLogID,bool bNeedFreeMemory =true);
/*
* Comments:到0点时清空锋利值
* @Return void:
*/
void ClearEquipSharp(bool boCast);
/*
* Comments:
* Param BYTE nActivityId: 活动id
* Param BYTE nOpId: 操作id
* Param bool bCloseNeedTrigger: 活动结束了是否需要触发脚本
* Param INT_PTR nParam:
* @Return void:
*/
void TriggerHundredEvent(BYTE nActivityId, BYTE nOpId, bool bCloseNeedTrigger = true, INT_PTR nParam = -1);
/*
* Comments: 检查人物身上静态变态,不是当前百服活动就清空
* @Return void:
*/
void CheckHundrerActorStaticVar();
//设置活动开关
void SendHundredActInit(int nType);
//发送百服活动开关
void SendHundredAct(int nType);
/*
* Comments: GM添加物品都调用这个功能
* Param INT_PTR nItemID: 物品的ID
* Param INT_PTR nCount: 物品的数量
* Param INT_PTR nStar: 物品的强化星级
* Param INT_PTR nLostStar: 物品强化损失星级
* Param INT_PTR nBind 绑定
* Param INT_PTR nInscriptLv 铭刻等级
* Param INT_PTR nAreaId 铭刻经验
* Param INT_PTR nTime: 物品时间
* @Return bool: 成功返回true否则返回false
*/
bool AddItemByItemId(INT_PTR nItemID, INT_PTR nCount, INT_PTR nStar=0, INT_PTR nLostStar=0,INT_PTR nBind=0, INT_PTR nInscriptLv =0, INT_PTR nAreaId=0,INT_PTR nTime=0);
protected:
/*** 覆盖CUserItemContainer父类的函数集 ***/
virtual VOID SendDeleteItem(const CUserItem *pUserItem,INT_PTR nLogIdent) const ;
virtual VOID LogNewItem(const CUserItem *pUserItem, const CStdItem *pStdItem, LPCSTR lpSender, const INT_PTR nLogIdent) const ;
virtual VOID LogItemCountChange(const CUserItem *pUserItem, const CStdItem *pStdItem, const INT_PTR nCountChg, LPCSTR lpSender, const INT_PTR nLogIdent) const ;
virtual VOID SendAddItem(const CUserItem *pUserItem,INT_PTR nLogIdent, BYTE bBatchUseShow = 0, BYTE bNotice = 1) const ;
virtual VOID SendItemCountChange(const CUserItem *pUserItem, bool isGetNewCount = false, BYTE bBatchUseShow = 0) const ;
//当物品添加成功到里边调用,主要用来发系统提示的
//添加物品的提示
virtual VOID OnAddItem(const CStdItem * pItem,INT_PTR nCount,INT_PTR nLogIdent,const CUserItem *pUserItem=NULL);
//删除物品的提示
virtual VOID OnDeleteItem(const CStdItem * pItem, INT_PTR nItemCount,INT_PTR nLogIdent, int nMsgId = 0,const CUserItem *pUserItem=NULL);
//添加物品的提示
virtual VOID OnAddItemById(int itemId, INT_PTR nItemCount, INT_PTR nLogIdent,const CUserItem *pUserItem=NULL);
//处理网络消息包,获取背包扩展的费用
void OnGetBagEnlargeFee();
//处理网络消息包,扩展背包
void OnEnlargeBag();
void DealUserItem();
/*
* Comments: 使用物品
* Param CUserItem * pUserItem: 指针
* Param CStdItem * pStdItem: 标准物品指针
* Param int nCount: 使用个数默认为1
* Param bool isHeroUse : 是否是给英雄使用的
* @Return void:
*/
bool OnUseItem(CUserItem *pUserItem, const CStdItem * pStdItem, int nCount = 1, bool isHeroUse =false, int nParam = 0, bool bNeedRes = true);
/*
* Comments: 发送背包的物品改变的系统提示
* ParamconstINT_PTR nItemID: 物品指针
* Param INT_PTR nCount: 改变的数量,可以为正,也可以为负数
* Param CUserItem * pUserItem: 物品的指针
* Param INT_PTR nLogIndex: 物品的来源
* Param int nMsgId: 提示信息id
* @Return void:
*/
void SendBagItemChangeTipmsg(INT_PTR nItemID,INT_PTR nCount,const CUserItem * pUserItem,INT_PTR nLogIndex, int nMsgId = 0) const;
/*
* Comments:获取背包扩展的费用,格子数量,如果不能扩展,返回错误码
* Param INT_PTR & nFee:费用,这个也是返回参数
* Param INT_PTR & nGridCount:可以添加的格子的数量,这个也是返回参数
* Param INT_PTR & nMoneyType:需要下消耗的金钱,这个也是返回参数
* @Return INT_PTR:如果能够扩展返回true,否则返回false
*/
INT_PTR GetBagEnlargeFeeErorCode(INT_PTR &nFee,INT_PTR & nGridCount,INT_PTR& nMoneyType);
void HandError(CDataPacketReader &packet){};
void HandAddItem(CDataPacketReader &packet); //添加物品
void HandDelItem(CDataPacketReader &packet); //删除物品
void HandQueryItems(CDataPacketReader &packet); //获取背包列表
void HandGetBagEnlargeFee(CDataPacketReader &packet); //获取扩大背包费用
void HandEnlargeBag(CDataPacketReader &packet); //获取扩大背包
void HandSlpitItem(CDataPacketReader &packet); //拆分
void HandMergeItem(CDataPacketReader &packet); //合并
void HandUseItem(CDataPacketReader &packet); //使用物品
void HandProcessItem(CDataPacketReader &packet);//处理装备
void HandGetProcessItemConsume(CDataPacketReader &packet); //获取强化一件装备需要的消耗
void HandGetItemProcessConfig(CDataPacketReader &packet); //获取物品处理的配置
void HandActiveBagList(CDataPacketReader &packet); //获取活动背包的列表内容
void HandGetActiveBagItem(CDataPacketReader &packet); //领取某个活动背包的物品
void HandDestroyCoin(CDataPacketReader &packet); //消耗背包里的银两
void HandleExChangeMoney(CDataPacketReader &packet);//兑换金币
void DebugRevoceItem(int nType);
//新增背包道具的特殊属性
void HandQueryItemsExtraInfo(CDataPacketReader &packet);
void HandQueryItemsExtraInfoOne(CDataPacketReader &packet);
/*
依据客户端请求type
*/
void HandleRecoverItem(CDataPacketReader &packet);// 回收
/*
* Comments:下发消费排名
* @Return void:
*/
void GetConsumeRank();
/*
* Comments:领取百服庆典福利
* @Return void:
*/
void GetBigGiftBag(BYTE nId);
/*
回收道具
*/
bool RecoverItem(CUserItem* pItem, const CStdItem* pStdItem,bool IsreCoverBast = false);
/*
* Comments:发送玩家的活动背包数据
CDataPacketReader &reader:会话服务器返回的数据
* Param INT_PTR nType:1:账户绑定2是角色绑定
* @Return void:
*/
void SendActiveItem(CDataPacketReader &reader,INT_PTR nType);
/*
* Comments:发送活动物品到角色邮箱
* Param CDataPacketReader & reader:
* @Return void:
*/
void SendActiviItemByMail(CDataPacketReader & reader);
/*
* Comments:给予用户后台奖励的物品
* Param CDataPacketReader & reader:会话或者数据库服务器返回的数据内容
* Param INT_PTR nType:账户绑定还是角色绑定
* @Return void:
*/
void GetActiveItem(CDataPacketReader &reader,INT_PTR nType);
void OnGetSACardInfo(CDataPacketReader &reader, bool bQuery);
public:
//获取装备的系统提示用到的格式化的字符串
static char s_ItemTipmsgBuff[1024];
static char s_ConsignItemLinkBuff[1024]; //寄卖物品的链接
static char s_UserItemFormat[512];
//存一些鉴定属性在MidStr0和MidStr1的字段上
static char s_ItemMidStr1[32];
static char s_ItemMidStr2[32];
/* 记录物品数量变更的日志
* item 物品对象
* pStdItem 物品对应的标准物品配置对象
* nCountChg 物品变更的数量,负数表示扣除了物品,正数表示获得了物品
* lpSender 物品给予或收取者名称
* nLogIdent 日志消息号
*/
static VOID LogChangeItemCount(const CUserItem *pUserItem, const CStdItem *pStdItem, const INT_PTR nCountChg, LPCSTR lpSender, const INT_PTR nTgtId, LPCSTR sTargetName, const INT_PTR nLogIdent, LPCSTR sTargetAccount = "");
/*
* Comments: 向客户端发送物品时间到期的消息
* Param CActor * pActor:
* Param const CUserItem * pUserItem:
* Param INT_PTR nPos: 物品位置0表示背包1表示装备2表示仓库
* @Return VOID:
*/
static VOID SendItemTimeUp(CActor *pActor, const CUserItem *pUserItem, INT_PTR nPos);
/*
* Comments: 使用增值卡
* Param UINT64 nCardSeries:增值卡序列号
* Param bool bQueryOrUse: 标记查询还是使用。true为查询false为使用
* @Return void:
*/
void UseServicesAddedCard(UINT64 nCardSeries, bool bQueryOrUse);
void OnUseSACardResult(int nResult, int nErrorCode, UINT64 nSN, int nType, int nSubType, bool bQuery);
void OnQuerySACardResult(int nResult, int nErrorCode, UINT64 nSN, int nType, int nSubType);
// 检测物品使用是否进入CD。 如果物品在CD中返回true否则返回false
bool CheckUseItemCD(int nGroupId);
// 物品使用后进入CD
void ItemUseEnterCD(int nGroupId, int nCDTime);
// 请求活动背包数据
void ReqActiveBagData();
/*
* Comments:判断任务强化
* Param INT_PTR propId:强化操作id
* @Return void:
*/
void BagQuestTarget(INT_PTR propId );
/*
* Comments:获取能升级的配置
* Param CDataPacketReader & packet:数据包
* @Return void:
*/
void HandGetUpgradeCfg(CDataPacketReader &packet);
void HandUseStrongItem(CDataPacketReader &packet);
void HandSmashGoldEgg(CDataPacketReader &packet);
void HandLuckAwardOpt(CDataPacketReader &packet);
void HandGetPerfectCompTimes(CDataPacketReader &packet);
void HandUseFiveAttrItem(CDataPacketReader &packet);
void HandUseItemRecoverEx(CDataPacketReader &packet);
void HandBatchUseItem(CDataPacketReader &packet);
void HandArrangeItemList(CDataPacketReader & packet);//整理背包
void HandMergeItemBindInfect(CDataPacketReader &packet);
/*
* Comments:获取所有数量
* @Return INT_PTR:
*/
INT_PTR GetAllItemCount();
/*
* Comments:通过索引 取物品
* Param INT_PTR nIdx:
* @Return CUserItem *:
*/
CUserItem * GetItemByIdx(INT_PTR nIdx);
/*
* Comments: 根据物品指针获取物品在背包的索引
* Param void * pEntity:
* @Return void:
* @Remark:
*/
int GetBagItemIndex(CUserItem * itemPtr);
//查找物品
//nItemPos: 1背包 2玩家装备 3英雄装备
//nHeroId:如果是英雄装备则为英雄ID
//nEntityId: <=0则遍历查找 如果查找到则赋值nItemPos与nHeroId 如果>0用作heroId
CUserItem *GetEquipItemPtr(const CUserItem::ItemSeries itemGuid, int &nItemPos, int &nHeroId, int nEntityId=-1);
/*
* Comments:获取当前的可以添加经验的物品
* @Return CUserItem *:
*/
inline CUserItem * GetExpItem()
{
return m_pExpItem;
}
void AssignExpItem(); //指定一个经验道具作为当前吸收经验道具
CUserItem* GetOneItemByItemTypeInBag(BYTE nItemType);
void ChangeHpPotValue(CUserItem *pEquip,int nValue);
//立即使用,放入背包之后立即使用
void BatchUseItemAtOnce(WORD wItemId, WORD wCount);
//批量使用
void BatchUseItem(CUserItem* pUserItem, WORD wCount);
CUserItem* GetItemPtrHighestStar(WORD nItemId);
void TestAddItem(int itemid, int itemNum);
public: //装备的一些刷出的属性
//----------------鉴定属性-------------------------------------------------------
//是否有鉴定属性不为全0
bool HasItemIdentifyAttrs( CUserItem* pUserItem );
//转换鉴定属性
void TransferItemIdentifyAttrs( CUserItem* pSrcUserItem, CUserItem* pDesUserItem );
//跨服相关数据
public:
//发送数据到跨服
void SendMsg2CrossServer(int nType);
//跨服数据初始化
VOID OnCrossInitData(std::vector<CUserItem>& vUseBags);
private:
CVector<CUserItem*> m_sellUserList; //向商店卖的物品的指针列表,用于回购,在玩家下线的时候,这些指针的数据将删除
CTimer<30*1000> m_ItemTimeChkTimer; // 物品到期时间检查定时器
TICKCOUNT m_aItemCDGroupExpireTimeTbl[s_nMaxItemCDGroupCount]; // 物品冷却组到期时间表
static int s_nEggYbCircleCount;
bool m_bGetActiveItemFlag; //正在领取活动背包物品
unsigned int m_nUseXiuWeiCount;
CUserItem * m_pExpItem; //当前可以吸收经验的经验道具(各种经验盒子)
};