DragonNest/Server/DNVillageServer/DNFieldBlock.cpp
2024-12-19 09:48:26 +08:00

242 lines
5.9 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#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);
}
}
}