123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350 |
- #include "../idlib/precompiled.h"
- #pragma hdrstop
- #include "Game_local.h"
- #define TIME_TO_FRONTMACHINE 400
- #define TIME_TO_PAUSE 400
- #define TIME_TO_LOOK_UP 500
- //const idEventDef EV_ButtonSwitcher_activate( "buttonswitcheractivate", "f" );
- CLASS_DECLARATION( idStaticEntity, idCybervendor )
- //EVENT( EV_ButtonSwitcher_activate, idButtonSwitcher::Event_buttonswitcheractivate)
- END_CLASS
- void idCybervendor::Save( idSaveGame *savefile ) const
- {
- savefile->WriteInt(state);
- savefile->WriteInt(nextUpdate);
- savefile->WriteInt(lerpStart);
- savefile->WriteInt(lerpEnd);
- savefile->WriteVec3(posStart);
- savefile->WriteVec3(posEnd);
- savefile->WriteVec3(angStart);
- savefile->WriteVec3(angEnd);
- savefile->WriteInt(count);
- }
- void idCybervendor::Restore( idRestoreGame *savefile )
- {
- savefile->ReadInt(state);
- savefile->ReadInt(nextUpdate);
- savefile->ReadInt(lerpStart);
- savefile->ReadInt(lerpEnd);
- savefile->ReadVec3(posStart);
- savefile->ReadVec3(posEnd);
- savefile->ReadVec3(angStart);
- savefile->ReadVec3(angEnd);
- savefile->ReadInt(count);
- }
- void idCybervendor::Spawn( void )
- {
- BecomeActive( TH_THINK );
- GetPhysics()->SetContents( CONTENTS_SOLID );
- GetPhysics()->SetClipMask( MASK_SOLID | CONTENTS_BODY | CONTENTS_CORPSE | CONTENTS_MOVEABLECLIP );
- this->noGrab = true;
- this->isFrobbable = true;
- state = 0;
- nextUpdate = 0;
- lerpStart = 0;
- lerpEnd = 0;
- count = 2;
- }
- void idCybervendor::OnFrob()
- {
- if (state == 0)
- {
- float player_z = gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin().z;
- float machine_z = this->GetPhysics()->GetOrigin().z;
- if (player_z < machine_z - 4)
- {
- StartSound( "snd_error", SND_CHANNEL_ANY, 0, false, NULL );
- return;
- }
- count *= 2;
- gameLocal.GetLocalPlayer()->Event_setFrozen(1);
- isFrobbable = 0;
- lerpStart = gameLocal.time;
- lerpEnd = gameLocal.time + TIME_TO_FRONTMACHINE; //time to transition to the machine front.
- idVec3 forward, right;
- GetPhysics()->GetAxis().ToAngles().ToVectors( &forward, &right );
- posEnd = this->GetPhysics()->GetOrigin() + (forward * 48) + (right * 12);
- posStart = gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin();
-
- angStart.x = gameLocal.GetLocalPlayer()->viewAngles.pitch;
- angStart.y = gameLocal.GetLocalPlayer()->viewAngles.yaw;
- angStart.z = gameLocal.GetLocalPlayer()->viewAngles.roll;
- if (angStart.y < 0)
- angStart.y += 360;
- if (angStart.y < 180)
- angStart.y += 360;
-
- angEnd.x = GetPhysics()->GetAxis().ToAngles().pitch + 5;
- angEnd.y = GetPhysics()->GetAxis().ToAngles().yaw + 180;
- angEnd.z = GetPhysics()->GetAxis().ToAngles().roll;
- if (angEnd.y < 0)
- angEnd.y += 360;
- if (angEnd.y < 180)
- angEnd.y += 360;
- StartSound( "snd_jingle", SND_CHANNEL_ANY, 0, false, NULL );
- state = 1;
- }
- }
- void idCybervendor::Think()
- {
- if (state == 1)
- {
- //lerp the player to the machine front AND look at the machine front.
- float lerp;
- float currentTime = gameLocal.time;
- float lookTimeMax = this->lerpEnd - this->lerpStart;
- float lookTimeMin = this->lerpStart;
- currentTime -= this->lerpStart;
- lerp = currentTime / lookTimeMax;
- idVec3 newPosition;
- newPosition.x = idMath::Lerp(posStart.x, posEnd.x, lerp);
- newPosition.y = idMath::Lerp(posStart.y, posEnd.y, lerp);
- newPosition.z = idMath::Lerp(posStart.z, posEnd.z, lerp);
- gameLocal.GetLocalPlayer()->GetPhysics()->SetOrigin(newPosition);
- idVec3 lookAng;
- lookAng.x = idMath::Lerp(this->angStart.x, this->angEnd.x, lerp);
- lookAng.y = idMath::Lerp(this->angStart.y, this->angEnd.y, lerp);
- lookAng.z = idMath::Lerp(this->angStart.z, this->angEnd.z, lerp);
- //common->Printf("%f : %f : %f %f %f\n", angStart.y, angEnd.y, lookAng.x, lookAng.y, lookAng.z);
-
- gameLocal.GetLocalPlayer()->Event_setviewangle(lookAng);
- //common->Printf("%f\n", lerp);
- if (lerp >= 1)
- {
- lerpEnd = gameLocal.time + TIME_TO_PAUSE;
- state = 2;
- }
- }
- else if (state == 2)
- {
- //pause.
- if (gameLocal.time >= lerpEnd)
- {
- angStart.x = gameLocal.GetLocalPlayer()->viewAngles.pitch;
- angStart.y = gameLocal.GetLocalPlayer()->viewAngles.yaw;
- angStart.z = gameLocal.GetLocalPlayer()->viewAngles.roll;
- if (angStart.y < 0)
- angStart.y += 360;
- if (angStart.y < 180)
- angStart.y += 360;
-
- angEnd.x = spawnArgs.GetInt("drillangle", "50");
- angEnd.y = GetPhysics()->GetAxis().ToAngles().yaw + 180;
- angEnd.z = GetPhysics()->GetAxis().ToAngles().roll;
- if (angEnd.y < 0)
- angEnd.y += 360;
- if (angEnd.y < 180)
- angEnd.y += 360;
- lerpStart = gameLocal.time;
- lerpEnd = gameLocal.time + TIME_TO_LOOK_UP; //time to transition to the machine front.
- state = 3;
- }
- }
- else if (state == 3)
- {
- //look at the hole.
- float lerp;
- float currentTime = gameLocal.time;
- float lookTimeMax = this->lerpEnd - this->lerpStart;
- float lookTimeMin = this->lerpStart;
- currentTime -= this->lerpStart;
- lerp = currentTime / lookTimeMax;
- //look up.
- idVec3 lookAng;
- lookAng.x = idMath::Lerp(this->angStart.x, this->angEnd.x, lerp);
- lookAng.y = idMath::Lerp(this->angStart.y, this->angEnd.y, lerp);
- lookAng.z = idMath::Lerp(this->angStart.z, this->angEnd.z, lerp);
- //common->Printf("%f : %f : %f %f %f\n", angStart.y, angEnd.y, lookAng.x, lookAng.y, lookAng.z);
-
- gameLocal.GetLocalPlayer()->Event_setviewangle(lookAng);
- if (lerp >= 1)
- {
- StartSound( "snd_drill", SND_CHANNEL_ANY, 0, false, NULL );
- idVec3 forward, right, up;
- GetPhysics()->GetAxis().ToAngles().ToVectors( &forward, &right, &up );
- posStart = this->GetPhysics()->GetOrigin() + (forward * 32) + (right * 12) + (up * 55);
- gameLocal.GetLocalPlayer()->Event_viewlook(posStart, 0.2f, 0, 1);
- lerpEnd = gameLocal.time + 1500;
- //gameLocal.GetLocalPlayer()->Event_ToggleBloom(1);
- cvarSystem->SetCVarString("g_testpostprocess", "textures/fx/fastforward_fast");
- state = 4;
- }
- }
- else if (state == 4)
- {
- //drilling.
- gameLocal.GetLocalPlayer()->Event_setviewangle(angEnd);
- if (gameLocal.time >= lerpEnd)
- {
- gameLocal.GetLocalPlayer()->Event_viewlook(posStart, 0.4f, 1, 0);
- StartSound( "snd_ding", SND_CHANNEL_ANY, 0, false, NULL );
-
- angStart.x = gameLocal.GetLocalPlayer()->viewAngles.pitch;
- angEnd.x = 20;
- angEnd.y = gameLocal.GetLocalPlayer()->viewAngles.yaw;
- lerpStart = gameLocal.time;
- lerpEnd = gameLocal.time + 300; //time to transition to the machine front.
- cvarSystem->SetCVarString("g_testpostprocess", "0");
- renderEntity.gui[0]->HandleNamedEvent("done");
- //spew some decals into the world.
- if (count <= 256)
- {
- idVec3 forward, right, up;
- GetPhysics()->GetAxis().ToAngles().ToVectors( &forward, &right, &up );
- idVec3 spitPoint = this->GetPhysics()->GetOrigin() + (forward * 25) + (right * 12) + (up * 128);
- int i;
- for (i = 0; i < count; i++)
- {
- idVec3 randSpot;
- randSpot = this->GetPhysics()->GetOrigin() + (forward * (25 + gameLocal.random.RandomFloat() * 64)) + (right * (12 - 64 + gameLocal.random.RandomFloat() * 128) ) + (up * 128);
- trace_t groundTr;
- gameLocal.clip.TracePoint( groundTr, randSpot, randSpot + idVec3(0,0,-1024), MASK_SOLID, this );
- if ((randSpot - spitPoint).Normalize() > 64)
- continue;
- gameLocal.ProjectDecal( groundTr.c.point, -groundTr.c.normal, 0.5f, true, 4 + gameLocal.random.RandomFloat() * 36, spawnArgs.GetString("mtr_oil") );
- }
- }
- state = 5;
- }
- }
- else if (state == 5)
- {
- //look up.
- float lerp;
- float currentTime = gameLocal.time;
- float lookTimeMax = this->lerpEnd - this->lerpStart;
- float lookTimeMin = this->lerpStart;
- currentTime -= this->lerpStart;
- lerp = currentTime / lookTimeMax;
- //look up.
- idVec3 lookAng;
- lookAng.x = idMath::Lerp(this->angStart.x, this->angEnd.x, lerp);
- lookAng.y = angEnd.y;
- lookAng.z = 0;
- //common->Printf("%f : %f : %f %f %f\n", angStart.y, angEnd.y, lookAng.x, lookAng.y, lookAng.z);
-
- gameLocal.GetLocalPlayer()->Event_setviewangle(lookAng);
- if (lerp >= 1)
- {
- gameLocal.GetLocalPlayer()->Event_setFrozen(0);
- isFrobbable = 1;
- state = 0;
- ActivateTargets( this );
- }
- }
- if (gameLocal.time > nextUpdate && state == 0)
- {
- //check if player angle faces the FRONT of the machine.
- idAngles playerAng = gameLocal.GetLocalPlayer()->viewAngles;
- playerAng.pitch = 0;
- playerAng.roll = 0;
- float vdot = DotProduct( this->GetPhysics()->GetAxis().ToAngles().ToForward(), playerAng.ToForward() );
- //check if player is positioned in FRONT of the machine.
- idVec3 forward;
- GetPhysics()->GetAxis().ToAngles().ToVectors( &forward );
- idVec3 frontOfMachinePos = this->GetPhysics()->GetOrigin() + (forward * 24);
- idVec3 toPlayer = frontOfMachinePos - gameLocal.GetLocalPlayer()->GetPhysics()->GetOrigin();
- idVec3 machineFacing = this->GetPhysics()->GetAxis().ToAngles().ToForward();
- float facingResult = DotProduct( toPlayer, machineFacing );
- //gameLocal.GetLocalPlayer()->DebugMessage(va("dot %f", facingResult));
- if (vdot < -0.1f && facingResult < 0)
- {
- this->isFrobbable = true;
- }
- else
- {
- this->isFrobbable = false;
- }
- nextUpdate = gameLocal.time + 300; //update every X milliseconds.
- }
-
- Present();
- }
|