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

📄 map.cpp

📁 韩国英雄王座倒闭后流出来部分源代码
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	int		nMaxX	=	MapConfig[nMapLayer].nMaxX;
	int		nMaxY	=	MapConfig[nMapLayer].nMaxY;

	//	--------------------------------------------------------------------------------
	//	Item阑 殿废 矫糯	
	//	--------------------------------------------------------------------------------
	m_MapItem.Insert( pItem->m_dwItemHandle, pItem );	

	//	--------------------------------------------------------------------------------
	//	捞悼且 困摹甫 	崔曝捞 葛胆肺 秦寸 困摹俊 沥焊甫 扁废 矫糯 	
	//	--------------------------------------------------------------------------------
	int nLevel	= 0, i, j;
		
	int	nXFrom	= 0, nXTo =	0;
	int nYFrom	= 0, nYTo =	0;

	while( 1 )
	{
		//	八祸 裹困 瘤沥
		nXFrom	= pTile.x  - nLevel;
		nXTo	= pTile.x  + nLevel;
	
		nYFrom	= pTile.y  - nLevel;
		nYTo	= pTile.y  + nLevel;

		//	----------------------------------------------------------------------------
		//	MAP MAX蔼 厚背
		//	----------------------------------------------------------------------------
		nXFrom	=	MAX( nXFrom	,	0		);
		nXTo	=	MIN( nXTo	,	nMaxX	);

		nYFrom	=	MAX( nYFrom	,	0		);
		nYTo	=	MIN( nYTo	,	nMaxY	);

		//	----------------------------------------------------------------------------
		//	秦寸 八祸 备埃俊辑 Item阑 困摹 矫懦 荐 乐绰 镑阑 茫澜 
		//	----------------------------------------------------------------------------
		for( i = nXFrom; i <= nXTo; i ++ )
		{
			for( j = nYFrom; j <= nYTo; j ++ )
			{					
				if( _MAP[nMapLayer][i][j].dwHandle		)	continue;	//	PC/NPC啊 粮犁 窍瘤 臼澜
				if( _MAP[nMapLayer][i][j].dwItemHandle	)	continue;	// Item捞 粮犁 窍瘤 臼澜

				EnterCriticalSection( &m_MapLock );

					_MAP[nMapLayer][i][j].dwItemHandle	=	pItem->m_dwItemHandle;	//	Item Handle涝仿 
					_MAP[nMapLayer][i][j].pItemObject	=	pItem;					//	Item Object涝仿

				LeaveCriticalSection( &m_MapLock );

				//	Tilte困摹 蔼阑 涝仿 
				pItem->m_TilePoint.x	= i;
				pItem->m_TilePoint.y	= j;

				//	Item困摹 蔼阑 涝仿 
				pItem->m_PostionPoint.x	= i * 100 + 50;
				pItem->m_PostionPoint.y	= j * 100 + 50;

				return nLevel;	// LOOP狐廉 唱坷扁 
			}
		}	
		
		nLevel ++;

		// 漂沥 Level鳖瘤 贸府 窍瘤 给茄 版快
		if( nLevel > 10 ) return -1;
	}
	
	return nLevel;
}


