Files

574 lines
18 KiB
C
Raw Permalink Normal View History

2025-01-09 17:45:40 +08:00
#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:truefalse
*/
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: truefalse
*/
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: 012
* @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; //当前可以吸收经验的经验道具(各种经验盒子)
};