|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
// copied from portal2 code; original code came with client-predicted counterpart,
// but implementing predictable triggers in tf2 wasn't trivial so this is just the
// server component. it works but causes prediction errors.
#ifndef TRIGGER_CATAPULT_H
#define TRIGGER_CATAPULT_H
#ifdef _WIN32
#pragma once
#endif
#include "triggers.h"
class CTriggerCatapult : public CBaseTrigger { DECLARE_CLASS( CTriggerCatapult, CBaseTrigger ); DECLARE_DATADESC(); //DECLARE_SERVERCLASS();
public:
CTriggerCatapult( void );
virtual void Spawn( void ); virtual void StartTouch( CBaseEntity *pOther ); virtual void EndTouch( CBaseEntity *pOther ); virtual int DrawDebugTextOverlays(void); virtual void DrawDebugGeometryOverlays( void );
void LaunchThink( void );
void PlayerPassesTriggerFiltersThink( void ); static const char *s_szPlayerPassesTriggerFiltersThinkContext;
private: void InputSetPlayerSpeed( inputdata_t &in ); void InputSetPhysicsSpeed( inputdata_t &in ); void InputSetLaunchTarget( inputdata_t &in ); void InputSetExactVelocityChoiceType( inputdata_t &in );
void LaunchByTarget( CBaseEntity *pVictim, CBaseEntity *pTarget ); Vector CalculateLaunchVector( CBaseEntity *pVictim, CBaseEntity *pTarget ); Vector CalculateLaunchVectorPreserve( Vector vecInitialVelocity, CBaseEntity *pVictim, CBaseEntity *pTarget, bool bForcePlayer = false );
void LaunchByDirection( CBaseEntity *pVictim ); void OnLaunchedVictim( CBaseEntity *pVictim );
float m_flRefireDelay[MAX_PLAYERS + 1]; float m_flPlayerVelocity; float m_flPhysicsVelocity; QAngle m_vecLaunchAngles; string_t m_strLaunchTarget; int m_ExactVelocityChoice; bool m_bUseExactVelocity; bool m_bUseThresholdCheck; float m_flLowerThreshold; float m_flUpperThreshold; float m_flEntryAngleTolerance; EHANDLE m_hLaunchTarget; bool m_bOnlyVelocityCheck; bool m_bApplyAngularImpulse; bool m_bPlayersPassTriggerFilters; float m_flAirControlSupressionTime; bool m_bDirectionSuppressAirControl;
//CNetworkArray( float, m_flRefireDelay, MAX_PLAYERS + 1 ); // 0 for physics object the rest for each player userid
//CNetworkVar( float, m_flPlayerVelocity );
//CNetworkVar( float, m_flPhysicsVelocity );
//CNetworkQAngle( m_vecLaunchAngles );
////CNetworkVar( string_t, m_strLaunchTarget );
//string_t m_strLaunchTarget;
//CNetworkVar( int, m_ExactVelocityChoice );
//CNetworkVar( bool, m_bUseExactVelocity );
//CNetworkVar( bool, m_bUseThresholdCheck );
//CNetworkVar( float, m_flLowerThreshold );
//CNetworkVar( float, m_flUpperThreshold );
//CNetworkVar( float, m_flEntryAngleTolerance );
//CNetworkHandle( CBaseEntity, m_hLaunchTarget );
//CNetworkVar( bool, m_bOnlyVelocityCheck );
//CNetworkVar( bool, m_bApplyAngularImpulse );
//CNetworkVar( bool, m_bPlayersPassTriggerFilters );
//CNetworkVar( float, m_flAirControlSupressionTime ); // After catapult, stop air control for this long (or default of quarter second if this value is negative)
//CNetworkVar( bool, m_bDirectionSuppressAirControl ); // Do we want to use air control suppression for directional catapults.
COutputEvent m_OnCatapulted;
CUtlVector< EHANDLE > m_hAbortedLaunchees; };
#endif // TRIGGER_CATAPULT_H
|