////////////////////////////////////////////////////////////////////////////////////////
//	AOI 包府 Array俊辑 秦寸 Object甫 力芭 矫糯 
//
////////////////////////////////////////////////////////////////////////////////////////
bool Map::AOI_PlayerDelete(CPlayer *pPlayer)
{
	if( !pPlayer  )	return false;

	//	--------------------------------------------------------------------------------
	//	Map Layer厚背
	//	--------------------------------------------------------------------------------
	BYTE	nMapLayer =	pPlayer->m_nMapLayer;
	if( nMapLayer >= m_nMaxLayer )	return	false;

	if( pPlayer->m_Tile.x <	0	)	return	false;
	if( pPlayer->m_Tile.y <	0	)	return	false;

	int		nMaxX	=	MapConfig[nMapLayer].nMaxX;
	int		nMaxY	=	MapConfig[nMapLayer].nMaxY;		
		
	if( pPlayer->m_Tile.x >= nMaxX	)	return false;
	if( pPlayer->m_Tile.y >= nMaxY	)	return false;
	
	//	--------------------------------------------------------------------------------
	//	秦寸 MAP俊辑 秦寸 Object甫 茫酒辑 NULL肺 父惦
	//	--------------------------------------------------------------------------------
	if(  _MAP[nMapLayer][pPlayer->m_Tile.x][pPlayer->m_Tile.y].dwHandle == pPlayer->m_dwHandle ) 
	{			
		EnterCriticalSection( &m_MapLock );

			_MAP[nMapLayer][pPlayer->m_Tile.x][pPlayer->m_Tile.y].pObject	= NULL;
			_MAP[nMapLayer][pPlayer->m_Tile.x][pPlayer->m_Tile.y].dwHandle	= NULL;
		
		LeaveCriticalSection( &m_MapLock );
	}
	else
	{
/*		int i ; 
		int j ; 
		for( i = 0 ; i < 256 ; ++i)
		{
			for( j = 0 ; j < 256 ; ++j)
			{
				if(  _MAP[nMapLayer][i][j].dwHandle == pPlayer->m_dwHandle ) 
					break; 
			}
		}
		
*/		
		return false;
	}


	return true;
}

////////////////////////////////////////////////////////////////////////////////////////
//	AOI 包府 备炼眉俊辑 秦寸 Item沥焊甫 力芭 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void Map::AOI_ItemDelete(CItem *pItem)
{
	if( !pItem ) return;
	
	m_MapItem.Delete( pItem->m_dwItemHandle );		//	Item包府 MAP俊辑 昏力 矫糯

	BYTE	nMapLayer =	pItem->m_nMapLayer;



	if( _MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].dwItemHandle == pItem->m_dwItemHandle )
	{
		EnterCriticalSection( &m_MapLock );

			_MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].dwItemHandle	= NULL;
			_MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].pItemObject	= NULL;

		LeaveCriticalSection( &m_MapLock );
	}
}




////////////////////////////////////////////////////////////////////////////////////////
//	AOI 包府 备炼眉俊辑 秦寸 Item沥焊甫 力芭 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void Map::AOI_BatchItemDelete(CItem *pItem)
{
	if( !pItem ) return;
	
	m_MapItem.Delete( pItem->m_dwItemHandle );		//	Item包府 MAP俊辑 昏力 矫糯

	BYTE	nMapLayer =	pItem->m_nMapLayer;

	// 馆券等 酒捞袍捞搁 AOI 酒捞袍 勤甸阑 啊历客 昏力茄促.
	if(!pItem->m_bPoolUse ) 
	{
		pItem->m_dwItemHandle	 = 	_MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].dwItemHandle ;
	}

	if( _MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].dwItemHandle == pItem->m_dwItemHandle )
	{
		EnterCriticalSection( &m_MapLock );

			_MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].dwItemHandle	= NULL;
			_MAP[nMapLayer][pItem->m_TilePoint.x][pItem->m_TilePoint.y].pItemObject		= NULL;

		LeaveCriticalSection( &m_MapLock );
	}
}


////////////////////////////////////////////////////////////////////////////////////////
//	Debug侩栏肺 Map狼 郴侩阑 免仿矫 郴侩 馆券 
//
////////////////////////////////////////////////////////////////////////////////////////
int Map::MapView( BYTE pMapIndex, DWORD pX, DWORD pY)
{
	if( _MAP[pMapIndex][pX][pY].nCheckBit & CHK_MOVE) 
	{

		// PC牢 版快
		if( _MAP[pMapIndex][pX][pY].dwHandle )
		{
			return _MAP[pMapIndex][pX][pY].nType;
		}
	}
	else
	{
		return -1;
	}


	return 0;
}


