summaryrefslogtreecommitdiff
path: root/game/shared/tf/tf_condition.h
blob: d2e880490b0ba3ec76698d53d1692bb0a53ad937 (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
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Condition Objects
//
//=============================================================================
#ifndef TF_CONDITION_H
#define TF_CONDITION_H

#ifdef _WIN32
#pragma once
#endif

#include "utlvector.h"
#include "utlstack.h"
#include "tf_shareddefs.h"

#ifdef CLIENT_DLL
	// Avoid redef warnings
	#undef CTFPlayer
	#define CTFPlayer C_TFPlayer
	class C_TFPlayer;
#endif

class CTFPlayer;
class CTFCondition;

class CTFConditionList
{
public:
	DECLARE_EMBEDDED_NETWORKVAR();
	DECLARE_CLASS_NOBASE( CTFConditionList );
	DECLARE_PREDICTABLE();

	CTFConditionList();

	bool Add( ETFCond type, float duration, CTFPlayer* outer, CBaseEntity* provider = NULL );
	bool _Add( ETFCond type, float duration, CTFPlayer* outer, CBaseEntity* provider = NULL );
	bool Remove( ETFCond type, bool ignore_duration=false );
	bool _Remove( ETFCond type, bool ignore_duration=false );
	void RemoveAll();

	bool InCond( ETFCond type ) const;
	CBaseEntity *GetProvider( ETFCond type ) const;

	void Think();
	void ServerThink();

#ifdef CLIENT_DLL
	// Forwarded from player shared.
	virtual void OnPreDataChanged( void );
	virtual void OnDataChanged( CTFPlayer* outer );
	void UpdateClientConditions( CTFPlayer* outer );
#endif

private:
	CUtlVector< CTFCondition* > _conditions;

	CNetworkVar( int, _condition_bits ); // Bitfield of set conditions for fast checking.
	int _old_condition_bits;
};

class CTFCondition
{
public:
	CTFCondition( ETFCond type, float duration, CTFPlayer* outer, CBaseEntity* provider = NULL );
	virtual ~CTFCondition();

	virtual void Add( float duration );

	virtual void OnAdded() = 0;
	virtual void OnRemoved() = 0;
	virtual void OnThink() = 0;
	virtual void OnServerThink() = 0;

	// Condition Traits
	virtual bool IsHealable() { return false; }
	virtual bool UsesMinDuration() { return false; }

	ETFCond	GetType() { return _type; }
	float	GetMaxDuration() { return _max_duration; }
	void	SetMaxDuration( float val ) { _max_duration = val; }
	float	GetMinDuration() { return _min_duration; }
	void	SetMinDuration( float val ) { if ( UsesMinDuration() ) { _min_duration = val; } }
	CTFPlayer* GetOuter() { return _outer; }
	void	SetProvider( CBaseEntity *provider ) { _provider = provider; }
	CBaseEntity* GetProvider() { return _provider; }

private:
	float			_min_duration;
	float			_max_duration;
	const ETFCond	_type;
	CTFPlayer*		_outer;
	CHandle< CBaseEntity >	_provider;
};

class CTFCondition_CritBoost : public CTFCondition
{
public:
	CTFCondition_CritBoost( ETFCond type, float duration, CTFPlayer* outer, CBaseEntity* provider = NULL );

	virtual void OnAdded();
	virtual void OnRemoved();
	virtual void OnThink();
	virtual void OnServerThink();

	// Condition Traits
	virtual bool IsHealable() { return false; }
	virtual bool UsesMinDuration() { return true; }
};

#endif