143 lines
4.0 KiB
C++
143 lines
4.0 KiB
C++
#pragma once
|
||
|
||
typedef struct DealActorCd
|
||
{
|
||
unsigned int nActorId = 0;
|
||
uint32_t nCd = 0;
|
||
};
|
||
|
||
class CDealSystem :
|
||
public CEntitySubSystem<enDealSystemID, CDealSystem, CActor>
|
||
{
|
||
public:
|
||
typedef CEntitySubSystem<enDealSystemID, CDealSystem, CActor> Inherited;
|
||
//单次交易物品数量限制
|
||
static const INT_PTR MaxDealItemCount = 5;
|
||
|
||
public:
|
||
CDealSystem();
|
||
|
||
//判断是否正在交易
|
||
inline bool IsDealing(){ return m_boDealing; }
|
||
//获取交易放入的钱币数量
|
||
inline INT_PTR GetCoinCount(){ return m_nDealCoin; }
|
||
//获取交易放入的物品数量
|
||
inline INT_PTR GetItemCount(){ return m_nItemCount; }
|
||
//判断交易是否已经被锁定
|
||
inline bool IsLocked(){ return m_boDealing && m_boDealLocked; }
|
||
//取消交易
|
||
#pragma __CPMSG__(★ATTENTION:注意,每当角色离线时以及周期性例行保存数据前,必须判断角色是否正在交易,如果正在交易则必须取消交易)
|
||
void CancelDeal(bool boComplete = false);
|
||
public:
|
||
/*** 覆盖父类的函数集 ***/
|
||
//清空内存
|
||
virtual void Destroy();
|
||
|
||
/*处理网络数据
|
||
* nCmd 消息号
|
||
* packet 网络包
|
||
*/
|
||
virtual void ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet);
|
||
|
||
private:
|
||
//客户端发起交易
|
||
void ClientRequestDeal(CDataPacketReader &packet);
|
||
|
||
//客户端回应交易请求
|
||
void ClientReplyDeal(CDataPacketReader &packet);
|
||
|
||
//客户端添加交易物品
|
||
void ClientDealAddItem(CDataPacketReader &packet);
|
||
|
||
void ClientChangeDealCoin(CDataPacketReader &packet);
|
||
|
||
//客户端锁定交易
|
||
void ClientLockDeal(CDataPacketReader &packet);
|
||
|
||
//客户端取消交易
|
||
void ClientCancelDeal(CDataPacketReader &packet);
|
||
|
||
//客户端确认交易
|
||
void ClientConfimDeal(CDataPacketReader &packet);
|
||
|
||
/*
|
||
* Comments: 检测交易双方距离(可视范围内才允许交易)
|
||
* Param CActor * pActor1:交易甲方
|
||
* Param CActor * pActor2:交易乙方
|
||
* @Return bool:
|
||
*/
|
||
bool CheckDealTargetDistance(CActor *pActor1, CActor *pActor2);
|
||
|
||
private:
|
||
//清空交易数据
|
||
inline void ClearDealData()
|
||
{
|
||
ZeroMemory(m_DealItems, sizeof(m_DealItems));
|
||
ZeroMemory(m_DealItemList, sizeof(m_DealItemList));
|
||
ZeroMemory(m_DealItemCount, sizeof(m_DealItemCount));
|
||
m_nDealCoin = 0;
|
||
m_nItemCount = 0;
|
||
m_boDealing = false;
|
||
m_boDealLocked = false;
|
||
m_boDealConfimed = false;
|
||
m_pDealTarget = NULL;
|
||
m_nDealYb =0;
|
||
}
|
||
|
||
//验证交易物品是否有效
|
||
bool ValidateDealItems();
|
||
//完成交易并取走对方的物品和钱币
|
||
void CompleteDeal();
|
||
bool DealInCd(unsigned int nActorId)
|
||
{
|
||
int nNowTime = time(NULL);
|
||
std::map<uint32_t, uint32_t>::iterator it = m_nActorIdCds.begin();
|
||
for(;it != m_nActorIdCds.end(); it++)
|
||
{
|
||
if(it->first == nActorId && it->second > nNowTime)
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
return true;
|
||
}
|
||
//获取以满足申请数量
|
||
int getApplyCount()
|
||
{
|
||
int nNowTime = time(NULL);
|
||
int nCount = 0;
|
||
std::map<uint32_t, uint32_t>::iterator it = m_nActorIdCds.begin();
|
||
for(;it != m_nActorIdCds.end(); it++)
|
||
{
|
||
if( it->second > nNowTime)
|
||
nCount++;
|
||
}
|
||
return nCount;
|
||
}
|
||
|
||
int AddApplyIdCd(unsigned int nActorId, int nCd)
|
||
{
|
||
m_nActorIdCds[nActorId] = nCd;
|
||
}
|
||
public:
|
||
//查找交易物品
|
||
bool FindDealItem(const CUserItem *pUserItem);
|
||
private:
|
||
CActor* m_pDealTarget; //交易目标角色
|
||
INT_PTR m_nItemCount; //交易放入的物品数量
|
||
CUserItem* m_DealItems[MaxDealItemCount]; //交易放入的物品列表
|
||
int m_DealItemList[MaxDealItemCount]; //交易放入物品的位置
|
||
int m_DealItemCount[MaxDealItemCount]; //交易放入物品的位置
|
||
unsigned int m_nDealCoin; //交易放入的钱币数量
|
||
unsigned int m_nDealYb; //交易放入的元宝数量
|
||
bool m_boDealing; //我现在是否正在交易
|
||
bool m_boDealLocked; //交易是否已被锁定
|
||
bool m_boDealConfimed; //交易是否已经确认
|
||
|
||
std::map<uint32_t, uint32_t> m_nActorIdCds; //邀请Cd
|
||
std::map<uint32_t, uint32_t> m_nApplyIdCds; //申请id cd
|
||
public:
|
||
int m_nApplyCount = 0; //被邀请数量
|
||
|
||
};
|