mirror of
https://github.com/nillerusr/source-engine.git
synced 2024-12-23 14:46:53 +00:00
279 lines
8.1 KiB
C++
279 lines
8.1 KiB
C++
//========= Copyright Valve Corporation, All rights reserved. ============//
|
|
//
|
|
// Purpose:
|
|
//
|
|
//=============================================================================//
|
|
|
|
#ifndef C_WEAPON_PORTALGUN_H
|
|
#define C_WEAPON_PORTALGUN_H
|
|
|
|
#ifdef _WIN32
|
|
#pragma once
|
|
#endif
|
|
|
|
|
|
#include "weapon_portalbasecombatweapon.h"
|
|
|
|
#include "c_prop_portal.h"
|
|
#include "fx_interpvalue.h"
|
|
#include "beamdraw.h"
|
|
#include "iviewrender_beams.h"
|
|
|
|
//----------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
// CPhysCannonEffect class
|
|
//----------------------------------------------------------------------------------------------------------------------------------------------------------
|
|
|
|
class CPortalgunEffect
|
|
{
|
|
public:
|
|
|
|
CPortalgunEffect( void )
|
|
: m_vecColor( 255, 255, 255 ),
|
|
m_bVisibleViewModel( true ),
|
|
m_bVisible3rdPerson( true ),
|
|
m_nAttachment( -1 )
|
|
{}
|
|
|
|
void SetAttachment( int attachment ) { m_nAttachment = attachment; }
|
|
int GetAttachment( void ) const { return m_nAttachment; }
|
|
|
|
void SetVisible( bool visible = true ) { m_bVisibleViewModel = visible; m_bVisible3rdPerson = visible; }
|
|
|
|
void SetVisibleViewModel( bool visible = true ) { m_bVisibleViewModel = visible; }
|
|
int IsVisibleViewModel( void ) const { return m_bVisibleViewModel; }
|
|
|
|
void SetVisible3rdPerson( bool visible = true ) { m_bVisible3rdPerson = visible; }
|
|
int IsVisible3rdPerson( void ) const { return m_bVisible3rdPerson; }
|
|
|
|
void SetColor( const Vector &color ) { m_vecColor = color; }
|
|
const Vector &GetColor( void ) const { return m_vecColor; }
|
|
|
|
bool SetMaterial( const char *materialName )
|
|
{
|
|
m_hMaterial.Init( materialName, TEXTURE_GROUP_CLIENT_EFFECTS );
|
|
return ( m_hMaterial != NULL );
|
|
}
|
|
|
|
CMaterialReference &GetMaterial( void ) { return m_hMaterial; }
|
|
|
|
CInterpolatedValue &GetAlpha( void ) { return m_Alpha; }
|
|
CInterpolatedValue &GetScale( void ) { return m_Scale; }
|
|
|
|
virtual PortalWeaponID GetWeaponID( void ) const { return WEAPON_PORTALGUN; }
|
|
|
|
private:
|
|
CInterpolatedValue m_Alpha;
|
|
CInterpolatedValue m_Scale;
|
|
|
|
Vector m_vecColor;
|
|
bool m_bVisibleViewModel;
|
|
bool m_bVisible3rdPerson;
|
|
int m_nAttachment;
|
|
CMaterialReference m_hMaterial;
|
|
};
|
|
|
|
|
|
class CPortalgunEffectBeam
|
|
{
|
|
public:
|
|
CPortalgunEffectBeam( void );;
|
|
~CPortalgunEffectBeam( void );
|
|
|
|
void Release( void );
|
|
|
|
void Init( int startAttachment, int endAttachment, CBaseEntity *pEntity, bool firstPerson );
|
|
|
|
void SetVisibleViewModel( bool visible = true );
|
|
int IsVisibleViewModel( void ) const;
|
|
|
|
void SetVisible3rdPerson( bool visible = true );
|
|
int SetVisible3rdPerson( void ) const;
|
|
|
|
void SetBrightness( float fBrightness );
|
|
|
|
void DrawBeam( void );
|
|
|
|
private:
|
|
Beam_t *m_pBeam;
|
|
|
|
float m_fBrightness;
|
|
};
|
|
|
|
|
|
class C_WeaponPortalgun : public CBasePortalCombatWeapon
|
|
{
|
|
|
|
public:
|
|
DECLARE_CLASS( C_WeaponPortalgun, CBasePortalCombatWeapon );
|
|
|
|
DECLARE_NETWORKCLASS();
|
|
DECLARE_PREDICTABLE();
|
|
|
|
private:
|
|
CNetworkVar( bool, m_bCanFirePortal1 ); // Is able to use primary fire
|
|
CNetworkVar( bool, m_bCanFirePortal2 ); // Is able to use secondary fire
|
|
CNetworkVar( int, m_iLastFiredPortal ); // Which portal was placed last
|
|
CNetworkVar( bool, m_bOpenProngs ); // Which portal was placed last
|
|
CNetworkVar( float, m_fCanPlacePortal1OnThisSurface ); // Tells the gun if it can place on the surface it's pointing at
|
|
CNetworkVar( float, m_fCanPlacePortal2OnThisSurface ); // Tells the gun if it can place on the surface it's pointing at
|
|
|
|
CNetworkVar( float, m_fEffectsMaxSize1 );
|
|
CNetworkVar( float, m_fEffectsMaxSize2 );
|
|
|
|
public:
|
|
virtual const Vector& GetBulletSpread( void )
|
|
{
|
|
static Vector cone = VECTOR_CONE_10DEGREES;
|
|
return cone;
|
|
}
|
|
|
|
void Precache ( void );
|
|
|
|
virtual void OnRestore( void );
|
|
virtual void UpdateOnRemove( void );
|
|
void Spawn( void );
|
|
void DoEffectCreate( Vector &vDir, Vector &ptStart, Vector &ptEnd, bool bPortal1, bool bPlayer );
|
|
|
|
virtual bool ShouldDrawCrosshair( void );
|
|
float GetPortal1Placablity( void ) { return m_fCanPlacePortal1OnThisSurface; }
|
|
float GetPortal2Placablity( void ) { return m_fCanPlacePortal2OnThisSurface; }
|
|
int GetLastFiredPortal( void ) { return m_iLastFiredPortal; }
|
|
bool IsHoldingObject( void ) { return m_bOpenProngs; }
|
|
|
|
bool Reload( void );
|
|
void FillClip( void );
|
|
void CheckHolsterReload( void );
|
|
void ItemHolsterFrame( void );
|
|
bool Holster( CBaseCombatWeapon *pSwitchingTo = NULL );
|
|
bool Deploy( void );
|
|
|
|
void SetCanFirePortal1( bool bCanFire = true );
|
|
void SetCanFirePortal2( bool bCanFire = true );
|
|
float CanFirePortal1( void ) { return m_bCanFirePortal1; }
|
|
float CanFirePortal2( void ) { return m_bCanFirePortal2; }
|
|
|
|
void PrimaryAttack( void );
|
|
void SecondaryAttack( void );
|
|
|
|
void DelayAttack( float fDelay );
|
|
|
|
void DryFire( void );
|
|
virtual float GetFireRate( void ) { return 0.7; };
|
|
void WeaponIdle( void );
|
|
|
|
protected:
|
|
|
|
void StartEffects( void ); // Initialize all sprites and beams
|
|
void StopEffects( bool stopSound = true ); // Hide all effects temporarily
|
|
void DestroyEffects( void ); // Destroy all sprites and beams
|
|
|
|
// Portalgun effects
|
|
void DoEffect( int effectType, Vector *pos = NULL );
|
|
|
|
void DoEffectClosed( void );
|
|
void DoEffectReady( void );
|
|
void DoEffectHolding( void );
|
|
void DoEffectNone( void );
|
|
|
|
enum EffectType_t
|
|
{
|
|
PORTALGUN_GRAVLIGHT = 0,
|
|
PORTALGUN_GRAVLIGHT_WORLD,
|
|
PORTALGUN_PORTAL1LIGHT,
|
|
PORTALGUN_PORTAL1LIGHT_WORLD,
|
|
PORTALGUN_PORTAL2LIGHT,
|
|
PORTALGUN_PORTAL2LIGHT_WORLD,
|
|
|
|
PORTALGUN_GLOW1, // Must be in order!
|
|
PORTALGUN_GLOW2,
|
|
PORTALGUN_GLOW3,
|
|
PORTALGUN_GLOW4,
|
|
PORTALGUN_GLOW5,
|
|
PORTALGUN_GLOW6,
|
|
|
|
PORTALGUN_GLOW1_WORLD,
|
|
PORTALGUN_GLOW2_WORLD,
|
|
PORTALGUN_GLOW3_WORLD,
|
|
PORTALGUN_GLOW4_WORLD,
|
|
PORTALGUN_GLOW5_WORLD,
|
|
PORTALGUN_GLOW6_WORLD,
|
|
|
|
PORTALGUN_ENDCAP1, // Must be in order!
|
|
PORTALGUN_ENDCAP2,
|
|
PORTALGUN_ENDCAP3,
|
|
|
|
PORTALGUN_ENDCAP1_WORLD,
|
|
PORTALGUN_ENDCAP2_WORLD,
|
|
PORTALGUN_ENDCAP3_WORLD,
|
|
|
|
PORTALGUN_MUZZLE_GLOW,
|
|
|
|
PORTALGUN_MUZZLE_GLOW_WORLD,
|
|
|
|
PORTALGUN_TUBE_BEAM1,
|
|
PORTALGUN_TUBE_BEAM2,
|
|
PORTALGUN_TUBE_BEAM3,
|
|
PORTALGUN_TUBE_BEAM4,
|
|
PORTALGUN_TUBE_BEAM5,
|
|
|
|
PORTALGUN_TUBE_BEAM1_WORLD,
|
|
PORTALGUN_TUBE_BEAM2_WORLD,
|
|
PORTALGUN_TUBE_BEAM3_WORLD,
|
|
PORTALGUN_TUBE_BEAM4_WORLD,
|
|
PORTALGUN_TUBE_BEAM5_WORLD,
|
|
|
|
NUM_PORTALGUN_PARAMETERS // Must be last!
|
|
};
|
|
|
|
#define NUM_GLOW_SPRITES ((C_WeaponPortalgun::PORTALGUN_GLOW6-C_WeaponPortalgun::PORTALGUN_GLOW1)+1)
|
|
#define NUM_GLOW_SPRITES_WORLD ((C_WeaponPortalgun::PORTALGUN_GLOW6_WORLD-C_WeaponPortalgun::PORTALGUN_GLOW1_WORLD)+1)
|
|
#define NUM_ENDCAP_SPRITES ((C_WeaponPortalgun::PORTALGUN_ENDCAP3-C_WeaponPortalgun::PORTALGUN_ENDCAP1)+1)
|
|
#define NUM_ENDCAP_SPRITES_WORLD ((C_WeaponPortalgun::PORTALGUN_ENDCAP3_WORLD-C_WeaponPortalgun::PORTALGUN_ENDCAP1_WORLD)+1)
|
|
#define NUM_TUBE_BEAM_SPRITES ((C_WeaponPortalgun::PORTALGUN_TUBE_BEAM5-C_WeaponPortalgun::PORTALGUN_TUBE_BEAM1)+1)
|
|
#define NUM_TUBE_BEAM_SPRITES_WORLD ((C_WeaponPortalgun::PORTALGUN_TUBE_BEAM5_WORLD-C_WeaponPortalgun::PORTALGUN_TUBE_BEAM1_WORLD)+1)
|
|
|
|
#define NUM_PORTALGUN_BEAMS 6
|
|
|
|
void DrawEffects( bool b3rdPerson );
|
|
Vector GetEffectColor( int iPalletIndex );
|
|
void GetEffectParameters( EffectType_t effectID, color32 &color, float &scale, IMaterial **pMaterial, Vector &vecAttachment, bool b3rdPerson );
|
|
void DrawEffectSprite( EffectType_t effectID, bool b3rdPerson );
|
|
inline bool IsEffectVisible( EffectType_t effectID, bool b3rdPerson );
|
|
void UpdateElementPosition( void );
|
|
|
|
CPortalgunEffect m_Parameters[NUM_PORTALGUN_PARAMETERS]; // Interpolated parameters for the effects
|
|
CPortalgunEffectBeam m_Beams[NUM_PORTALGUN_BEAMS]; // Beams
|
|
|
|
int m_nOldEffectState; // Used for parity checks
|
|
bool m_bOldCanFirePortal1;
|
|
bool m_bOldCanFirePortal2;
|
|
|
|
bool m_bPulseUp;
|
|
float m_fPulse;
|
|
|
|
CNetworkVar( int, m_EffectState ); // Current state of the effects on the gun
|
|
|
|
public:
|
|
|
|
virtual int DrawModel( int flags );
|
|
virtual void ViewModelDrawn( C_BaseViewModel *pBaseViewModel );
|
|
virtual void OnPreDataChanged( DataUpdateType_t updateType );
|
|
virtual void OnDataChanged( DataUpdateType_t updateType );
|
|
virtual void ClientThink( void );
|
|
|
|
void DoEffectIdle( void );
|
|
|
|
public:
|
|
|
|
DECLARE_ACTTABLE();
|
|
|
|
C_WeaponPortalgun(void);
|
|
|
|
private:
|
|
C_WeaponPortalgun( const C_WeaponPortalgun & );
|
|
|
|
};
|
|
|
|
|
|
#endif // C_WEAPON_PORTALGUN_H
|