213 lines
5.1 KiB
C++
213 lines
5.1 KiB
C++
//-----------------------------------------------------------------------------
|
|
//
|
|
// $Logfile:: /EF2/Code/DLLs/game/stationaryvehicle.cpp $
|
|
// $Revision:: 8 $
|
|
// $Author:: Singlis $
|
|
// $Date:: 9/26/03 2:36p $
|
|
//
|
|
// Copyright (C) 1997 by Ritual Entertainment, Inc.
|
|
// All rights reserved.
|
|
//
|
|
// This source is may not be distributed and/or modified without
|
|
// expressly written permission by Ritual Entertainment, Inc.
|
|
//
|
|
|
|
#include "stationaryvehicle.hpp"
|
|
#include "player.h"
|
|
|
|
|
|
CLASS_DECLARATION(Vehicle, StationaryVehicle, NULL)
|
|
{
|
|
{ NULL, NULL }
|
|
};
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
//
|
|
// Name: StationaryVehicle
|
|
// Class: StationaryVehicle
|
|
//
|
|
// Description:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//-----------------------------------------------------
|
|
StationaryVehicle::StationaryVehicle()
|
|
{
|
|
_yawDeltaDegrees = 0.0f;
|
|
_pitchDeltaDegrees = 0.0f;
|
|
|
|
}
|
|
|
|
|
|
//-----------------------------------------------------
|
|
//
|
|
// Name: ~StationaryVehicle
|
|
// Class: StationaryVehicle
|
|
//
|
|
// Description:
|
|
//
|
|
// Parameters:
|
|
//
|
|
// Returns:
|
|
//-----------------------------------------------------
|
|
StationaryVehicle::~StationaryVehicle()
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
//
|
|
// Name: Postthink
|
|
// Class: StationaryVehicle
|
|
//
|
|
// Description: Updates the vehicle location based upon the user input.
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//-----------------------------------------------------
|
|
void StationaryVehicle::Postthink()
|
|
{
|
|
if(drivable)
|
|
{
|
|
turnangle = turnangle * 0.25f + turnimpulse;
|
|
pitchangle = pitchangle * 0.25f + pitchimpulse;
|
|
|
|
float turn = turnangle * ( 1.0f / 200.0f );
|
|
float pitch = pitchangle * ( 1.0f / 200.0f );
|
|
|
|
avelocity *= 0.05f;
|
|
avelocity.y += turn * 200.0f;
|
|
avelocity.x += pitch * 200.0f;
|
|
|
|
angles += avelocity * level.frametime;
|
|
setAngles(angles);
|
|
}
|
|
|
|
PositionVehicleAndDriver();
|
|
|
|
}
|
|
|
|
//-----------------------------------------------------
|
|
//
|
|
// Name: PositionVehicleAndDriver
|
|
// Class: StationaryVehicle
|
|
//
|
|
// Description: Positions the vehicle and driver of the vehicle. This positioning is based
|
|
// upon the amount of delta angles the user has moved the mouse.
|
|
// Pitch and yaw restrictions can be set through the tiki file to restrict the players
|
|
// view angles.
|
|
//
|
|
// Parameters: None
|
|
//
|
|
// Returns: None
|
|
//-----------------------------------------------------
|
|
void StationaryVehicle::PositionVehicleAndDriver(void)
|
|
{
|
|
if(driver == 0)
|
|
return;
|
|
|
|
if(!driver->isSubclassOf(Player))
|
|
return;
|
|
|
|
Vector i,j,k;
|
|
i = Vector( orientation[ 0 ] );
|
|
j = Vector( orientation[ 1 ] );
|
|
k = Vector( orientation[ 2 ] );
|
|
|
|
Player * player;
|
|
player = ( Player * )( Sentient * )driver;
|
|
player->setOrigin( origin + ( i * driveroffset[PITCH] ) + ( j * driveroffset[YAW] ) + ( k * driveroffset[ROLL] ) );
|
|
|
|
if(!drivable)
|
|
return;
|
|
|
|
player->velocity = vec_zero;
|
|
|
|
//Adjust the pitch and normalize the degrees based upon the location of our pitch seam
|
|
angles[PITCH] += _pitchDeltaDegrees;
|
|
angles[PITCH] = AngleNormalizeArbitrary( angles[PITCH], _pitchSeam);
|
|
if( _restrictPitch )
|
|
{
|
|
if(angles[PITCH] < _minimumPitch)
|
|
{
|
|
angles[PITCH] = _minimumPitch;
|
|
}
|
|
|
|
if(angles[PITCH] > _maximumPitch)
|
|
{
|
|
angles[PITCH] = _maximumPitch;
|
|
}
|
|
}
|
|
|
|
/// Adjust the yaw and normalize the degrees based upon the location of our yaw seam.
|
|
angles[YAW] += _yawDeltaDegrees;
|
|
angles[YAW] = AngleNormalizeArbitrary( angles[YAW], _yawSeam);
|
|
if( _restrictYaw )
|
|
{
|
|
|
|
/// Clamp yaw to the range [ _minimumRotate, _maximumRotate ]
|
|
if( angles[ YAW ] > _maximumYaw )
|
|
{
|
|
angles[ YAW ] = _maximumYaw;
|
|
}
|
|
|
|
if( angles[ YAW ] < _minimumYaw )
|
|
{
|
|
angles[ YAW ] = _minimumYaw;
|
|
}
|
|
}
|
|
|
|
//Set the player view angles based on the resulting vehicle angles
|
|
player->SetViewAngles(angles);
|
|
}
|
|
|
|
|
|
|
|
//-----------------------------------------------------
|
|
//
|
|
// Name: Drive
|
|
// Class: StationaryVehicle
|
|
//
|
|
// Description: Retrieves the user commands to determine the location of the vehicle.
|
|
//
|
|
// Parameters: ucmd - the user command structure
|
|
//
|
|
// Returns: qtrue - always
|
|
//-----------------------------------------------------
|
|
//virtual
|
|
qboolean StationaryVehicle::Drive(usercmd_t* ucmd)
|
|
{
|
|
Vector i, j, k;
|
|
|
|
if ( !driver || !driver->isClient() )
|
|
{
|
|
return false;
|
|
}
|
|
|
|
if ( !drivable )
|
|
{
|
|
driver->client->ps.pm_flags |= PMF_FROZEN;
|
|
ucmd->forwardmove = 0.0f;
|
|
ucmd->rightmove = 0.0f;
|
|
return false;
|
|
}
|
|
|
|
if(_noPrediction )
|
|
{
|
|
driver->client->ps.pm_flags |= PMF_NO_PREDICTION;
|
|
}
|
|
|
|
turnimpulse = angledist( SHORT2ANGLE( ucmd->angles[ YAW ] ) - driver->client->cmd_angles[ YAW ] );
|
|
pitchimpulse = angledist( SHORT2ANGLE( ucmd->angles[ PITCH ] ) - driver->client->cmd_angles[ PITCH ] );
|
|
|
|
_yawDeltaDegrees = SHORT2ANGLE(ucmd->deltaAngles[ YAW ] );
|
|
_pitchDeltaDegrees = SHORT2ANGLE(ucmd->deltaAngles[ PITCH ] );
|
|
|
|
return qtrue;
|
|
}
|