?? 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 + -