📄 partnerwaitingmanager.cpp
字号:
#include "PlayerCreature.h"#include "PCFinder.h"#include "WaitForMeet.h"#include "WaitForApart.h"#include "VariableManager.h"#include "PartnerWaitingManager.h"#include "Zone.h"#include "PlayerCreature.h"#include "Gpackets/GCNPCResponse.h"PartnerWaitInfo::PartnerWaitInfo( PlayerCreature* pWaitingPC, string RequestedPCName ){ Assert( pWaitingPC != NULL ); m_pZone = pWaitingPC->getZone(); Assert( m_pZone != NULL ); m_RequestedPCName = RequestedPCName; m_WaitingPCOID = pWaitingPC->getObjectID(); // 力茄矫埃 1盒 Timeval currentTime; getCurrentTime( currentTime ); m_Deadline = currentTime; m_Deadline.tv_sec += 60;}PartnerWaitInfo* PartnerWaitInfo::getPartnerWaitInfo(PlayerCreature* pWaitingPC, string RequestedPCName, WaitType waitType) throw(Error){ __BEGIN_TRY Assert( pWaitingPC != NULL ); switch( waitType ) { case WAIT_FOR_MEET: return new WaitForMeet( pWaitingPC, RequestedPCName ); case WAIT_FOR_APART: return new WaitForApart( pWaitingPC, RequestedPCName ); default: return NULL; } __END_CATCH}PlayerCreature* PartnerWaitInfo::getWaitingPC() const{ __BEGIN_TRY Assert( m_pZone != NULL ); Creature* pCreature = m_pZone->getCreature( m_WaitingPCOID ); if ( pCreature != NULL ) { PlayerCreature* pPC = dynamic_cast<PlayerCreature*>(pCreature); Assert( pPC != NULL ); return pPC; } return NULL; __END_CATCH}PartnerWaitingManager::~PartnerWaitingManager(){ WaitInfoHashMap::iterator itr = m_WaitInfos.begin(); for( ; itr != m_WaitInfos.end(); itr++ ) { SAFE_DELETE( itr->second ); } m_WaitInfos.clear();}// 货肺款 PartnerWaitInfo甫 父甸绊 殿废茄促.uint PartnerWaitingManager::waitForPartner( PlayerCreature* pWaitingPC, string RequestedPCName ) throw(Error){ __BEGIN_TRY if ( !g_pVariableManager->isActivateCouple() ) return COUPLE_MESSAGE_NOT_EVENT_TERM; Assert( pWaitingPC != NULL ); if ( isWaitForPartner( pWaitingPC ) ) return COUPLE_MESSAGE_ALREADY_WAITING; PlayerCreature* pTargetPC = NULL; __ENTER_CRITICAL_SECTION((*g_pPCFinder)) Creature* pTargetCreature = g_pPCFinder->getCreature_LOCKED(RequestedPCName); if (pTargetCreature!=NULL) { if ( !pTargetCreature->isPC() ) { g_pPCFinder->unlock(); return COUPLE_MESSAGE_LOGOFF; } pTargetPC = dynamic_cast<PlayerCreature*>( pTargetCreature ); Assert( pTargetPC != NULL ); } __LEAVE_CRITICAL_SECTION((*g_pPCFinder)) if ( pTargetPC == NULL ) return COUPLE_MESSAGE_LOGOFF; // PartnerWaitInfo 狼 FactoryMethod 肺 货肺款 PartnerWaitInfo 狼 按眉甫 父电促. WaitForMeet or WaitForApart PartnerWaitInfo* pPartnerWaitInfo = PartnerWaitInfo::getPartnerWaitInfo( pWaitingPC, RequestedPCName, getWaitType() ); Assert( pPartnerWaitInfo != NULL ); uint result = pPartnerWaitInfo->waitPartner( pTargetPC ); if ( result != 0 ) { SAFE_DELETE( pPartnerWaitInfo ); return result; } m_WaitInfos[ RequestedPCName ] = pPartnerWaitInfo; return 0; __END_CATCH}// 秦寸窍绰 PC啊 扁促府绊 乐绰 颇飘呈 夸没阑 茫酒辑 瘤款促.bool PartnerWaitingManager::stopWaitForPartner( PlayerCreature* pWaitingPC ) throw(Error){ __BEGIN_TRY Assert( pWaitingPC != NULL ); WaitInfoHashMap::iterator itr = m_WaitInfos.begin(); for( ; itr != m_WaitInfos.end(); itr++ ) { if ( pWaitingPC == itr->second->getWaitingPC() ) { SAFE_DELETE( itr->second ); m_WaitInfos.erase( itr ); return true; } } return false; __END_CATCH}uint PartnerWaitingManager::acceptPartner( PlayerCreature* pRequestedPC ) throw(Error){ __BEGIN_TRY if ( !g_pVariableManager->isActivateCouple() ) return COUPLE_MESSAGE_NOT_EVENT_TERM; Assert( pRequestedPC != NULL ); WaitInfoHashMap::iterator itr = m_WaitInfos.find( pRequestedPC->getName() ); // 捞 荤恩阑 扁促府绰 磊啊 绝促. if ( itr == m_WaitInfos.end() ) return COUPLE_MESSAGE_NO_WAITING; PartnerWaitInfo* pPartnerWaitInfo = itr->second; Assert( pPartnerWaitInfo != NULL ); PlayerCreature* pWaitingPC = pPartnerWaitInfo->getWaitingPC(); if ( pWaitingPC == NULL ) return COUPLE_MESSAGE_LOGOFF; // 己喊捞 鞍栏搁 己荤瞪 荐 绝促. if ( pWaitingPC->getSex() == pRequestedPC->getSex() ) return COUPLE_MESSAGE_SAME_SEX; uint result = pPartnerWaitInfo->acceptPartner( pRequestedPC ); // 己荤等 捞饶浚 瘤况霖促. SAFE_DELETE( pPartnerWaitInfo ); m_WaitInfos.erase( itr ); return result; __END_CATCH}bool PartnerWaitingManager::isWaitForPartner( PlayerCreature* pRequestedPC ) throw(Error){ __BEGIN_TRY WaitInfoHashMap::iterator itr = m_WaitInfos.find( pRequestedPC->getName() ); return ( itr != m_WaitInfos.end() ); __END_CATCH}PlayerCreature* PartnerWaitingManager::getWaitingPartner( PlayerCreature* pRequestedPC ) throw(Error){ __BEGIN_TRY WaitInfoHashMap::iterator itr = m_WaitInfos.find( pRequestedPC->getName() ); if ( itr == m_WaitInfos.end() ) return NULL; return itr->second->getWaitingPC(); __END_CATCH}void PartnerWaitingManager::heartbeat() throw(Error){ __BEGIN_TRY WaitInfoHashMap::iterator itr = m_WaitInfos.begin(); for ( ; itr != m_WaitInfos.end() ; ) { PartnerWaitInfo* pPartnerWaitInfo = itr->second; Assert( pPartnerWaitInfo != NULL ); Timeval currentTime; getCurrentTime( currentTime ); if ( pPartnerWaitInfo->getDeadline() < currentTime ) { WaitInfoHashMap::iterator delitr = itr; itr++; // 单靛扼牢捞 瘤车促! pPartnerWaitInfo->timeExpired(); SAFE_DELETE( pPartnerWaitInfo ); m_WaitInfos.erase( delitr ); } else { itr++; } } __END_CATCH}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -