/* ================ idSecurityCamera::Think ================ */ void idSecurityCamera::Think( void ) { float pct; float travel; if( thinkFlags & TH_THINK ) { if( g_showEntityInfo.GetBool() ) { DrawFov(); } if( health <= 0 ) { BecomeInactive( TH_THINK ); return; } } // run physics RunPhysics(); if( thinkFlags & TH_THINK ) { if( CanSeePlayer() ) { if( alertMode == SCANNING ) { float sightTime; SetAlertMode( ALERT ); stopSweeping = gameLocal.time; if( sweeping ) { CancelEvents( &EV_SecurityCam_Pause ); } else { CancelEvents( &EV_SecurityCam_ReverseSweep ); } sweeping = false; StopSound( SND_CHANNEL_ANY, false ); StartSound( "snd_sight", SND_CHANNEL_BODY, 0, false, NULL ); sightTime = spawnArgs.GetFloat( "sightTime", "5" ); PostEventSec( &EV_SecurityCam_Alert, sightTime ); } } else { if( alertMode == ALERT ) { float sightResume; SetAlertMode( LOSINGINTEREST ); CancelEvents( &EV_SecurityCam_Alert ); sightResume = spawnArgs.GetFloat( "sightResume", "1.5" ); PostEventSec( &EV_SecurityCam_ContinueSweep, sightResume ); } if( sweeping ) { idAngles a = GetPhysics()->GetAxis().ToAngles(); pct = ( gameLocal.time - sweepStart ) / ( sweepEnd - sweepStart ); travel = pct * sweepAngle; if( negativeSweep ) { a.yaw = angle + travel; } else { a.yaw = angle - travel; } SetAngles( a ); } } } Present(); }
/* ================ idSecurityCamera::Spawn ================ */ void idSecurityCamera::Spawn( void ) { idStr str; sweepAngle = spawnArgs.GetFloat( "sweepAngle", "90" ); health = spawnArgs.GetInt( "health", "100" ); scanFov = spawnArgs.GetFloat( "scanFov", "90" ); scanDist = spawnArgs.GetFloat( "scanDist", "200" ); flipAxis = spawnArgs.GetBool( "flipAxis" ); modelAxis = spawnArgs.GetInt( "modelAxis" ); if ( modelAxis < 0 || modelAxis > 2 ) { modelAxis = 0; } spawnArgs.GetVector( "viewOffset", "0 0 0", viewOffset ); if ( spawnArgs.GetBool( "spotLight" ) ) { PostEventMS( &EV_SecurityCam_AddLight, 0 ); } negativeSweep = ( sweepAngle < 0 ) ? true : false; sweepAngle = abs( sweepAngle ); scanFovCos = cos( scanFov * idMath::PI / 360.0f ); angle = GetPhysics()->GetAxis().ToAngles().yaw; StartSweep(); SetAlertMode( SCANNING ); BecomeActive( TH_THINK ); if ( health ) { fl.takedamage = true; } pvsArea = gameLocal.pvs.GetPVSArea( GetPhysics()->GetOrigin() ); // if no target specified use ourself str = spawnArgs.GetString( "cameraTarget" ); if ( str.Length() == 0 ) { spawnArgs.Set( "cameraTarget", spawnArgs.GetString( "name" ) ); } // check if a clip model is set spawnArgs.GetString( "clipmodel", "", str ); if ( !str[0] ) { str = spawnArgs.GetString( "model" ); // use the visual model } if ( !collisionModelManager->TrmFromModel( str, trm ) ) { gameLocal.Error( "idSecurityCamera '%s': cannot load collision model %s", name.c_str(), str.c_str() ); return; } GetPhysics()->SetContents( CONTENTS_SOLID ); GetPhysics()->SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP ); // setup the physics UpdateChangeableSpawnArgs( NULL ); }
/* ================ idSecurityCamera::Event_Alert ================ */ void idSecurityCamera::Event_Alert( void ) { float wait; SetAlertMode( ACTIVATED ); StopSound( SND_CHANNEL_ANY, false ); StartSound( "snd_activate", SND_CHANNEL_BODY, 0, false, NULL ); ActivateTargets( this ); CancelEvents( &EV_SecurityCam_ContinueSweep ); wait = spawnArgs.GetFloat( "wait", "20" ); PostEventSec( &EV_SecurityCam_ContinueSweep, wait ); }
/* ================ idSecurityCamera::Event_ContinueSweep ================ */ void idSecurityCamera::Event_ContinueSweep( void ) { float pct = ( stopSweeping - sweepStart ) / ( sweepEnd - sweepStart ); float f = gameLocal.time - ( sweepEnd - sweepStart ) * pct; int speed; sweepStart = f; speed = MS2SEC( SweepSpeed() ); sweepEnd = sweepStart + speed; PostEventMS( &EV_SecurityCam_Pause, speed * ( 1.0 - pct ) ); StartSound( "snd_moving", SND_CHANNEL_BODY, 0, false, NULL ); SetAlertMode( SCANNING ); sweeping = true; }