Team Fortress 2 Source Code as on 22/4/2020
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.
 
 
 
 
 
 

203 lines
5.8 KiB

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $NoKeywords: $
//=============================================================================//
#ifndef PREDICTABLE_ENTITY_H
#define PREDICTABLE_ENTITY_H
#ifdef _WIN32
#pragma once
#endif
// For introspection
#include "tier0/platform.h"
#include "predictioncopy.h"
#include "shared_classnames.h"
#ifndef NO_ENTITY_PREDICTION
#define UsePrediction() 1
#else
#define UsePrediction() 0
#endif
// CLIENT DLL includes
#if defined( CLIENT_DLL )
#include "iclassmap.h"
#include "recvproxy.h"
class SendTable;
// Game DLL includes
#else
#include "sendproxy.h"
#endif // !CLIENT_DLL
#if defined( CLIENT_DLL )
#define DECLARE_NETWORKCLASS() \
DECLARE_CLIENTCLASS()
#define DECLARE_NETWORKCLASS_NOBASE() \
DECLARE_CLIENTCLASS_NOBASE()
#else
#define DECLARE_NETWORKCLASS() \
DECLARE_SERVERCLASS()
#define DECLARE_NETWORKCLASS_NOBASE() \
DECLARE_SERVERCLASS_NOBASE()
#endif
#if defined( CLIENT_DLL )
#ifndef NO_ENTITY_PREDICTION
#define DECLARE_PREDICTABLE() \
public: \
static typedescription_t m_PredDesc[]; \
static datamap_t m_PredMap; \
virtual datamap_t *GetPredDescMap( void ); \
template <typename T> friend datamap_t *PredMapInit(T *)
#else
#define DECLARE_PREDICTABLE() template <typename T> friend datamap_t *PredMapInit(T *)
#endif
#ifndef NO_ENTITY_PREDICTION
#define BEGIN_PREDICTION_DATA( className ) \
datamap_t className::m_PredMap = { 0, 0, #className, &BaseClass::m_PredMap }; \
datamap_t *className::GetPredDescMap( void ) { return &m_PredMap; } \
BEGIN_PREDICTION_DATA_GUTS( className )
#define BEGIN_PREDICTION_DATA_NO_BASE( className ) \
datamap_t className::m_PredMap = { 0, 0, #className, NULL }; \
datamap_t *className::GetPredDescMap( void ) { return &m_PredMap; } \
BEGIN_PREDICTION_DATA_GUTS( className )
#define BEGIN_PREDICTION_DATA_GUTS( className ) \
template <typename T> datamap_t *PredMapInit(T *); \
template <> datamap_t *PredMapInit<className>( className * ); \
namespace className##_PredDataDescInit \
{ \
datamap_t *g_PredMapHolder = PredMapInit( (className *)NULL ); /* This can/will be used for some clean up duties later */ \
} \
\
template <> datamap_t *PredMapInit<className>( className * ) \
{ \
typedef className classNameTypedef; \
static typedescription_t predDesc[] = \
{ \
{ FIELD_VOID,0, {0,0},0,0,0,0,0,0}, /* so you can define "empty" tables */
#define END_PREDICTION_DATA() \
}; \
\
if ( sizeof( predDesc ) > sizeof( predDesc[0] ) ) \
{ \
classNameTypedef::m_PredMap.dataNumFields = ARRAYSIZE( predDesc ) - 1; \
classNameTypedef::m_PredMap.dataDesc = &predDesc[1]; \
} \
else \
{ \
classNameTypedef::m_PredMap.dataNumFields = 1; \
classNameTypedef::m_PredMap.dataDesc = predDesc; \
} \
return &classNameTypedef::m_PredMap; \
}
#else
#define BEGIN_PREDICTION_DATA( className ) \
template <> inline datamap_t *PredMapInit<className>( className * ) \
{ \
if ( 0 ) \
{ \
typedef className classNameTypedef; \
typedescription_t predDesc[] = \
{ \
{ FIELD_VOID,0, {0,0},0,0,0,0,0,0},
#define BEGIN_PREDICTION_DATA_NO_BASE( className ) BEGIN_PREDICTION_DATA( className )
#define END_PREDICTION_DATA() \
}; \
predDesc[0].flags = 0; /* avoid compiler warning of unused data */ \
} \
}
#endif
#else
// nothing, only client has a prediction system
#define DECLARE_PREDICTABLE()
#define BEGIN_PREDICTION_DATA( className )
#define END_PREDICTION_DATA()
#endif
#if defined( CLIENT_DLL )
// On the client .dll this creates a mapping between a classname and
// a client side class. Probably could be templatized at some point.
#define LINK_ENTITY_TO_CLASS( localName, className ) \
static C_BaseEntity *C##className##Factory( void ) \
{ \
return static_cast< C_BaseEntity * >( new className ); \
}; \
class C##localName##Foo \
{ \
public: \
C##localName##Foo( void ) \
{ \
GetClassMap().Add( #localName, #className, sizeof( className ), \
&C##className##Factory ); \
} \
}; \
static C##localName##Foo g_C##localName##Foo;
#define BEGIN_NETWORK_TABLE( className, tableName ) BEGIN_RECV_TABLE( className, tableName )
#define BEGIN_NETWORK_TABLE_NOBASE( className, tableName ) BEGIN_RECV_TABLE_NOBASE( className, tableName )
#define END_NETWORK_TABLE END_RECV_TABLE
#define IMPLEMENT_NETWORKCLASS_ALIASED(className, dataTable) \
IMPLEMENT_CLIENTCLASS( C_##className, dataTable, C##className )
#define IMPLEMENT_NETWORKCLASS(className, dataTable) \
IMPLEMENT_CLIENTCLASS(className, dataTable, className)
#define IMPLEMENT_NETWORKCLASS_DT(className, dataTable) \
IMPLEMENT_CLIENTCLASS_DT(className, dataTable, className)
#else
#define BEGIN_NETWORK_TABLE( className, tableName ) BEGIN_SEND_TABLE( className, tableName )
#define BEGIN_NETWORK_TABLE_NOBASE( className, tableName ) BEGIN_SEND_TABLE_NOBASE( className, tableName )
#define END_NETWORK_TABLE END_SEND_TABLE
#define IMPLEMENT_NETWORKCLASS_ALIASED(className, dataTable) \
IMPLEMENT_SERVERCLASS( C##className, dataTable )
#define IMPLEMENT_NETWORKCLASS(className, dataTable) \
IMPLEMENT_SERVERCLASS(className, dataTable)
#define IMPLEMENT_NETWORKCLASS_DT(className, dataTable) \
IMPLEMENT_SERVERCLASS_ST(className, dataTable)
#endif
// Interface used by client and server to track predictable entities
abstract_class IPredictableList
{
public:
// Get predictables by index
virtual CBaseEntity *GetPredictable( int slot ) = 0;
// Get count of predictables
virtual int GetPredictableCount( void ) = 0;
};
// Expose interface to rest of .dll
extern IPredictableList *predictables;
#endif // PREDICTABLE_ENTITY_H