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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
//=============================================================================//
#ifndef PROP_COMBINE_BALL_H
#define PROP_COMBINE_BALL_H
#ifdef _WIN32
#pragma once
#endif
//-----------------------------------------------------------------------------
// Includes
//-----------------------------------------------------------------------------
#include "player_pickup.h" // for combine ball inheritance
//-----------------------------------------------------------------------------
// Forward declarations
//-----------------------------------------------------------------------------
class CFuncCombineBallSpawner;
class CSpriteTrail;
//-----------------------------------------------------------------------------
// Looks for enemies, bounces a max # of times before it breaks
//-----------------------------------------------------------------------------
class CPropCombineBall : public CBaseAnimating, public CDefaultPlayerPickupVPhysics
{
public:
DECLARE_CLASS( CPropCombineBall, CBaseAnimating );
DECLARE_DATADESC();
DECLARE_SERVERCLASS();
virtual void Precache();
virtual void Spawn();
virtual void UpdateOnRemove();
void StopLoopingSounds();
virtual void OnPhysGunPickup( CBasePlayer *pPhysGunUser, PhysGunPickup_t reason );
virtual void OnPhysGunDrop( CBasePlayer *pPhysGunUser, PhysGunDrop_t Reason );
virtual void VPhysicsCollision( int index, gamevcollisionevent_t *pEvent );
virtual bool OverridePropdata();
virtual bool CreateVPhysics();
CFuncCombineBallSpawner *GetSpawner();
virtual void ExplodeThink( void );
// Override of IPlayerPickupVPhysics;
virtual bool ShouldPuntUseLaunchForces( PhysGunForce_t reason ) { return ( reason == PHYSGUN_FORCE_PUNTED ); }
void SetRadius( float flRadius );
void SetSpeed( float flSpeed ) { m_flSpeed = flSpeed; }
float GetSpeed( void ) const { return m_flSpeed; }
void CaptureBySpawner( );
bool IsBeingCaptured() const { return m_bCaptureInProgress; }
void ReplaceInSpawner( float flSpeed );
// Input
void InputExplode( inputdata_t &inputdata );
void InputFadeAndRespawn( inputdata_t &inputdata );
void InputKill( inputdata_t &inputdata );
void InputSocketed( inputdata_t &inputdata );
enum
{
STATE_NOT_THROWN = 0,
STATE_HOLDING,
STATE_THROWN,
STATE_LAUNCHED, //by a combine_ball launcher
};
void SetState( int state );
bool IsInField() const;
void StartWhizSoundThink( void );
void StartLifetime( float flDuration );
void ClearLifetime( );
void SetMass( float mass );
void SetWeaponLaunched( bool state = true ) { m_bWeaponLaunched = state; m_bLaunched = state; }
bool WasWeaponLaunched( void ) const { return m_bWeaponLaunched; }
bool WasFiredByNPC() const { return (GetOwnerEntity() && GetOwnerEntity()->IsNPC()); }
bool ShouldHitPlayer() const;
virtual CBasePlayer *HasPhysicsAttacker( float dt );
void SetSpawner( CFuncCombineBallSpawner *pSpawner ) { m_hSpawner = pSpawner; }
void NotifySpawnerOfRemoval( void );
float LastCaptureTime() const;
unsigned char GetState() const { return m_nState; }
int NumBounces( void ) const { return m_nBounceCount; }
void SetMaxBounces( int iBounces )
{
m_nMaxBounces = iBounces;
}
void SetEmitState( bool bEmit )
{
m_bEmit = bEmit;
}
void SetOriginalOwner( CBaseEntity *pEntity ) { m_hOriginalOwner = pEntity; }
CBaseEntity *GetOriginalOwner() { return m_hOriginalOwner; }
private:
void SetPlayerLaunched( CBasePlayer *pOwner );
float GetBallHoldDissolveTime();
float GetBallHoldSoundRampTime();
// Pow!
void DoExplosion( );
void StartAnimating( void );
void StopAnimating( void );
void SetBallAsLaunched( void );
void CollisionEventToTrace( int index, gamevcollisionevent_t *pEvent, trace_t &tr );
bool DissolveEntity( CBaseEntity *pEntity );
void OnHitEntity( CBaseEntity *pHitEntity, float flSpeed, int index, gamevcollisionevent_t *pEvent );
void DoImpactEffect( const Vector &preVelocity, int index, gamevcollisionevent_t *pEvent );
// Bounce inside the spawner:
void BounceInSpawner( float flSpeed, int index, gamevcollisionevent_t *pEvent );
bool IsAttractiveTarget( CBaseEntity *pEntity );
// Deflects the ball toward enemies in case of a collision
void DeflectTowardEnemy( float flSpeed, int index, gamevcollisionevent_t *pEvent );
// Is this something we can potentially dissolve?
bool IsHittableEntity( CBaseEntity *pHitEntity );
// Sucky.
void WhizSoundThink();
void DieThink();
void DissolveThink();
void DissolveRampSoundThink();
void AnimThink( void );
void FadeOut( float flDuration );
bool OutOfBounces( void ) const
{
return ( m_nState == STATE_LAUNCHED && m_nMaxBounces != 0 && m_nBounceCount >= m_nMaxBounces );
}
private:
int m_nBounceCount;
int m_nMaxBounces;
bool m_bBounceDie;
float m_flLastBounceTime;
bool m_bFiredGrabbedOutput;
bool m_bStruckEntity; // Has hit an entity already (control accuracy)
bool m_bWeaponLaunched; // Means this was fired from the AR2
bool m_bForward; // Movement direction in ball spawner
unsigned char m_nState;
bool m_bCaptureInProgress;
float m_flSpeed;
CSpriteTrail *m_pGlowTrail;
CSoundPatch *m_pHoldingSound;
float m_flNextDamageTime;
float m_flLastCaptureTime;
CHandle < CFuncCombineBallSpawner > m_hSpawner;
EHANDLE m_hOriginalOwner;
CNetworkVar( bool, m_bEmit );
CNetworkVar( bool, m_bHeld );
CNetworkVar( bool, m_bLaunched );
CNetworkVar( float, m_flRadius );
};
class CFuncCombineBallSpawner : public CBaseEntity
{
DECLARE_CLASS( CFuncCombineBallSpawner, CBaseEntity );
DECLARE_DATADESC();
public:
CFuncCombineBallSpawner();
virtual void Spawn();
virtual void Precache();
// Balls call this to figure out where to bounce to
void GetTargetEndpoint( bool bForward, Vector *pVecEndpoint );
// Balls call this when they've been removed from the spawner
void RespawnBall( float flRespawnTime );
void RespawnBallPostExplosion( void );
// Fire ball grabbed output
void BallGrabbed( CBaseEntity *pEntity );
// Get speed of ball to place into the field
float GetBallSpeed( ) const;
// Register that a reflection occurred
void RegisterReflection( CPropCombineBall *pBall, bool bForward );
// Spawn a ball
virtual void SpawnBall();
private:
// Choose a random point inside the cylinder
void ChoosePointInCylinder( Vector *pVecPoint );
// Choose a random point inside the box
void ChoosePointInBox( Vector *pVecPoint );
// Used to determine when to respawn balls
void BallThink();
// Input
void InputEnable( inputdata_t &inputdata );
void InputDisable( inputdata_t &inputdata );
// Fire ball grabbed output
void GrabBallTouch( CBaseEntity *pOther );
public:
bool m_bShooter;
float m_flBallRadius;
float m_flBallRespawnTime;
float m_flMinSpeed;
float m_flMaxSpeed;
private:
CUtlVector< float > m_BallRespawnTime;
int m_nBallCount;
int m_nBallsRemainingInField;
float m_flRadius;
float m_flDisableTime;
bool m_bEnabled;
COutputEvent m_OnBallGrabbed;
COutputEvent m_OnBallReinserted;
COutputEvent m_OnBallHitTopSide;
COutputEvent m_OnBallHitBottomSide;
COutputEvent m_OnLastBallGrabbed;
COutputEvent m_OnFirstBallReinserted;
};
class CPointCombineBallLauncher : public CFuncCombineBallSpawner
{
DECLARE_CLASS( CPointCombineBallLauncher, CFuncCombineBallSpawner );
DECLARE_DATADESC();
public:
virtual void Spawn( void );
virtual void SpawnBall( void );
void InputLaunchBall ( inputdata_t &inputdata );
CPointCombineBallLauncher();
private:
int m_iBounces;
float m_flConeDegrees;
string_t m_iszBullseyeName;
};
// Creates a combine ball
CBaseEntity *CreateCombineBall( const Vector &origin, const Vector &velocity, float radius, float mass, float lifetime, CBaseEntity *pOwner );
// Query function to find out if a physics object is a combine ball (used for collision checks)
bool UTIL_IsCombineBall( CBaseEntity *pEntity );
bool UTIL_IsCombineBallDefinite( CBaseEntity *pEntity );
bool UTIL_IsAR2CombineBall( CBaseEntity *pEntity );
#endif // PROP_COMBINE_BALL_H
|