コード例 #1
0
void UpdateAvatarEffect(void)
{
	if(!haptics->HasDevice())
		return;

	Vector vel;
	Vector vvel;
	Vector evel;
	QAngle eye;
	C_BasePlayer* pPlayer = C_BasePlayer::GetLocalPlayer();
	if(!pPlayer)
		return;

	eye = pPlayer->GetAbsAngles();

	if(pPlayer->IsInAVehicle() && pPlayer->GetVehicle())
	{
		pPlayer->GetVehicle()->GetVehicleEnt()->EstimateAbsVelocity(vvel);
		eye = pPlayer->GetVehicle()->GetVehicleEnt()->EyeAngles();

		if(!Q_stristr(pPlayer->GetVehicle()->GetVehicleEnt()->GetClassname(),"choreo"))
		{
			eye[YAW] += 90;
		}
		


	}
	else
	{
		vel = pPlayer->GetAbsVelocity();
	}

	Vector PlayerVel = pPlayer->GetAbsVelocity();

	//Choreo vehicles use player avatar and don't produce their own velocity
	if(!pPlayer->GetVehicle() || abs(vvel.Length()) == 0 )
	{
		vel = PlayerVel;
	}
	else
		vel = vvel;


	
	VectorYawRotate(vel, -90 -eye[YAW], vel );

	vel.y = -vel.y;
	vel.z = -vel.z;
	
	switch(pPlayer->GetMoveType()) {
		case MOVETYPE_NOCLIP:
			vel *= hap_noclip_avatar_scale.GetFloat();
			break;
		default:
			break;
	}

	haptics->UpdateAvatarVelocity(vel);
}
コード例 #2
0
//-----------------------------------------------------------------------------
// Purpose: Returns a very rough estimate for distance needed to turn
//-----------------------------------------------------------------------------
float UnitVehicleNavigator::CalcNeededDistanceForTurn( UnitBaseMoveCommand &MoveCommand, float turn )
{
	float turnPerInterval = MoveCommand.yawspeed * 10.0f * MoveCommand.interval;
	float turnStep, speedWeight;

	Vector dir( 1, 0, 0 );
	Vector end(0, 0, 0);
	int i = 0;
	for( i = 0; turn > 0 && i < 1000; i++ )
	{
		turnStep = Min( turnPerInterval, turn - turnPerInterval );
		speedWeight = turnStep / turnPerInterval;
		turn -= turnPerInterval;
		VectorYawRotate( dir, turnStep, dir );
		end += dir * (MoveCommand.maxspeed * speedWeight * MoveCommand.interval);
	}
	return end.Length2D();
}
コード例 #3
0
ファイル: c_cf_player.cpp プロジェクト: BSVino/Arcon
bool C_CFPlayer::GetIntervalMovement( float flIntervalUsed, bool &bMoveSeqFinished, Vector &newPosition, QAngle &newAngles )
{
	CStudioHdr *pstudiohdr = GetModelPtr( );
	if (! pstudiohdr || !pstudiohdr->SequencesAvailable())
		return false;

	float flComputedCycleRate = GetSequenceCycleRate( pstudiohdr, GetSequence() );
	
	float flNextCycle = GetCycle() + flIntervalUsed * flComputedCycleRate * m_flPlaybackRate;

	if ((!SequenceLoops()) && flNextCycle > 1.0)
	{
		flIntervalUsed = GetCycle() / (flComputedCycleRate * m_flPlaybackRate);
		flNextCycle = 1.0;
		bMoveSeqFinished = true;
	}
	else
	{
		bMoveSeqFinished = false;
	}

	Vector deltaPos;
	QAngle deltaAngles;

	float poseParameters[MAXSTUDIOPOSEPARAM];
	GetPoseParameters(pstudiohdr, poseParameters);

	if (Studio_SeqMovement( pstudiohdr, GetSequence(), GetCycle(), flNextCycle, poseParameters, deltaPos, deltaAngles ))
	{
		VectorYawRotate( deltaPos, GetLocalAngles().y, deltaPos );
		newPosition = GetLocalOrigin() + deltaPos;
		newAngles.Init();
		newAngles.y = GetLocalAngles().y + deltaAngles.y;
		return true;
	}
	else
	{
		newPosition = GetLocalOrigin();
		newAngles = GetLocalAngles();
		return false;
	}
}
コード例 #4
0
float DensityWeightsMap::Get( const Vector &vPos )
{
	Vector vTranslated;
	

#ifdef USELERP
	float x, y;
	int xlow, xhigh, ylow, yhigh;
	switch( m_iType )
	{
	case DENSITY_NONE:
		{
			return 0.0f;
		}
		break;
	case DENSITY_GAUSSIAN:
	default:
		{
			x =  ((vPos.x - m_pOuter->GetAbsOrigin().x)/MAP_TILE_SIZE) + m_iHalfSizeX;
			y =  ((vPos.y - m_pOuter->GetAbsOrigin().y)/MAP_TILE_SIZE) + m_iHalfSizeY;
		}
		break;
	};

	xlow = floor(x);
	xhigh = ceil(x);
	ylow = floor(y);
	yhigh = ceil(y);

	if( xlow < 0 || ylow < 0 || xhigh >= m_iSizeX || yhigh >= m_iSizeY )
		return 0.0f;

	return Lerp<float>(sqrt(pow(x - xlow, 2) + pow(y - ylow, 2)), m_pWeights[xlow][ylow], m_pWeights[xhigh][yhigh]);
#else
	// Read out density for the given position
	// If outside our field, return zero (too far away).
	int x, y;
	switch( m_iType )
	{
	case DENSITY_NONE:
		{
			return 0.0f;
		}
		break;
	case DENSITY_GAUSSIANECLIPSE:
		{
			vTranslated = vPos - m_pOuter->GetAbsOrigin();
			VectorYawRotate(vTranslated, -m_pOuter->GetAbsAngles()[YAW], vTranslated);
			x =  (int)floor(((vTranslated.x + m_fXOffset)/unit_density_eclipse_tile_res.GetFloat()) + m_iHalfSizeX + 0.5f);
			y =  (int)floor(((vTranslated.y + m_fYOffset)/unit_density_eclipse_tile_res.GetFloat()) + m_iHalfSizeY + 0.5f);	
		}
		break;
	case DENSITY_GAUSSIAN:
	default:
		{
			x =  (int)floor(((vPos.x - m_pOuter->GetAbsOrigin().x)/MAP_TILE_SIZE) + m_iHalfSizeX + 0.5f);
			y =  (int)floor(((vPos.y - m_pOuter->GetAbsOrigin().y)/MAP_TILE_SIZE) + m_iHalfSizeY + 0.5f);
		}
		break;
	}

	if( x < 0 || y < 0 || x >= m_iSizeX || y >= m_iSizeY )
		return 0.0f;

	return m_pWeights[x][y];
#endif // USELERP
}