123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235 |
- #include "../idlib/precompiled.h"
- #pragma hdrstop
- #include "Game_local.h"
- const idEventDef EV_powersaw_spawndelay( "<powersaw_spawndelay>" );
- const idEventDef EV_powersaw_reset( "powersawreset" );
- CLASS_DECLARATION( idMover, idPowerSawGeneric )
-
- EVENT( EV_powersaw_spawndelay, idPowerSawGeneric::Spawn2)
- EVENT( EV_powersaw_reset, idPowerSawGeneric::reset)
- END_CLASS
- void idPowerSawGeneric::Save( idSaveGame *savefile ) const
- {
- savefile->WriteInt(state);
- savefile->WriteInt(nextSparktime);
- savefile->WriteString(callName.c_str());
- savefile->WriteObject(mover);
- savefile->WriteObject(splineEnt);
- savefile->WriteObject(sparks);
- savefile->WriteObject(light);
- }
- void idPowerSawGeneric::Restore( idRestoreGame *savefile )
- {
- savefile->ReadInt(state);
- savefile->ReadInt(nextSparktime);
- savefile->ReadString(callName);
- savefile->ReadObject(reinterpret_cast<idClass *&>(mover));
- savefile->ReadObject(reinterpret_cast<idClass *&>(splineEnt));
- savefile->ReadObject(reinterpret_cast<idClass *&>(sparks));
- savefile->ReadObject(reinterpret_cast<idClass *&>(light));
- }
- void idPowerSawGeneric::Spawn2( void )
- {
- idDict args;
- idStr splineName = spawnArgs.GetString( "spline" );
- splineName.StripTrailingWhitespace();
- splineName.StripLeading(' ');
- if ( !splineName.Length() )
- {
- gameLocal.Error( "idPowerSawGeneric '%s' at (%s) doesn't have 'spline' key specified", name.c_str(), GetPhysics()->GetOrigin().ToString(0) );
- }
- splineEnt = gameLocal.FindEntity( splineName );
-
- if (!splineEnt)
- {
- gameLocal.Error( "idPowerSawGeneric '%s' at (%s) can't find spline '%s'", name.c_str(), GetPhysics()->GetOrigin().ToString(0), splineName.c_str() );
- }
- splineEnt->Hide();
- int movetime = spawnArgs.GetFloat("movetime", "6");
- int acceltime = spawnArgs.GetFloat("acceltime", "2");
- int deceltime = spawnArgs.GetFloat("deceltime", "1");
- args.Clear();
- args.SetVector( "origin", splineEnt->GetPhysics()->GetOrigin() );
- args.Set( "model", "models/powersaw/tris.ase" );
- args.SetInt( "solid", 0 );
- args.SetInt( "frobbable", 0 );
- args.Set( "onsplineend", this->GetName() );
- mover = ( idMover * )gameLocal.SpawnEntityType( idMover::Type, &args );
- //mover->SetAngles( this->GetPhysics()->GetAxis().ToAngles() );
- mover->Event_SetMoveTime( movetime );
- mover->Event_SetAccellerationTime( acceltime);
- mover->Event_SetDecelerationTime( deceltime );
- args.Clear();
- args.SetVector("origin", mover->GetPhysics()->GetOrigin() );
- args.SetInt( "noshadows", 1);
- args.Set("texture", "lights/powersaw" );
- light = ( idLight * )gameLocal.SpawnEntityType( idLight::Type, &args );
- light->SetRadius(64);
- light->Event_FadeLight(0.3f, idVec3(0.8,0.5,0));
- light->Event_Off();
- light->Bind(mover, false);
-
-
- if (spawnArgs.GetInt("ceiling", "0") == 1)
- {
- idAngles moverAng = mover->GetPhysics()->GetAxis().ToAngles();
- moverAng.roll += 180;
- mover->SetAngles(moverAng);
- }
- mover->Hide();
- state = IDLE;
- nextSparktime = 0;
- BecomeActive( TH_THINK );
- }
- void idPowerSawGeneric::Spawn( void )
- {
- state = IDLE;
- //force a little delay to let all world entities spawn in.
- PostEventSec( &EV_powersaw_spawndelay, 0.3f );
- }
- void idPowerSawGeneric::Think( void )
- {
-
- if (gameLocal.time > nextSparktime && state == SAWING)
- {
- idDict args;
- nextSparktime = gameLocal.time + 2500;
-
- args.Clear();
- args.SetVector( "origin", this->mover->GetPhysics()->GetOrigin() );
- args.Set( "model", "sparkloop.prt" );
- args.SetBool( "start_off", false );
- sparks = gameLocal.SpawnEntityType( idExplodable::Type, &args );
- sparks->Bind(mover, false);
- StartSound( "snd_sawhit" , SND_CHANNEL_BODY2, 0, false, NULL );
- }
- idMover::Think();
- }
- void idPowerSawGeneric::OnSplineEnd( void )
- {
- if (state == IDLE)
- {
- //if the grate is reset during sawing, then we end up here.
- return;
- }
- //BC 7-20-2016 fix saveload crash. do not spline end if it's already done.
- if (state == DONE)
- {
- return;
- }
- state = DONE;
- sparks->PostEventMS( &EV_Remove, 0 );
- mover->Hide();
- light->Event_Off();
- StartSound( "snd_sawend" , SND_CHANNEL_ANY, 0, false, NULL );
- StopSound( SND_CHANNEL_BODY2, false );
- StopSound( SND_CHANNEL_BODY3, false );
-
- idStr scriptName = spawnArgs.GetString( "call" );
- const function_t *scriptFunction;
- scriptFunction = gameLocal.program.FindFunction( scriptName );
- if ( scriptFunction )
- {
- idThread *thread;
- thread = new idThread( scriptFunction );
- thread->DelayedStart( 0 );
- }
-
- }
- void idPowerSawGeneric::Frob( void )
- {
- //BC 5-15-2015
- //auto detect whether buzzsaw appears on floor or ceiling.
- if (spawnArgs.GetInt("ceiling") >= 2)
- {
- float eye_z = gameLocal.GetLocalPlayer()->GetEyePosition().z;
- float grate_z = GetPhysics()->GetOrigin().z;
- if (grate_z > eye_z)
- {
- //ceiling.
- idAngles moverAng = mover->GetPhysics()->GetAxis().ToAngles();
- moverAng.roll += 180;
- mover->SetAngles(moverAng);
- }
- else
- {
- //floor.
- }
- }
- this->isFrobbable = false;
-
- //start the mover.
- mover->Show();
- mover->Event_StartSpline(splineEnt);
- light->Event_On();
- StartSound( "snd_sawloop" , SND_CHANNEL_BODY3, 0, false, NULL );
- state = SAWING;
- }
- void idPowerSawGeneric::reset( void )
- {
- state = IDLE;
- nextSparktime = 0;
- this->isFrobbable = true;
- this->Event_StopMoving();
- mover->Event_StopMoving();
- mover->Hide();
- light->Event_Off();
- this->GetPhysics()->SetOrigin( this->originalPosition);
- this->GetPhysics()->SetAxis( this->originalAngle);
- this->UpdateVisuals();
- }
|