summaryrefslogtreecommitdiff
path: root/tf2/dt_common.h
blob: 7f86418d28bd08fa4fc61d6219c88864fd8f3adc (plain)
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
#pragma once

#define MAX_DATATABLES		1024	// must be a power of 2.
#define MAX_DATATABLE_PROPS	4096
#define MAX_ARRAY_ELEMENTS	2048		// a network array should have more that 1024 elements

#define HIGH_DEFAULT		-121121.121121f

#define BITS_FULLRES	-1	// Use the full resolution of the type being encoded.
#define BITS_WORLDCOORD	-2	// Encode as a world coordinate.

#define DT_MAX_STRING_BITS			9
#define DT_MAX_STRING_BUFFERSIZE	(1 << DT_MAX_STRING_BITS)	// Maximum length of a string that can be sent.

#define STRINGBUFSIZE(className, varName)	sizeof(((className*)0)->varName)

// Gets the size of a variable in a class.
#define PROPSIZEOF(className, varName)		sizeof(((className*)0)->varName)

// SendProp::m_Flags.
enum SPROP_FLAGS
{
	SPROP_UNSIGNED				= (1<<0),	// Unsigned integer data.
	SPROP_COORD					= (1<<1),	// If this is set, the float/vector is treated like a world coordinate.
											// Note that the bit count is ignored in this case.
	SPROP_NOSCALE				= (1<<2),	// For floating point, don't scale into range, just take value as is.
	SPROP_ROUNDDOWN				= (1<<3),	// For floating point, limit high value to range minus one bit unit
	SPROP_ROUNDUP				= (1<<4),	// For floating point, limit low value to range minus one bit unit
	SPROP_NORMAL				= (1<<5),	// If this is set, the vector is treated like a normal (only valid for vectors),
	SPROP_EXCLUDE				= (1<<6),	// This is an exclude prop (not excludED, but it points at another prop to be excluded),.
	SPROP_XYZE					= (1<<7),	// Use XYZ/Exponent encoding for vectors.
	SPROP_INSIDEARRAY			= (1<<8),	// This tells us that the property is inside an array, so it shouldn't be put into the
											// flattened property list. Its array will point at it when it needs to.
	SPROP_PROXY_ALWAYS_YES		= (1<<9),	// Set for datatable props using one of the default datatable proxies like
											// SendProxy_DataTableToDataTable that always send the data to all clients.
	SPROP_CHANGES_OFTEN			= (1<<10),	// this is an often changed field, moved to head of sendtable so it gets a small index
	SPROP_IS_A_VECTOR_ELEM		= (1<<11),	// Set automatically if SPROP_VECTORELEM is used.
	SPROP_COLLAPSIBLE			= (1<<12),	// Set automatically if it's a datatable with an offset of 0 that doesn't change the pointer
											// (ie: for all automatically-chained base classes),.
											// In this case, it can get rid of this SendPropDataTable altogether and spare the
											// trouble of walking the hierarchy more than necessary.
	SPROP_COORD_MP				= (1<<13),	// Like SPROP_COORD, but special handling for multiplayer games
	SPROP_COORD_MP_LOWPRECISION = (1<<14),	// Like SPROP_COORD, but special handling for multiplayer games where the fractional component only gets a 3 bits instead of 5
	SPROP_COORD_MP_INTEGRAL		= (1<<15),	// SPROP_COORD_MP, but coordinates are rounded to integral boundaries

	// This is server side only, it's used to mark properties whose SendProxy_* functions encode against gpGlobals->tickcount (the only ones that currently do this are
	//  m_flAnimTime and m_flSimulationTime.  MODs shouldn't need to mess with this probably
	SPROP_ENCODED_AGAINST_TICKCOUNT	= (1<<16),
};

#define SPROP_NUMFLAGBITS_NETWORKED		16

#define SPROP_NUMFLAGBITS				17

// Used by the SendProp and RecvProp functions to disable debug checks on type sizes.
#define SIZEOF_IGNORE		-1

// Use this to extern send and receive datatables, and reference them.
#define EXTERN_SEND_TABLE(tableName)	namespace tableName {extern SendTable g_SendTable;}
#define EXTERN_RECV_TABLE(tableName)	namespace tableName {extern RecvTable g_RecvTable;}

#define REFERENCE_SEND_TABLE(tableName)	tableName::g_SendTable
#define REFERENCE_RECV_TABLE(tableName)	tableName::g_RecvTable

class SendProp;

typedef enum
{
	DPT_Int = 0,
	DPT_Float,
	DPT_Vector,
	DPT_VectorXY,
	DPT_String,
	DPT_Array, // An array of the base types (can't be of datatables).
	DPT_DataTable,
	DPT_NUMSendPropTypes
} SendPropType;

/*
class DVariant
{
public:
	union
	{
		float m_Float;
		long m_Int;
		char* m_pString;
		void* m_pData; // For DataTables.
		float m_Vector[3];
	};

	SendPropType m_Type;

	DVariant() { m_Type = DPT_Float; }

	DVariant(float val)
	{
		m_Type = DPT_Float;
		m_Float = val;
	}
};
*/

struct DVariant {
	union {
		float m_Float;
		long m_Int;
		char* m_pString;
		void* m_pData;
		float m_Vector[3];
		__int64 m_Int64;
	};

	int	m_Type;
};

// This can be used to set the # of bits used to transmit a number between 0 and nMaxElements-1.
inline int NumBitsForCount(int nMaxElements)
{
	int nBits = 0;
	while(nMaxElements > 0)
	{
		++nBits;
		nMaxElements >>= 1;
	}
	return nBits;
}