本文整理汇总了C++中P_NPC::clearPath方法的典型用法代码示例。如果您正苦于以下问题:C++ P_NPC::clearPath方法的具体用法?C++ P_NPC::clearPath怎么用?C++ P_NPC::clearPath使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类P_NPC
的用法示例。
在下文中一共展示了P_NPC::clearPath方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: Walking
/*!
This handles if a character actually tries to walk (NPC & Player)
*/
bool cMovement::Walking( P_CHAR pChar, Q_UINT8 dir, Q_UINT8 sequence )
{
if ( !pChar )
return false;
// Scripting
if ( pChar->onWalk( dir, sequence ) )
return false;
P_PLAYER player = dynamic_cast<P_PLAYER>( pChar );
// Is the sequence in order ?
if ( player && player->socket() && !verifySequence( player->socket(), sequence ) )
return false;
// If checking for weight is more expensive, shouldn't we check for frozen first?
if ( pChar->isFrozen() )
{
if ( player && player->socket() )
player->socket()->denyMove( sequence );
return false;
}
// save our original location before we even think about moving
const Coord oldpos( pChar->pos() );
// If the Direction we're moving to is different from our current direction
// We're turning and NOT moving into a specific direction
// Clear the running flag here (!)
// If the direction we're moving is already equal to our current direction
bool running = dir & 0x80;
dir = dir & 0x7; // Remove all unneeded stuff
pChar->setRunning( running );
bool turning = dir != pChar->direction();
// This happens if we're moving
if ( !turning )
{
// Note: Do NOT use the copy constructor as it'll create a reference
Coord newCoord = calcCoordFromDir( dir, pChar->pos() );
// Check if the stamina parameters
if ( player && !consumeStamina( player, running ) )
{
if ( player->socket() )
player->socket()->denyMove( sequence );
return false;
}
// Check if we're going to collide with characters
if ( player )
{
// Player vs characters
if ( player->socket() && player->pos().map == 0 && !player->account()->isStaff() )
{
// Currently hard-limiting collisions to Felucca; this should be a server option!
MapCharsIterator charCollisions = MapObjects::instance()->listCharsAtCoord( newCoord );
for ( P_CHAR them = charCollisions.first(); them; them = charCollisions.next() )
{
if ( them == player )
continue;
P_PLAYER otherplayer = dynamic_cast<P_PLAYER>( them );
if ( otherplayer && otherplayer->account()->isStaff() )
continue; // no collisions against the staff
if ( wpAbs<SI08>( newCoord.z - them->pos().z ) < P_M_MAX_Z_CLIMB )
{
// to push another char we must have maximum stamina
if ( player->stamina() >= player->maxStamina() )
{
player->socket()->clilocMessage( them->isHidden() ? 1019043 : 1019042 );
player->setStamina( player->stamina() - 10 );
break;
}
else
{
player->socket()->denyMove( sequence );
return false;
}
}
}
}
}
else
{
// NPC vs characters
P_NPC npc = dynamic_cast<P_NPC>( pChar );
if ( npc && CheckForCharacterAtXYZ( pChar, newCoord ) )
{
npc->clearPath();
return false;
}
}
//.........这里部分代码省略.........
示例2: Walking
/*!
This handles if a character actually tries to walk (NPC & Player)
*/
bool cMovement::Walking( P_CHAR pChar, Q_UINT8 dir, Q_UINT8 sequence )
{
if ( !pChar )
return false;
// Scripting
if ( pChar->onWalk( dir, sequence ) )
return false;
/* if( !isValidDirection( dir ) )
{
pChar->setPathNum( pChar->pathnum() + PATHNUM );
return;
}*/
P_PLAYER player = dynamic_cast<P_PLAYER>( pChar );
// Is the sequence in order ?
if ( player && player->socket() && !verifySequence( player->socket(), sequence ) )
return false;
// If checking for weight is more expensive, shouldn't we check for frozen first?
if ( pChar->isFrozen() )
{
if ( player && player->socket() )
player->socket()->denyMove( sequence );
return false;
}
// save our original location before we even think about moving
const Coord_cl oldpos( pChar->pos() );
// If the Direction we're moving to is different from our current direction
// We're turning and NOT moving into a specific direction
// Clear the running flag here (!)
// If the direction we're moving is already equal to our current direction
bool running = dir & 0x80;
dir = dir & 0x7F; // Remove the running flag
pChar->setRunning(running);
bool turning = dir != pChar->direction();
// This happens if we're moving
if ( !turning )
{
// Note: Do NOT use the copy constructor as it'll create a reference
Coord_cl newCoord = calcCoordFromDir( dir, pChar->pos() );
// Check if the stamina parameters
if ( player && !consumeStamina( player, running ) )
{
if ( player->socket() )
player->socket()->denyMove( sequence );
return false;
}
// Check for Characters in our way
if ( !checkObstacles( pChar, newCoord, running ) )
{
if ( player && player->socket() )
player->socket()->denyMove( sequence );
return false;
}
// Check if the char can move to those new coordinates
// It is going to automatically calculate the new coords (!)
if ( !mayWalk( pChar, newCoord ) )
{
if ( player && player->socket() )
player->socket()->denyMove( sequence );
return false;
}
else
{
if ( player && player->socket() )
player->socket()->allowMove( sequence );
}
// Check if we're going to collide with characters
if ( !player && CheckForCharacterAtXYZ( pChar, newCoord ) )
{
P_NPC npc = dynamic_cast<P_NPC>( pChar );
if ( npc )
{
npc->clearPath();
}
return false;
}
// We moved so let's update our location
pChar->moveTo( newCoord );
pChar->setStepsTaken( pChar->stepsTaken() + 1 );
pChar->setLastMovement( Server::instance()->time() );
checkStealth( pChar ); // Reveals the user if neccesary
}
else
//.........这里部分代码省略.........