diff options
Diffstat (limited to 'game/server/triggers.h')
| -rw-r--r-- | game/server/triggers.h | 229 |
1 files changed, 229 insertions, 0 deletions
diff --git a/game/server/triggers.h b/game/server/triggers.h new file mode 100644 index 0000000..a591be7 --- /dev/null +++ b/game/server/triggers.h @@ -0,0 +1,229 @@ +//========= Copyright Valve Corporation, All rights reserved. ============// +// +// Purpose: +// +// $NoKeywords: $ +//=============================================================================// + +#ifndef TRIGGERS_H +#define TRIGGERS_H +#ifdef _WIN32 +#pragma once +#endif + +#include "basetoggle.h" +#include "entityoutput.h" + +// +// Spawnflags +// + +enum +{ + SF_TRIGGER_ALLOW_CLIENTS = 0x01, // Players can fire this trigger + SF_TRIGGER_ALLOW_NPCS = 0x02, // NPCS can fire this trigger + SF_TRIGGER_ALLOW_PUSHABLES = 0x04, // Pushables can fire this trigger + SF_TRIGGER_ALLOW_PHYSICS = 0x08, // Physics objects can fire this trigger + SF_TRIGGER_ONLY_PLAYER_ALLY_NPCS = 0x10, // *if* NPCs can fire this trigger, this flag means only player allies do so + SF_TRIGGER_ONLY_CLIENTS_IN_VEHICLES = 0x20, // *if* Players can fire this trigger, this flag means only players inside vehicles can + SF_TRIGGER_ALLOW_ALL = 0x40, // Everything can fire this trigger EXCEPT DEBRIS! + SF_TRIGGER_ONLY_CLIENTS_OUT_OF_VEHICLES = 0x200, // *if* Players can fire this trigger, this flag means only players outside vehicles can + SF_TRIG_PUSH_ONCE = 0x80, // trigger_push removes itself after firing once + SF_TRIG_PUSH_AFFECT_PLAYER_ON_LADDER = 0x100, // if pushed object is player on a ladder, then this disengages them from the ladder (HL2only) + SF_TRIG_TOUCH_DEBRIS = 0x400, // Will touch physics debris objects + SF_TRIGGER_ONLY_NPCS_IN_VEHICLES = 0X800, // *if* NPCs can fire this trigger, only NPCs in vehicles do so (respects player ally flag too) + SF_TRIGGER_DISALLOW_BOTS = 0x1000, // Bots are not allowed to fire this trigger +}; + +// DVS TODO: get rid of CBaseToggle +//----------------------------------------------------------------------------- +// Purpose: +//----------------------------------------------------------------------------- +class CBaseTrigger : public CBaseToggle +{ + DECLARE_CLASS( CBaseTrigger, CBaseToggle ); +public: + CBaseTrigger(); + + void Activate( void ); + virtual void PostClientActive( void ); + void InitTrigger( void ); + + void Enable( void ); + void Disable( void ); + void Spawn( void ); + void UpdateOnRemove( void ); + void TouchTest( void ); + + // Input handlers + virtual void InputEnable( inputdata_t &inputdata ); + virtual void InputDisable( inputdata_t &inputdata ); + virtual void InputDisableAndEndTouch( inputdata_t &inputdata ); + virtual void InputToggle( inputdata_t &inputdata ); + virtual void InputTouchTest ( inputdata_t &inputdata ); + + virtual void InputStartTouch( inputdata_t &inputdata ); + virtual void InputEndTouch( inputdata_t &inputdata ); + + virtual bool UsesFilter( void ){ return ( m_hFilter.Get() != NULL ); } + virtual bool PassesTriggerFilters(CBaseEntity *pOther); + virtual void StartTouch(CBaseEntity *pOther); + virtual void EndTouch(CBaseEntity *pOther); + virtual void StartTouchAll() {} + virtual void EndTouchAll() {} + virtual bool IsTouching( const CBaseEntity *pOther ) const; + + CBaseEntity *GetTouchedEntityOfType( const char *sClassName ); + + int DrawDebugTextOverlays(void); + + // by default, triggers don't deal with TraceAttack + void TraceAttack(CBaseEntity *pAttacker, float flDamage, const Vector &vecDir, trace_t *ptr, int bitsDamageType) {} + + bool PointIsWithin( const Vector &vecPoint ); + + bool m_bDisabled; + string_t m_iFilterName; + CHandle<class CBaseFilter> m_hFilter; + +protected: + + // Outputs + COutputEvent m_OnStartTouch; + COutputEvent m_OnStartTouchAll; + COutputEvent m_OnEndTouch; + COutputEvent m_OnEndTouchAll; + COutputEvent m_OnTouching; + COutputEvent m_OnNotTouching; + + // Entities currently being touched by this trigger + CUtlVector< EHANDLE > m_hTouchingEntities; + + DECLARE_DATADESC(); +}; + +//----------------------------------------------------------------------------- +// Purpose: Variable sized repeatable trigger. Must be targeted at one or more entities. +// If "delay" is set, the trigger waits some time after activating before firing. +// "wait" : Seconds between triggerings. (.2 default/minimum) +//----------------------------------------------------------------------------- +class CTriggerMultiple : public CBaseTrigger +{ + DECLARE_CLASS( CTriggerMultiple, CBaseTrigger ); +public: + void Spawn( void ); + void MultiTouch( CBaseEntity *pOther ); + void MultiWaitOver( void ); + void ActivateMultiTrigger(CBaseEntity *pActivator); + + DECLARE_DATADESC(); + + // Outputs + COutputEvent m_OnTrigger; +}; + +// Global list of triggers that care about weapon fire +extern CUtlVector< CHandle<CTriggerMultiple> > g_hWeaponFireTriggers; + + +//------------------------------------------------------------------------------ +// Base VPhysics trigger implementation +// NOTE: This uses vphysics to compute touch events. It doesn't do a per-frame Touch call, so the +// Entity I/O is different from a regular trigger +//------------------------------------------------------------------------------ +#define SF_VPHYSICS_MOTION_MOVEABLE 0x1000 + +class CBaseVPhysicsTrigger : public CBaseEntity +{ + DECLARE_CLASS( CBaseVPhysicsTrigger , CBaseEntity ); + +public: + DECLARE_DATADESC(); + + virtual void Spawn(); + virtual void UpdateOnRemove(); + virtual bool CreateVPhysics(); + virtual void Activate( void ); + virtual bool PassesTriggerFilters(CBaseEntity *pOther); + + // UNDONE: Pass trigger event in or change Start/EndTouch. Add ITriggerVPhysics perhaps? + // BUGBUG: If a player touches two of these, his movement will screw up. + // BUGBUG: If a player uses crouch/uncrouch it will generate touch events and clear the motioncontroller flag + virtual void StartTouch( CBaseEntity *pOther ); + virtual void EndTouch( CBaseEntity *pOther ); + + void InputToggle( inputdata_t &inputdata ); + void InputEnable( inputdata_t &inputdata ); + void InputDisable( inputdata_t &inputdata ); + + +protected: + bool m_bDisabled; + string_t m_iFilterName; + CHandle<class CBaseFilter> m_hFilter; +}; + +//----------------------------------------------------------------------------- +// Purpose: Hurts anything that touches it. If the trigger has a targetname, +// firing it will toggle state. +//----------------------------------------------------------------------------- + +// This class is to get around the fact that DEFINE_FUNCTION doesn't like multiple inheritance +class CTriggerHurtShim : public CBaseTrigger +{ + virtual void RadiationThink( void ) = 0; + virtual void HurtThink( void ) = 0; + +public: + + void RadiationThinkShim( void ){ RadiationThink(); } + void HurtThinkShim( void ){ HurtThink(); } +}; + +DECLARE_AUTO_LIST( ITriggerHurtAutoList ); +class CTriggerHurt : public CTriggerHurtShim, public ITriggerHurtAutoList +{ +public: + CTriggerHurt() + { + // This field came along after levels were built so the field defaults to 20 here in the constructor. + m_flDamageCap = 20.0f; + } + + DECLARE_CLASS( CTriggerHurt, CTriggerHurtShim ); + + void Spawn( void ); + void RadiationThink( void ); + void HurtThink( void ); + void Touch( CBaseEntity *pOther ); + void EndTouch( CBaseEntity *pOther ); + bool HurtEntity( CBaseEntity *pOther, float damage ); + int HurtAllTouchers( float dt ); + + DECLARE_DATADESC(); + + float m_flOriginalDamage; // Damage as specified by the level designer. + float m_flDamage; // Damage per second. + float m_flDamageCap; // Maximum damage per second. + float m_flLastDmgTime; // Time that we last applied damage. + float m_flDmgResetTime; // For forgiveness, the time to reset the counter that accumulates damage. + int m_bitsDamageInflict; // DMG_ damage type that the door or tigger does + int m_damageModel; + bool m_bNoDmgForce; // Should damage from this trigger impart force on what it's hurting + + enum + { + DAMAGEMODEL_NORMAL = 0, + DAMAGEMODEL_DOUBLE_FORGIVENESS, + }; + + // Outputs + COutputEvent m_OnHurt; + COutputEvent m_OnHurtPlayer; + + CUtlVector<EHANDLE> m_hurtEntities; +}; + +bool IsTakingTriggerHurtDamageAtPoint( const Vector &vecPoint ); + +#endif // TRIGGERS_H |