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.
|
|
//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose:
//
// $Workfile: $
// $Date: $
// $NoKeywords: $
//=============================================================================//
#if !defined( PACKED_ENTITY_H )
#define PACKED_ENTITY_H
#ifdef _WIN32
#pragma once
#endif
#include <const.h>
#include <basetypes.h>
#include <mempool.h>
#include <utlvector.h>
#include <tier0/dbg.h>
#include "common.h"
// Matched with the memdbgoff at end of header
#include "memdbgon.h"
// This is extra spew to the files cltrace.txt + svtrace.txt
// #define DEBUG_NETWORKING 1
#if defined( DEBUG_NETWORKING )
#include "convar.h"
void SpewToFile( PRINTF_FORMAT_STRING char const* pFmt, ... ); extern ConVar sv_packettrace; #define TRACE_PACKET( text ) if ( sv_packettrace.GetInt() ) { SpewToFile text ; };
#else
#define TRACE_PACKET( text )
#endif
enum { ENTITY_SENTINEL = 9999 // larger number than any real entity number
};
#define FLAG_IS_COMPRESSED (1<<31)
class CSendProxyRecipients; class SendTable; class RecvTable; class ServerClass; class ClientClass; class IChangeFrameList;
// Replaces entity_state_t.
// This is what we send to clients.
class PackedEntity { public:
PackedEntity(); ~PackedEntity(); void SetNumBits( int nBits ); int GetNumBits() const; int GetNumBytes() const; void SetCompressed(); bool IsCompressed() const;
// Access the data in the entity.
void* GetData(); void FreeData();
// Copy the data into the PackedEntity's data and make sure the # bytes allocated is
// an integer multiple of 4.
bool AllocAndCopyPadded( const void *pData, unsigned long size );
// These are like Get/Set, except SnagChangeFrameList clears out the
// PackedEntity's pointer since the usage model in sv_main is to keep
// the same CChangeFrameList in the most recent PackedEntity for the
// lifetime of an edict.
//
// When the PackedEntity is deleted, it deletes its current CChangeFrameList if it exists.
void SetChangeFrameList( IChangeFrameList *pList ); IChangeFrameList* GetChangeFrameList(); IChangeFrameList* SnagChangeFrameList();
// If this PackedEntity has a ChangeFrameList, then this calls through. If not, it returns all props
int GetPropsChangedAfterTick( int iTick, int *iOutProps, int nMaxOutProps ); // Access the recipients array.
const CSendProxyRecipients* GetRecipients() const; int GetNumRecipients() const;
void SetRecipients( const CUtlMemory<CSendProxyRecipients> &recipients ); bool CompareRecipients( const CUtlMemory<CSendProxyRecipients> &recipients );
void SetSnapshotCreationTick( int nTick ); int GetSnapshotCreationTick() const;
void SetShouldCheckCreationTick( bool bState ); bool ShouldCheckCreationTick() const;
void SetServerAndClientClass( ServerClass *pServerClass, ClientClass *pClientClass );
public: ServerClass *m_pServerClass; // Valid on the server
ClientClass *m_pClientClass; // Valid on the client
int m_nEntityIndex; // Entity index.
int m_ReferenceCount; // reference count;
private:
CUtlVector<CSendProxyRecipients> m_Recipients;
void *m_pData; // Packed data.
int m_nBits; // Number of bits used to encode.
IChangeFrameList *m_pChangeFrameList; // Only the most current
// This is the tick this PackedEntity was created on
unsigned int m_nSnapshotCreationTick : 31; unsigned int m_nShouldCheckCreationTick : 1; };
inline void PackedEntity::SetNumBits( int nBits ) { Assert( !( nBits & 31 ) ); m_nBits = nBits; }
inline void PackedEntity::SetCompressed() { m_nBits |= FLAG_IS_COMPRESSED; }
inline bool PackedEntity::IsCompressed() const { return (m_nBits & FLAG_IS_COMPRESSED) != 0; }
inline int PackedEntity::GetNumBits() const { Assert( !( m_nBits & 31 ) ); return m_nBits & ~(FLAG_IS_COMPRESSED); }
inline int PackedEntity::GetNumBytes() const { return Bits2Bytes( m_nBits ); }
inline void* PackedEntity::GetData() { return m_pData; }
inline void PackedEntity::FreeData() { if ( m_pData ) { free(m_pData); m_pData = NULL; } }
inline void PackedEntity::SetChangeFrameList( IChangeFrameList *pList ) { Assert( !m_pChangeFrameList ); m_pChangeFrameList = pList; }
inline IChangeFrameList* PackedEntity::GetChangeFrameList() { return m_pChangeFrameList; }
inline IChangeFrameList* PackedEntity::SnagChangeFrameList() { IChangeFrameList *pRet = m_pChangeFrameList; m_pChangeFrameList = NULL; return pRet; }
inline void PackedEntity::SetSnapshotCreationTick( int nTick ) { m_nSnapshotCreationTick = (unsigned int)nTick; }
inline int PackedEntity::GetSnapshotCreationTick() const { return (int)m_nSnapshotCreationTick; }
inline void PackedEntity::SetShouldCheckCreationTick( bool bState ) { m_nShouldCheckCreationTick = bState ? 1 : 0; }
inline bool PackedEntity::ShouldCheckCreationTick() const { return m_nShouldCheckCreationTick == 1 ? true : false; }
#include "memdbgoff.h"
#endif // PACKED_ENTITY_H
|