diff --git a/engine/cmodel.cpp b/engine/cmodel.cpp index 466d4451..e9af063d 100644 --- a/engine/cmodel.cpp +++ b/engine/cmodel.cpp @@ -539,64 +539,62 @@ struct leafnums_t CCollisionBSPData *pBSPData; }; - - int CM_BoxLeafnums( leafnums_t &context, const Vector ¢er, const Vector &extents, int nodenum ) { - int leafCount = 0; - const int NODELIST_MAX = 1024; - int nodeList[NODELIST_MAX]; - int nodeReadIndex = 0; - int nodeWriteIndex = 0; - cplane_t *plane; - cnode_t *node; - int prev_topnode = -1; - - while (1) - { - if (nodenum < 0) - { - // This handles the case when the box lies completely - // within a single node. In that case, the top node should be - // the parent of the leaf - if (context.leafTopNode == -1) - context.leafTopNode = prev_topnode; - - if (leafCount < context.leafMaxCount) - { - context.pLeafList[leafCount] = -1 - nodenum; - leafCount++; - } - if ( nodeReadIndex == nodeWriteIndex ) - return leafCount; - nodenum = nodeList[nodeReadIndex]; - nodeReadIndex = (nodeReadIndex+1) & (NODELIST_MAX-1); - } - else - { - node = &context.pBSPData->map_rootnode[nodenum]; - plane = node->plane; - // s = BoxOnPlaneSide (leaf_mins, leaf_maxs, plane); - // s = BOX_ON_PLANE_SIDE(*leaf_mins, *leaf_maxs, plane); - float d0 = DotProduct( plane->normal, center ) - plane->dist; - float d1 = DotProductAbs( plane->normal, extents ); - prev_topnode = nodenum; - if (d0 >= d1) - nodenum = node->children[0]; - else if (d0 < -d1) - nodenum = node->children[1]; - else - { // go down both - if (context.leafTopNode == -1) - context.leafTopNode = nodenum; - nodeList[nodeWriteIndex] = node->children[0]; - nodeWriteIndex = (nodeWriteIndex+1) & (NODELIST_MAX-1); - // check for overflow of the ring buffer - Assert(nodeWriteIndex != nodeReadIndex); - nodenum = node->children[1]; - } - } - } + int leafCount = 0; + const int NODELIST_MAX = 1024; + int nodeList[NODELIST_MAX]; + int nodeReadIndex = 0; + int nodeWriteIndex = 0; + cplane_t *plane; + cnode_t *node; + int prev_topnode = -1; + + while (1) + { + if (nodenum < 0) + { + // This handles the case when the box lies completely + // within a single node. In that case, the top node should be + // the parent of the leaf + if (context.leafTopNode == -1) + context.leafTopNode = prev_topnode; + + if (leafCount < context.leafMaxCount) + { + context.pLeafList[leafCount] = -1 - nodenum; + leafCount++; + } + if ( nodeReadIndex == nodeWriteIndex ) + return leafCount; + nodenum = nodeList[nodeReadIndex]; + nodeReadIndex = (nodeReadIndex+1) & (NODELIST_MAX-1); + } + else + { + node = &context.pBSPData->map_rootnode[nodenum]; + plane = node->plane; + // s = BoxOnPlaneSide (leaf_mins, leaf_maxs, plane); + // s = BOX_ON_PLANE_SIDE(*leaf_mins, *leaf_maxs, plane); + float d0 = DotProduct( plane->normal, center ) - plane->dist; + float d1 = DotProductAbs( plane->normal, extents ); + prev_topnode = nodenum; + if (d0 >= d1) + nodenum = node->children[0]; + else if (d0 < -d1) + nodenum = node->children[1]; + else + { // go down both + if (context.leafTopNode == -1) + context.leafTopNode = nodenum; + nodeList[nodeWriteIndex] = node->children[0]; + nodeWriteIndex = (nodeWriteIndex+1) & (NODELIST_MAX-1); + // check for overflow of the ring buffer + Assert(nodeWriteIndex != nodeReadIndex); + nodenum = node->children[1]; + } + } + } } int CM_BoxLeafnums ( const Vector& mins, const Vector& maxs, int *list, int listsize, int *topnode) @@ -2666,38 +2664,32 @@ bool CM_HeadnodeVisible (int nodenum, const byte *visbits, int vissize ) // *visbits - pvs or pas of some cluster // Output : true if visible, false if not //----------------------------------------------------------------------------- -#define MAX_BOX_LEAVES 256 -int CM_BoxVisible( const Vector& mins, const Vector& maxs, const byte *visbits, int vissize ) -{ - int leafList[MAX_BOX_LEAVES]; - int topnode; - - // FIXME: Could save a loop here by traversing the tree in this routine like the code above - int count = CM_BoxLeafnums( mins, maxs, leafList, MAX_BOX_LEAVES, &topnode ); - for ( int i = 0; i < count; i++ ) - { - int cluster = CM_LeafCluster( leafList[i] ); - int offset = cluster>>3; - - if ( offset == -1 ) - { - return false; - } - - if ( offset > vissize || offset < 0 ) - { - Sys_Error( "CM_BoxVisible: cluster %i, offset %i out of bounds %i\n", cluster, offset, vissize ); - } - - if (visbits[cluster>>3] & (1<<(cluster&7))) - { - return true; - } - } - return false; +#define MAX_BOX_LEAVES 256 +int CM_BoxVisible( const Vector& mins, const Vector& maxs, const byte *visbits, int vissize ) +{ + int leafList[MAX_BOX_LEAVES]; + int topnode; + + // FIXME: Could save a loop here by traversing the tree in this routine like the code above + int count = CM_BoxLeafnums( mins, maxs, leafList, MAX_BOX_LEAVES, &topnode ); + for ( int i = 0; i < count; i++ ) + { + int cluster = CM_LeafCluster( leafList[i] ); + int offset = cluster>>3; + + if ( offset > vissize ) + { + Sys_Error( "CM_BoxVisible: cluster %i, offset %i out of bounds %i\n", cluster, offset, vissize ); + } + + if (visbits[cluster>>3] & (1<<(cluster&7))) + { + return true; + } + } + return false; } - //----------------------------------------------------------------------------- // Returns the world-space center of an entity //----------------------------------------------------------------------------- diff --git a/game/server/player.cpp b/game/server/player.cpp index 7dea1f50..b5d4debc 100644 --- a/game/server/player.cpp +++ b/game/server/player.cpp @@ -3380,12 +3380,14 @@ void CBasePlayer::PhysicsSimulate( void ) pi->m_nNumCmds = commandsToRun; } } +#if 0 else if ( GetTimeSinceLastUserCommand() > sv_player_usercommand_timeout.GetFloat() ) { // no usercommand from player after some threshold // server should start RunNullCommand as if client sends an empty command so that Think and gamestate related things run properly RunNullCommand(); } +#endif // Restore the true server clock // FIXME: Should this occur after simulation of children so diff --git a/public/Color.h b/public/Color.h index e800a372..0d6d292d 100644 --- a/public/Color.h +++ b/public/Color.h @@ -12,6 +12,8 @@ #pragma once #endif +#include "tier1/strtools.h" + //----------------------------------------------------------------------------- // Purpose: Basic handler for an rgb set of colors // This class is fully inline @@ -22,7 +24,7 @@ public: // constructors Color() { - *((int *)this) = 0; + Q_memset( _color, 0, sizeof _color ); } Color(int _r,int _g,int _b) { @@ -32,7 +34,7 @@ public: { SetColor(_r, _g, _b, _a); } - + // set the color // r - red component (0-255) // g - green component (0-255) @@ -56,19 +58,21 @@ public: void SetRawColor( int color32 ) { - *((int *)this) = color32; + Q_memcpy( _color, &color32, sizeof _color ); } int GetRawColor() const { - return *((int *)this); + int color; + Q_memcpy( &color, _color, sizeof _color ); + return color; } inline int r() const { return _color[0]; } inline int g() const { return _color[1]; } inline int b() const { return _color[2]; } inline int a() const { return _color[3]; } - + unsigned char &operator[](int index) { return _color[index]; @@ -79,12 +83,12 @@ public: return _color[index]; } - bool operator == (const Color &rhs) const + bool operator == (const Color &rhs) { - return ( *((int *)this) == *((int *)&rhs) ); + return Q_memcmp( this, &rhs, sizeof(Color) ) == 0; } - bool operator != (const Color &rhs) const + bool operator != (const Color &rhs) { return !(operator==(rhs)); } diff --git a/public/datamap.h b/public/datamap.h index 909d67f5..936f4436 100644 --- a/public/datamap.h +++ b/public/datamap.h @@ -128,11 +128,9 @@ DECLARE_FIELD_SIZE( FIELD_MATERIALINDEX, sizeof(int) ) #define ARRAYSIZE2D(p) (sizeof(p)/sizeof(p[0][0])) #define SIZE_OF_ARRAY(p) _ARRAYSIZE(p) -// Normal offset of is invalid on non-array-types, this is dubious as hell. The rest of the codebase converted to the -// legit offsetof from the C headers, so we'll use the old impl here to avoid exposing temptation to others -#define _hacky_datamap_offsetof(s,m) ((size_t)&(((s *)0)->m)) +#define _offsetof(s,m) ((size_t)&(((s *)0)->m)) -#define _FIELD(name,fieldtype,count,flags,mapname,tolerance) { fieldtype, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, count, flags, mapname, NULL, NULL, NULL, sizeof( ((classNameTypedef *)0)->name ), NULL, 0, tolerance } +#define _FIELD(name,fieldtype,count,flags,mapname,tolerance) { fieldtype, #name, { _offsetof(classNameTypedef, name), 0 }, count, flags, mapname, NULL, NULL, NULL, sizeof( ((classNameTypedef *)0)->name ), NULL, 0, tolerance } #define DEFINE_FIELD_NULL { FIELD_VOID,0, {0,0},0,0,0,0,0,0} #define DEFINE_FIELD(name,fieldtype) _FIELD(name, fieldtype, 1, FTYPEDESC_SAVE, NULL, 0 ) #define DEFINE_KEYFIELD(name,fieldtype, mapname) _FIELD(name, fieldtype, 1, FTYPEDESC_KEY | FTYPEDESC_SAVE, mapname, 0 ) @@ -144,35 +142,35 @@ DECLARE_FIELD_SIZE( FIELD_MATERIALINDEX, sizeof(int) ) #define DEFINE_ENTITY_GLOBAL_FIELD(name,fieldtype) _FIELD(edict_t, name, fieldtype, 1, FTYPEDESC_KEY | FTYPEDESC_SAVE | FTYPEDESC_GLOBAL, #name, 0 ) #define DEFINE_GLOBAL_FIELD(name,fieldtype) _FIELD(name, fieldtype, 1, FTYPEDESC_GLOBAL | FTYPEDESC_SAVE, NULL, 0 ) #define DEFINE_GLOBAL_KEYFIELD(name,fieldtype, mapname) _FIELD(name, fieldtype, 1, FTYPEDESC_GLOBAL | FTYPEDESC_KEY | FTYPEDESC_SAVE, mapname, 0 ) -#define DEFINE_CUSTOM_FIELD(name,datafuncs) { FIELD_CUSTOM, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, datafuncs, NULL } -#define DEFINE_CUSTOM_KEYFIELD(name,datafuncs,mapname) { FIELD_CUSTOM, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_KEY, mapname, datafuncs, NULL } +#define DEFINE_CUSTOM_FIELD(name,datafuncs) { FIELD_CUSTOM, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, datafuncs, NULL } +#define DEFINE_CUSTOM_KEYFIELD(name,datafuncs,mapname) { FIELD_CUSTOM, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_KEY, mapname, datafuncs, NULL } #define DEFINE_AUTO_ARRAY2D(name,fieldtype) _FIELD(name, fieldtype, ARRAYSIZE2D(((classNameTypedef *)0)->name), FTYPEDESC_SAVE, NULL, 0 ) // Used by byteswap datadescs #define DEFINE_BITFIELD(name,fieldtype,bitcount) DEFINE_ARRAY(name,fieldtype,((bitcount+FIELD_BITS(fieldtype)-1)&~(FIELD_BITS(fieldtype)-1)) / FIELD_BITS(fieldtype) ) #define DEFINE_INDEX(name,fieldtype) _FIELD(name, fieldtype, 1, FTYPEDESC_INDEX, NULL, 0 ) #define DEFINE_EMBEDDED( name ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name.m_DataMap), sizeof( ((classNameTypedef *)0)->name ), NULL, 0, 0.0f } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name.m_DataMap), sizeof( ((classNameTypedef *)0)->name ), NULL, 0, 0.0f } #define DEFINE_EMBEDDED_OVERRIDE( name, overridetype ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &((overridetype *)0)->m_DataMap, sizeof( ((classNameTypedef *)0)->name ), NULL, 0, 0.0f } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &((overridetype *)0)->m_DataMap, sizeof( ((classNameTypedef *)0)->name ), NULL, 0, 0.0f } #define DEFINE_EMBEDDEDBYREF( name ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_PTR, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( *(((classNameTypedef *)0)->name) ), NULL, 0, 0.0f } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_PTR, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( *(((classNameTypedef *)0)->name) ), NULL, 0, 0.0f } #define DEFINE_EMBEDDED_ARRAY( name, count ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, count, FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( ((classNameTypedef *)0)->name[0] ), NULL, 0, 0.0f } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, count, FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( ((classNameTypedef *)0)->name[0] ), NULL, 0, 0.0f } #define DEFINE_EMBEDDED_AUTO_ARRAY( name ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, SIZE_OF_ARRAY( ((classNameTypedef *)0)->name ), FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( ((classNameTypedef *)0)->name[0] ), NULL, 0, 0.0f } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, SIZE_OF_ARRAY( ((classNameTypedef *)0)->name ), FTYPEDESC_SAVE, NULL, NULL, NULL, &(((classNameTypedef *)0)->name->m_DataMap), sizeof( ((classNameTypedef *)0)->name[0] ), NULL, 0, 0.0f } #ifndef NO_ENTITY_PREDICTION #define DEFINE_PRED_TYPEDESCRIPTION( name, fieldtype ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &fieldtype::m_PredMap } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE, NULL, NULL, NULL, &fieldtype::m_PredMap } #define DEFINE_PRED_TYPEDESCRIPTION_PTR( name, fieldtype ) \ - { FIELD_EMBEDDED, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_PTR, NULL, NULL, NULL, &fieldtype::m_PredMap } + { FIELD_EMBEDDED, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_SAVE | FTYPEDESC_PTR, NULL, NULL, NULL, &fieldtype::m_PredMap } #else @@ -193,7 +191,7 @@ DECLARE_FIELD_SIZE( FIELD_MATERIALINDEX, sizeof(int) ) //#define DEFINE_DATA( name, fieldextname, flags ) _FIELD(name, fieldtype, 1, flags, extname ) // INPUTS -#define DEFINE_INPUT( name, fieldtype, inputname ) { fieldtype, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_INPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, inputname, NULL, NULL, NULL, sizeof( ((classNameTypedef *)0)->name ) } +#define DEFINE_INPUT( name, fieldtype, inputname ) { fieldtype, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_INPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, inputname, NULL, NULL, NULL, sizeof( ((classNameTypedef *)0)->name ) } #define DEFINE_INPUTFUNC( fieldtype, inputname, inputfunc ) { fieldtype, #inputfunc, { NULL, NULL }, 1, FTYPEDESC_INPUT, inputname, NULL, static_cast (&classNameTypedef::inputfunc) } // OUTPUTS @@ -201,7 +199,7 @@ DECLARE_FIELD_SIZE( FIELD_MATERIALINDEX, sizeof(int) ) // we know the output type from the variable itself, so it doesn't need to be specified here class ISaveRestoreOps; extern ISaveRestoreOps *eventFuncs; -#define DEFINE_OUTPUT( name, outputname ) { FIELD_CUSTOM, #name, { (int)_hacky_datamap_offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_OUTPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, outputname, eventFuncs } +#define DEFINE_OUTPUT( name, outputname ) { FIELD_CUSTOM, #name, { _offsetof(classNameTypedef, name), 0 }, 1, FTYPEDESC_OUTPUT | FTYPEDESC_SAVE | FTYPEDESC_KEY, outputname, eventFuncs } // replaces EXPORT table for portability and non-DLL based systems (xbox) #define DEFINE_FUNCTION_RAW( function, func_type ) { FIELD_VOID, nameHolder.GenerateName(#function), { NULL, NULL }, 1, FTYPEDESC_FUNCTIONTABLE, NULL, NULL, (inputfunc_t)((func_type)(&classNameTypedef::function)) } diff --git a/public/tier1/bitbuf.h b/public/tier1/bitbuf.h index ebf40cc4..a625f5eb 100644 --- a/public/tier1/bitbuf.h +++ b/public/tier1/bitbuf.h @@ -20,7 +20,7 @@ #include "mathlib/vector.h" #include "basetypes.h" #include "tier0/dbg.h" - +#include "strtools.h" #if _DEBUG #define BITBUF_INLINE inline @@ -465,12 +465,12 @@ BITBUF_INLINE void bf_write::WriteUBitVar( unsigned int data ) // write raw IEEE float bits in little endian form BITBUF_INLINE void bf_write::WriteBitFloat(float val) { - long intVal; + int32 intVal; Assert(sizeof(long) == sizeof(float)); Assert(sizeof(float) == 4); - intVal = *((long*)&val); + Q_memcpy( &intVal, &val, sizeof(intVal)); WriteUBitLong( intVal, 32 ); } diff --git a/public/tier1/utlbuffer.h b/public/tier1/utlbuffer.h index 0de85fda..2f646e5e 100644 --- a/public/tier1/utlbuffer.h +++ b/public/tier1/utlbuffer.h @@ -598,7 +598,7 @@ inline void CUtlBuffer::GetObject( T *dest ) { if ( !m_Byteswap.IsSwappingBytes() || ( sizeof( T ) == 1 ) ) { - *dest = *(T *)PeekGet(); + Q_memcpy( dest, PeekGet(), sizeof( T ) ); } else { @@ -630,18 +630,18 @@ inline void CUtlBuffer::GetTypeBin( T &dest ) { if ( !m_Byteswap.IsSwappingBytes() || ( sizeof( T ) == 1 ) ) { - dest = *(T *)PeekGet(); + Q_memcpy(&dest, PeekGet(), sizeof(T) ); } else { m_Byteswap.SwapBufferToTargetEndian( &dest, (T*)PeekGet() ); } - m_Get += sizeof(T); - } + m_Get += sizeof(T); + } else { dest = 0; - } + } } template <> @@ -661,18 +661,18 @@ inline void CUtlBuffer::GetTypeBin< float >( float &dest ) else { // aligned read - dest = *(float *)pData; + Q_memcpy( &dest, (void*)pData, sizeof(float) ); } if ( m_Byteswap.IsSwappingBytes() ) { m_Byteswap.SwapBufferToTargetEndian< float >( &dest, &dest ); } - m_Get += sizeof( float ); - } + m_Get += sizeof( float ); + } else { dest = 0; - } + } } template @@ -816,7 +816,7 @@ inline void CUtlBuffer::PutObject( T *src ) { if ( !m_Byteswap.IsSwappingBytes() || ( sizeof( T ) == 1 ) ) { - *(T *)PeekPut() = *src; + Q_memcpy( PeekPut(), src, sizeof( T ) ); } else { @@ -845,7 +845,7 @@ inline void CUtlBuffer::PutTypeBin( T src ) { if ( !m_Byteswap.IsSwappingBytes() || ( sizeof( T ) == 1 ) ) { - *(T *)PeekPut() = src; + Q_memcpy( PeekPut(), &src, sizeof( T ) ); } else { diff --git a/vpklib/packedstore.cpp b/vpklib/packedstore.cpp index eee4f5eb..8b7d7ba7 100644 --- a/vpklib/packedstore.cpp +++ b/vpklib/packedstore.cpp @@ -29,7 +29,7 @@ typedef uint16 PackFileIndex_t; #define PACKFILEINDEX_END 0xffff - +const uint16 packedfileindex_end = 0xffff; #pragma pack(1) struct CFilePartDescr @@ -120,9 +120,12 @@ static int SkipFile( char const * &pData ) // returns highest file index int nHighestChunkIndex = -1; pData += 1 + V_strlen( pData ); pData += sizeof( uint32 ); - int nMetaDataSize = *(reinterpret_cast( pData ) ); + + uint16 nMetaDataSize; + Q_memcpy( &nMetaDataSize, pData, sizeof( uint16 ) ); + pData += sizeof( uint16 ); - while ( *( ( PackFileIndex_t const *) pData ) != PACKFILEINDEX_END ) + while ( Q_memcmp( pData, &packedfileindex_end, sizeof( packedfileindex_end ) ) != 0 ) { int nIdx = reinterpret_cast(pData)->m_nFileNumber;