123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- //Rotating door.
- //Based on The Dark Mod's CBinaryFrobMover.
- #include "../idlib/precompiled.h"
- #pragma hdrstop
- #include "Game_local.h"
- const idEventDef EV_rotdoor_open( "open", NULL );
- const idEventDef EV_rotdoor_close( "close", NULL );
- const idEventDef EV_rotdoor_isOpen( "isOpen", NULL, 'f' );
- CLASS_DECLARATION( idMover, idRotDoor )
- EVENT( EV_rotdoor_open, idRotDoor::Event_Open )
- EVENT( EV_rotdoor_close, idRotDoor::Event_Close )
- EVENT( EV_rotdoor_isOpen, idRotDoor::Event_isOpen )
- END_CLASS
- void idRotDoor::Save( idSaveGame *savefile ) const
- {
- savefile->WriteBool(shouldOpen);
- savefile->WriteAngles(m_Rotate);
- savefile->WriteVec3(m_ClosedPos);
- savefile->WriteVec3(m_OpenPos);
- savefile->WriteVec3(m_OpenDir);
- savefile->WriteAngles(m_ClosedAngles);
- savefile->WriteAngles(m_OpenAngles);
- }
- void idRotDoor::Restore( idRestoreGame *savefile )
- {
- savefile->ReadBool(shouldOpen);
- savefile->ReadAngles(m_Rotate);
- savefile->ReadVec3(m_ClosedPos);
- savefile->ReadVec3(m_OpenPos);
- savefile->ReadVec3(m_OpenDir);
- savefile->ReadAngles(m_ClosedAngles);
- savefile->ReadAngles(m_OpenAngles);
- }
- void idRotDoor::Spawn( void )
- {
- m_Rotate = spawnArgs.GetAngles("rotate", "0 90 0");
- m_ClosedAngles = physicsObj.GetLocalAngles();
- m_ClosedAngles.Normalize180();
- m_OpenAngles = (m_ClosedAngles + m_Rotate).Normalize180();
- idRotation rot = m_Rotate.ToRotation();
- idVec3 rotationAxis = rot.GetVec();
- idVec3 normal = rotationAxis.Cross(m_ClosedPos);
- m_OpenDir = (m_OpenPos * normal) * normal;
- m_OpenDir.Normalize();
- this->shouldOpen = true;
- }
- void idRotDoor::Event_isOpen( void )
- {
- idThread::ReturnInt( IsOpen() );
- }
- bool idRotDoor::IsOpen( void )
- {
- return ( !this->shouldOpen );
- }
- void idRotDoor::Event_Activate( idEntity *activator )
- {
- idAngles targetAngles = this->shouldOpen ? m_OpenAngles : m_ClosedAngles;
- idAngles angleDelta = (targetAngles - physicsObj.GetLocalAngles()).Normalize180();
- if (!angleDelta.Compare(idAngles(0,0,0)))
- {
- Event_RotateOnce(angleDelta);
- if (this->shouldOpen)
- {
- StartSound( "snd_open", SND_CHANNEL_ANY, 0, false, NULL );
- Signal( SIG_MOVER_1TO2 );
- }
- else
- StartSound( "snd_close", SND_CHANNEL_ANY, 0, false, NULL );
- }
- this->shouldOpen = !this->shouldOpen;
- }
- void idRotDoor::Event_Open( void )
- {
- this->shouldOpen = true;
- this->Event_Activate( NULL );
- }
- void idRotDoor::Event_Close( void )
- {
- this->shouldOpen = false;
- this->Event_Activate( NULL );
- }
|