aboutsummaryrefslogtreecommitdiff
path: root/sp/src/game/server/hl2/combine_mine.h
blob: 48dbb4681291202dc4c1b2692135d12ad9a8e92c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: 
//
//=============================================================================//

#include "Color.h"

#ifndef COMBINE_MINE_H
#define COMBINE_MINE_H

#ifdef _WIN32
#pragma once
#endif

class CSoundPatch;

//---------------------------------------------------------
//---------------------------------------------------------
#define BOUNCEBOMB_HOOK_RANGE		64
#define BOUNCEBOMB_WARN_RADIUS		245.0	// Must be slightly less than physcannon!
#define BOUNCEBOMB_DETONATE_RADIUS	100.0

#define BOUNCEBOMB_EXPLODE_RADIUS	125.0
#define BOUNCEBOMB_EXPLODE_DAMAGE	150.0
#include "player_pickup.h"

class CBounceBomb : public CBaseAnimating, public CDefaultPlayerPickupVPhysics
{
	DECLARE_CLASS( CBounceBomb, CBaseAnimating );

public:
	CBounceBomb() { m_pWarnSound = NULL; m_bPlacedByPlayer = false; }
	void Precache();
	void Spawn();
	void OnRestore();
	int DrawDebugTextOverlays(void);
	void SetMineState( int iState );
	int GetMineState() { return m_iMineState; }
	bool IsValidLocation();
	void Flip( const Vector &vecForce, const AngularImpulse &torque );
	void SearchThink();
	void BounceThink();
	void SettleThink();
	void CaptiveThink();
	void ExplodeThink();
	void ExplodeTouch( CBaseEntity *pOther );
	void CavernBounceThink(); ///< an alternative style of bouncing used for the citizen modded bouncers
	bool IsAwake() { return m_bAwake; }
	void Wake( bool bWake );
	float FindNearestNPC();
	void SetNearestNPC( CBaseEntity *pNearest ) { m_hNearestNPC.Set( pNearest ); }
	int OnTakeDamage( const CTakeDamageInfo &info );
	bool IsFriend( CBaseEntity *pEntity );

	void UpdateLight( bool bTurnOn, unsigned int r, unsigned int g, unsigned int b, unsigned int a );
	bool IsLightOn() { return m_hSprite.Get() != NULL; }

	void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason = PICKED_UP_BY_CANNON );
	void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t reason );
	bool ForcePhysgunOpen( CBasePlayer *pPlayer ) { return true; }
	bool HasPreferredCarryAnglesForPlayer( CBasePlayer *pPlayer ) { return true; }
	virtual QAngle	PreferredCarryAngles( void ) { return vec3_angle; }
	CBasePlayer *HasPhysicsAttacker( float dt );

	bool IsPlayerPlaced() { return m_bPlacedByPlayer; }

	bool CreateVPhysics()
	{
		VPhysicsInitNormal( SOLID_VPHYSICS, 0, false );
		return true;
	}

	void Pickup();

	void OpenHooks( bool bSilent = false );
	void CloseHooks();

	DECLARE_DATADESC();

	static string_t gm_iszFloorTurretClassname;
	static string_t gm_iszGroundTurretClassname;

private:
	float		m_flExplosionDelay;

	bool	m_bAwake;
	bool	m_bBounce;
	EHANDLE	m_hNearestNPC;
	EHANDLE m_hSprite;
	Color 	m_LastSpriteColor;

	float	m_flHookPositions;
	int		m_iHookN;
	int		m_iHookE;
	int		m_iHookS;
	int		m_iAllHooks;

	CSoundPatch	*m_pWarnSound;

	bool	m_bLockSilently;
	bool	m_bFoeNearest;

	float	m_flIgnoreWorldTime;

	bool	m_bDisarmed;

	bool	m_bPlacedByPlayer;

	bool	m_bHeldByPhysgun;

	int		m_iFlipAttempts;
	int     m_iModification;

	CHandle<CBasePlayer>	m_hPhysicsAttacker;
	float					m_flLastPhysicsInfluenceTime;

	float					m_flTimeGrabbed;
	IPhysicsConstraint		*m_pConstraint;
	int						m_iMineState;

	COutputEvent	m_OnPulledUp;
	void InputDisarm( inputdata_t &inputdata );
};



#endif // COMBINE_MINE_H