////////////////////////////////////////////////////////////////////////////////////////
//
//
////////////////////////////////////////////////////////////////////////////////////////
bool Map::AOI_PlayerDelete( DWORD pHandle, BYTE pMapLayer, BYTE pX, BYTE pY )
{

	//	秦寸 MAP俊辑 秦寸 Object甫 茫酒辑 NULL肺 父惦
	if(  _MAP[pMapLayer][pX][pY].dwHandle == pHandle ) 
	{			
		EnterCriticalSection( &m_MapLock );

			_MAP[pMapLayer][pX][pY].pObject		= NULL;
			_MAP[pMapLayer][pX][pY].dwHandle	= NULL;
		
		LeaveCriticalSection( &m_MapLock );
	}
	else
	{
		return false;
	}


	return true;
}



////////////////////////////////////////////////////////////////////////////////////////
//	Memory Pool 积己 
//
//
////////////////////////////////////////////////////////////////////////////////////////
bool Map::CreateMemory()
{
	//	--------------------------------------------------------------------------------
	//	荤侩瞪 Player Socket Memory甫 积己 矫糯
	//	荤侩瞪 Player Memory甫 积己 矫糯 
	//	--------------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
	for( int i=0; i < _Module.m_dwMaxUser; i ++ )
#else
	for( int i=0; i < MAX_SOCKET_CONTEXT; i ++ )
#endif
	{
		_SOCKET_FD	*pSocketFD	= new _SOCKET_FD;
		if( !pSocketFD  ) return false;


		memset(	pSocketFD, 0x00, sizeof( _SOCKET_FD ) );		
		pSocketFD->dwMagicNum = MAGIC_NUM;


		::InitializeCriticalSectionAndSpinCount( &pSocketFD->SendCS	, 2000 );

		pSocketFD->pPlayer = new PlayerInfo;		// Player 按眉甫 Memory 且寸
		if( !pSocketFD->pPlayer  )	return false;
		
		m_PoolSocket.Insert( pSocketFD );
	}


	//	--------------------------------------------------------------------------------
	//	荤侩瞪 Party List沥焊甫 掘澜
	//	--------------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
	for(i = 0; i < _Module.m_dwMaxUser  / 25  ; ++i )
#else
	for(i = 0; i < ( MAX_SOCKET_CONTEXT / 25) ; ++i )
#endif
	{
		CParty *pParty = new CParty;

		if( !pParty )	return false;
		
		m_PoolParty.Insert( pParty );
	}
	
	//	--------------------------------------------------------------------------------
	//	NOTENOTE: 荤侩瞪 辨靛 皋葛府 积己 
	//	--------------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
	for(i=0; i < ( _Module.m_dwMaxUser / 50) ; ++i)
#else
	for(i=0; i < ( MAX_SOCKET_CONTEXT / 50) ; ++i)
#endif
	{
		_CGUILD *pGuild = new _CGUILD;

		if( !pGuild )	return false;

		m_PoolGuild.Insert( pGuild );
	}

	//	--------------------------------------------------------------------------------
	//	荤侩瞪 SKILL MEMORY甫 积己 矫糯 (MAX * 2俺 父怒 积己)
	//	--------------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
	for( i=0; i < _Module.m_dwMaxUser	; i ++ )
#else
	for( i=0; i < MAX_SOCKET_CONTEXT 	; i ++ )
#endif
	{
		CEnchant *pEnchant =	new CEnchant;

		if( !pEnchant )	return false;

		m_PoolSkill.Insert( pEnchant );		
	}

	//	--------------------------------------------------------------------------------
	//	荤侩瞪 Item	Memory甫 积己 矫糯 
	//	--------------------------------------------------------------------------------
#ifdef DEF_NEWREGISTRY 
	for( i=0; i < _Module.m_dwMaxUser * 5	; ++i )
#else
	for( i=0; i < MAX_SOCKET_CONTEXT * 5	; ++i )
#endif
	{
		CItem *pItem =	new CItem;		// Item 按眉甫 Memory 且寸

		if( !pItem ) return false;
		pItem->dwMagicNum	=	MAGIC_NUM;

		m_PoolItem.Insert( pItem );
	}

	for( i=0;  i < m_nMaxLayer; ++i )
	{
		m_MapNPC[i] = new SafeMap ;
	}

	return	true;
}



