981 lines
30 KiB
C++
981 lines
30 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DealSystem.h"
|
|||
|
|
|
|||
|
|
CDealSystem::CDealSystem()
|
|||
|
|
{
|
|||
|
|
ClearDealData();
|
|||
|
|
m_nActorIdCds.clear();
|
|||
|
|
m_nApplyCount = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::Destroy()
|
|||
|
|
{
|
|||
|
|
if (m_boDealing)
|
|||
|
|
CancelDeal();
|
|||
|
|
Inherited::Destroy();
|
|||
|
|
m_nActorIdCds.clear();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ProcessNetData(INT_PTR nCmd,CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
switch(nCmd)
|
|||
|
|
{
|
|||
|
|
case cDealSystemRequestDeal: ClientRequestDeal(packet); break;
|
|||
|
|
case cDealSystemReplyDeal: ClientReplyDeal(packet); break;
|
|||
|
|
case cDealSystemAddDealItem: ClientDealAddItem(packet); break;
|
|||
|
|
case cDealSystemAddNumber: ClientChangeDealCoin(packet); break;
|
|||
|
|
case cDealSystemLockDeal: ClientLockDeal(packet); break;
|
|||
|
|
case cDealSystemCancelDeal: ClientCancelDeal(packet); break;
|
|||
|
|
case cDealSystemConfimDeal: ClientConfimDeal(packet); break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDealSystem::FindDealItem(const CUserItem *pUserItem)
|
|||
|
|
{
|
|||
|
|
INT_PTR i;
|
|||
|
|
for (i=MaxDealItemCount-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
if (m_DealItems[i] == pUserItem)
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDealSystem::ValidateDealItems()
|
|||
|
|
{
|
|||
|
|
int nCount;
|
|||
|
|
for (INT_PTR i=MaxDealItemCount-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
if(m_DealItemList[i] > 0 && !m_DealItems[i])
|
|||
|
|
return false;
|
|||
|
|
if(!m_DealItems[i])
|
|||
|
|
continue;
|
|||
|
|
CUserItem *pUserItem = m_pEntity->GetBagSystem().FindItemByGuid(m_DealItems[i]->series);
|
|||
|
|
if (!pUserItem)
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::CompleteDeal()
|
|||
|
|
{
|
|||
|
|
if(!m_pDealTarget || !m_pEntity) return;
|
|||
|
|
INT_PTR i;
|
|||
|
|
CUserItem *pUserItem;
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
tagEditionInfo editionInfo = GetLogicServer()->GetDataProvider()->GetEditionProvider().GetEditionInfo();
|
|||
|
|
CDealSystem &dealSys = m_pDealTarget->GetDealSystem();
|
|||
|
|
|
|||
|
|
bool isGmDealing = m_pDealTarget->GetGmLevel() >0; //是否是Gm在交易
|
|||
|
|
|
|||
|
|
//取得对方交易的钱币
|
|||
|
|
char sLogText[127];
|
|||
|
|
LPCTSTR sFormat = GetLogicServer()->GetDataProvider()->GetOldTipmsgConfig().GetTipmsg(tmLogDealWith);
|
|||
|
|
if ( dealSys.m_nDealCoin > 0 )
|
|||
|
|
{
|
|||
|
|
int nDues = consignmentProvider.nDues * dealSys.m_nDealCoin / 100;
|
|||
|
|
if(nDues == 0)
|
|||
|
|
nDues = 1;
|
|||
|
|
sprintf_s(sLogText, sizeof(sLogText), sFormat, m_pDealTarget->GetEntityName());
|
|||
|
|
m_pEntity->ChangeMoney(mtCoin, (int)dealSys.m_nDealCoin - nDues, GameLog::Log_Deal, 0, sLogText, true);
|
|||
|
|
|
|||
|
|
GetGlobalLogicEngine()->AddDealToLog(GameLog::Log_Deal,
|
|||
|
|
m_pEntity->GetId(), m_pDealTarget->GetId(),
|
|||
|
|
0,0,mtCoin,(int)dealSys.m_nDealCoin, nDues);
|
|||
|
|
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmCoinTaxRateGet, tstUI);
|
|||
|
|
|
|||
|
|
sprintf_s(sLogText, sizeof(sLogText), sFormat, m_pEntity->GetEntityName());
|
|||
|
|
m_pDealTarget->ChangeMoney(mtCoin,(int)(dealSys.m_nDealCoin) * -1, GameLog::Log_Deal, 0, sLogText, true);
|
|||
|
|
|
|||
|
|
dealSys.m_nDealCoin = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if ( dealSys.m_nDealYb > 0 )
|
|||
|
|
{
|
|||
|
|
int nDuty = consignmentProvider.nDuty * dealSys.m_nDealYb / 100;
|
|||
|
|
if(nDuty == 0)
|
|||
|
|
nDuty = 1;
|
|||
|
|
|
|||
|
|
sprintf_s(sLogText, sizeof(sLogText), sFormat, m_pDealTarget->GetEntityName());
|
|||
|
|
m_pEntity->ChangeMoney(mtYuanbao, (int)dealSys.m_nDealYb-nDuty, GameLog::Log_Deal, 0, sLogText, true);
|
|||
|
|
if(editionInfo.nStart && ((CActor*)m_pDealTarget)->GetMiscSystem().GetMaxColorCardLevel() < editionInfo.nPrivilege)
|
|||
|
|
{
|
|||
|
|
m_pDealTarget->ChangeMoney(mtJyQuota, (int)((int)dealSys.m_nDealYb*-1*(editionInfo.nProportion/100.0)), GameLog::Log_Deal, 0, sLogText, true);
|
|||
|
|
}
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmYbTaxRateGet, tstUI);
|
|||
|
|
|
|||
|
|
GetGlobalLogicEngine()->AddDealToLog(GameLog::Log_Deal,
|
|||
|
|
m_pEntity->GetId(), m_pDealTarget->GetId(),
|
|||
|
|
0,0,mtYuanbao,(int)dealSys.m_nDealYb,nDuty,((CActor*)m_pEntity)->getOldSrvId());
|
|||
|
|
|
|||
|
|
sprintf_s(sLogText, sizeof(sLogText), sFormat, m_pEntity->GetEntityName());
|
|||
|
|
m_pDealTarget->ChangeMoney(mtYuanbao, (int) (dealSys.m_nDealYb) * -1, GameLog::Log_Deal, 0, sLogText, true);
|
|||
|
|
|
|||
|
|
dealSys.m_nDealYb = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//取得对方交易的物品
|
|||
|
|
CUserBag& targetBag = m_pDealTarget->GetBagSystem();
|
|||
|
|
CUserBag& myBag = m_pEntity->GetBagSystem();
|
|||
|
|
for (i=dealSys.MaxDealItemCount-1; i>-1; --i)
|
|||
|
|
{
|
|||
|
|
if(!dealSys.m_DealItems[i])
|
|||
|
|
continue;
|
|||
|
|
pUserItem = targetBag.FindItemByGuid(dealSys.m_DealItems[i]->series);
|
|||
|
|
if ( pUserItem )
|
|||
|
|
{
|
|||
|
|
//只有移除成功才给自己加上物品
|
|||
|
|
if (targetBag.RemoveItem(dealSys.m_DealItems[i]->series,m_pEntity->GetEntityName(),GameLog::Log_Deal,false))
|
|||
|
|
{
|
|||
|
|
const CStdItem *pStdItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
|
|||
|
|
//如果物品需要记录流通日志,则需要向日志服务器发送记录日志的数据
|
|||
|
|
// if ( pStdItem && pStdItem->m_Flags.recordLog)
|
|||
|
|
// {
|
|||
|
|
// CUserBag::LogChangeItemCount(pUserItem, pStdItem, -pUserItem->wCount, m_pEntity->GetEntityName(), m_pDealTarget->GetId(), m_pDealTarget->GetEntityName(), GameLog::Log_Deal, ((CActor*)m_pEntity)->GetAccount());
|
|||
|
|
// }
|
|||
|
|
myBag.AddItem(pUserItem, m_pDealTarget->GetEntityName(), GameLog::Log_Deal,true,false);
|
|||
|
|
}
|
|||
|
|
//和GM交易商城物品,相当于从商城买东西,用于外网的一些托的操作
|
|||
|
|
if(isGmDealing)
|
|||
|
|
{
|
|||
|
|
CGameStore::PMERCHANDISE pMerchandise = GetLogicServer()->GetDataProvider()->GetGameStore().GetShopItem(pUserItem->wItemId);
|
|||
|
|
if(pMerchandise)
|
|||
|
|
{
|
|||
|
|
m_pEntity->m_consumeyb += pMerchandise->dwPrice * pUserItem->wCount;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
GetGlobalLogicEngine()->AddDealToLog(GameLog::Log_Deal,
|
|||
|
|
m_pEntity->GetId(), m_pDealTarget->GetId(),
|
|||
|
|
pUserItem->wItemId,pUserItem->wCount,0,0,0,((CActor*)m_pEntity)->getOldSrvId());
|
|||
|
|
}
|
|||
|
|
dealSys.m_DealItems[i] = NULL;
|
|||
|
|
}
|
|||
|
|
dealSys.m_nItemCount = 0;
|
|||
|
|
|
|||
|
|
//发送交易完成的消息
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket &pack = m_pEntity->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealComplete;
|
|||
|
|
ap.flush();
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealComplete, tstUI);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::CancelDeal(bool boComplete)
|
|||
|
|
{
|
|||
|
|
if ( !m_boDealing )
|
|||
|
|
return;
|
|||
|
|
m_boDealing = false;
|
|||
|
|
if(m_pEntity ==NULL) return ;
|
|||
|
|
//让对方取消交易
|
|||
|
|
if (m_pDealTarget && m_pDealTarget->IsInited())
|
|||
|
|
{
|
|||
|
|
m_pDealTarget->GetDealSystem().CancelDeal(boComplete);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//清除交易数据
|
|||
|
|
ClearDealData();
|
|||
|
|
|
|||
|
|
if (!boComplete)
|
|||
|
|
{
|
|||
|
|
//发送交易取消的消息
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket& pack = m_pEntity->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealCanceled;
|
|||
|
|
ap.flush();
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealCancel, tstUI);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientRequestDeal(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
if ( !m_pEntity || m_pEntity->GetType() != enActor )
|
|||
|
|
{
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
EntityHandle handle;
|
|||
|
|
bool boCanDeal = false;
|
|||
|
|
CActor *pTarget = NULL;
|
|||
|
|
if (GetLogicServer()->IsCommonServer())
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
unsigned int nActorId = 0;
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
//我是否正在交易
|
|||
|
|
if (m_boDealing)
|
|||
|
|
{
|
|||
|
|
//你已经在交易了,请先完成本次交易
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmYouAreDealingNow, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
packet >>nActorId;
|
|||
|
|
char name[32];
|
|||
|
|
packet.readString(name,sizeof(name));
|
|||
|
|
name[sizeof(name) -1]=0;
|
|||
|
|
//查找目标玩家
|
|||
|
|
if(nActorId > 0)
|
|||
|
|
{
|
|||
|
|
pTarget = (CActor*)GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId);
|
|||
|
|
}
|
|||
|
|
if(!pTarget)
|
|||
|
|
{
|
|||
|
|
pTarget = (CActor*)GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetActorPtrByName(name);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
|
|||
|
|
//如果目标玩家不存在或对象不是一个玩家则返回交易被拒绝
|
|||
|
|
if ( !pTarget || pTarget->GetType() != enActor )
|
|||
|
|
{
|
|||
|
|
//对方不在线,无法请求交易
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetNotExists, tstUI);
|
|||
|
|
return ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(pTarget->GetId() == ((CActor*)m_pEntity)->GetProperty<unsigned int>(PROP_ENTITY_ID))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmFriendnotaddSelf, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//判断双方距离
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(pTarget, consignmentProvider.nPrivateDealDistance))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
char limit[4];
|
|||
|
|
sprintf(limit, "%d", consignmentProvider.nMinDealLevel);
|
|||
|
|
//最低的交易等级
|
|||
|
|
if(!((CActor*)m_pEntity)->CheckLevel(consignmentProvider.nMinDealLevel, 0))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealSelfLevelLimit, tstUI, limit);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// int nCircleLevel = ((CActor*)m_pEntity)->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE);
|
|||
|
|
// int nCardLv = ((CActor*)m_pEntity)->GetMiscSystem().GetMaxColorCardLevel() ;
|
|||
|
|
// if (nCircleLevel < consignmentProvider.nDealLevel[0] && nCardLv < consignmentProvider.nDealLevel[1])
|
|||
|
|
// {
|
|||
|
|
// ((CActor*)m_pEntity)->SendTipmsgFormatWithId(tmLimitDeal, tstUI);
|
|||
|
|
// return ;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
if(!((CActor*)pTarget)->CheckLevel(consignmentProvider.nMinDealLevel, 0))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetLevelLimit, tstUI, limit);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(!DealInCd(pTarget->GetId()))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealApplyCdLimit, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// if (m_pEntity->HasState(esStateStall))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmYouInStall, ttFlyTip);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
// if (!pTarget->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmDealNotAtSeafArea, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
// if (!m_pEntity->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmDealNotAtSeafArea, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
//对方是否正在交易
|
|||
|
|
if (pTarget->GetDealSystem().IsDealing())
|
|||
|
|
{
|
|||
|
|
//对方正在交易,请稍后再试
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmTargetIsDealing, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(pTarget->GetDealSystem().getApplyCount() >= 3)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealApplyTooMuch, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
boCanDeal = true;
|
|||
|
|
}
|
|||
|
|
//返回交易被拒绝
|
|||
|
|
if ( !boCanDeal )
|
|||
|
|
{
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket &pack = m_pEntity->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealRefused;
|
|||
|
|
pack.writeString(pTarget->GetEntityName());
|
|||
|
|
ap.flush();
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//向对方发送交易请求
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket &pack = pTarget->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealRequest << m_pEntity->GetId();
|
|||
|
|
pack.writeString(m_pEntity->GetEntityName());
|
|||
|
|
ap.flush();
|
|||
|
|
int nCd = time(NULL)+consignmentProvider.nDealCd;
|
|||
|
|
pTarget->GetDealSystem().AddApplyIdCd(m_pEntity->GetId(), nCd);
|
|||
|
|
m_nActorIdCds[pTarget->GetId()] =nCd;
|
|||
|
|
//pTarget->GetDealSystem().m_nApplyCount++;
|
|||
|
|
//向我发送已经邀请对方进行交易的提示
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmAlreadyInvaiteDeal, tstUI);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientReplyDeal(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
if(!m_pEntity) return;
|
|||
|
|
|
|||
|
|
// EntityHandle handle;
|
|||
|
|
unsigned int nActorId = 0;
|
|||
|
|
bool boStartDeal = false;
|
|||
|
|
CActor *pTarget = NULL;
|
|||
|
|
if (GetLogicServer()->IsCommonServer())
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// if (!m_pEntity->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
//如果我已经在交易了,则返回正在交易的提示
|
|||
|
|
if ( m_boDealing )
|
|||
|
|
{
|
|||
|
|
//你已经在交易了,请先完成本次交易
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmYouAreDealingNow, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
BYTE boAccept = 0;
|
|||
|
|
packet >> nActorId >> boAccept;
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
//查找目标玩家
|
|||
|
|
pTarget = (CActor*)GetLogicServer()->GetLogicEngine()->GetEntityMgr()->GetEntityPtrByActorID(nActorId);
|
|||
|
|
//如果目标玩家不存在或对象不是一个玩家则返回申请人已经离开
|
|||
|
|
if ( !pTarget || pTarget->GetType() != enActor )
|
|||
|
|
{
|
|||
|
|
//交易对方已经离开,交易被取消
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealRequesterHasLeaved, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(pTarget->GetId() == ((CActor*)m_pEntity)->GetProperty<unsigned int>(PROP_ENTITY_ID))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmFriendnotaddSelf, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//是否拒绝与对方进行交易
|
|||
|
|
if ( !boAccept )
|
|||
|
|
{
|
|||
|
|
//交易对方已经离开,交易被取消
|
|||
|
|
pTarget->SendTipmsgFormatWithId(tmTargetDoNotDealWithYou, tstUI, m_pEntity->GetEntityName());
|
|||
|
|
|
|||
|
|
AddApplyIdCd(pTarget->GetId(), 0);
|
|||
|
|
}
|
|||
|
|
//如果目标玩家正在交易则不能再进行交易
|
|||
|
|
else if ( pTarget->GetDealSystem().IsDealing() )
|
|||
|
|
{
|
|||
|
|
//对方正在交易,请稍后再试
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmTargetIsDealing, tstUI);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//必须在同一场景且在一定坐标范围内才允许交易
|
|||
|
|
//int x, y, tx, ty;
|
|||
|
|
//m_pEntity->GetPosition(x, y);
|
|||
|
|
//pTarget->GetPosition(tx, ty);
|
|||
|
|
//if ( pTarget->GetPosInfo().pScene != m_pEntity->GetPosInfo().pScene || abs(x - tx) > 12 || abs(y - ty) > 12)
|
|||
|
|
//{
|
|||
|
|
// //交易对方已经离开,交易被取消
|
|||
|
|
// m_pEntity->SendOldTipmsgWithId(tpDealRequesterHasLeaved, ttDialog);
|
|||
|
|
//}
|
|||
|
|
// if (m_pEntity->HasState(esStateStall))
|
|||
|
|
// {
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
// if (pTarget->HasState(esStateStall))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendOldTipmsgWithId(tpTargetInStall, ttFlyTip);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
// if (!pTarget->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmDealNotAtSeafArea, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(pTarget,consignmentProvider.nPrivateDealDistance))
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
else
|
|||
|
|
boStartDeal = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
if ( !boStartDeal )
|
|||
|
|
{
|
|||
|
|
if ( pTarget )
|
|||
|
|
{
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket &pack = pTarget->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealRefused << m_pEntity->GetEntityName();
|
|||
|
|
ap.flush();
|
|||
|
|
|
|||
|
|
CDataPacket &datapack = m_pEntity->AllocPacket(ap);
|
|||
|
|
datapack << (BYTE)GetSystemID() << (BYTE)sDealSystemDealRefused << m_pEntity->GetEntityName();
|
|||
|
|
ap.flush();
|
|||
|
|
AddApplyIdCd(pTarget->GetId(), 0);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_nApplyCount = 0;
|
|||
|
|
//开始交易
|
|||
|
|
pTarget->GetDealSystem().ClearDealData();
|
|||
|
|
pTarget->GetDealSystem().m_boDealing = true;
|
|||
|
|
pTarget->GetDealSystem().m_pDealTarget = m_pEntity;
|
|||
|
|
ClearDealData();
|
|||
|
|
m_boDealing = true;
|
|||
|
|
m_pDealTarget = pTarget;
|
|||
|
|
|
|||
|
|
// unsigned int nTargetActorId = pTarget->GetProperty<unsigned int>(PROP_ENTITY_ID);
|
|||
|
|
// unsigned int nActorId = m_pEntity->GetProperty<unsigned int>(PROP_ENTITY_ID);
|
|||
|
|
// BYTE nRelation = 0;
|
|||
|
|
// if (m_pEntity->GetFriendSystem().GetSocialFlag(nTargetActorId, SOCIAL_FRIEND)
|
|||
|
|
// && pTarget->GetFriendSystem().GetSocialFlag(nActorId, SOCIAL_FRIEND) )
|
|||
|
|
// {
|
|||
|
|
// nRelation = 1;
|
|||
|
|
// }
|
|||
|
|
//向双方发送开始交易的消息
|
|||
|
|
CActorPacket ap;
|
|||
|
|
byte nSex = m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_SEX);
|
|||
|
|
CDataPacket &pack = pTarget->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)enDealSystemID << (BYTE)sDealSystemStartDeal;
|
|||
|
|
pack << (unsigned int)(m_pEntity->GetId());
|
|||
|
|
pack.writeString(m_pEntity->GetEntityName());
|
|||
|
|
pack << (int)(m_pEntity->GetProperty<unsigned int>(PROP_CREATURE_LEVEL));
|
|||
|
|
pack << (BYTE)(m_pEntity->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE));
|
|||
|
|
ap.flush();
|
|||
|
|
CActorPacket AP;
|
|||
|
|
CDataPacket &packet = m_pEntity->AllocPacket(AP);
|
|||
|
|
packet << (BYTE)enDealSystemID << (BYTE)sDealSystemStartDeal;
|
|||
|
|
packet << (unsigned int)(pTarget->GetId());
|
|||
|
|
packet.writeString(pTarget->GetEntityName());
|
|||
|
|
packet << (int)(pTarget->GetProperty<unsigned int>(PROP_CREATURE_LEVEL));
|
|||
|
|
packet << (BYTE)(pTarget->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE));
|
|||
|
|
AP.flush();
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientDealAddItem(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
bool boSuccess = false;
|
|||
|
|
CUserItem::ItemSeries series;
|
|||
|
|
BYTE nType = 0;
|
|||
|
|
BYTE nPos= 0;
|
|||
|
|
packet >> nType >> nPos;
|
|||
|
|
CUserItem* pUserItem = NULL;
|
|||
|
|
if((nPos < 0) || (nPos >= MaxDealItemCount))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDataError, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(!m_pEntity || !m_pDealTarget) return;
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
if (!m_boDealLocked && m_boDealing)
|
|||
|
|
{
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(m_pDealTarget, consignmentProvider.nPrivateDealDistance))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
//添加物品
|
|||
|
|
if( nType == 1)
|
|||
|
|
{
|
|||
|
|
packet >> series;
|
|||
|
|
//交易物品数量是否已满
|
|||
|
|
if (m_nItemCount >= MaxDealItemCount)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealBlankWasFull, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
//从背包中查找物品
|
|||
|
|
pUserItem = ((CActor*)m_pEntity)->GetBagSystem().FindItemByGuid(series);
|
|||
|
|
if (!pUserItem)
|
|||
|
|
{
|
|||
|
|
OutputMsg(rmError, _T("unexpected item data! can't find item by pointed series"));
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmItemNoDeal, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
int nCircleLevel = ((CActor*)m_pEntity)->GetProperty<unsigned int>(PROP_ACTOR_CIRCLE);
|
|||
|
|
int nCardLv = ((CActor*)m_pEntity)->GetMiscSystem().GetMaxColorCardLevel() ;
|
|||
|
|
if (nCircleLevel < consignmentProvider.nDealLevel[0] && nCardLv < consignmentProvider.nDealLevel[1])
|
|||
|
|
{
|
|||
|
|
((CActor*)m_pEntity)->SendTipmsg(consignmentProvider.sDealLimitTips, tstUI);
|
|||
|
|
return ;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 任务物品无法交易
|
|||
|
|
bool isQuestItem = false;
|
|||
|
|
const CStdItem* pItem = GetLogicServer()->GetDataProvider()->GetStdItemProvider().GetStdItem(pUserItem->wItemId);
|
|||
|
|
if (pItem)
|
|||
|
|
isQuestItem = (Item::itQuestItem == pItem->m_btType) ? true : false;
|
|||
|
|
|
|||
|
|
if (isQuestItem)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmItemIsQuestItem, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 配置了不可交易
|
|||
|
|
if (pItem && pItem->hasSceneProp())
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmItemNoDeal, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (pItem && pItem->m_Flags.denyDeal && strlen(pUserItem->cBestAttr) == 0)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmItemNoDeal, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果物品存在且尚未放入交易栏中则添加
|
|||
|
|
if ( pUserItem && !FindDealItem(pUserItem) )
|
|||
|
|
{
|
|||
|
|
if(m_DealItemList[nPos] == 0)
|
|||
|
|
m_nItemCount++;
|
|||
|
|
|
|||
|
|
m_DealItems[nPos] = pUserItem;
|
|||
|
|
m_DealItemList[nPos] = nPos+1;
|
|||
|
|
m_DealItemCount[nPos] = pUserItem->wCount;
|
|||
|
|
|
|||
|
|
boSuccess = true;
|
|||
|
|
break;
|
|||
|
|
}else
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealItemExist, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
else //删除物品
|
|||
|
|
{
|
|||
|
|
m_DealItems[nPos] = NULL;
|
|||
|
|
m_DealItemList[nPos] = 0;
|
|||
|
|
m_DealItemCount[nPos] = 0;
|
|||
|
|
m_nItemCount--;
|
|||
|
|
boSuccess = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealHasLocked, tstUI);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
} while (false);
|
|||
|
|
|
|||
|
|
CActorPacket ap;
|
|||
|
|
//向交易对方发送添加交易物品的消息
|
|||
|
|
if(m_pDealTarget && boSuccess)
|
|||
|
|
{
|
|||
|
|
CDataPacket& pack = m_pDealTarget->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemTargetAddDealItem;
|
|||
|
|
pack << nType;
|
|||
|
|
pack << nPos;
|
|||
|
|
if(pUserItem)
|
|||
|
|
{
|
|||
|
|
*pUserItem >> pack;
|
|||
|
|
}
|
|||
|
|
ap.flush();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//向客户端回复添加交易物品成功与否的消息
|
|||
|
|
CDataPacket& Packet = m_pEntity->AllocPacket(ap);
|
|||
|
|
Packet << (BYTE)GetSystemID() << (BYTE)sDealSystemAddDealItemRet << boSuccess;
|
|||
|
|
Packet << nType;
|
|||
|
|
Packet << nPos;
|
|||
|
|
if(pUserItem)
|
|||
|
|
{
|
|||
|
|
*pUserItem >> Packet;
|
|||
|
|
}
|
|||
|
|
ap.flush();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientChangeDealCoin(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
|
|||
|
|
bool boSuccess = false;
|
|||
|
|
BYTE nMoneyType =0;
|
|||
|
|
int nMoneyCount =0;
|
|||
|
|
if(!m_pEntity || !m_pDealTarget) return;
|
|||
|
|
do
|
|||
|
|
{
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
if(m_boDealLocked)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealHasLocked, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (m_boDealing)
|
|||
|
|
{
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(m_pDealTarget, consignmentProvider.nPrivateDealDistance))
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
packet >> nMoneyType >> nMoneyCount;
|
|||
|
|
if(nMoneyType != mtCoin && nMoneyType != mtYuanbao) //不是元宝就去掉
|
|||
|
|
break;
|
|||
|
|
if (m_pDealTarget)
|
|||
|
|
{
|
|||
|
|
if (nMoneyCount < 0 || 0xFFFFFFFF - (unsigned int)m_pDealTarget->GetMoneyCount(eMoneyType(nMoneyType)) < (UINT32)nMoneyCount)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmTargetMoneyIsFull, tstUI);
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(nMoneyCount >=50000000)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealNumTooLarge,tstUI);
|
|||
|
|
if(nMoneyType == mtCoin)
|
|||
|
|
m_nDealCoin = 0;
|
|||
|
|
else if(nMoneyType == mtYuanbao)
|
|||
|
|
m_nDealYb = 0;
|
|||
|
|
|
|||
|
|
nMoneyCount = 0;
|
|||
|
|
boSuccess = true;
|
|||
|
|
break;
|
|||
|
|
}
|
|||
|
|
//判断钱币是否足够,必须判断nCoin是否非负数,否则会造成刷钱的BUG
|
|||
|
|
if ( nMoneyCount >= 0 && m_pEntity->GetMoneyCount(eMoneyType(nMoneyType)) >= nMoneyCount )
|
|||
|
|
{
|
|||
|
|
if(nMoneyType == mtCoin)
|
|||
|
|
{
|
|||
|
|
m_nDealCoin = nMoneyCount;
|
|||
|
|
}
|
|||
|
|
else if(nMoneyType == mtYuanbao)
|
|||
|
|
{
|
|||
|
|
m_nDealYb = nMoneyCount;
|
|||
|
|
}
|
|||
|
|
boSuccess = true;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
}while (false);
|
|||
|
|
|
|||
|
|
//向交易对方发送我交易的钱币数量变更的消息
|
|||
|
|
CActorPacket ap;
|
|||
|
|
if(m_pDealTarget)
|
|||
|
|
{
|
|||
|
|
CDataPacket& pack = m_pDealTarget->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemTargetChgDealCoin <<boSuccess<<nMoneyType << nMoneyCount;
|
|||
|
|
ap.flush();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//向客户端回复改变交易钱币数量成功与否的消息
|
|||
|
|
CDataPacket& data = m_pEntity->AllocPacket(ap);
|
|||
|
|
data << (BYTE)GetSystemID() << (BYTE)sDealSystemChangeDealCoinRet << boSuccess <<nMoneyType<< nMoneyCount ;
|
|||
|
|
ap.flush();
|
|||
|
|
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientLockDeal(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
if (GetLogicServer()->IsCommonServer())
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
// if (!m_pEntity->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
if (!m_boDealing)
|
|||
|
|
return;
|
|||
|
|
if(! m_pDealTarget) return;
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(m_pDealTarget, consignmentProvider.nPrivateDealDistance))
|
|||
|
|
{
|
|||
|
|
if(! m_pDealTarget) return;
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
m_boDealLocked = true;
|
|||
|
|
|
|||
|
|
//向我发送双方的交易锁定状态
|
|||
|
|
CActorPacket ap;
|
|||
|
|
CDataPacket& pack = m_pEntity->AllocPacket(ap);
|
|||
|
|
pack << (BYTE)GetSystemID() << (BYTE)sDealSystemLockDeal << m_boDealLocked << m_pDealTarget->GetDealSystem().m_boDealLocked;
|
|||
|
|
ap.flush();
|
|||
|
|
|
|||
|
|
//向对方发送双方的交易锁定状态
|
|||
|
|
m_pDealTarget->AllocPacket(ap);
|
|||
|
|
ap << (BYTE)GetSystemID() << (BYTE)sDealSystemLockDeal << m_pDealTarget->GetDealSystem().m_boDealLocked << true;
|
|||
|
|
ap.flush();
|
|||
|
|
|
|||
|
|
if ( m_pDealTarget->GetDealSystem().m_boDealLocked )
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmYouMayClickDealBtnNow, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmYouMayClickDealBtnNow, tstUI);
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmWaitTargetLockDeal, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmTargetHasLockedDeal, tstUI);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDealSystem::ClientCancelDeal(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
bool boComplete = false;
|
|||
|
|
CancelDeal(boComplete);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDealSystem::CheckDealTargetDistance(CActor *pActor1, CActor *pActor2)
|
|||
|
|
{
|
|||
|
|
if (!pActor1 || !pActor2)
|
|||
|
|
return false;
|
|||
|
|
if(pActor1->IsInited() == false || pActor2->IsInited() ==false) return false;
|
|||
|
|
|
|||
|
|
int nSelf_X, nSelf_Y, nTarget_X, nTarget_Y;
|
|||
|
|
pActor1->GetPosition(nSelf_X, nSelf_Y);
|
|||
|
|
pActor2->GetPosition(nTarget_X, nTarget_Y);
|
|||
|
|
if (pActor1->GetPosInfo().pScene != pActor2->GetPosInfo().pScene
|
|||
|
|
|| abs(nSelf_X - nTarget_X) > 12
|
|||
|
|
|| abs(nSelf_Y - nTarget_Y) > 12)
|
|||
|
|
{
|
|||
|
|
return false;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
//交易
|
|||
|
|
void CDealSystem::ClientConfimDeal(CDataPacketReader &packet)
|
|||
|
|
{
|
|||
|
|
CActorPacket ap;
|
|||
|
|
if (GetLogicServer()->IsCommonServer())
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if(! m_pDealTarget) return;
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (!m_boDealing) return;
|
|||
|
|
|
|||
|
|
// if (!m_pEntity->HasMapAttribute(asDealArea) || !m_pDealTarget->HasMapAttribute(asDealArea))
|
|||
|
|
// {
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmAreaCannotTrade, tstUI);
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
//判断双方书否均已锁定交易
|
|||
|
|
if (!m_boDealLocked || !m_pDealTarget->GetDealSystem().m_boDealLocked)
|
|||
|
|
{
|
|||
|
|
//只能在双发都锁定交易后才能完成交易
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmYouMustLockDealFirst, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
ConsignmentProvider& consignmentProvider = GetLogicServer()->GetDataProvider()->GetConsignmentProvider();
|
|||
|
|
tagEditionInfo& editionInfo = GetLogicServer()->GetDataProvider()->GetEditionProvider().GetEditionInfo();
|
|||
|
|
if (!m_pEntity->CheckTargetDistance(m_pDealTarget, consignmentProvider.nPrivateDealDistance))
|
|||
|
|
{
|
|||
|
|
if(! m_pDealTarget) return;
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealTargetTooFar, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//如果对方尚未按下交易键则向其发送交易确认消息
|
|||
|
|
bool bHadConfirmed = m_boDealConfimed;
|
|||
|
|
m_boDealConfimed = true;
|
|||
|
|
if (!m_pDealTarget->GetDealSystem().m_boDealConfimed)
|
|||
|
|
{
|
|||
|
|
if (!bHadConfirmed)
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealTargetConfimed, tstUI);
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//检查双方的交易钱币是否足够
|
|||
|
|
if ((UINT32)m_pEntity->GetMoneyCount(mtCoin) < m_nDealCoin
|
|||
|
|
|| !ValidateDealItems()
|
|||
|
|
|| (UINT32)m_pDealTarget->GetMoneyCount(mtCoin) < m_pDealTarget->GetDealSystem().m_nDealCoin
|
|||
|
|
|| !m_pDealTarget->GetDealSystem().ValidateDealItems())
|
|||
|
|
{
|
|||
|
|
//非法数据,外挂嫌疑
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealDataValidateFailure, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealDataValidateFailure, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
if (INT_MAX - m_pEntity->GetMoneyCount(mtCoin) < m_pDealTarget->GetDealSystem().m_nDealCoin)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmSelfMoneryIsFull, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmTargetMoneyIsFull, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (INT_MAX - m_pDealTarget->GetMoneyCount(mtCoin) < m_nDealCoin)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmTargetMoneyIsFull, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmSelfMoneryIsFull, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//检查双方的交易钱币是否足够
|
|||
|
|
if ((UINT32)m_pEntity->GetMoneyCount(mtYuanbao) < m_nDealYb
|
|||
|
|
|| !ValidateDealItems()
|
|||
|
|
|| (UINT32)m_pDealTarget->GetMoneyCount(mtYuanbao) < m_pDealTarget->GetDealSystem().m_nDealYb
|
|||
|
|
|| !m_pDealTarget->GetDealSystem().ValidateDealItems())
|
|||
|
|
{
|
|||
|
|
//非法数据,外挂嫌疑
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealDataValidateFailure, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealDataValidateFailure, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(editionInfo.nStart)
|
|||
|
|
{
|
|||
|
|
if((UINT32)(m_pEntity->GetMoneyCount(mtJyQuota)*(editionInfo.nProportion/100.0)) < m_nDealYb
|
|||
|
|
|| (UINT32)(m_pDealTarget->GetMoneyCount(mtJyQuota)*(editionInfo.nProportion/100.0)) < m_pDealTarget->GetDealSystem().m_nDealYb)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmQuotaNoEnough, tstUI);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmQuotaNoEnough, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
if (0xFFFFFFFF - m_pEntity->GetMoneyCount(mtYuanbao) < m_pDealTarget->GetDealSystem().m_nDealYb)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmSelfMoneryIsFull);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmTargetMoneyIsFull);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if (0xFFFFFFFF - m_pDealTarget->GetMoneyCount(mtYuanbao) < m_nDealYb)
|
|||
|
|
{
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmTargetMoneyIsFull);
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmSelfMoneryIsFull);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
//判断我的背包空间是否足够
|
|||
|
|
// if (m_pEntity->GetBagSystem().availableMinCount() < m_pDealTarget->GetDealSystem().m_nItemCount)
|
|||
|
|
// {
|
|||
|
|
// //由于你的背包无法完全容纳交易对方放入的物品,交易已被取消
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmDealCanceledOfMyBagWasFull, tstUI);
|
|||
|
|
// //由于对方背包无法完全容纳你放入的物品,交易已被取消
|
|||
|
|
// m_pDealTarget->SendTipmsgFormatWithId(tmDealcanceldOfTargetBagWasFull, tstUI);
|
|||
|
|
// CancelDeal();
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
CUserItem * pUserItem = NULL;
|
|||
|
|
for (int i=CDealSystem::MaxDealItemCount-1; i>-1; --i) {
|
|||
|
|
//判断我的背包空间是否足够
|
|||
|
|
if(m_pDealTarget->GetDealSystem().m_DealItems[i]) {
|
|||
|
|
pUserItem = m_pDealTarget->GetBagSystem().FindItemByGuid(m_pDealTarget->GetDealSystem().m_DealItems[i]->series);
|
|||
|
|
if (pUserItem) {
|
|||
|
|
if(pUserItem->wCount != m_pDealTarget->GetDealSystem().m_DealItemCount[i])
|
|||
|
|
{
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(! m_pEntity->GetBagSystem().CanAddItem(pUserItem, true)) {
|
|||
|
|
//由于你的背包无法完全容纳交易对方放入的物品,交易已被取消
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealCanceledOfMyBagWasFull, tstUI);
|
|||
|
|
//由于对方背包无法完全容纳你放入的物品,交易已被取消
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealcanceldOfTargetBagWasFull, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
//判断对方的背包空间是否足够
|
|||
|
|
if(m_pEntity->GetDealSystem().m_DealItems[i]) {
|
|||
|
|
pUserItem = m_pEntity->GetBagSystem().FindItemByGuid(m_pEntity->GetDealSystem().m_DealItems[i]->series);
|
|||
|
|
if ( pUserItem ) {
|
|||
|
|
if(pUserItem->wCount != m_DealItemCount[i])
|
|||
|
|
{
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
if(! m_pDealTarget->GetBagSystem().CanAddItem(pUserItem, true)) {
|
|||
|
|
//由于你的背包无法完全容纳交易对方放入的物品,交易已被取消
|
|||
|
|
m_pEntity->SendTipmsgFormatWithId(tmDealCanceledOfMyBagWasFull, tstUI);
|
|||
|
|
//由于对方背包无法完全容纳你放入的物品,交易已被取消
|
|||
|
|
m_pDealTarget->SendTipmsgFormatWithId(tmDealcanceldOfTargetBagWasFull, tstUI);
|
|||
|
|
CancelDeal();
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
|
|||
|
|
//判断对方的背包空间是否足够
|
|||
|
|
// if (m_pDealTarget->GetBagSystem().availableMinCount() < m_nItemCount)
|
|||
|
|
// {
|
|||
|
|
// //由于你的背包无法完全容纳交易对方放入的物品,交易已被取消
|
|||
|
|
// m_pDealTarget->SendTipmsgFormatWithId(tmDealCanceledOfMyBagWasFull, tstUI);
|
|||
|
|
// //由于对方背包无法完全容纳你放入的物品,交易已被取消
|
|||
|
|
// m_pEntity->SendTipmsgFormatWithId(tmDealcanceldOfTargetBagWasFull, tstUI);
|
|||
|
|
// CancelDeal();
|
|||
|
|
// return;
|
|||
|
|
// }
|
|||
|
|
|
|||
|
|
CompleteDeal();
|
|||
|
|
|
|||
|
|
m_pDealTarget->GetDealSystem().CompleteDeal();
|
|||
|
|
m_pDealTarget->GetDealSystem().ClearDealData();
|
|||
|
|
m_pDealTarget->SaveDb();
|
|||
|
|
ClearDealData();
|
|||
|
|
m_pEntity->SaveDb();
|
|||
|
|
}
|