//----------------------------------------------------------------------------- // Purpose: // Input : id - // *tableName - // maxentries - //----------------------------------------------------------------------------- CNetworkStringTable::CNetworkStringTable( TABLEID id, const char *tableName, int maxentries, int userdatafixedsize, int userdatanetworkbits, bool bIsFilenames ) : m_bAllowClientSideAddString( false ), m_pItemsClientSide( NULL ) { m_id = id; int len = strlen( tableName ) + 1; m_pszTableName = new char[ len ]; assert( m_pszTableName ); assert( tableName ); Q_strncpy( m_pszTableName, tableName, len ); m_changeFunc = NULL; m_pObject = NULL; m_nTickCount = 0; m_pMirrorTable = NULL; m_nLastChangedTick = 0; m_bChangeHistoryEnabled = false; m_bLocked = false; m_nMaxEntries = maxentries; m_nEntryBits = Q_log2( m_nMaxEntries ); m_bUserDataFixedSize = userdatafixedsize != 0; m_nUserDataSize = userdatafixedsize; m_nUserDataSizeBits = userdatanetworkbits; if ( m_nUserDataSizeBits > CNetworkStringTableItem::MAX_USERDATA_BITS ) { Host_Error( "String tables user data bits restricted to %i bits, requested %i is too large\n", CNetworkStringTableItem::MAX_USERDATA_BITS, m_nUserDataSizeBits ); } if ( m_nUserDataSize > CNetworkStringTableItem::MAX_USERDATA_SIZE ) { Host_Error( "String tables user data size restricted to %i bytes, requested %i is too large\n", CNetworkStringTableItem::MAX_USERDATA_SIZE, m_nUserDataSize ); } // Make sure maxentries is power of 2 if ( ( 1 << m_nEntryBits ) != maxentries ) { Host_Error( "String tables must be powers of two in size!, %i is not a power of 2\n", maxentries ); } if ( IsXbox() || bIsFilenames ) { m_bIsFilenames = true; m_pItems = new CNetworkStringFilenameDict; } else { m_bIsFilenames = false; m_pItems = new CNetworkStringDict; } }
int SendProp::GetNumArrayLengthBits() const { Assert( GetType() == DPT_Array ); #if _X360 int elemCount = GetNumElements(); if ( !elemCount ) return 1; return (32 - _CountLeadingZeros(GetNumElements())); #else return Q_log2( GetNumElements() ) + 1; #endif }
// Assign each class and ID and write an svc_classinfo for each one. void SV_WriteClassInfos(ServerClass *pClasses, bf_write *pBuf) { // FileHandle_t fileHandle = g_pFileSystem->Open( "classinfos.txt", "w" ); // Count the number of classes. int nClasses = 0; for ( ServerClass *pCount=pClasses; pCount; pCount=pCount->m_pNext ) { // g_pFileSystem->FPrintf( fileHandle, "%d %s\n", nClasses, pCount->GetName() ); ++nClasses; } assert( nClasses < (1<<16) ); sv.serverclasses = nClasses; sv.serverclassbits = Q_log2( sv.serverclasses ) + 1; // g_pFileSystem->Close( fileHandle ); pBuf->WriteByte(svc_classinfo); pBuf->WriteByte(CLASSINFO_NUMCLASSES); pBuf->WriteShort( nClasses ); int curID = 0; for ( ServerClass *pClass=pClasses; pClass; pClass=pClass->m_pNext ) { pClass->m_ClassID = curID; curID++; pBuf->WriteByte(svc_classinfo); pBuf->WriteByte(CLASSINFO_CLASSDATA); pBuf->WriteUBitLong( pClass->m_ClassID, sv.serverclassbits, false ); pBuf->WriteString( pClass->m_pNetworkName ); pBuf->WriteString( pClass->m_pTable->GetName() ); /* // Write the sub networkable info. for ( CServerSubNetworkableDef *pCur=pClass->m_pSubNetworkableList->m_pHead; pCur; pCur=pCur->m_pNext ) { pBuf->WriteOneBit( 1 ); pBuf->WriteString( pCur->m_pSharedName ); pBuf->WriteUBitLong( pCur->m_SubNetworkableID, 16 ); } pBuf->WriteOneBit( 0 ); */ } pBuf->WriteByte(svc_classinfo); pBuf->WriteByte(CLASSINFO_ENDCLASSES); }
#if !defined( NO_ENTITY_PREDICTION ) BEGIN_NETWORK_TABLE_NOBASE( CBeam, DT_BeamPredictableId ) #if !defined( CLIENT_DLL ) SendPropPredictableId( SENDINFO( m_PredictableID ) ), SendPropInt( SENDINFO( m_bIsPlayerSimulated ), 1, SPROP_UNSIGNED ), #else RecvPropPredictableId( RECVINFO( m_PredictableID ) ), RecvPropInt( RECVINFO( m_bIsPlayerSimulated ) ), #endif END_NETWORK_TABLE() #endif BEGIN_NETWORK_TABLE_NOBASE( CBeam, DT_Beam ) #if !defined( CLIENT_DLL ) SendPropInt (SENDINFO(m_nBeamType), Q_log2(NUM_BEAM_TYPES)+1, SPROP_UNSIGNED ), SendPropInt (SENDINFO(m_nBeamFlags), NUM_BEAM_FLAGS, SPROP_UNSIGNED ), SendPropInt (SENDINFO(m_nNumBeamEnts ), 5, SPROP_UNSIGNED ), SendPropArray3 ( SENDINFO_ARRAY3(m_hAttachEntity), SendPropEHandle( SENDINFO_ARRAY(m_hAttachEntity) ) ), SendPropArray3 ( SENDINFO_ARRAY3(m_nAttachIndex), SendPropInt( SENDINFO_ARRAY(m_nAttachIndex), ATTACHMENT_INDEX_BITS, SPROP_UNSIGNED) ), SendPropInt (SENDINFO(m_nHaloIndex), 16, SPROP_UNSIGNED ), SendPropFloat (SENDINFO(m_fHaloScale), 0, SPROP_NOSCALE ), SendPropFloat (SENDINFO(m_fWidth), 10, SPROP_ROUNDUP, 0.0f, MAX_BEAM_WIDTH ),
// // Tables. // // Client specific. #ifdef CLIENT_DLL BEGIN_RECV_TABLE_NOBASE( CTFPlayerClassShared, DT_TFPlayerClassShared ) RecvPropInt( RECVINFO( m_iClass ) ), END_RECV_TABLE() // Server specific. #else BEGIN_SEND_TABLE_NOBASE( CTFPlayerClassShared, DT_TFPlayerClassShared ) SendPropInt( SENDINFO( m_iClass ), Q_log2( TF_CLASS_COUNT_ALL )+1, SPROP_UNSIGNED ), END_SEND_TABLE() #endif //----------------------------------------------------------------------------- // Purpose: Constructor //----------------------------------------------------------------------------- CTFPlayerClassShared::CTFPlayerClassShared() { m_iClass.Set( TF_CLASS_UNDEFINED ); } //----------------------------------------------------------------------------- // Purpose: Initialize the player class.
int SendProp::GetNumArrayLengthBits() const { Assert( GetType() == DPT_Array ); return Q_log2( GetNumElements() ) + 1; }
} } return NULL; } REGISTER_SEND_PROXY_NON_MODIFIED_POINTER( SendProxy_SendLocalObjectDataTable ); BEGIN_NETWORK_TABLE_NOBASE( CObjectSentrygun, DT_SentrygunLocalData ) SendPropInt( SENDINFO(m_iKills), 12, SPROP_CHANGES_OFTEN ), SendPropInt( SENDINFO(m_iAssists), 12, SPROP_CHANGES_OFTEN ), END_NETWORK_TABLE() IMPLEMENT_SERVERCLASS_ST( CObjectSentrygun, DT_ObjectSentrygun ) SendPropInt( SENDINFO(m_iAmmoShells), 9, SPROP_CHANGES_OFTEN ), SendPropInt( SENDINFO(m_iAmmoRockets), 6, SPROP_CHANGES_OFTEN ), SendPropInt( SENDINFO(m_iState), Q_log2( SENTRY_NUM_STATES ) + 1, SPROP_UNSIGNED ), SendPropDataTable( "SentrygunLocalData", 0, &REFERENCE_SEND_TABLE( DT_SentrygunLocalData ), SendProxy_SendLocalObjectDataTable ), END_SEND_TABLE() BEGIN_DATADESC( CObjectSentrygun ) END_DATADESC() LINK_ENTITY_TO_CLASS(obj_sentrygun, CObjectSentrygun); PRECACHE_REGISTER(obj_sentrygun); ConVar tf_sentrygun_damage( "tf_sentrygun_damage", "16", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); ConVar tf_sentrygun_ammocheat( "tf_sentrygun_ammocheat", "0", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); ConVar tf_sentrygun_upgrade_per_hit( "tf_sentrygun_upgrade_per_hit", "25", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); ConVar tf_sentrygun_newtarget_dist( "tf_sentrygun_newtarget_dist", "200", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); ConVar tf_sentrygun_metal_per_shell( "tf_sentrygun_metal_per_shell", "1", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY ); ConVar tf_sentrygun_metal_per_rocket( "tf_sentrygun_metal_per_rocket", "2", FCVAR_CHEAT | FCVAR_DEVELOPMENTONLY );
CTEFireBullets::CTEFireBullets( const char *name ) : CBaseTempEntity( name ) { } //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- CTEFireBullets::~CTEFireBullets( void ) { } IMPLEMENT_SERVERCLASS_ST_NOBASE( CTEFireBullets, DT_TEFireBullets ) SendPropVector( SENDINFO(m_vecOrigin), -1, SPROP_COORD_MP_INTEGRAL ), SendPropAngle( SENDINFO_VECTORELEM( m_vecAngles, 0 ), 7, 0 ), SendPropAngle( SENDINFO_VECTORELEM( m_vecAngles, 1 ), 7, 0 ), SendPropInt( SENDINFO( m_iWeaponID ), Q_log2(TF_WEAPON_COUNT)+1, SPROP_UNSIGNED ), SendPropInt( SENDINFO( m_iMode ), 1, SPROP_UNSIGNED ), SendPropInt( SENDINFO( m_iSeed ), NUM_BULLET_SEED_BITS, SPROP_UNSIGNED ), SendPropInt( SENDINFO( m_iPlayer ), 6, SPROP_UNSIGNED ), // max 64 players, see MAX_PLAYERS SendPropFloat( SENDINFO( m_flSpread ), 8, 0, 0.0f, 1.0f ), SendPropBool( SENDINFO( m_bCritical ) ), END_SEND_TABLE() // Singleton static CTEFireBullets g_TEFireBullets( "Fire Bullets" ); //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- void TE_FireBullets( int iPlayerIndex, const Vector &vOrigin, const QAngle &vAngles, int iWeaponID, int iMode, int iSeed, float flSpread, bool bCritical )
DECLARE_CLASS( CTEPlayerAnimEvent, CBaseTempEntity ); DECLARE_SERVERCLASS(); CTEPlayerAnimEvent( const char *name ) : CBaseTempEntity( name ) { } CNetworkHandle( CBasePlayer, m_hPlayer ); CNetworkVar( int, m_iEvent ); }; #define THROWGRENADE_COUNTER_BITS 3 IMPLEMENT_SERVERCLASS_ST_NOBASE( CTEPlayerAnimEvent, DT_TEPlayerAnimEvent ) SendPropEHandle( SENDINFO( m_hPlayer ) ), SendPropInt( SENDINFO( m_iEvent ), Q_log2( PLAYERANIMEVENT_COUNT ) + 1, SPROP_UNSIGNED ), END_SEND_TABLE() static CTEPlayerAnimEvent g_TEPlayerAnimEvent( "PlayerAnimEvent" ); void TE_PlayerAnimEvent( CBasePlayer *pPlayer, PlayerAnimEvent_t event ) { CPVSFilter filter( (const Vector&)pPlayer->EyePosition() ); g_TEPlayerAnimEvent.m_hPlayer = pPlayer; g_TEPlayerAnimEvent.m_iEvent = event; g_TEPlayerAnimEvent.Create( filter, 0 ); } // -------------------------------------------------------------------------------- // // Tables.
public: DECLARE_CLASS( CTEPlayerAnimEvent, CBaseTempEntity ); DECLARE_SERVERCLASS(); CTEPlayerAnimEvent( const char *name ) : CBaseTempEntity( name ) { } CNetworkHandle( CBasePlayer, m_hPlayer ); CNetworkVar( int, m_iEvent ); CNetworkVar( int, m_nData ); }; IMPLEMENT_SERVERCLASS_ST_NOBASE( CTEPlayerAnimEvent, DT_TEPlayerAnimEvent ) SendPropEHandle( SENDINFO( m_hPlayer ) ), SendPropInt( SENDINFO( m_iEvent ), Q_log2( PLAYERANIMEVENT_COUNT ) + 1, SPROP_UNSIGNED ), SendPropInt( SENDINFO( m_nData ), 32 ) END_SEND_TABLE() static CTEPlayerAnimEvent g_TEPlayerAnimEvent( "PlayerAnimEvent" ); void TE_PlayerAnimEvent( CBasePlayer *pPlayer, PlayerAnimEvent_t event, int nData ) { CPVSFilter filter( (const Vector&)pPlayer->EyePosition() ); //Tony; pull the player who is doing it out of the recipientlist, this is predicted!! filter.RemoveRecipient( pPlayer ); g_TEPlayerAnimEvent.m_hPlayer = pPlayer; g_TEPlayerAnimEvent.m_iEvent = event; g_TEPlayerAnimEvent.m_nData = nData;