📄 map.cpp
字号:
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 + -