⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 viewportmanager.cpp

📁 奇迹世界 部分源代码奇迹世界 部分源代码奇迹世界 部分源代码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -