📄 npc.cpp
字号:
//啊鳖捞 乐瘤 臼栏搁 框流牢促.
if(GetDistance(m_pGuardTarget) > m_nSightRange)
{
MoveTo( m_pGuardTarget );
return;
}
//阿 拌凯 喊肺 瘤盔茄促.
if((m_pGuardTarget->m_nHP * 100.) / m_pGuardTarget->m_nMaxHP < 50 )
{
Heal(m_pGuardTarget);
return;
}
//父老 焊龋窍绊磊 窍绰 措惑阑 鲍酚洒绰 磊啊 荤扼瘤搁 措扁肺 倒酒埃促.
if(m_pGuardTarget->m_pTarget == NULL)
{
m_pGuardTarget = NULL;
m_nStatus = STATUS_STAY;
m_nStatusLevel = STATLVL_CALM;
return;
}
else if(IsAttackable(m_pGuardTarget->m_pTarget)) //傍拜茄促.
{
m_pTarget = m_pGuardTarget->m_pTarget;
Attack(m_pTarget);
}
break;
*/
}
}
////////////////////////////////////////////////////////////////////////////////////////
// 15固磐 郴狼 瘤开阑 烙狼肺 急沥茄促.
////////////////////////////////////////////////////////////////////////////////////////
_POINT_TILE NPC::RandomSelectRoamingArea(_POINT_TILE center)
{
// --------------------------------------------------------------------------------
// 秦寸 甘狼 MAX X/Y Size沥焊甫 掘澜
//
// - NPC Load矫 Map包访 沥焊甫 鞍捞 涝仿矫糯
// --------------------------------------------------------------------------------
int nMaxX = g_pMap->MapConfig[m_nMapLayer].nMaxX;
int nMaxY = g_pMap->MapConfig[m_nMapLayer].nMaxY;
_POINT_TILE nextRoam;
int x = BETWEEN( center.x + (rand() % 30 -15),0,(nMaxX-1) );
int y = BETWEEN( center.y + (rand() % 30 -15),0,(nMaxY-1) );
nextRoam.x = x;
nextRoam.y = y;
// 捞悼 瘤开 困摹 焊沥 (哎荐 绝绰 镑牢 版快 哎荐 乐绰 Point肺 捞悼 矫糯)
// --------------------------------------------------------------------------------
// NOTENOTE: 2003-10-30 badajoa NPC 炮饭器飘 泅惑 狼缴瘤开 荐沥吝
// --------------------------------------------------------------------------------
if( g_pMap->AOI_MovePoint( m_nMapLayer, nextRoam ) == -1 )
{
nextRoam.x = center.x;
nextRoam.y = center.y;
}
return nextRoam;
}
////////////////////////////////////////////////////////////////////////////////////////
// 困摹 捞悼 窃荐
//
// - 内靛狼 弥利拳 累诀捞 鞘夸
////////////////////////////////////////////////////////////////////////////////////////
void NPC::MoveTo( _POINT_TILE target )
{
if(m_bHoldTurn || m_nMaxMoveTile == 0 ) return ;
// --------------------------------------------------------------------------------
// 秦寸 甘狼 MAX X/Y Size沥焊甫 掘澜
//
// - NPC Load矫 Map包访 沥焊甫 鞍捞 涝仿矫糯
// --------------------------------------------------------------------------------
int nMaxX = g_pMap->MapConfig[m_nMapLayer].nMaxX;
int nMaxY = g_pMap->MapConfig[m_nMapLayer].nMaxY;
_POINT MoveTile;
BYTE nNPC = MAP_MONSTER ;
if(m_nClassType == MONSTER_SUMMON )
nNPC = MAP_SUMMONNPC ;
int nDeltaX = target.x - m_Tile.x;
int nDeltaY = target.y - m_Tile.y;
// --------------------------------------------------------------------------------
// 茄锅俊 框流老荐 乐绰 芭府 父怒 捞悼 矫糯
// 老窜篮 弥措 框流老荐 乐绰 m_nMaxMoveTile蔼阑 阑 劝侩窃
// --------------------------------------------------------------------------------
if( abs( nDeltaX ) > m_nMaxMoveTile )
{
MoveTile.x = BETWEEN( m_Tile.x + ((nDeltaX>0)?m_nMaxMoveTile:-m_nMaxMoveTile),0,nMaxX-1);
}
else
{
MoveTile.x = BETWEEN( m_Tile.x + nDeltaX,0,nMaxX-1);
}
if( abs( nDeltaY ) > m_nMaxMoveTile )
{
MoveTile.y = BETWEEN( m_Tile.y + ((nDeltaY>0)?m_nMaxMoveTile:-m_nMaxMoveTile),0,nMaxY-1);
}
else
{
MoveTile.y = BETWEEN( m_Tile.y + nDeltaY,0,nMaxY-1);
}
// --------------------------------------------------------------------------------
// 捞悼 包访
// --------------------------------------------------------------------------------
m_MoveFrom.x = m_MoveTo.x;
m_MoveFrom.y = m_MoveTo.y;
// --------------------------------------------------------------------------------
// AOI包府 Array俊 秦寸蔼 涝仿 饶 框流老 蔼阑 Setting矫糯
// --------------------------------------------------------------------------------
int nReturn = g_pMap->AOI_NPCMove( this , MoveTile, nNPC ); // MAP俊辑 捞悼 矫糯
// --------------------------------------------------------------------------------
// 巩力 惯积矫 馆措 规氢栏肺 捞悼
// --------------------------------------------------------------------------------
if( nReturn == -1 )
{
_POINT DeltaPoint;
DeltaPoint.x = MoveTile.x - m_Tile.x;
DeltaPoint.y = MoveTile.y - m_Tile.y;
MoveTile.x = m_Tile.x - DeltaPoint.x;
MoveTile.y = m_Tile.y - DeltaPoint.y;
MoveTile.x = BETWEEN_INT( MoveTile.x, 0, nMaxX );
MoveTile.y = BETWEEN_INT( MoveTile.y, 0, nMaxY );
nReturn = g_pMap->AOI_NPCMove( this , MoveTile, nNPC );
if( nReturn == -1 )
{
// TRACE( "NPC MOVE 2瞒 矫档 角菩 %d\n", m_dwHandle );
}
}
g_pServer->PacketSend_NPCMove( this ); // NPC捞悼 Packet阑 傈价 矫糯
}
////////////////////////////////////////////////////////////////////////////////////////
// 困摹 捞悼 窃荐
//
////////////////////////////////////////////////////////////////////////////////////////
void NPC::TeleportTo( _POINT_TILE target )
{
if(m_bHoldTurn || m_nMaxMoveTile == 0 ) return ;
// --------------------------------------------------------------------------------
// 秦寸 甘狼 MAX X/Y Size沥焊甫 掘澜
//
// - NPC Load矫 Map包访 沥焊甫 鞍捞 涝仿矫糯
// --------------------------------------------------------------------------------
int nMaxX = g_pMap->MapConfig[m_nMapLayer].nMaxX;
int nMaxY = g_pMap->MapConfig[m_nMapLayer].nMaxY;
_POINT MoveTile;
BYTE nNPC = MAP_MONSTER ;
if(m_nClassType == MONSTER_SUMMON )
nNPC = MAP_SUMMONNPC ;
int nDeltaX = target.x - m_Tile.x;
int nDeltaY = target.y - m_Tile.y;
// --------------------------------------------------------------------------------
// 茄锅俊 框流老荐 乐绰 芭府 父怒 捞悼 矫糯
// 老窜篮 弥措 框流老荐 乐绰 m_nMaxMoveTile蔼阑 阑 劝侩窃
// --------------------------------------------------------------------------------
MoveTile.x = BETWEEN( m_Tile.x + nDeltaX,0,(nMaxX-1) );
MoveTile.y = BETWEEN( m_Tile.y + nDeltaY,0,(nMaxY-1) );
// --------------------------------------------------------------------------------
// 捞悼 包访
// --------------------------------------------------------------------------------
m_MoveFrom.x = m_MoveTo.x;
m_MoveFrom.y = m_MoveTo.y;
// --------------------------------------------------------------------------------
// AOI包府 Array俊 秦寸蔼 涝仿 饶 框流老 蔼阑 Setting矫糯
// --------------------------------------------------------------------------------
int nReturn = g_pMap->AOI_NPCMove( this , MoveTile, nNPC ); // MAP俊辑 捞悼 矫糯
if( nReturn != -1 )
g_pServer->PacketSend_NPCMove( this ); // NPC捞悼 Packet阑 傈价 矫糯
}
////////////////////////////////////////////////////////////////////////////////////////
// 秦寸 困摹 菊率栏肺 捞悼 矫糯
//
// 1,-1 (6) 0, 1 (7) 1, 1 (8)
// -1, 0 (3) 0, 0 (4) 1, 0 (5)
// -1,-1 (0) 0,-1 (1) 1,-1 (2)
////////////////////////////////////////////////////////////////////////////////////////
const _sPOINT _NPCMOVE_TABLE_[9][9] = {
{ {-1,-1}, {-1, 0}, { 0,-1}, { 1,-1}, { 1,-1}, { 0, 1}, { 1, 0}, { 1, 1}, { 0, 0} }, // 0
{ { 0,-1}, {-1,-1}, { 1,-1}, {-1, 0}, { 1, 0}, { 1,-1}, { 1, 1}, { 0, 1}, { 0, 0} }, // 1
{ { 1,-1}, { 0,-1}, { 1, 0}, {-1,-1}, { 1, 1}, {-1, 0}, { 0, 1}, { 1,-1}, { 0, 0} }, // 2
{ {-1, 0}, { 1,-1}, {-1,-1}, { 0, 1}, { 0,-1}, { 1, 1}, { 1,-1}, { 0, 0}, { 1, 0}, }, // 3
{ { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0}, { 0, 0} }, // 4
{ { 1, 0}, { 1,-1}, { 1, 1}, { 0,-1}, { 0, 1}, {-1,-1}, { 1,-1}, { 0, 0}, {-1, 0}, }, // 5
{ { 1,-1}, { 0, 1}, {-1, 0}, { 1, 1}, {-1,-1}, { 1, 0}, { 0,-1}, { 1,-1}, { 0, 0} }, // 6
{ { 0, 1}, { 1,-1}, { 1, 1}, {-1, 0}, { 1, 0}, {-1,-1}, { 1,-1}, { 0,-1}, { 0, 0} }, // 7
{ { 1, 1}, { 0, 1}, { 1, 0}, { 1,-1}, { 1,-1}, {-1, 0}, { 0,-1}, {-1,-1}, { 0, 0} } // 8
};
////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
void NPC::MoveTo(CPlayer *pPlayer )
{
_POINT_TILE MoveTile;
// --------------------------------------------------------------------------------
// 捞悼 困摹甫 焊沥 风凭
// --------------------------------------------------------------------------------
int nDeltaX = pPlayer->m_Tile.x - m_Tile.x;
int nDeltaY = pPlayer->m_Tile.y - m_Tile.y;
int nTempMoveIndex = 0;
// --------------------------------------------------------------------------------
// X困摹 茫扁
// --------------------------------------------------------------------------------
if( nDeltaX < 0 )
nTempMoveIndex = 0;
else if( nDeltaX > 0 )
nTempMoveIndex = 2;
else
nTempMoveIndex = 1;
// --------------------------------------------------------------------------------
// Y困摹 焊沥
// --------------------------------------------------------------------------------
if( nDeltaY < 0 )
nTempMoveIndex += 0;
else if( nDeltaY > 0 )
nTempMoveIndex += 6;
else
nTempMoveIndex += 3;
// --------------------------------------------------------------------------------
// 框流老 Point甫 掘澜
// --------------------------------------------------------------------------------
for( int i=0; i<9; i++ )
{
MoveTile.x = pPlayer->m_Tile.x - _NPCMOVE_TABLE_[nTempMoveIndex][i].x; // X困摹
MoveTile.y = pPlayer->m_Tile.y - _NPCMOVE_TABLE_[nTempMoveIndex][i].y; // Y困摹
if( g_pMap->IsMoveable( m_nMapLayer, MoveTile ) ) break;
}
MoveTo( MoveTile ); // 秦寸困摹肺 捞悼
return ;
}
////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
void NPC::MoveToTarget(CPlayer *pPlayer )
{
_POINT_TILE MoveTile;
// --------------------------------------------------------------------------------
// 捞悼 困摹甫 焊沥 风凭
// --------------------------------------------------------------------------------
int nDeltaX = pPlayer->m_Tile.x - m_Tile.x;
int nDeltaY = pPlayer->m_Tile.y - m_Tile.y;
int nTempMoveIndex = 0;
// --------------------------------------------------------------------------------
// X困摹 茫扁
// --------------------------------------------------------------------------------
if( nDeltaX < 0 )
nTempMoveIndex = 0;
else if( nDeltaX > 0 )
nTempMoveIndex = 2;
else
nTempMoveIndex = 1;
// --------------------------------------------------------------------------------
// Y困摹 焊沥
// --------------------------------------------------------------------------------
if( nDeltaY < 0 )
nTempMoveIndex += 0;
else if( nDeltaY > 0 )
nTempMoveIndex += 6;
else
nTempMoveIndex += 3;
// --------------------------------------------------------------------------------
// 框流老 Point甫 掘澜
// --------------------------------------------------------------------------------
for( int i=0; i<9; i++ )
{
MoveTile.x = pPlayer->m_Tile.x - 2*_NPCMOVE_TABLE_[nTempMoveIndex][i].x; // X困摹
MoveTile.y = pPlayer->m_Tile.y - 2*_NPCMOVE_TABLE_[nTempMoveIndex][i].y; // Y困摹
if( g_pMap->IsMoveable( m_nMapLayer, MoveTile ) ) break;
}
MoveTo( MoveTile ); // 秦寸困摹肺 捞悼
return ;
}
////////////////////////////////////////////////////////////////////////////////////////
//
////////////////////////////////////////////////////////////////////////////////////////
void NPC::TeleportTo(CPlayer *pPlayer )
{
_POINT_TILE MoveTile;
// --------------------------------------------------------------------------------
// 捞悼 困摹甫 焊沥 风凭
// --------------------------------------------------------------------------------
int nDeltaX = pPlayer->m_Tile.x - m_Tile.x;
int nDeltaY = pPlayer->m_Tile.y - m_Tile.y;
int nTempMoveIndex = 0;
// --------------------------------------------------------------------------------
// X困摹 茫扁
// --------------------------------------------------------------------------------
if( nDeltaX < 0 )
nTempMoveIndex = 0;
else if( nDeltaX > 0 )
nTempMoveIndex = 2;
else
nTempMoveIndex = 1;
// --------------------------------------------------------------------------------
// Y困摹 焊沥
// --------------------------------------------------------------------------------
if( nDeltaY < 0 )
nTempMoveIndex += 0;
else if( nDeltaY > 0 )
nTempMoveIndex += 6;
else
nTempMoveIndex += 3;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -