etqw-sdk/source/game/misc/Door.h

255 lines
8.0 KiB
C++

// Copyright (C) 2007 Id Software, Inc.
//
#ifndef __GAME_DOOR_H__
#define __GAME_DOOR_H__
#include "../Mover.h"
#include "../misc/RenderEntityBundle.h"
class sdDoorPhysicsNetworkData : public sdEntityStateNetworkData {
public:
sdDoorPhysicsNetworkData( void ) { ; }
virtual void MakeDefault( void );
virtual void Write( idFile* file ) const;
virtual void Read( idFile* file );
float currentPos;
bool closing;
};
class sdPhysics_Door : public idPhysics_Base {
public:
sdPhysics_Door( void );
~sdPhysics_Door( void );
bool IsClosed( void ) const { return currentPos == 0.f; }
bool IsOpen( void ) const { return currentPos == 1.f; }
bool IsClosing( void ) const { return destPos == 0.f && currentPos != destPos; }
bool IsOpening( void ) const { return destPos == 1.f && currentPos != destPos; }
bool Open( void );
bool Close( void );
void OpenPortals( void );
void ClosePortals( void );
void SetBodyProperties( int id, const idVec3& _pos1, const idVec3& _pos2, const idMat3& axes, bool pusher );
void UpdateBodyPosition( int id );
bool SetCurrentPos( float newPos );
void SetSpeed( float _speed ) { speed = _speed; }
virtual void SetClipModel( idClipModel *model, float density, int id, bool freeOld = true );
virtual idClipModel* GetClipModel( int id ) const;
virtual int GetNumClipModels( void ) const;
virtual void SetContents( int contents, int id );
virtual int GetContents( int id ) const;
virtual const idBounds& GetBounds( int id ) const;
virtual const idBounds& GetAbsBounds( int id ) const;
virtual bool Evaluate( int timeStepMSec, int endTimeMSec );
virtual bool IsAtRest( void ) const;
virtual bool IsPushable( void ) const;
virtual bool EvaluateContacts( CLIP_DEBUG_PARMS_DECLARATION_ONLY );
virtual sdEntityStateNetworkData* CreateNetworkStructure( networkStateMode_t mode ) const;
virtual bool CheckNetworkStateChanges( networkStateMode_t mode, const sdEntityStateNetworkData& baseState ) const;
virtual void ApplyNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& newState );
virtual void ReadNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, const idBitMsg& msg ) const;
virtual void WriteNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, idBitMsg& msg ) const;
virtual const idVec3& GetOrigin( int id = 0 ) const;
virtual const idMat3& GetAxis( int id = 0 ) const;
virtual void EnableClip( void );
virtual void DisableClip( bool activateContacting = true );
virtual int GetClipMask( int id ) const;
virtual void SetClipMask( int mask, int id );
private:
struct body_t {
body_t( void ) { clipModel = NULL; }
idVec3 pos1;
idVec3 pos2;
idMat3 axes;
idVec3 currentOrigin;
idClipModel* clipModel;
int clipMask;
bool pusher;
};
idList< body_t > bodies;
float currentPos;
float destPos;
float speed;
};
struct doorSpawnInfo_t {
idStr name;
idStr group;
renderEntity_t renderEnt;
idTraceModel trm;
idVec3 pos1;
idVec3 pos2;
idMat3 axes;
bool pusher;
};
class sdDoorNetworkData : public sdScriptEntityNetworkData {
public:
sdDoorNetworkData( void ) { ; }
virtual void MakeDefault( void );
virtual void Write( idFile* file ) const;
virtual void Read( idFile* file );
int closeTime;
};
class idDoor : public sdScriptEntity {
public:
CLASS_PROTOTYPE( idDoor );
enum {
EVENT_PORTALSTATE = sdScriptEntity::EVENT_MAXEVENTS,
EVENT_MAXEVENTS
};
static const int TRIGGER_ID = 255;
static const int SND_TRIGGER_ID = 254;
idDoor( void );
~idDoor( void );
void Spawn( void );
void VectorForDir( float angle, idVec3 &vec );
virtual void Hide( void );
virtual void Show( void );
virtual void OnMasterReady( void );
virtual bool WantsTouch( void ) const { return !IsHidden(); }
virtual void UpdateModelTransform( void );
virtual void Present( void );
virtual bool CanCollide( const idEntity* other, int traceId ) const;
virtual void EnableClip( void );
virtual void DisableClip( bool activateContacting = true );
virtual void WriteDemoBaseData( idFile* file ) const;
virtual void ReadDemoBaseData( idFile* file );
bool Script_AllowOpen( idEntity* other );
virtual void PostMapSpawn( void );
void GetTraceModel( idTraceModel& trm );
bool IsOpen( void ) const;
bool IsPermanentlyOpen( void ) const;
void Use( idEntity *activator );
void Close( void );
void Open( void );
virtual bool WantsToThink( void ) const;
void OpenPortals( void );
void ClosePortals( bool force );
virtual void OnTeamBlocked( idEntity *blockedEntity, idEntity *blockingEntity );
virtual void OnTouch( idEntity *other, const trace_t& trace );
idEntity* GetActivator( void ) const { return activator; }
void SpawnDoorTrigger( void );
void SpawnSoundTrigger( void );
void SpectatorTouch( idPlayer* p, const trace_t& trace );
virtual void ReachedPosition( void );
virtual void Think( void );
void SetCloseTime( int time );
static void OnNewMapLoad( void );
static void OnMapClear( void );
virtual void OnMoveStarted( void ) { moving = true; }
virtual void OnMoveFinished( void ) { moving = false; }
virtual bool ClientReceiveEvent( int event, int time, const idBitMsg& msg );
virtual sdEntityStateNetworkData* CreateNetworkStructure( networkStateMode_t mode ) const;
virtual bool CheckNetworkStateChanges( networkStateMode_t mode, const sdEntityStateNetworkData& baseState ) const;
virtual void ApplyNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& newState );
virtual void ReadNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, const idBitMsg& msg ) const;
virtual void WriteNetworkState( networkStateMode_t mode, const sdEntityStateNetworkData& baseState, sdEntityStateNetworkData& newState, idBitMsg& msg ) const;
virtual const idVec3& GetWayPointOrigin( void ) const { return baseOrg; }
virtual const idBounds& GetWayPointBounds( void ) const { return baseBounds; }
virtual const idMat3& GetWayPointAxis( void ) const { return baseAxis; }
cheapDecalUsage_t GetDecalUsage( void ) { return CDU_LOCAL; }
virtual int GetModelDefHandle( int id = 0 );
private:
void CalcPositions( idVec3& pos1, idVec3& pos2 );
bool toggle;
bool moving;
idClipModel* trigger;
idClipModel* sndTrigger;
int nextSndTriggerTime;
int normalAxisIndex; // door faces X or Y for spectator teleports
const sdProgram::sdFunction* checkOpenFunc;
int closeTime;
int waitTime;
bool reverseOnBlock;
bool crushOnBlock;
bool isSlave;
idVec3 baseOrg;
idMat3 baseAxis;
idBounds baseBounds;
sdPortalState portal;
idList< sdRenderEntityBundle* > parts;
idEntityPtr< idEntity > activator;
sdPhysics_Door physicsObj;
static idList< doorSpawnInfo_t* > s_doorInfo;
void CalcTriggerBounds( float size, idBounds &bounds );
void LinkSoundTrigger( void );
void LinkTrigger( void );
void Event_Activate( idEntity *activator );
void Event_Close( void );
void Event_Open( void );
void Event_IsOpen( void );
void Event_IsClosed( void );
void Event_IsOpening( void );
void Event_IsClosing( void );
void Event_OpenPortal( void );
void Event_ClosePortal( void );
void Event_ForceClosePortal( void );
void Event_SetSkin( const char* skinname );
void Event_SetToggle( bool t );
};
#endif // __GAME_DOOR_H__