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
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef NETWORKSTRINGTABLE_H
#define NETWORKSTRINGTABLE_H
#ifdef _WIN32
#pragma once
#endif
#include "networkstringtabledefs.h"
#include "networkstringtableitem.h"
#include <utldict.h>
#include <utlbuffer.h>
#include "tier1/bitbuf.h"
class SVC_CreateStringTable;
class CBaseClient;
abstract_class INetworkStringDict
{
public:
virtual ~INetworkStringDict() {}
virtual unsigned int Count() = 0;
virtual void Purge() = 0;
virtual const char *String( int index ) = 0;
virtual bool IsValidIndex( int index ) = 0;
virtual int Insert( const char *pString ) = 0;
virtual int Find( const char *pString ) = 0;
virtual CNetworkStringTableItem &Element( int index ) = 0;
virtual const CNetworkStringTableItem &Element( int index ) const = 0;
};
//-----------------------------------------------------------------------------
// Purpose: Client/Server shared string table definition
//-----------------------------------------------------------------------------
class CNetworkStringTable : public INetworkStringTable
{
public:
// Construction
CNetworkStringTable( TABLEID id, const char *tableName, int maxentries, int userdatafixedsize, int userdatanetworkbits, bool bIsFilenames );
virtual ~CNetworkStringTable( void );
public:
// INetworkStringTable interface:
const char *GetTableName( void ) const;
TABLEID GetTableId( void ) const;
int GetNumStrings( void ) const;
int GetMaxStrings( void ) const;
int GetEntryBits( void ) const;
// Networking
void SetTick( int tick );
bool ChangedSinceTick( int tick ) const;
int AddString( bool bIsServer, const char *value, int length = -1, const void *userdata = NULL );
const char *GetString( int stringNumber );
void SetStringUserData( int stringNumber, int length, const void *userdata );
const void *GetStringUserData( int stringNumber, int *length );
int FindStringIndex( char const *string );
void SetStringChangedCallback( void *object, pfnStringChanged changeFunc );
bool HasFileNameStrings() const;
bool IsUserDataFixedSize() const;
int GetUserDataSizeBits() const;
int GetUserDataSize() const;
public:
#ifndef SHARED_NET_STRING_TABLES
int WriteUpdate( CBaseClient *client, bf_write &buf, int tick_ack );
void ParseUpdate( bf_read &buf, int entries );
// HLTV change history & rollback
void EnableRollback();
void RestoreTick(int tick);
// local backdoor tables
void SetMirrorTable( INetworkStringTable *table );
void UpdateMirrorTable( int tick_ack );
void CopyStringTable(CNetworkStringTable * table);
// buffer IO
void WriteStringTable( bf_write& buf );
bool ReadStringTable( bf_read& buf );
bool WriteBaselines( SVC_CreateStringTable &msg, char *msg_buffer, int msg_buffer_size );
#endif
void TriggerCallbacks( int tick_ack );
CNetworkStringTableItem *GetItem( int i );
// debug ouptput
virtual void Dump( void );
virtual void Lock( bool bLock );
void SetAllowClientSideAddString( bool state );
pfnStringChanged GetCallback();
protected:
void DataChanged( int stringNumber, CNetworkStringTableItem *item );
// Destroy string table
void DeleteAllStrings( void );
CNetworkStringTable( const CNetworkStringTable & ); // not implemented, not allowed
TABLEID m_id;
char *m_pszTableName;
// Must be a power of 2, so encoding can determine # of bits to use based on log2
int m_nMaxEntries;
int m_nEntryBits;
int m_nTickCount;
int m_nLastChangedTick;
bool m_bChangeHistoryEnabled : 1;
bool m_bLocked : 1;
bool m_bAllowClientSideAddString : 1;
bool m_bUserDataFixedSize : 1;
bool m_bIsFilenames : 1;
int m_nUserDataSize;
int m_nUserDataSizeBits;
// Change function callback
pfnStringChanged m_changeFunc;
// Optional context/object
void *m_pObject;
// pointer to local backdoor table
INetworkStringTable *m_pMirrorTable;
INetworkStringDict *m_pItems;
INetworkStringDict *m_pItemsClientSide; // For m_bAllowClientSideAddString, these items are non-networked and are referenced by a negative string index!!!
};
//-----------------------------------------------------------------------------
// Purpose: Implements game .dll string table interface
//-----------------------------------------------------------------------------
class CNetworkStringTableContainer : public INetworkStringTableContainer
{
public:
// Construction
CNetworkStringTableContainer( void );
~CNetworkStringTableContainer( void );
public:
// Implement INetworkStringTableContainer
INetworkStringTable *CreateStringTable( const char *tableName, int maxentries, int userdatafixedsize = 0, int userdatanetworkbits = 0 ) { return CreateStringTableEx( tableName, maxentries, userdatafixedsize, userdatanetworkbits, false ); }
INetworkStringTable *CreateStringTableEx( const char *tableName, int maxentries, int userdatafixedsize = 0, int userdatanetworkbits = 0, bool bIsFilenames = false );
void RemoveAllTables( void );
// table infos
INetworkStringTable *FindTable( const char *tableName ) const ;
INetworkStringTable *GetTable( TABLEID stringTable ) const;
int GetNumTables( void ) const;
virtual void SetAllowClientSideAddString( INetworkStringTable *table, bool bAllowClientSideAddString );
public:
// Update a client (called once during packet sending per client)
void SetTick( int tick_count);
#ifndef SHARED_NET_STRING_TABLES
// rollback feature
void EnableRollback( bool bState );
void RestoreTick( int tick );
// Buffer I/O
void WriteStringTables( bf_write& buf );
bool ReadStringTables( bf_read& buf );
void WriteUpdateMessage( CBaseClient *client, int tick_ack, bf_write &buf );
void WriteBaselines( bf_write &buf );
void DirectUpdate( int tick_ack ); // fill mirror table directly with updates
#endif
void TriggerCallbacks( int tick_ack ); // fire callback functions
// Guards so game .dll can't create tables at the wrong time
void AllowCreation( bool state );
// Print table data to console
void Dump( void );
// Sets the lock and returns the previous lock state
bool Lock( bool bLock );
void SetAllowClientSideAddString( bool state );
private:
bool m_bAllowCreation; // creat guard Guard
int m_nTickCount; // current tick
bool m_bLocked; // currently locked?
bool m_bEnableRollback; // enables rollback feature
CUtlVector < CNetworkStringTable* > m_Tables; // the string tables
};
#endif // NETWORKSTRINGTABLE_H
|