////////////////////////////////////////////////////////////////////////////////////////
//	NPC甫 漂沥 困摹 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void Map::AOI_NPCPoint(NPC *pNpcHandle, _POINT_TILE pTile)
{
	EnterCriticalSection( &m_MapLock );						

		_MAP[pNpcHandle->m_nMapLayer][pTile.x][pTile.y].dwHandle	=	pNpcHandle->m_dwHandle;
		_MAP[pNpcHandle->m_nMapLayer][pTile.x][pTile.y].pObject		=	pNpcHandle;

		_MAP[pNpcHandle->m_nMapLayer][pTile.x][pTile.y].nType		=	(BYTE) MAP_MONSTER;		//	NPC

	LeaveCriticalSection( &m_MapLock );
}

////////////////////////////////////////////////////////////////////////////////////////
//	MAP俊 弥檬 立加 矫 贸府 
//	
//	-	Map殿废捞 阂啊瓷茄 版快 
//	-	包访	CODE甫 弥利拳 矫糯
////////////////////////////////////////////////////////////////////////////////////////
bool Map::MAP_PlayerIn(_LPSOCKET_FD pSocketFD, _POINT &pPoint)
{	
	
	//	Socket FD啊 粮犁窍瘤 臼绰 版快 
	if( !pSocketFD 								)	return false;	
	if( pSocketFD->dwMagicNum != MAGIC_NUM		)	return false;				

	if( !pSocketFD->pPlayer						)	return false;
	if(	pSocketFD->PlayerStatus == CONNECT_CLOSE)	return false;


	BYTE	nMapLayer =	pSocketFD->pPlayer->m_nMapLayer;
	if( nMapLayer >= m_nMaxLayer )	return false;

	int		nMaxX	=	MapConfig[nMapLayer].nMaxX;
	int		nMaxY	=	MapConfig[nMapLayer].nMaxY;

	//	--------------------------------------------------------------------------------
	//	MAP郴狼 荤侩磊 包府 亲格俊 涝仿 矫糯 	
	//
	//	-	SOCKET FD	殿废 
	//	-	ACCOUNT ID	殿废
	//	-	PLAYER ID	殿废
	//	--------------------------------------------------------------------------------
	bool	bReturn = m_MapPlayerHandle.Insert( pSocketFD->pPlayer->m_dwHandle, pSocketFD );	


	//	--------------------------------------------------------------------------------
	// NOTENOTE: 吝汗 立加栏肺 牢茄 归挤阑 秦搬窍扁 困秦 荐沥窃 
	//	--------------------------------------------------------------------------------
/*	
	//	ACCOUNT ID殿废
	bReturn	= m_MapAccountID.Insert( pSocketFD->pPlayer->m_strAccountID, pSocketFD );


	//	PLAYER ID 殿废矫 措巩磊 肺 官曹 Temp函荐甫 荤侩 窃
	char strTempPlayer[20];	
	memcpy( strTempPlayer, pSocketFD->pPlayer->m_strPlayerID , sizeof( strTempPlayer ) );


	bReturn = m_MapPlayerID.Insert( strupr( strTempPlayer ), pSocketFD );
*/			



	//	--------------------------------------------------------------------------------		
	//	MAP Array郴俊 殿废 矫糯
	//
	//	-	捞悼且 困摹甫 崔曝捞 葛胆肺 秦寸 困摹俊 沥焊甫 扁废 矫糯
	//	--------------------------------------------------------------------------------
	int nLevel	= 0, i, j;
		
	int	nXFrom	= 0, nXTo =	0;
	int nYFrom	= 0, nYTo =	0;
	
	_POINT	Point;

	Point.x = (WORD)(pPoint.x/100);
	Point.y	= (WORD)(pPoint.y/100);	

	while( 1 )
	{
		nXFrom	= Point.x  - 	nLevel;
		nXTo	= Point.x  + 	nLevel;
	
		nYFrom	= Point.y  - 	nLevel;
		nYTo	= Point.y  + 	nLevel;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -