当前位置: 首页>>代码示例>>C++>>正文


C++ P_PLAYER::maxStamina方法代码示例

本文整理汇总了C++中P_PLAYER::maxStamina方法的典型用法代码示例。如果您正苦于以下问题:C++ P_PLAYER::maxStamina方法的具体用法?C++ P_PLAYER::maxStamina怎么用?C++ P_PLAYER::maxStamina使用的例子?那么恭喜您, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在P_PLAYER的用法示例。


在下文中一共展示了P_PLAYER::maxStamina方法的2个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。

示例1: consumeStamina

/*!
  Calculates the amount of Stamina needed for a move of the
  passed character.
*/
bool cMovement::consumeStamina( P_PLAYER pChar, bool running )
{
	// Dead people and gms don't care about weight
	if ( pChar->isDead() || pChar->isGMorCounselor() )
	{
		return true;
	}

	// Calculate the stones we weight too much
	int overWeight = ( int ) ( pChar->weight() - pChar->maxWeight() );
	bool mounted = pChar->atLayer( cBaseChar::Mount ) != 0;
	bool update = false;

	// We carry too much
	if ( overWeight > 0 )
	{
		// How much stamina we loose
		int amount = 5 + ( overWeight / 25 );

		// Only one third loss if mounted
		if ( mounted )
		{
			amount = amount / 3;
		}

		// Double loss if running
		if ( running )
		{
			amount = amount * 2;
		}

		// Set the new stamina
		pChar->setStamina( wpMax<Q_INT16>( 0, pChar->stamina() - amount ), false );
		update = true;

		// We are overloaded
		if ( pChar->stamina() == 0 )
		{
			pChar->socket()->updateStamina();
			pChar->socket()->clilocMessage( 500109 );
			return false;
		}
	}

	// If we have less than 10% stamina left, we loose
	// stamina more quickly
	if ( ( pChar->stamina() * 100 ) / wpMax<ushort>( 1, pChar->maxStamina() ) < 10 )
	{
		pChar->setStamina( wpMax<Q_INT16>( 0, pChar->stamina() - 1 ), false );
		update = true;
	}

	// We can't move anymore because we are exhausted
	if ( pChar->stamina() == 0 )
	{
		pChar->socket()->updateStamina();
		pChar->socket()->clilocMessage( 500110 );
		return false;
	}

	// Normally reduce stamina every few steps
	if ( pChar->stepsTaken() % ( mounted ? 48 : 16 ) == 0 )
	{
		pChar->setStamina( wpMax<Q_INT16>( 0, pChar->stamina() - 1 ) );
		update = true;
	}

	if ( update )
	{
		pChar->socket()->updateStamina();
	}

	return true;
}
开发者ID:BackupTheBerlios,项目名称:wolfpack-svn,代码行数:78,代码来源:walking.cpp

示例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;

	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;
			}
		}

//.........这里部分代码省略.........
开发者ID:BackupTheBerlios,项目名称:wolfpack-svn,代码行数:101,代码来源:walking.cpp


注:本文中的P_PLAYER::maxStamina方法示例由纯净天空整理自Github/MSDocs等开源代码及文档管理平台,相关代码片段筛选自各路编程大神贡献的开源项目,源码版权归原作者所有,传播和使用请参考对应项目的License;未经允许,请勿转载。