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.
534 lines
16 KiB
534 lines
16 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
//=====================================================================================// |
|
|
|
#include "dt_recv.h" |
|
#include "mathlib/vector.h" |
|
#include "tier1/strtools.h" |
|
#include "dt_utlvector_common.h" |
|
|
|
// memdbgon must be the last include file in a .cpp file!!! |
|
#include "tier0/memdbgon.h" |
|
|
|
#if !defined(_STATIC_LINKED) || defined(CLIENT_DLL) |
|
|
|
const char *s_ClientElementNames[MAX_ARRAY_ELEMENTS] = |
|
{ |
|
"000", "001", "002", "003", "004", "005", "006", "007", "008", "009", |
|
"010", "011", "012", "013", "014", "015", "016", "017", "018", "019", |
|
"020", "021", "022", "023", "024", "025", "026", "027", "028", "029", |
|
"030", "031", "032", "033", "034", "035", "036", "037", "038", "039", |
|
"040", "041", "042", "043", "044", "045", "046", "047", "048", "049", |
|
"050", "051", "052", "053", "054", "055", "056", "057", "058", "059", |
|
"060", "061", "062", "063", "064", "065", "066", "067", "068", "069", |
|
"070", "071", "072", "073", "074", "075", "076", "077", "078", "079", |
|
"080", "081", "082", "083", "084", "085", "086", "087", "088", "089", |
|
"090", "091", "092", "093", "094", "095", "096", "097", "098", "099", |
|
"100", "101", "102", "103", "104", "105", "106", "107", "108", "109", |
|
"110", "111", "112", "113", "114", "115", "116", "117", "118", "119", |
|
"120", "121", "122", "123", "124", "125", "126", "127", "128", "129", |
|
"130", "131", "132", "133", "134", "135", "136", "137", "138", "139", |
|
"140", "141", "142", "143", "144", "145", "146", "147", "148", "149", |
|
"150", "151", "152", "153", "154", "155", "156", "157", "158", "159", |
|
"160", "161", "162", "163", "164", "165", "166", "167", "168", "169", |
|
"170", "171", "172", "173", "174", "175", "176", "177", "178", "179", |
|
"180", "181", "182", "183", "184", "185", "186", "187", "188", "189", |
|
"190", "191", "192", "193", "194", "195", "196", "197", "198", "199", |
|
"200", "201", "202", "203", "204", "205", "206", "207", "208", "209", |
|
"210", "211", "212", "213", "214", "215", "216", "217", "218", "219", |
|
"220", "221", "222", "223", "224", "225", "226", "227", "228", "229", |
|
"230", "231", "232", "233", "234", "235", "236", "237", "238", "239", |
|
"240", "241", "242", "243", "244", "245", "246", "247", "248", "249", |
|
"250", "251", "252", "253", "254", "255", "256", "257", "258", "259", |
|
"260", "261", "262", "263", "264", "265", "266", "267", "268", "269", |
|
"270", "271", "272", "273", "274", "275", "276", "277", "278", "279", |
|
"280", "281", "282", "283", "284", "285", "286", "287", "288", "289", |
|
"290", "291", "292", "293", "294", "295", "296", "297", "298", "299", |
|
"300", "301", "302", "303", "304", "305", "306", "307", "308", "309", |
|
"310", "311", "312", "313", "314", "315", "316", "317", "318", "319", |
|
"320", "321", "322", "323", "324", "325", "326", "327", "328", "329", |
|
"330", "331", "332", "333", "334", "335", "336", "337", "338", "339", |
|
"340", "341", "342", "343", "344", "345", "346", "347", "348", "349", |
|
"350", "351", "352", "353", "354", "355", "356", "357", "358", "359", |
|
"360", "361", "362", "363", "364", "365", "366", "367", "368", "369", |
|
"370", "371", "372", "373", "374", "375", "376", "377", "378", "379", |
|
"380", "381", "382", "383", "384", "385", "386", "387", "388", "389", |
|
"390", "391", "392", "393", "394", "395", "396", "397", "398", "399", |
|
"400", "401", "402", "403", "404", "405", "406", "407", "408", "409", |
|
"410", "411", "412", "413", "414", "415", "416", "417", "418", "419", |
|
"420", "421", "422", "423", "424", "425", "426", "427", "428", "429", |
|
"430", "431", "432", "433", "434", "435", "436", "437", "438", "439", |
|
"440", "441", "442", "443", "444", "445", "446", "447", "448", "449", |
|
"450", "451", "452", "453", "454", "455", "456", "457", "458", "459", |
|
"460", "461", "462", "463", "464", "465", "466", "467", "468", "469", |
|
"470", "471", "472", "473", "474", "475", "476", "477", "478", "479", |
|
"480", "481", "482", "483", "484", "485", "486", "487", "488", "489", |
|
"490", "491", "492", "493", "494", "495", "496", "497", "498", "499", |
|
"500", "501", "502", "503", "504", "505", "506", "507", "508", "509", |
|
"510", "511", "512", "513", "514", "515", "516", "517", "518", "519", |
|
"520", "521", "522", "523", "524", "525", "526", "527", "528", "529", |
|
"530", "531", "532", "533", "534", "535", "536", "537", "538", "539", |
|
"540", "541", "542", "543", "544", "545", "546", "547", "548", "549", |
|
"550", "551", "552", "553", "554", "555", "556", "557", "558", "559", |
|
"560", "561", "562", "563", "564", "565", "566", "567", "568", "569", |
|
"570", "571", "572", "573", "574", "575", "576", "577", "578", "579", |
|
"580", "581", "582", "583", "584", "585", "586", "587", "588", "589", |
|
"590", "591", "592", "593", "594", "595", "596", "597", "598", "599", |
|
"600", "601", "602", "603", "604", "605", "606", "607", "608", "609", |
|
"610", "611", "612", "613", "614", "615", "616", "617", "618", "619", |
|
"620", "621", "622", "623", "624", "625", "626", "627", "628", "629", |
|
"630", "631", "632", "633", "634", "635", "636", "637", "638", "639", |
|
"640", "641", "642", "643", "644", "645", "646", "647", "648", "649", |
|
"650", "651", "652", "653", "654", "655", "656", "657", "658", "659", |
|
"660", "661", "662", "663", "664", "665", "666", "667", "668", "669", |
|
"670", "671", "672", "673", "674", "675", "676", "677", "678", "679", |
|
"680", "681", "682", "683", "684", "685", "686", "687", "688", "689", |
|
"690", "691", "692", "693", "694", "695", "696", "697", "698", "699", |
|
"700", "701", "702", "703", "704", "705", "706", "707", "708", "709", |
|
"710", "711", "712", "713", "714", "715", "716", "717", "718", "719", |
|
"720", "721", "722", "723", "724", "725", "726", "727", "728", "729", |
|
"730", "731", "732", "733", "734", "735", "736", "737", "738", "739", |
|
"740", "741", "742", "743", "744", "745", "746", "747", "748", "749", |
|
"750", "751", "752", "753", "754", "755", "756", "757", "758", "759", |
|
"760", "761", "762", "763", "764", "765", "766", "767", "768", "769", |
|
"770", "771", "772", "773", "774", "775", "776", "777", "778", "779", |
|
"780", "781", "782", "783", "784", "785", "786", "787", "788", "789", |
|
"790", "791", "792", "793", "794", "795", "796", "797", "798", "799", |
|
"800", "801", "802", "803", "804", "805", "806", "807", "808", "809", |
|
"810", "811", "812", "813", "814", "815", "816", "817", "818", "819", |
|
"820", "821", "822", "823", "824", "825", "826", "827", "828", "829", |
|
"830", "831", "832", "833", "834", "835", "836", "837", "838", "839", |
|
"840", "841", "842", "843", "844", "845", "846", "847", "848", "849", |
|
"850", "851", "852", "853", "854", "855", "856", "857", "858", "859", |
|
"860", "861", "862", "863", "864", "865", "866", "867", "868", "869", |
|
"870", "871", "872", "873", "874", "875", "876", "877", "878", "879", |
|
"880", "881", "882", "883", "884", "885", "886", "887", "888", "889", |
|
"890", "891", "892", "893", "894", "895", "896", "897", "898", "899", |
|
"900", "901", "902", "903", "904", "905", "906", "907", "908", "909", |
|
"910", "911", "912", "913", "914", "915", "916", "917", "918", "919", |
|
"920", "921", "922", "923", "924", "925", "926", "927", "928", "929", |
|
"930", "931", "932", "933", "934", "935", "936", "937", "938", "939", |
|
"940", "941", "942", "943", "944", "945", "946", "947", "948", "949", |
|
"950", "951", "952", "953", "954", "955", "956", "957", "958", "959", |
|
"960", "961", "962", "963", "964", "965", "966", "967", "968", "969", |
|
"970", "971", "972", "973", "974", "975", "976", "977", "978", "979", |
|
"980", "981", "982", "983", "984", "985", "986", "987", "988", "989", |
|
"990", "991", "992", "993", "994", "995", "996", "997", "998", "999", |
|
"1000", "1001", "1002", "1003", "1004", "1005", "1006", "1007", "1008", "1009", |
|
"1010", "1011", "1012", "1013", "1014", "1015", "1016", "1017", "1018", "1019", |
|
"1020", "1021", "1022", "1023" |
|
|
|
}; |
|
|
|
CStandardRecvProxies::CStandardRecvProxies() |
|
{ |
|
m_Int32ToInt8 = RecvProxy_Int32ToInt8; |
|
m_Int32ToInt16 = RecvProxy_Int32ToInt16; |
|
m_Int32ToInt32 = RecvProxy_Int32ToInt32; |
|
#ifdef SUPPORTS_INT64 |
|
m_Int64ToInt64 = RecvProxy_Int64ToInt64; |
|
#endif |
|
m_FloatToFloat = RecvProxy_FloatToFloat; |
|
m_VectorToVector = RecvProxy_VectorToVector; |
|
} |
|
|
|
CStandardRecvProxies g_StandardRecvProxies; |
|
|
|
|
|
// ---------------------------------------------------------------------- // |
|
// RecvProp. |
|
// ---------------------------------------------------------------------- // |
|
RecvProp::RecvProp() |
|
{ |
|
m_pExtraData = NULL; |
|
m_pVarName = NULL; |
|
m_Offset = 0; |
|
m_RecvType = DPT_Int; |
|
m_Flags = 0; |
|
m_ProxyFn = NULL; |
|
m_DataTableProxyFn = NULL; |
|
m_pDataTable = NULL; |
|
m_nElements = 1; |
|
m_ElementStride = -1; |
|
m_pArrayProp = NULL; |
|
m_ArrayLengthProxy = NULL; |
|
m_bInsideArray = false; |
|
} |
|
|
|
// ---------------------------------------------------------------------- // |
|
// RecvTable. |
|
// ---------------------------------------------------------------------- // |
|
RecvTable::RecvTable() |
|
{ |
|
Construct( NULL, 0, NULL ); |
|
} |
|
|
|
RecvTable::RecvTable(RecvProp *pProps, int nProps, const char *pNetTableName) |
|
{ |
|
Construct( pProps, nProps, pNetTableName ); |
|
} |
|
|
|
RecvTable::~RecvTable() |
|
{ |
|
} |
|
|
|
void RecvTable::Construct( RecvProp *pProps, int nProps, const char *pNetTableName ) |
|
{ |
|
m_pProps = pProps; |
|
m_nProps = nProps; |
|
m_pDecoder = NULL; |
|
m_pNetTableName = pNetTableName; |
|
m_bInitialized = false; |
|
m_bInMainList = false; |
|
} |
|
|
|
|
|
// ---------------------------------------------------------------------- // |
|
// Prop setup functions (for building tables). |
|
// ---------------------------------------------------------------------- // |
|
|
|
RecvProp RecvPropFloat( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
#ifdef _DEBUG |
|
if ( varProxy == RecvProxy_FloatToFloat ) |
|
{ |
|
Assert( sizeofVar == 0 || sizeofVar == 4 ); |
|
} |
|
#endif |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_Float; |
|
ret.m_Flags = flags; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp RecvPropVector( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
#ifdef _DEBUG |
|
if ( varProxy == RecvProxy_VectorToVector ) |
|
{ |
|
Assert( sizeofVar == sizeof( Vector ) ); |
|
} |
|
#endif |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_Vector; |
|
ret.m_Flags = flags; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp RecvPropVectorXY( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
#ifdef _DEBUG |
|
if ( varProxy == RecvProxy_VectorToVector ) |
|
{ |
|
Assert( sizeofVar == sizeof( Vector ) ); |
|
} |
|
#endif |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_VectorXY; |
|
ret.m_Flags = flags; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
|
|
#if 0 // We can't ship this since it changes the size of DTVariant to be 20 bytes instead of 16 and that breaks MODs!!! |
|
|
|
RecvProp RecvPropQuaternion( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, // Handled by RECVINFO macro, but set to SIZEOF_IGNORE if you don't want to bother. |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
#ifdef _DEBUG |
|
if ( varProxy == RecvProxy_QuaternionToQuaternion ) |
|
{ |
|
Assert( sizeofVar == sizeof( Quaternion ) ); |
|
} |
|
#endif |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_Quaternion; |
|
ret.m_Flags = flags; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
#endif |
|
|
|
RecvProp RecvPropInt( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
// If they didn't specify a proxy, then figure out what type we're writing to. |
|
if (varProxy == NULL) |
|
{ |
|
if (sizeofVar == 1) |
|
{ |
|
varProxy = RecvProxy_Int32ToInt8; |
|
} |
|
else if (sizeofVar == 2) |
|
{ |
|
varProxy = RecvProxy_Int32ToInt16; |
|
} |
|
else if (sizeofVar == 4) |
|
{ |
|
varProxy = RecvProxy_Int32ToInt32; |
|
} |
|
#ifdef SUPPORTS_INT64 |
|
else if (sizeofVar == 8) |
|
{ |
|
varProxy = RecvProxy_Int64ToInt64; |
|
} |
|
#endif |
|
else |
|
{ |
|
Assert(!"RecvPropInt var has invalid size"); |
|
varProxy = RecvProxy_Int32ToInt8; // safest one... |
|
} |
|
} |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
#ifdef SUPPORTS_INT64 |
|
ret.m_RecvType = (sizeofVar == 8) ? DPT_Int64 : DPT_Int; |
|
#else |
|
ret.m_RecvType = DPT_Int; |
|
#endif |
|
ret.m_Flags = flags; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp RecvPropString( |
|
const char *pVarName, |
|
int offset, |
|
int bufferSize, |
|
int flags, |
|
RecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_String; |
|
ret.m_Flags = flags; |
|
ret.m_StringBufferSize = bufferSize; |
|
ret.SetProxyFn( varProxy ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp RecvPropDataTable( |
|
const char *pVarName, |
|
int offset, |
|
int flags, |
|
RecvTable *pTable, |
|
DataTableRecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_DataTable; |
|
ret.m_Flags = flags; |
|
ret.SetDataTableProxyFn( varProxy ); |
|
ret.SetDataTable( pTable ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp RecvPropArray3( |
|
const char *pVarName, |
|
int offset, |
|
int sizeofVar, |
|
int elements, |
|
RecvProp pArrayProp, |
|
DataTableRecvVarProxyFn varProxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
Assert( elements <= MAX_ARRAY_ELEMENTS ); |
|
|
|
ret.m_pVarName = pVarName; |
|
ret.SetOffset( offset ); |
|
ret.m_RecvType = DPT_DataTable; |
|
ret.SetDataTableProxyFn( varProxy ); |
|
|
|
RecvProp *pProps = new RecvProp[elements]; // TODO free that again |
|
|
|
const char *pParentArrayPropName = AllocateStringHelper( "%s", pVarName ); |
|
|
|
for ( int i=0; i < elements; i++ ) |
|
{ |
|
pProps[i] = pArrayProp; // copy basic property settings |
|
pProps[i].SetOffset( i * sizeofVar ); // adjust offset |
|
pProps[i].m_pVarName = s_ClientElementNames[i]; // give unique name |
|
pProps[i].SetParentArrayPropName( pParentArrayPropName ); // For debugging... |
|
} |
|
|
|
RecvTable *pTable = new RecvTable( pProps, elements, pVarName ); // TODO free that again |
|
|
|
ret.SetDataTable( pTable ); |
|
|
|
return ret; |
|
} |
|
|
|
RecvProp InternalRecvPropArray( |
|
const int elementCount, |
|
const int elementStride, |
|
const char *pName, |
|
ArrayLengthRecvProxyFn proxy |
|
) |
|
{ |
|
RecvProp ret; |
|
|
|
ret.InitArray( elementCount, elementStride ); |
|
ret.m_pVarName = pName; |
|
ret.SetArrayLengthProxy( proxy ); |
|
|
|
return ret; |
|
} |
|
|
|
|
|
// ---------------------------------------------------------------------- // |
|
// Proxies. |
|
// ---------------------------------------------------------------------- // |
|
|
|
void RecvProxy_FloatToFloat( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
Assert( IsFinite( pData->m_Value.m_Float ) ); |
|
*((float*)pOut) = pData->m_Value.m_Float; |
|
} |
|
|
|
void RecvProxy_VectorToVector( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
const float *v = pData->m_Value.m_Vector; |
|
|
|
Assert( IsFinite( v[0] ) && IsFinite( v[1] ) && IsFinite( v[2] ) ); |
|
((float*)pOut)[0] = v[0]; |
|
((float*)pOut)[1] = v[1]; |
|
((float*)pOut)[2] = v[2]; |
|
} |
|
|
|
void RecvProxy_VectorXYToVectorXY( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
const float *v = pData->m_Value.m_Vector; |
|
|
|
Assert( IsFinite( v[0] ) && IsFinite( v[1] ) ); |
|
((float*)pOut)[0] = v[0]; |
|
((float*)pOut)[1] = v[1]; |
|
} |
|
|
|
void RecvProxy_QuaternionToQuaternion( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
const float *v = pData->m_Value.m_Vector; |
|
|
|
Assert( IsFinite( v[0] ) && IsFinite( v[1] ) && IsFinite( v[2] ) && IsFinite( v[3] ) ); |
|
((float*)pOut)[0] = v[0]; |
|
((float*)pOut)[1] = v[1]; |
|
((float*)pOut)[2] = v[2]; |
|
((float*)pOut)[3] = v[3]; |
|
} |
|
|
|
void RecvProxy_Int32ToInt8( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
*((unsigned char*)pOut) = (unsigned char)pData->m_Value.m_Int; |
|
} |
|
|
|
void RecvProxy_Int32ToInt16( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
*((unsigned short*)pOut) = (unsigned short)pData->m_Value.m_Int; |
|
} |
|
|
|
void RecvProxy_Int32ToInt32( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
*((uint32*)pOut) = (uint32)pData->m_Value.m_Int; |
|
} |
|
|
|
#ifdef SUPPORTS_INT64 |
|
void RecvProxy_Int64ToInt64( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
*((int64*)pOut) = (int64)pData->m_Value.m_Int64; |
|
} |
|
#endif |
|
|
|
void RecvProxy_StringToString( const CRecvProxyData *pData, void *pStruct, void *pOut ) |
|
{ |
|
char *pStrOut = (char*)pOut; |
|
if ( pData->m_pRecvProp->m_StringBufferSize <= 0 ) |
|
{ |
|
return; |
|
} |
|
|
|
for ( int i=0; i < pData->m_pRecvProp->m_StringBufferSize; i++ ) |
|
{ |
|
pStrOut[i] = pData->m_Value.m_pString[i]; |
|
if ( pStrOut[i] == 0 ) |
|
break; |
|
} |
|
|
|
pStrOut[pData->m_pRecvProp->m_StringBufferSize-1] = 0; |
|
} |
|
|
|
void DataTableRecvProxy_StaticDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ) |
|
{ |
|
*pOut = pData; |
|
} |
|
|
|
void DataTableRecvProxy_PointerDataTable( const RecvProp *pProp, void **pOut, void *pData, int objectID ) |
|
{ |
|
*pOut = *((void**)pData); |
|
} |
|
|
|
#endif
|
|
|