📄 map.cpp
字号:
// ----------------------------------------------------------------------------
// 捞悼 困摹 弥措蔼 厚背
// ----------------------------------------------------------------------------
nXFrom = MAX( nXFrom , 0 );
nXTo = MIN( nXTo , nMaxX );
nYFrom = MAX( nYFrom , 0 );
nYTo = MIN( nYTo , nMaxY );
for( i = nXFrom; i <= nXTo; i ++ )
{
for( j = nYFrom; j <= nYTo; j ++ )
{
if( !(_MAP[nMapLayer][i][j].nCheckBit & CHK_MOVE) ) continue; // 框流 老荐 乐绰瘤 咯何 魄沥 (Tile 犬牢)
if( _MAP[nMapLayer][i][j].dwHandle )continue; // PC/NPC啊 秦寸 Cell俊 粮犁 窍瘤 臼绰 版快
EnterCriticalSection( &m_MapLock );
_MAP[nMapLayer][i][j].dwHandle = pSocketFD->pPlayer->m_dwHandle;
_MAP[nMapLayer][i][j].pObject = pSocketFD;
_MAP[nMapLayer][i][j].nType = (BYTE)MAP_PC; // PC
LeaveCriticalSection( &m_MapLock );
// --------------------------------------------------------------------
// 秦寸 AOI蔼阑 历厘 矫糯
// --------------------------------------------------------------------
pSocketFD->pPlayer->m_Tile.x = i;
pSocketFD->pPlayer->m_Tile.y = j;
// --------------------------------------------------------------------
// 秦寸 AOI俊 谍 NPC/PC啊 粮犁窍绰 版快
// 困摹 焊沥 累诀篮 Title狼 吝埃俊 困摹 窍促废 父惦
// 抛胶飘 饶 困摹 钎矫啊 捞惑茄 版快 荐沥 累诀
// --------------------------------------------------------------------
// 困摹 焊沥 累诀
if( nLevel > 0 )
{
pSocketFD->pPlayer->_PLAYERINFO.wX = pSocketFD->pPlayer->m_Tile.x * 100 + 50;
pSocketFD->pPlayer->_PLAYERINFO.wY = pSocketFD->pPlayer->m_Tile.y * 100 + 50;
}
else
{
// 泅 困摹俊 粮犁 窍绰 版快
pSocketFD->pPlayer->_PLAYERINFO.wX = pPoint.x;
pSocketFD->pPlayer->_PLAYERINFO.wY = pPoint.y;
}
return true; // LOOP狐廉 唱坷扁
}
}
nLevel ++;
// 漂沥 Level鳖瘤 贸府 窍瘤 给茄 版快
if( nLevel > 10 ) return false;
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// MAP Array郴 Player甫 昏力 矫糯
//
// - ERROR贸府 风凭 眠啊
////////////////////////////////////////////////////////////////////////////////////////
bool Map::MAP_PlayerOut( PlayerInfo *pPlayer )
{
m_MapPlayerHandle.Delete( pPlayer->m_dwHandle ); // PLAYER HANDLE昏力
m_MapAccountID.Delete ( pPlayer->m_strAccountID ); // PLAYER ACCOUNT昏力
char strTempPlayer[22] ={0,} ;
memcpy( strTempPlayer, pPlayer->m_strPlayerID , 20 );
m_MapPlayerID.Delete( strupr( strTempPlayer ) ); // PLAYER ID昏力
//#ifdef DEF_LOGOUT_TO_WORLD
// m_MapTempPlayerID.Delete( strupr( strTempPlayer ) ); // 烙矫 历厘侩 AccountID
//#endif
// Map俊辑 昏力 矫糯
if( !AOI_PlayerDelete( pPlayer) )
{
ErrorMsg
(
"(X) MAP_PlayerOut 荤侩磊 昏力 坷幅 Handle=%d Tile=%d,%d",
pPlayer->m_dwHandle ,
pPlayer->m_Tile.x ,
pPlayer->m_Tile.y
);
}
return true;
}
////////////////////////////////////////////////////////////////////////////////////////
// Temp Handle阑 积己 矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
int Map::CreateTempHandle()
{
::InterlockedDecrement( (long *) &m_nTempHandle) ;
int nHandle = m_nTempHandle;
return nHandle;
}
////////////////////////////////////////////////////////////////////////////////////////
// NPC弥檬 积己 矫
////////////////////////////////////////////////////////////////////////////////////////
void Map::NPC_Create(NPC *pNPC, _POINT_TILE pTile)
{
AOI_NPCPoint( pNPC , pTile ); // NPC甫 AOI俊 困摹 矫糯
if(pNPC->m_nMapLayer >= m_nMaxLayer ) return ;
m_MapNPC[pNPC->m_nMapLayer]->Insert( pNPC->m_dwHandle, pNPC ); // NPC包府 Map 秦寸 沥焊甫 涝仿 矫糯
}
////////////////////////////////////////////////////////////////////////////////////////
// 酒瘤飘 阁胶磐 殿废
//
////////////////////////////////////////////////////////////////////////////////////////
#ifdef DEF_AZIT
void Map::AzitNPC_Create(NPC *pNPC, _POINT_TILE pTile)
{
BYTE nMapLayer = pNPC->m_nMapLayer;
if( nMapLayer >= m_nMaxLayer ) return;
int nMaxX = MapConfig[nMapLayer].nMaxX;
int nMaxY = MapConfig[nMapLayer].nMaxY;
// --------------------------------------------------------------------------------
// 秦寸 MAP俊 困摹矫糯
// --------------------------------------------------------------------------------
int nLevel = 0, i, j;
int nXFrom = 0, nXTo = 0;
int nYFrom = 0, nYTo = 0;
bool bExit=false;
while( 1 )
{
nXFrom = pTile.x - nLevel;
nXTo = pTile.x + nLevel;
nYFrom = pTile.y - nLevel;
nYTo = pTile.y + nLevel;
nXFrom = MAX( nXFrom , 0 );
nXTo = MIN( nXTo , nMaxX );
nYFrom = MAX( nYFrom , 0 );
nYTo = MIN( nYTo , nMaxY );
for( i = nXFrom; i <= nXTo; i ++ )
{
for( j = nYFrom; j <= nYTo; j ++ )
{
/*
* 秦寸 困摹俊 殿废 矫糯
*
*
*/
// PC/NPC啊 秦寸 Cell俊 粮犁 窍瘤 臼绰 版快
if( _MAP[nMapLayer][i][j].dwHandle == 0 )
{
EnterCriticalSection( &m_MapLock );
_MAP[nMapLayer][i][j].dwHandle = pNPC->m_dwHandle;
_MAP[nMapLayer][i][j].pObject = pNPC;
_MAP[nMapLayer][i][j].nType = MAP_MONSTER; // NPC
LeaveCriticalSection( &m_MapLock );
// 秦寸 AOI蔼阑 历厘 矫糯
pNPC->m_Tile.x = i;
pNPC->m_Tile.y = j;
bExit = true; // LOOP狐廉 唱坷扁
}
if( bExit ) break;
}
if( bExit ) break;
}
nLevel ++;
// 漂沥 Level鳖瘤 贸府 窍瘤 给茄 版快
if( nLevel > 10 ) break;
}
// NPC包府 Map 秦寸 沥焊甫 涝仿 矫糯
m_MapNPC[pNPC->m_nMapLayer]->Insert( pNPC->m_dwHandle, pNPC );
}
#endif
////////////////////////////////////////////////////////////////////////////////////////
// Monster弥檬 积己 矫
////////////////////////////////////////////////////////////////////////////////////////
void Map::Monster_Create(NPC *pNPC, _POINT_TILE pTile, BYTE nNPC)
{
AOI_NPCPut( pNPC , pTile, nNPC ); // Monaster AOI俊 困摹 矫糯
if(pNPC->m_nMapLayer >= m_nMaxLayer ) return ;
m_MapNPC[pNPC->m_nMapLayer]->Insert( pNPC->GetHandle(), pNPC ); // NPC包府 Map 秦寸 沥焊甫 涝仿 矫糯
}
////////////////////////////////////////////////////////////////////////////////////////
// Socket Pop矫糯
////////////////////////////////////////////////////////////////////////////////////////
void* Map::Pool_Socket_Pop()
{
_SOCKET_FD *pSocketFD = (_SOCKET_FD *)m_PoolSocket.RemoveHead();
if( pSocketFD->nSeq != 0 )
{
pSocketFD->nSeq = 0;
}
pSocketFD->nIO = 0;
pSocketFD->bLog = false; //Jason 2004-07-22
#if defined(DEF_SPEEDHACK) || defined(DEF_KORSPEEDHACK)
// Jason 2004-08-16-china
memset(pSocketFD->dwStartSpeedTick, 0x00, sizeof(pSocketFD->dwStartSpeedTick ));
memset(pSocketFD->dwOldSpeedTick, 0x00, sizeof(pSocketFD->dwOldSpeedTick ));
memset(pSocketFD->nPacketCount, 0x00, sizeof(pSocketFD->nPacketCount ));
memset(pSocketFD->dwInitSpeedTick, 0x00, sizeof(pSocketFD->dwInitSpeedTick ));
#ifdef DEF_SKILLHACK_CHANGEJOB
memset(pSocketFD->nReactCount, 0x00, sizeof(pSocketFD->nReactCount ));
#endif
// Jason 2004-09-24-china 捞霸 绝绢辑 胶乔靛琴 x瞪环 沁匙...
memset(pSocketFD->nHackCount, 0x00, sizeof(pSocketFD->nHackCount ));
pSocketFD->nWarningCount = 0;
#ifdef DEF_KORSPEEDHACKSKILL
pSocketFD->nSkillIndex = 0; // Duke 2005-1-31
#endif
#endif
#ifdef DEF_AUTHCODE
//Jason 2004-10-06
pSocketFD->dwAuthCode = -1;
pSocketFD->nMenuStatus = 0;
#endif
#ifdef DEF_PACKETSIZEDOWN_BADAJOA20041011
pSocketFD->dwMoveAOISendTime = 0;
pSocketFD->wOldMoveX = 0;
pSocketFD->wOldMoveY = 0;
#endif
#ifdef DEF_FULLGUAGEHACK
pSocketFD->dwSkillReadyTime = 0;
pSocketFD->dwSkillUseTime = 0;
#endif
pSocketFD->pPlayer->Clear_PlayerInfo();
return pSocketFD;
}
////////////////////////////////////////////////////////////////////////////////////////
// Player 包府 List俊 Push 矫糯
//
// - Error贸府 风凭 眠啊 矫糯
////////////////////////////////////////////////////////////////////////////////////////
void Map::Pool_Socket_Push( void *pSocket )
{
if( !pSocket ) return;
/*
_SOCKET_FD *pTempSocket = (_SOCKET_FD *)pSocket;
// 秦寸 Pointer坷幅 惯积矫
if( !pTempSocket || pTempSocket->dwMagicNum != MAGIC_NUM )
{
ErrorMsg( "(X) Map : Socket Push Error ");
return ;
}
pTempSocket->pPlayer->Clear_PlayerInfo();
*/
m_PoolSocket.Insert( pSocket );
}
////////////////////////////////////////////////////////////////////////////////////////
// Item 包府 List俊 Pop矫糯
////////////////////////////////////////////////////////////////////////////////////////
CItem* Map::Pool_Item_Pop()
{
CItem *pItem = (CItem *)m_PoolItem.RemoveHead();
// --------------------------------------------------------------------------------
// Item捞 捞固 荤侩 吝牢 版快
// --------------------------------------------------------------------------------
if(pItem == NULL)
{
pItem = new CItem; // Item 按眉甫 Memory 且寸
if( !pItem ) return NULL;
pItem->dwMagicNum = MAGIC_NUM;
}
else if( pItem->m_bPoolUse )
{
ErrorMsg( "(X) Pool_Item_Pop ITEM realloc" );
return NULL;
}
pItem->m_bPoolUse = true; // Item Pool 荤侩
pItem->Clear_Item();
return pItem;
}
////////////////////////////////////////////////////////////////////////////////////////
// Item 包府 List俊 Push 矫糯
//
// - ITEM 吝汗 馆券 咯何 Checking
////////////////////////////////////////////////////////////////////////////////////////
void Map::Pool_Item_Push( void *pItem, int pDebugCode )
{
CItem *p = (CItem *)pItem;
if( !p->m_bPoolUse )
{
MapLog("(X) (%d) Pool_Item_Push ITEM Debug Code=(%d)", _Module.m_nMapSeq, pDebugCode ) ;
return;
}
p->m_bPoolUse = false; // ITEM POOL馆券
p->Clear_Item();
m_PoolItem.Insert( pItem );
}
////////////////////////////////////////////////////////////////////////////////////////
// SKILL包府 List俊 Pop矫糯
//
////////////////////////////////////////////////////////////////////////////////////////
void* Map::Pool_Skill_Pop()
{
CEnchant *pEnchant = (CEnchant *)m_PoolSkill.RemoveHead();
if(pEnchant == NULL)
{
pEnchant = new CEnchant; // Enchant 按眉甫 Memory 且寸
if( !pEnchant ) return NULL;
}
pEnchant->m_bPoolUse = true; // ITEM POOL 荤侩
pEnchant->Clear_Skill();
return pEnchant;
}
////////////////////////////////////////////////////////////////////////////////////////
// SKILL PUSH
//
////////////////////////////////////////////////////////////////////////////////////////
void Map::Pool_Skill_Push( void *pSkill ,int i )
{
CEnchant *pEnchant = (CEnchant *)pSkill;
if( !pEnchant->m_bPoolUse )
{
MapLog("(X) (%d) Pool_Skill_Push SKILL is duplicated return (%d) (%d) [%d]", _Module.m_nMapSeq ,pEnchant->m_nSlotType , pEnchant->m_wSkillIndex, i ) ;
return;
}
pEnchant->m_bPoolUse = false; // Item Pool 馆券
m_PoolSkill.Insert( pSkill );
}
////////////////////////////////////////////////////////////////////////////////////////
// 秦寸 Handle狼 荤侩磊甫 Map俊辑 鉴瞒 八祸栏肺 茫酒辑 昏力 矫糯
//
// - 2003.11.01 Duke Kim Code眠啊
// - 眠饶 包访 Search 规过阑 背眉 窃
////////////////////////////////////////////////////////////////////////////////////////
void Map::MAP_PlayerClear( DWORD pHandle )
{
/*
for( int i=0; i < MAX_MAPTILE_SIZE; i++)
{
for( int j=0; j < MAX_MAPTILE_SIZE; j++)
{
if( _MAP[0][i][j].dwHandle == pHandle )
{
ErrorMsg("(X) MAP_PlayerClear Hande=%d Tile=%d,%d", pHandle, i , j );
AOI_PlayerDelete( pHandle, (BYTE)i, (BYTE)j );
return;
}
}
}
// 秦寸 Handle沥焊甫 Map俊辑 茫瘤 给窍绰 版快
ErrorMsg( "(X) Handle=%d Position infomation no find in Map", pHandle );
*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -