📄 viewportmanager.cpp
字号:
#include "StdAfx.h"
#include "ViewPortManager.h"
#include "Zone.h"
#include "UserManager.h"
#include "User.h"
#include <assert.h>
// 甘 肺爹 困秦 眠啊
#include <mapinfoparser.h>
#include "FieldInfo.h"
//#include <3DTerrain\3DTerrain.h>
//#include <3DTerrain\WorldBase.h>
//#include <ProgramCommon/WzArchive.h>
///////////////////////////////////
// ViewPort
ViewPort::ViewPort(void) : m_NeighborZone(MAX_NEIGHBOR_SECTOR_NUM)
{
m_pZone = new Zone;
m_pZone->Init();
}
ViewPort::~ViewPort(void)
{
delete m_pZone;
}
VOID ViewPort::AddNeighborZone( Zone* pZone )
{
m_NeighborZone.AddTail(pZone);
}
VOID ViewPort::SendToNeighbors( BYTE *pMsg, WORD wSize )
{
Zone *pZone = NULL;
void* pNode = NULL;
// 老窜篮 唱茄抛 焊郴绊
m_pZone->SendToAll( pMsg, wSize );
// 捞眶甸俊霸 焊郴霖促
if(m_NeighborZone.GetCount() > 0)
{
pNode = m_NeighborZone.GetFirstPos();
while( (pZone = m_NeighborZone.GetNextPos(pNode)) != NULL )
{
pZone->SendToAll(pMsg, wSize);
}
}
}
VOID ViewPort::SendToZone( BYTE* pMsg, WORD wSize )
{
m_pZone->SendToAll( pMsg, wSize );
}
VOID ViewPort::AddUser( User *pUser )
{
m_pZone->AddSectorUser( pUser->GetGUID(), pUser );
}
VOID ViewPort::RemoveUser( User *pUser )
{
m_pZone->RemoveSectorUser( pUser->GetGUID() );
}
VOID ViewPort::SetZone(eZONETYPE eZoneType, DWORD dwSectorIndex)
{
m_pZone->SetZoneType( eZoneType );
m_pZone->SetKey(dwSectorIndex);
}
DWORD ViewPort::GetKey()
{
return m_pZone->GetKey();
}
/////////////////////////////////////////
// ChatField
ChatField::ChatField()
: m_pFieldInfo(NULL), m_pZonePool(NULL)
{
m_mapZone.clear();
}
ChatField::~ChatField()
{
Release();
}
VOID ChatField::Init(FieldInfo *pFieldInfo)
{
// 鞘靛 单捞磐甫 爱绊 檬扁拳
m_pFieldInfo = pFieldInfo;
// 轰器飘 沥焊 钱 积己
m_pZonePool = new CMemoryPoolFactory<ViewPort>;
m_pZonePool->Initialize(m_pFieldInfo->GetTotalSectorNum());
// 捞 鞘靛俊 甸绢哎 轰器飘 傈何 积己
ViewPort *pViewPort = NULL;
for( DWORD dwSectorIndex = 0 ; dwSectorIndex < m_pFieldInfo->GetTotalSectorNum() ; ++dwSectorIndex )
{
pViewPort = m_pZonePool->Alloc();
pViewPort->SetZone( eZONETYPE_VILLAGE, dwSectorIndex );
m_mapZone.insert(VIEWPORT_MAP_PAIR(dwSectorIndex, pViewPort));
}
for( dwSectorIndex = 0 ; dwSectorIndex < m_pFieldInfo->GetTotalSectorNum() ; ++dwSectorIndex )
{
// 捞眶 粮 汲沥
SectorInfo *pSector = m_pFieldInfo->GetSectorInfo(dwSectorIndex);
SectorInfo *pNextSector = NULL;
CLinkedlist<SectorInfo *> SectorList = pSector->GetNeighborSectorInfoList();
void* pNode = NULL;
Zone* pZone = NULL;
pViewPort = m_mapZone.find( dwSectorIndex )->second;
if(SectorList.GetCount() > 0)
{
pNode = SectorList.GetFirstPos();
while( (pNextSector = SectorList.GetNextPos((POS&)pNode)) != NULL )
{
VIEWPORT_MAP_ITER iter = m_mapZone.find(pNextSector->GetSectorIndex());
if(iter == m_mapZone.end())
{
//缴阿茄 俊矾
MessageOut( eCRITICAL_LOG, "NeighborZone 技泼 俊矾!!!" );
return;
}
ViewPort *pNeighbor = (*iter).second;
pViewPort->AddNeighborZone( pNeighbor->GetZone() );
}
}
}
MessageOut( eCRITICAL_LOG, "ChatField[Code:%u][SectorNum:%u] Init Complete", pFieldInfo->GetFieldCode(), pFieldInfo->GetTotalSectorNum() );
}
VOID ChatField::Release()
{
// 积己茄 轰器飘 葛滴 昏力
VIEWPORT_MAP_ITER iter;
ViewPort *pViewPort=NULL;
while( !m_mapZone.empty() )
{
iter = m_mapZone.begin();
pViewPort = iter->second;
m_pZonePool->Free(pViewPort);
// delete pViewPort;
m_mapZone.erase(iter);
}
if(m_pFieldInfo)
{
m_pFieldInfo->Destroy();
// delete m_pFieldInfo;
}
if(m_pZonePool)
{
// m_pZonePool->Release();
delete m_pZonePool;
}
}
VOID ChatField::RemoveViewPort(DWORD dwZoneID)
{
VIEWPORT_MAP_ITER iter;
ViewPort *pViewPort = NULL;
iter = m_mapZone.find(dwZoneID);
if(iter != m_mapZone.end())
{
pViewPort = iter->second;
m_pZonePool->Free(pViewPort);
m_mapZone.erase(iter);
}
}
BOOL ChatField::MoveViewPort(User *pUser, DWORD dwFieldCode, DWORD dwZoneID)
{
// 鞘靛 掳肺 捞悼
if(pUser->GetFieldCode() != dwFieldCode)
{
// 捞 鞘靛俊 持阑 镑捞 乐绰瘤 犬牢
VIEWPORT_MAP_ITER iter = m_mapZone.find( dwZoneID );
if(iter == m_mapZone.end())
{
MessageOut( eCRITICAL_LOG, "MoveViewPort SectorIndex error - [%s][f:%u][s:%u]", pUser->GetCharName().c_str(),
dwFieldCode,
dwZoneID );
return FALSE;
}
// 捞 鞘靛俊 持绰促
AddUser(pUser, dwZoneID);
return TRUE;
}
// 冀磐父 捞悼
if(pUser->GetSectorIndex() != dwZoneID)
{
// 货肺 持阑 鞘靛 茫绰促
VIEWPORT_MAP_ITER iterNew = m_mapZone.find( dwZoneID );
if(iterNew == m_mapZone.end())
{
MessageOut( eCRITICAL_LOG, "MoveViewPort SectorIndex error - [%s][f:%u][s:%u]", pUser->GetCharName().c_str(),
dwFieldCode,
dwZoneID );
return FALSE;
}
ViewPort *pViewPortNew = (*iterNew).second;
// 捞傈 冀磐俊辑 瘤况林绊
VIEWPORT_MAP_ITER iter = m_mapZone.find( pUser->GetSectorIndex() );
if(iter == m_mapZone.end())
{
MessageOut( eCRITICAL_LOG, "MoveViewPort SectorIndex error - [%s][f:%u][s:%u]", pUser->GetCharName().c_str(),
dwFieldCode,
dwZoneID );
return FALSE;
}
ViewPort *pViewPort = (*iter).second;
pViewPort->RemoveUser( pUser );
// 货 冀磐俊 持绰促
pViewPortNew->AddUser( pUser );
return TRUE;
}
// 笛促 酒聪搁 弊成 力磊府
return TRUE;
}
ViewPort *ChatField::GetViewPort(DWORD dwZoneID)
{
VIEWPORT_MAP_ITER iter;
iter = m_mapZone.find(dwZoneID);
if(iter == m_mapZone.end())
{
return NULL;
}
return (*iter).second;
}
BOOL ChatField::SendToNeighbors(DWORD dwZoneID, BYTE *pMsg, WORD wSize)
{
VIEWPORT_MAP_ITER iter;
iter = m_mapZone.find(dwZoneID);
if(iter == m_mapZone.end())
{
MessageOut(eCRITICAL_LOG, "No Neighbor Zone Error - [F:%u][Z:%u]", GetFieldCode(), dwZoneID);
return FALSE;
}
ViewPort *pViewPort = (*iter).second;
pViewPort->SendToNeighbors( pMsg, wSize );
return TRUE;
}
BOOL ChatField::SendToAll( BYTE* pMsg, WORD wSize )
{
VIEWPORT_MAP_ITER iter;
if( m_mapZone.empty() )
{
MessageOut(eCRITICAL_LOG, "SendToAll No Zone Error - [F:%u]", GetFieldCode());
return FALSE;
}
ViewPort *pViewPort = NULL;
for( iter = m_mapZone.begin(); iter != m_mapZone.end(); iter++ )
{
pViewPort = (*iter).second;
if( !pViewPort )
{
MessageOut(eCRITICAL_LOG, "SendToAll ViewPort NULL Error - [F:%u]", GetFieldCode());
return FALSE;
}
pViewPort->SendToZone( pMsg, wSize );
}
return TRUE;
}
DWORD ChatField::GetFieldCode()
{
if(!m_pFieldInfo)
{
return 0;
}
return m_pFieldInfo->GetFieldCode();
}
BOOL ChatField::AddUser( User *pUser, DWORD dwZoneID )
{
VIEWPORT_MAP_ITER iter = m_mapZone.find( dwZoneID );
if( iter == m_mapZone.end() )
{
MessageOut(eCRITICAL_LOG, "ChatField AddUser Error - No Sector [%u:%u]", m_pFieldInfo->GetFieldCode(), dwZoneID );
return FALSE;
}
ViewPort *pViewPort = (*iter).second;
pViewPort->AddUser( pUser );
pUser->SetFieldCode( m_pFieldInfo->GetFieldCode() );
MessageOut( eFULL_LOG, "AddUser %s[Guid:%u][CharGuid:%u][ZT:%u][F:%u][Z:%u] Complete", pUser->GetCharName().c_str(),
pUser->GetGUID(),
pUser->GetCharGuid(),
pUser->GetStatus(),
pUser->GetFieldCode(),
dwZoneID );
return TRUE;
}
VOID ChatField::RemoveUser( User *pUser )
{
VIEWPORT_MAP_ITER iter = m_mapZone.find( pUser->GetSectorIndex() );
if(iter == m_mapZone.end())
{
MessageOut(eCRITICAL_LOG, "ChatField RemoveUser Error - No Sector [F:%u][S:%u]", m_pFieldInfo->GetFieldCode(), pUser->GetSectorIndex() );
return;
}
ViewPort *pViewPort = (*iter).second;
pViewPort->RemoveUser( pUser );
// 捞傈 付阑 沥焊甫 瘤快瘤 臼绊 底促啊 寇摹扁俊 结冈绰促. 老窜篮 祈过...捞瘤父 扁裙俊 蝶扼辑绰 沥傍过老瘤档?
// pUser->SetFieldCode( 0 );
pUser->SetSectorIndex( 0 );
MessageOut( eFULL_LOG, "RemoveUser %s[Guid:%u][CharGuid;%u][ZT:%u][F:%u][S:%u] Complete", pUser->GetCharName().c_str(),
pUser->GetGUID(),
pUser->GetCharGuid(),
pUser->GetStatus(),
m_pFieldInfo->GetFieldCode(),
pViewPort->GetKey() );
}
/////////////////////////////////////////////
// ViewPortManager
ViewPortManager::ViewPortManager()
{
m_pChatFieldPool = new CMemoryPoolFactory<ChatField>;
m_pChatFieldPool->Initialize( 10, 0 );
}
ViewPortManager::~ViewPortManager()
{
Release();
}
VOID ViewPortManager::Init()
{
}
BOOL ViewPortManager::TestLoadMap()
{
/*
// 甘 肺爹 傈 券版 汲沥
#ifndef _DEBUG
// DLL 肺爹
char *lpszDLL = "3DTerrain_s.dll";
#else
// DLL 肺爹
char *lpszDLL = "3DTerrain_sd.dll";
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -