quake4-sdk/source/mpgame/vehicle/VehicleController.cpp

302 lines
6.7 KiB
C++
Raw Permalink Normal View History

2007-06-15 00:00:00 +00:00
//----------------------------------------------------------------
// VehicleController.cpp
//
// Copyright 2002-2004 Raven Software
//----------------------------------------------------------------
#include "../../idlib/precompiled.h"
#pragma hdrstop
#include "../Game_local.h"
#include "VehicleController.h"
#include "Vehicle.h"
/*
=====================
rvVehicleController::rvVehicleController
=====================
*/
rvVehicleController::rvVehicleController ( void ) {
mVehicle = NULL;
//mDriver = NULL;
mPosition = 0;
}
/*
=====================
rvVehicleController::Save
=====================
*/
void rvVehicleController::Save ( idSaveGame *savefile ) const {
mVehicle.Save ( savefile );
savefile->WriteInt ( mPosition );
}
/*
=====================
rvVehicleController::Restore
=====================
*/
void rvVehicleController::Restore ( idRestoreGame *savefile ) {
mVehicle.Restore ( savefile );
savefile->ReadInt ( mPosition );
}
/*
=====================
rvVehicleController::Drive
=====================
*/
bool rvVehicleController::Drive ( rvVehicle* vehicle, idActor* driver ) {
assert ( vehicle && driver );
// Flip the vehicle back over?
if ( vehicle->IsFlipped ( ) ) {
vehicle->AutoRight ( vehicle );
return false;
}
// Add the driver to the vehicle and cache the position it was added.
if ( -1 == (mPosition = vehicle->AddDriver ( 0, driver ) ) ) {
return false;
}
mVehicle = vehicle;
//twhitaker: for scripted callback events
vehicle->OnEnter();
if ( driver->IsType( idPlayer::GetClassType() ) ) {
idPlayer * player = static_cast< idPlayer *>( driver );
if ( player->GetHud() ) {
GetHud()->Activate( true, gameLocal.time );
GetHud()->HandleNamedEvent( "showExitmessage" );
}
}
return true;
}
/*
=====================
rvVehicleController::Eject
=====================
*/
bool rvVehicleController::Eject ( bool force ) {
if ( !GetVehicle() ) {
return true;
}
if ( GetDriver()->IsType( idPlayer::GetClassType() ) ) {
idPlayer * player = static_cast< idPlayer *>( GetDriver() );
if ( player->GetHud() ) {
GetHud()->HandleNamedEvent( "hideExitmessage" );
}
}
if ( mVehicle->RemoveDriver ( GetPosition(), force ) ) {
mVehicle->OnExit();
mVehicle = NULL;
return true;
}
return false;
}
/*
=====================
rvVehicleController::FindClearExitPoint
=====================
*/
bool rvVehicleController::FindClearExitPoint( idVec3& origin, idMat3& axis ) const {
return GetVehicle()->FindClearExitPoint( mPosition, origin, axis );
}
/*
=====================
rvVehicleController::KillVehicles
=====================
*/
void rvVehicleController::KillVehicles ( void ) {
KillEntities( idCmdArgs(), rvVehicle::GetClassType() );
}
/*
=====================
rvVehicleController::DrawHUD
=====================
*/
void rvVehicleController::DrawHUD ( void ) {
assert ( mVehicle );
if ( GetDriver() && GetDriver()->IsType( idPlayer::GetClassType() ) ) {
idPlayer * player = static_cast<idPlayer*>( GetDriver() );
rvVehicleWeapon * weapon = mVehicle->GetPosition( mPosition )->GetActiveWeapon();
if ( weapon ) {
if ( weapon->CanZoom() && player->IsZoomed() && player == gameLocal.GetLocalPlayer() ) {
weapon->GetZoomGui()->Redraw( gameLocal.time );
}
// if ( mVehicle->GetHud() ) {
// mVehicle->GetHud()->SetStateFloat( "tram_heatpct", weapon->GetOverheatPercent());
// mVehicle->GetHud()->SetStateFloat( "tram_overheat", weapon->GetOverheatState());
// }
}
}
mVehicle->DrawHUD ( mPosition );
}
/*
=====================
rvVehicleController::StartRadioChatter
=====================
*/
void rvVehicleController::StartRadioChatter ( void ) {
assert ( mVehicle );
if ( mVehicle->GetHud () ) {
mVehicle->GetHud ()->HandleNamedEvent( "radioChatterUp" );
}
}
/*
=====================
rvVehicleController::StopRadioChatter
=====================
*/
void rvVehicleController::StopRadioChatter ( void ) {
assert ( mVehicle );
if ( mVehicle->GetHud () ) {
mVehicle->GetHud ()->HandleNamedEvent( "radioChatterDown" );
}
}
/*
=====================
rvVehicleController::Give
=====================
*/
void rvVehicleController::Give ( const char* statname, const char* value ) {
if( mVehicle.IsValid() ) {
mVehicle->Give ( statname, value );
}
}
/*
=====================
rvVehicleController::GetEyePosition
=====================
*/
void rvVehicleController::GetEyePosition ( idVec3& origin, idMat3& axis ) const {
if( mVehicle.IsValid() ) {
mVehicle->GetEyePosition ( mPosition, origin, axis );
}
}
/*
=====================
rvVehicleController::GetDriverPosition
=====================
*/
void rvVehicleController::GetDriverPosition ( idVec3& origin, idMat3& axis ) const {
if( mVehicle.IsValid() ) {
mVehicle->GetDriverPosition ( mPosition, origin, axis );
}
}
/*
=====================
rvVehicleController::GetVehicle
=====================
*/
rvVehicle* rvVehicleController::GetVehicle ( void ) const {
return mVehicle;
}
idActor* rvVehicleController::GetDriver ( void ) const {
return (GetVehicle()) ? GetVehicle()->GetPosition(GetPosition())->GetDriver() : NULL;
}
/*
=====================
rvVehicleController::SetInput
=====================
*/
void rvVehicleController::SetInput ( const usercmd_t& cmd, const idAngles &angles ) {
if( mVehicle.IsValid() ) {
mVehicle->SetInput ( mPosition, cmd, angles );
}
}
/*
=====================
rvVehicleController::GetInput
=====================
*/
void rvVehicleController::GetInput( usercmd_t& cmd, idAngles &newAngles ) const {
if( mVehicle.IsValid() ) {
mVehicle->GetInput( mPosition, cmd, newAngles );
}
}
/*
================
rvVehicleController::GetHud
================
*/
idUserInterface* rvVehicleController::GetHud( void ) {
return (IsDriving()) ? mVehicle->GetHud() : NULL;
}
/*
================
rvVehicleController::GetHud
================
*/
const idUserInterface* rvVehicleController::GetHud( void ) const {
return (IsDriving()) ? mVehicle->GetHud() : NULL;
}
/*
================
rvVehicleController::WriteToSnapshot
================
*/
void rvVehicleController::WriteToSnapshot ( idBitMsgDelta &msg ) const {
msg.WriteLong ( mPosition );
msg.WriteLong ( mVehicle.GetSpawnId ( ) );
}
/*
================
rvVehicleController::ReadFromSnapshot
================
*/
void rvVehicleController::ReadFromSnapshot ( const idBitMsgDelta &msg ) {
mPosition = msg.ReadLong ( );
mVehicle.SetSpawnId ( msg.ReadLong ( ) );
}
/*
================
rvVehicleController::UpdateCursorGUI
================
*/
void rvVehicleController::UpdateCursorGUI ( idUserInterface* ui ) {
assert ( mVehicle );
mVehicle->UpdateCursorGUI ( mPosition, ui );
}
/*
================
rvVehicleController::SelectWeapon
================
*/
void rvVehicleController::SelectWeapon ( int weapon ) {
if( mVehicle.IsValid() ) {
mVehicle->GetPosition( mPosition )->SelectWeapon( weapon );
}
}