243 lines
5.9 KiB
C++
243 lines
5.9 KiB
C++
|
|
#include "StdAfx.h"
|
|||
|
|
#include "DNFieldBlock.h"
|
|||
|
|
#include "DNUserSession.h"
|
|||
|
|
#include "Util.h"
|
|||
|
|
#include "Log.h"
|
|||
|
|
|
|||
|
|
CDNFieldBlock::CDNFieldBlock(void)
|
|||
|
|
{
|
|||
|
|
m_nMinX = m_nMinZ = m_nMaxX = m_nMaxZ = m_nXPoint = m_nZPoint = 0;
|
|||
|
|
Final();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDNFieldBlock::~CDNFieldBlock(void)
|
|||
|
|
{
|
|||
|
|
Final();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDNFieldBlock::Init(int nXPoint, int nZPoint, int nMinX, int nMinZ)
|
|||
|
|
{
|
|||
|
|
Final();
|
|||
|
|
|
|||
|
|
m_nXPoint = nXPoint;
|
|||
|
|
m_nZPoint = nZPoint;
|
|||
|
|
m_nMinX = nMinX;
|
|||
|
|
m_nMinZ = nMinZ;
|
|||
|
|
m_nMaxX = m_nMinX + FIELDBLOCKRANGE;
|
|||
|
|
m_nMaxZ = m_nMinZ + FIELDBLOCKRANGE;
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDNFieldBlock::Final()
|
|||
|
|
{
|
|||
|
|
m_pObjectList.clear();
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
void CDNFieldBlock::GetWaitUserList( std::list<CDNUserSession*>& UserList, int iLimitLevel/*=-1*/, BYTE cPvPChannelType/* = static_cast<BYTE>(PvPCommon::RoomType::max)*/ )
|
|||
|
|
#else //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
void CDNFieldBlock::GetWaitUserList( std::list<CDNUserSession*>& UserList, int iLimitLevel/*=-1*/ )
|
|||
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
{
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
for( TObjectList::iterator iter=m_pObjectList.begin() ; iter != m_pObjectList.end(); ++iter )
|
|||
|
|
{
|
|||
|
|
if( g_IDGenerator.IsUser((*iter)->GetObjectID()) == false )
|
|||
|
|
continue;
|
|||
|
|
|
|||
|
|
CDNUserSession* pSession = static_cast<CDNUserSession*>(*iter);
|
|||
|
|
if( pSession->GetPvPIndex() > 0 )
|
|||
|
|
continue;
|
|||
|
|
if( pSession->bIsLadderUser() == true )
|
|||
|
|
continue;
|
|||
|
|
if( iLimitLevel > 0 )
|
|||
|
|
{
|
|||
|
|
if( pSession->GetLevel() < iLimitLevel )
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
if (cPvPChannelType != PvPCommon::RoomType::max && pSession->GetPvPChannelType() != cPvPChannelType)
|
|||
|
|
continue;
|
|||
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
UserList.push_back( pSession );
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CDNFieldBlock::SendFieldMessage (CDNBaseObject *pSender, USHORT wMsg, TBaseData *pSenderData, TParamData *pParamData)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return -1;
|
|||
|
|
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
CDNBaseObject *pBaseObject = NULL;
|
|||
|
|
TObjectList::iterator iter;
|
|||
|
|
|
|||
|
|
for (iter = m_pObjectList.begin(); iter != m_pObjectList.end(); ){
|
|||
|
|
pBaseObject = *iter;
|
|||
|
|
if (pBaseObject) { // <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC>ؾ<EFBFBD><D8BE>ҵ<EFBFBD>
|
|||
|
|
//<2F><><EFBFBD><EFBFBD> <20>ڱ<EFBFBD> <20>ڽ<EFBFBD><DABD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>
|
|||
|
|
if( wMsg == FM_GUILDWARWINSKILL || pBaseObject != pSender) {
|
|||
|
|
pBaseObject->FieldProcess(pSender, wMsg, pSenderData, pParamData);
|
|||
|
|
}
|
|||
|
|
++iter;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
iter = m_pObjectList.erase(iter);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CDNFieldBlock::SendUserFieldMessage (CDNBaseObject *pSender, USHORT wMsg, TBaseData *pSenderData, TParamData *pParamData)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return -1;
|
|||
|
|
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
CDNBaseObject *pBaseObject = NULL;
|
|||
|
|
TObjectList::iterator iter;
|
|||
|
|
|
|||
|
|
for (iter = m_pObjectList.begin(); iter != m_pObjectList.end(); ){
|
|||
|
|
if (g_IDGenerator.IsNpc((*iter)->GetObjectID()))
|
|||
|
|
{
|
|||
|
|
++iter;
|
|||
|
|
continue; // user<65><72> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
pBaseObject = *iter;
|
|||
|
|
|
|||
|
|
if (pBaseObject){ // <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC>ؾ<EFBFBD><D8BE>ҵ<EFBFBD>
|
|||
|
|
if (pBaseObject != pSender){
|
|||
|
|
pBaseObject->FieldProcess(pSender, wMsg, pSenderData, pParamData);
|
|||
|
|
}
|
|||
|
|
++iter;
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
iter = m_pObjectList.erase(iter);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
int CDNFieldBlock::SendPvPLobbyMessage( CDNBaseObject *pSender, USHORT wMsg, TBaseData *pSenderData, TParamData *pParamData )
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return -1;
|
|||
|
|
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
for( TObjectList::iterator iter = m_pObjectList.begin(); iter != m_pObjectList.end() ; )
|
|||
|
|
{
|
|||
|
|
if (g_IDGenerator.IsNpc((*iter)->GetObjectID()))
|
|||
|
|
{
|
|||
|
|
++iter;
|
|||
|
|
continue; // user<65><72> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
CDNUserSession* pUserObject = static_cast<CDNUserSession*>(*iter);
|
|||
|
|
if(pUserObject)
|
|||
|
|
{
|
|||
|
|
if( pUserObject->GetPvPIndex() == 0 && pUserObject->bIsLadderUser() == false )
|
|||
|
|
{
|
|||
|
|
#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
CDNUserSession * pUserSenderObject = (CDNUserSession*)pSender;
|
|||
|
|
if (pUserObject != pUserSenderObject)
|
|||
|
|
{
|
|||
|
|
if (pUserObject->GetPvPChannelType() != pUserSenderObject->GetPvPChannelType())
|
|||
|
|
{
|
|||
|
|
++iter;
|
|||
|
|
continue;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
#endif //#ifdef PRE_ADD_COLOSSEUM_BEGINNER
|
|||
|
|
pUserObject->FieldProcess( pSender, wMsg, pSenderData, pParamData );
|
|||
|
|
}
|
|||
|
|
++iter;
|
|||
|
|
}
|
|||
|
|
else
|
|||
|
|
{
|
|||
|
|
iter = m_pObjectList.erase(iter);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
return 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDNFieldBlock::AddBaseObject(CDNBaseObject *pObj)
|
|||
|
|
{
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
m_pObjectList.push_back(pObj);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
bool CDNFieldBlock::DelBaseObject(CDNBaseObject *pObj)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return false;
|
|||
|
|
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
m_pObjectList.remove(pObj);
|
|||
|
|
|
|||
|
|
return true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDNFieldBlock::SendFieldNotice(int cLen, const WCHAR *pwszChatMsg, int nShowSec)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return;
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
TObjectList::iterator iter;
|
|||
|
|
CDNUserSession *pUserObj = NULL;
|
|||
|
|
|
|||
|
|
for (iter = m_pObjectList.begin(); iter != m_pObjectList.end(); iter++){
|
|||
|
|
if (g_IDGenerator.IsNpc((*iter)->GetObjectID())) continue; // user<65><72> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
|
|||
|
|
|
|||
|
|
pUserObj = (CDNUserSession*)*iter;
|
|||
|
|
if (pUserObj){ // <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC>ؾ<EFBFBD><D8BE>ҵ<EFBFBD>
|
|||
|
|
pUserObj->SendNotice(pwszChatMsg, cLen, nShowSec);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDNFieldBlock::SendChannelChat(int cLen, const WCHAR *pwszCharacterName, const WCHAR *pwszChatMsg, int nRet)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return;
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
TObjectList::iterator iter;
|
|||
|
|
CDNUserSession *pUserObj = NULL;
|
|||
|
|
|
|||
|
|
for (iter = m_pObjectList.begin(); iter != m_pObjectList.end(); iter++){
|
|||
|
|
if (g_IDGenerator.IsNpc((*iter)->GetObjectID())) continue; // user<65><72> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
|
|||
|
|
|
|||
|
|
pUserObj = (CDNUserSession*)*iter;
|
|||
|
|
if (pUserObj){ // <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC>ؾ<EFBFBD><D8BE>ҵ<EFBFBD>
|
|||
|
|
pUserObj->SendChat(CHATTYPE_CHANNEL, cLen, pwszCharacterName, pwszChatMsg);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
void CDNFieldBlock::SendDebugChat(const WCHAR* szMsg)
|
|||
|
|
{
|
|||
|
|
if (m_pObjectList.empty()) return;
|
|||
|
|
ScopeLock<CSyncLock> lock(m_ObjectLock);
|
|||
|
|
|
|||
|
|
TObjectList::iterator iter;
|
|||
|
|
CDNUserSession *pUserObj = NULL;
|
|||
|
|
|
|||
|
|
for (iter = m_pObjectList.begin(); iter != m_pObjectList.end(); iter++){
|
|||
|
|
if (g_IDGenerator.IsNpc((*iter)->GetObjectID())) continue; // user<65><72> ó<><C3B3><EFBFBD>Ѵ<EFBFBD>
|
|||
|
|
|
|||
|
|
pUserObj = (CDNUserSession*)*iter;
|
|||
|
|
if (pUserObj){ // <20><><EFBFBD><EFBFBD> <20><> üũ<C3BC>ؾ<EFBFBD><D8BE>ҵ<EFBFBD>
|
|||
|
|
pUserObj->SendDebugChat(szMsg);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|