You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
212 lines
6.5 KiB
212 lines
6.5 KiB
//========= 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
|
|
|