#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(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(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(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(PROP_ENTITY_ID); // unsigned int nActorId = m_pEntity->GetProperty(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(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(PROP_CREATURE_LEVEL)); pack << (BYTE)(m_pEntity->GetProperty(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(PROP_CREATURE_LEVEL)); packet << (BYTE)(pTarget->GetProperty(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(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 <AllocPacket(ap); data << (BYTE)GetSystemID() << (BYTE)sDealSystemChangeDealCoinRet << boSuccess <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(); }