msg.cpp 29 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249
  1. #include "../game/q_shared.h"
  2. #include "qcommon.h"
  3. #include "../server/server.h"
  4. /*
  5. ==============================================================================
  6. MESSAGE IO FUNCTIONS
  7. Handles byte ordering and avoids alignment errors
  8. ==============================================================================
  9. */
  10. void MSG_Init( msg_t *buf, byte *data, int length ) {
  11. memset (buf, 0, sizeof(*buf));
  12. buf->data = data;
  13. buf->maxsize = length;
  14. }
  15. void MSG_Clear( msg_t *buf ) {
  16. buf->cursize = 0;
  17. buf->overflowed = qfalse;
  18. buf->bit = 0;
  19. }
  20. void MSG_BeginReading( msg_t *msg ) {
  21. msg->readcount = 0;
  22. msg->bit = 0;
  23. }
  24. void MSG_ReadByteAlign( msg_t *buf ) {
  25. // round up to the next byte
  26. if ( buf->bit ) {
  27. buf->bit = 0;
  28. buf->readcount++;
  29. }
  30. }
  31. void *MSG_GetSpace( msg_t *buf, int length ) {
  32. void *data;
  33. // round up to the next byte
  34. if ( buf->bit ) {
  35. buf->bit = 0;
  36. buf->cursize++;
  37. }
  38. if ( buf->cursize + length > buf->maxsize ) {
  39. if ( !buf->allowoverflow ) {
  40. Com_Error (ERR_FATAL, "MSG_GetSpace: overflow without allowoverflow set");
  41. }
  42. if ( length > buf->maxsize ) {
  43. Com_Error (ERR_FATAL, "MSG_GetSpace: %i is > full buffer size", length);
  44. }
  45. Com_Printf ("MSG_GetSpace: overflow\n");
  46. MSG_Clear (buf);
  47. buf->overflowed = qtrue;
  48. }
  49. data = buf->data + buf->cursize;
  50. buf->cursize += length;
  51. return data;
  52. }
  53. void MSG_WriteData( msg_t *buf, const void *data, int length ) {
  54. memcpy (MSG_GetSpace(buf,length),data,length);
  55. }
  56. /*
  57. =============================================================================
  58. bit functions
  59. =============================================================================
  60. */
  61. int overflows;
  62. // negative bit values include signs
  63. void MSG_WriteBits( msg_t *msg, int value, int bits ) {
  64. int put;
  65. int fraction;
  66. // this isn't an exact overflow check, but close enough
  67. if ( msg->maxsize - msg->cursize < 4 ) {
  68. msg->overflowed = qtrue;
  69. #ifndef FINAL_BUILD
  70. Com_Printf (S_COLOR_RED"MSG_WriteBits: buffer Full writing %d in %d bits\n", value, bits);
  71. #endif
  72. return;
  73. }
  74. if ( bits == 0 || bits < -31 || bits > 32 ) {
  75. Com_Error( ERR_DROP, "MSG_WriteBits: bad bits %i", bits );
  76. }
  77. // check for overflows
  78. if ( bits != 32 ) {
  79. if ( bits > 0 ) {
  80. if ( value > ( ( 1 << bits ) - 1 ) || value < 0 ) {
  81. overflows++;
  82. #ifndef FINAL_BUILD
  83. #ifdef _DEBUG
  84. Com_Printf (S_COLOR_RED"MSG_WriteBits: overflow writing %d in %d bits\n", value, bits);
  85. #endif
  86. #endif
  87. }
  88. } else {
  89. int r;
  90. r = 1 << (bits-1);
  91. if ( value > r - 1 || value < -r ) {
  92. overflows++;
  93. #ifndef FINAL_BUILD
  94. #ifdef _DEBUG
  95. Com_Printf (S_COLOR_RED"MSG_WriteBits: overflow writing %d in %d bits\n", value, bits);
  96. #endif
  97. #endif
  98. }
  99. }
  100. }
  101. if ( bits < 0 ) {
  102. bits = -bits;
  103. }
  104. while ( bits ) {
  105. if ( msg->bit == 0 ) {
  106. msg->data[msg->cursize] = 0;
  107. msg->cursize++;
  108. }
  109. put = 8 - msg->bit;
  110. if ( put > bits ) {
  111. put = bits;
  112. }
  113. fraction = value & ( ( 1 << put ) - 1 );
  114. msg->data[msg->cursize - 1] |= fraction << msg->bit;
  115. bits -= put;
  116. value >>= put;
  117. msg->bit = ( msg->bit + put ) & 7;
  118. }
  119. }
  120. int MSG_ReadBits( msg_t *msg, int bits ) {
  121. int value;
  122. int valueBits;
  123. int get;
  124. int fraction;
  125. qboolean sgn;
  126. value = 0;
  127. valueBits = 0;
  128. if ( bits < 0 ) {
  129. bits = -bits;
  130. sgn = qtrue;
  131. } else {
  132. sgn = qfalse;
  133. }
  134. while ( valueBits < bits ) {
  135. if ( msg->bit == 0 ) {
  136. msg->readcount++;
  137. assert (msg->readcount <= msg->cursize);
  138. }
  139. get = 8 - msg->bit;
  140. if ( get > (bits - valueBits) ) {
  141. get = (bits - valueBits);
  142. }
  143. fraction = msg->data[msg->readcount - 1];
  144. fraction >>= msg->bit;
  145. fraction &= ( 1 << get ) - 1;
  146. value |= fraction << valueBits;
  147. valueBits += get;
  148. msg->bit = ( msg->bit + get ) & 7;
  149. }
  150. if ( sgn ) {
  151. if ( value & ( 1 << ( bits - 1 ) ) ) {
  152. value |= -1 ^ ( ( 1 << bits ) - 1 );
  153. }
  154. }
  155. return value;
  156. }
  157. //================================================================================
  158. //
  159. // writing functions
  160. //
  161. void MSG_WriteByte( msg_t *sb, int c ) {
  162. #ifdef PARANOID
  163. if (c < 0 || c > 255)
  164. Com_Error (ERR_FATAL, "MSG_WriteByte: range error");
  165. #endif
  166. MSG_WriteBits( sb, c, 8 );
  167. }
  168. void MSG_WriteShort( msg_t *sb, int c ) {
  169. #ifdef PARANOID
  170. if (c < ((short)0x8000) || c > (short)0x7fff)
  171. Com_Error (ERR_FATAL, "MSG_WriteShort: range error");
  172. #endif
  173. MSG_WriteBits( sb, c, 16 );
  174. }
  175. static void MSG_WriteSShort( msg_t *sb, int c ) {
  176. MSG_WriteBits( sb, c, -16 );
  177. }
  178. void MSG_WriteLong( msg_t *sb, int c ) {
  179. MSG_WriteBits( sb, c, 32 );
  180. }
  181. void MSG_WriteString( msg_t *sb, const char *s ) {
  182. if ( !s ) {
  183. MSG_WriteData (sb, "", 1);
  184. } else {
  185. int l, i;
  186. char string[MAX_STRING_CHARS];
  187. l = strlen( s );
  188. if ( l >= MAX_STRING_CHARS ) {
  189. Com_Printf( "MSG_WriteString: MAX_STRING_CHARS" );
  190. MSG_WriteData (sb, "", 1);
  191. return;
  192. }
  193. Q_strncpyz( string, s, sizeof( string ) );
  194. // get rid of 0xff chars, because old clients don't like them
  195. for ( i = 0 ; i < l ; i++ ) {
  196. if ( ((byte *)string)[i] > 127 ) {
  197. string[i] = '.';
  198. }
  199. }
  200. MSG_WriteData (sb, string, l+1);
  201. }
  202. }
  203. //============================================================
  204. //
  205. // reading functions
  206. //
  207. // returns -1 if no more characters are available
  208. int MSG_ReadByte( msg_t *msg ) {
  209. int c;
  210. if ( msg->readcount+1 > msg->cursize ) {
  211. c = -1;
  212. } else {
  213. c = (unsigned char)MSG_ReadBits( msg, 8 );
  214. }
  215. return c;
  216. }
  217. int MSG_ReadShort( msg_t *msg ) {
  218. int c;
  219. if ( msg->readcount+2 > msg->cursize ) {
  220. c = -1;
  221. } else {
  222. c = MSG_ReadBits( msg, 16 );
  223. }
  224. return c;
  225. }
  226. static int MSG_ReadSShort( msg_t *msg ) {
  227. int c;
  228. if ( msg->readcount+2 > msg->cursize ) {
  229. c = -1;
  230. } else {
  231. c = MSG_ReadBits( msg, -16 );
  232. }
  233. return c;
  234. }
  235. int MSG_ReadLong( msg_t *msg ) {
  236. int c;
  237. if ( msg->readcount+4 > msg->cursize ) {
  238. c = -1;
  239. } else {
  240. c = MSG_ReadBits( msg, 32 );
  241. }
  242. return c;
  243. }
  244. char *MSG_ReadString( msg_t *msg ) {
  245. static char string[MAX_STRING_CHARS];
  246. int l,c;
  247. MSG_ReadByteAlign( msg );
  248. l = 0;
  249. do {
  250. c = MSG_ReadByte(msg); // use ReadByte so -1 is out of bounds
  251. if ( c == -1 || c == 0 ) {
  252. break;
  253. }
  254. // translate all fmt spec to avoid crash bugs
  255. if ( c == '%' ) {
  256. c = '.';
  257. }
  258. string[l] = c;
  259. l++;
  260. } while (l < sizeof(string)-1);
  261. string[l] = 0;
  262. return string;
  263. }
  264. char *MSG_ReadStringLine( msg_t *msg ) {
  265. static char string[MAX_STRING_CHARS];
  266. int l,c;
  267. MSG_ReadByteAlign( msg );
  268. l = 0;
  269. do {
  270. c = MSG_ReadByte(msg); // use ReadByte so -1 is out of bounds
  271. if (c == -1 || c == 0 || c == '\n') {
  272. break;
  273. }
  274. // translate all fmt spec to avoid crash bugs
  275. if ( c == '%' ) {
  276. c = '.';
  277. }
  278. string[l] = c;
  279. l++;
  280. } while (l < sizeof(string)-1);
  281. string[l] = 0;
  282. return string;
  283. }
  284. void MSG_ReadData( msg_t *msg, void *data, int len ) {
  285. int i;
  286. MSG_ReadByteAlign( msg );
  287. for (i=0 ; i<len ; i++) {
  288. ((byte *)data)[i] = MSG_ReadByte (msg);
  289. }
  290. }
  291. /*
  292. =============================================================================
  293. delta functions
  294. =============================================================================
  295. */
  296. extern cvar_t *cl_shownet;
  297. #define LOG(x) if( cl_shownet->integer == 4 ) { Com_Printf("%s ", x ); };
  298. void MSG_WriteDelta( msg_t *msg, int oldV, int newV, int bits ) {
  299. if ( oldV == newV ) {
  300. MSG_WriteBits( msg, 0, 1 );
  301. return;
  302. }
  303. MSG_WriteBits( msg, 1, 1 );
  304. MSG_WriteBits( msg, newV, bits );
  305. }
  306. int MSG_ReadDelta( msg_t *msg, int oldV, int bits ) {
  307. if ( MSG_ReadBits( msg, 1 ) ) {
  308. return MSG_ReadBits( msg, bits );
  309. }
  310. return oldV;
  311. }
  312. void MSG_WriteDeltaFloat( msg_t *msg, float oldV, float newV ) {
  313. if ( oldV == newV ) {
  314. MSG_WriteBits( msg, 0, 1 );
  315. return;
  316. }
  317. MSG_WriteBits( msg, 1, 1 );
  318. MSG_WriteBits( msg, *(int *)&newV, 32 );
  319. }
  320. float MSG_ReadDeltaFloat( msg_t *msg, float oldV ) {
  321. if ( MSG_ReadBits( msg, 1 ) ) {
  322. float newV;
  323. *(int *)&newV = MSG_ReadBits( msg, 32 );
  324. return newV;
  325. }
  326. return oldV;
  327. }
  328. /*
  329. ============================================================================
  330. usercmd_t communication
  331. ============================================================================
  332. */
  333. // ms is allways sent, the others are optional
  334. #define CM_ANGLE1 (1<<0)
  335. #define CM_ANGLE2 (1<<1)
  336. #define CM_ANGLE3 (1<<2)
  337. #define CM_FORWARD (1<<3)
  338. #define CM_SIDE (1<<4)
  339. #define CM_UP (1<<5)
  340. #define CM_BUTTONS (1<<6)
  341. #define CM_WEAPON (1<<7)
  342. /*
  343. =====================
  344. MSG_WriteDeltaUsercmd
  345. =====================
  346. */
  347. void MSG_WriteDeltaUsercmd( msg_t *msg, usercmd_t *from, usercmd_t *to ) {
  348. MSG_WriteDelta( msg, from->serverTime, to->serverTime, 32 );
  349. MSG_WriteDelta( msg, from->angles[0], to->angles[0], 16 );
  350. MSG_WriteDelta( msg, from->angles[1], to->angles[1], 16 );
  351. MSG_WriteDelta( msg, from->angles[2], to->angles[2], 16 );
  352. MSG_WriteDelta( msg, from->forwardmove, to->forwardmove, -8 );
  353. MSG_WriteDelta( msg, from->rightmove, to->rightmove, -8 );
  354. MSG_WriteDelta( msg, from->upmove, to->upmove, -8 );
  355. MSG_WriteDelta( msg, from->buttons, to->buttons, 16 );//FIXME: We're only really using 9 bits...can this be changed to that?
  356. MSG_WriteDelta( msg, from->weapon, to->weapon, 8 );
  357. MSG_WriteDelta( msg, from->generic_cmd, to->generic_cmd, 8 );
  358. }
  359. /*
  360. =====================
  361. MSG_ReadDeltaUsercmd
  362. =====================
  363. */
  364. void MSG_ReadDeltaUsercmd( msg_t *msg, usercmd_t *from, usercmd_t *to ) {
  365. to->serverTime = MSG_ReadDelta( msg, from->serverTime, 32);
  366. to->angles[0] = MSG_ReadDelta( msg, from->angles[0], 16);
  367. to->angles[1] = MSG_ReadDelta( msg, from->angles[1], 16);
  368. to->angles[2] = MSG_ReadDelta( msg, from->angles[2], 16);
  369. to->forwardmove = MSG_ReadDelta( msg, from->forwardmove, -8);
  370. to->rightmove = MSG_ReadDelta( msg, from->rightmove, -8);
  371. to->upmove = MSG_ReadDelta( msg, from->upmove, -8);
  372. to->buttons = MSG_ReadDelta( msg, from->buttons, 16);//FIXME: We're only really using 9 bits...can this be changed to that?
  373. to->weapon = MSG_ReadDelta( msg, from->weapon, 8);
  374. to->generic_cmd = MSG_ReadDelta( msg, from->generic_cmd, 8);
  375. }
  376. /*
  377. =============================================================================
  378. entityState_t communication
  379. =============================================================================
  380. */
  381. typedef struct {
  382. char *name;
  383. int offset;
  384. int bits; // 0 = float
  385. } netField_t;
  386. // using the stringizing operator to save typing...
  387. #define NETF(x) #x,(int)&((entityState_t*)0)->x
  388. #if 0 // Removed by BTO (VV)
  389. const netField_t entityStateFields[] =
  390. {
  391. { NETF(eType), 8 },
  392. { NETF(eFlags), 32 },
  393. { NETF(pos.trType), 8 },
  394. { NETF(pos.trTime), 32 },
  395. { NETF(pos.trDuration), 32 },
  396. { NETF(pos.trBase[0]), 0 },
  397. { NETF(pos.trBase[1]), 0 },
  398. { NETF(pos.trBase[2]), 0 },
  399. { NETF(pos.trDelta[0]), 0 },
  400. { NETF(pos.trDelta[1]), 0 },
  401. { NETF(pos.trDelta[2]), 0 },
  402. { NETF(apos.trType), 8 },
  403. { NETF(apos.trTime), 32 },
  404. { NETF(apos.trDuration), 32 },
  405. { NETF(apos.trBase[0]), 0 },
  406. { NETF(apos.trBase[1]), 0 },
  407. { NETF(apos.trBase[2]), 0 },
  408. { NETF(apos.trDelta[0]), 0 },
  409. { NETF(apos.trDelta[1]), 0 },
  410. { NETF(apos.trDelta[2]), 0 },
  411. { NETF(time), 32 },
  412. { NETF(time2), 32 },
  413. { NETF(origin[0]), 0 },
  414. { NETF(origin[1]), 0 },
  415. { NETF(origin[2]), 0 },
  416. { NETF(origin2[0]), 0 },
  417. { NETF(origin2[1]), 0 },
  418. { NETF(origin2[2]), 0 },
  419. { NETF(angles[0]), 0 },
  420. { NETF(angles[1]), 0 },
  421. { NETF(angles[2]), 0 },
  422. { NETF(angles2[0]), 0 },
  423. { NETF(angles2[1]), 0 },
  424. { NETF(angles2[2]), 0 },
  425. { NETF(otherEntityNum), GENTITYNUM_BITS },
  426. //{ NETF(otherEntityNum2), GENTITYNUM_BITS },
  427. { NETF(groundEntityNum), GENTITYNUM_BITS },
  428. { NETF(constantLight), 32 },
  429. { NETF(loopSound), 16 },
  430. { NETF(modelindex), 9 }, //0 to 511
  431. { NETF(modelindex2), 8 },
  432. { NETF(modelindex3), 8 },
  433. { NETF(clientNum), 32 },
  434. { NETF(frame), 16 },
  435. { NETF(solid), 24 },
  436. { NETF(event), 10 },
  437. { NETF(eventParm), 16 },
  438. { NETF(powerups), 16 },
  439. { NETF(weapon), 8 },
  440. { NETF(legsAnim), 16 },
  441. { NETF(legsAnimTimer), 8 },
  442. { NETF(torsoAnim), 16 },
  443. { NETF(torsoAnimTimer), 8 },
  444. { NETF(scale), 8 },
  445. { NETF(saberInFlight), 4 },
  446. { NETF(saberActive), 4 },
  447. { NETF(vehicleArmor), 32 },
  448. { NETF(vehicleAngles[0]), 0 },
  449. { NETF(vehicleAngles[1]), 0 },
  450. { NETF(vehicleAngles[2]), 0 },
  451. { NETF(m_iVehicleNum), 32 },
  452. /*
  453. Ghoul2 Insert Start
  454. */
  455. { NETF(modelScale[0]), 0 },
  456. { NETF(modelScale[1]), 0 },
  457. { NETF(modelScale[2]), 0 },
  458. { NETF(radius), 16 },
  459. { NETF(boltInfo), 32 },
  460. //{ NETF(ghoul2), 32 },
  461. { NETF(isPortalEnt), 1 },
  462. };
  463. #endif
  464. // if (int)f == f and (int)f + ( 1<<(FLOAT_INT_BITS-1) ) < ( 1 << FLOAT_INT_BITS )
  465. // the float will be sent with FLOAT_INT_BITS, otherwise all 32 bits will be sent
  466. #define FLOAT_INT_BITS 13
  467. #define FLOAT_INT_BIAS (1<<(FLOAT_INT_BITS-1))
  468. void MSG_WriteField (msg_t *msg, const int *toF, const netField_t *field)
  469. {
  470. int trunc;
  471. float fullFloat;
  472. if ( field->bits == -1)
  473. { // a -1 in the bits field means it's a float that's always between -1 and 1
  474. int temp = *(float *)toF * 32767;
  475. MSG_WriteBits( msg, temp, -16 );
  476. }
  477. else
  478. if ( field->bits == 0 ) {
  479. // float
  480. fullFloat = *(float *)toF;
  481. trunc = (int)fullFloat;
  482. if (fullFloat == 0.0f) {
  483. MSG_WriteBits( msg, 0, 1 ); //it's a zero
  484. } else {
  485. MSG_WriteBits( msg, 1, 1 ); //not a zero
  486. if ( trunc == fullFloat && trunc + FLOAT_INT_BIAS >= 0 &&
  487. trunc + FLOAT_INT_BIAS < ( 1 << FLOAT_INT_BITS ) ) {
  488. // send as small integer
  489. MSG_WriteBits( msg, 0, 1 );
  490. MSG_WriteBits( msg, trunc + FLOAT_INT_BIAS, FLOAT_INT_BITS );
  491. } else {
  492. // send as full floating point value
  493. MSG_WriteBits( msg, 1, 1 );
  494. MSG_WriteBits( msg, *toF, 32 );
  495. }
  496. }
  497. } else {
  498. if (*toF == 0) {
  499. MSG_WriteBits( msg, 0, 1 ); //it's a zero
  500. } else {
  501. MSG_WriteBits( msg, 1, 1 ); //not a zero
  502. // integer
  503. MSG_WriteBits( msg, *toF, field->bits );
  504. }
  505. }
  506. }
  507. void MSG_ReadField (msg_t *msg, int *toF, const netField_t *field, int print)
  508. {
  509. int trunc;
  510. if ( field->bits == -1)
  511. { // a -1 in the bits field means it's a float that's always between -1 and 1
  512. int temp = MSG_ReadBits( msg, -16);
  513. *(float *)toF = (float)temp / 32767;
  514. }
  515. else
  516. if ( field->bits == 0 ) {
  517. // float
  518. if ( MSG_ReadBits( msg, 1 ) == 0 ) {
  519. *(float *)toF = 0.0f;
  520. } else {
  521. if ( MSG_ReadBits( msg, 1 ) == 0 ) {
  522. // integral float
  523. trunc = MSG_ReadBits( msg, FLOAT_INT_BITS );
  524. // bias to allow equal parts positive and negative
  525. trunc -= FLOAT_INT_BIAS;
  526. *(float *)toF = trunc;
  527. if ( print ) {
  528. Com_Printf( "%s:%i ", field->name, trunc );
  529. }
  530. } else {
  531. // full floating point value
  532. *toF = MSG_ReadBits( msg, 32 );
  533. if ( print ) {
  534. Com_Printf( "%s:%f ", field->name, *(float *)toF );
  535. }
  536. }
  537. }
  538. } else {
  539. if ( MSG_ReadBits( msg, 1 ) == 0 ) {
  540. *toF = 0;
  541. } else {
  542. // integer
  543. *toF = MSG_ReadBits( msg, field->bits );
  544. if ( print ) {
  545. Com_Printf( "%s:%i ", field->name, *toF );
  546. }
  547. }
  548. }
  549. }
  550. /*
  551. ==================
  552. MSG_WriteDeltaEntity
  553. GENTITYNUM_BITS 1 : remove this entity
  554. GENTITYNUM_BITS 0 1 SMALL_VECTOR_BITS <data>
  555. GENTITYNUM_BITS 0 0 LARGE_VECTOR_BITS >data>
  556. Writes part of a packetentities message, including the entity number.
  557. Can delta from either a baseline or a previous packet_entity
  558. If to is NULL, a remove entity update will be sent
  559. If force is not set, then nothing at all will be generated if the entity is
  560. identical, under the assumption that the in-order delta code will catch it.
  561. ==================
  562. */
  563. #if 0 // Removed by BTO (VV)
  564. void MSG_WriteDeltaEntity( msg_t *msg, struct entityState_s *from, struct entityState_s *to,
  565. qboolean force ) {
  566. int c;
  567. int i;
  568. const netField_t *field;
  569. int *fromF, *toF;
  570. int blah;
  571. bool stuffChanged = false;
  572. const int numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]);
  573. byte changeVector[(numFields/8) + 1];
  574. // all fields should be 32 bits to avoid any compiler packing issues
  575. // the "number" field is not part of the field list
  576. // if this assert fails, someone added a field to the entityState_t
  577. // struct without updating the message fields
  578. blah = sizeof( *from );
  579. assert( numFields + 1 == blah/4);
  580. c = msg->cursize;
  581. // a NULL to is a delta remove message
  582. if ( to == NULL ) {
  583. if ( from == NULL ) {
  584. return;
  585. }
  586. MSG_WriteBits( msg, from->number, GENTITYNUM_BITS );
  587. MSG_WriteBits( msg, 1, 1 );
  588. return;
  589. }
  590. if ( to->number < 0 || to->number >= MAX_GENTITIES ) {
  591. Com_Error (ERR_FATAL, "MSG_WriteDeltaEntity: Bad entity number: %i", to->number );
  592. }
  593. memset(changeVector, 0, sizeof(changeVector));
  594. // build the change vector as bytes so it is endien independent
  595. for ( i = 0, field = entityStateFields ; i < numFields ; i++, field++ ) {
  596. fromF = (int *)( (byte *)from + field->offset );
  597. toF = (int *)( (byte *)to + field->offset );
  598. if ( *fromF != *toF ) {
  599. changeVector[ i>>3 ] |= 1 << ( i & 7 );
  600. stuffChanged = true;
  601. }
  602. }
  603. if ( stuffChanged )
  604. {
  605. MSG_WriteBits( msg, to->number, GENTITYNUM_BITS );
  606. MSG_WriteBits( msg, 0, 1 ); // not removed
  607. MSG_WriteBits( msg, 1, 1 ); // we have a delta
  608. // we need to write the entire delta
  609. for ( i = 0 ; i + 8 <= numFields ; i += 8 ) {
  610. MSG_WriteByte( msg, changeVector[i>>3] );
  611. }
  612. if ( numFields & 7 ) {
  613. MSG_WriteBits( msg, changeVector[i>>3], numFields & 7 );
  614. }
  615. for ( i = 0, field = entityStateFields ; i < numFields ; i++, field++ ) {
  616. fromF = (int *)( (byte *)from + field->offset );
  617. toF = (int *)( (byte *)to + field->offset );
  618. if ( *fromF == *toF ) {
  619. continue;
  620. }
  621. MSG_WriteField(msg, toF, field);
  622. }
  623. }
  624. else
  625. {
  626. // nothing at all changed
  627. // write two bits for no change
  628. MSG_WriteBits( msg, to->number, GENTITYNUM_BITS );
  629. MSG_WriteBits( msg, 0, 1 ); // not removed
  630. MSG_WriteBits( msg, 0, 1 ); // no delta
  631. }
  632. c = msg->cursize - c;
  633. }
  634. #endif
  635. extern serverStatic_t svs;
  636. void MSG_WriteEntity( msg_t *msg, struct entityState_s *to, int removeNum)
  637. {
  638. if ( to == NULL ) {
  639. MSG_WriteBits(msg, removeNum, GENTITYNUM_BITS);
  640. MSG_WriteBits(msg, 1, 1); //removed
  641. return;
  642. } else {
  643. MSG_WriteBits(msg, to->number, GENTITYNUM_BITS);
  644. MSG_WriteBits(msg, 0, 1); //not removed
  645. }
  646. assert(( to - svs.snapshotEntities ) >= 0 && ( to - svs.snapshotEntities ) < 512);
  647. MSG_WriteLong(msg, to - svs.snapshotEntities);
  648. }
  649. void MSG_ReadEntity( msg_t *msg, entityState_t *to)
  650. {
  651. // check for a remove
  652. if ( MSG_ReadBits( msg, 1 ) == 1 ) {
  653. memset( to, 0, sizeof( *to ) );
  654. to->number = MAX_GENTITIES - 1;
  655. return;
  656. }
  657. //No remove, read data
  658. int index;
  659. index = MSG_ReadLong(msg);
  660. assert(index >= 0 && index < svs.numSnapshotEntities);
  661. *to = svs.snapshotEntities[index];
  662. }
  663. /*
  664. ==================
  665. MSG_ReadDeltaEntity
  666. The entity number has already been read from the message, which
  667. is how the from state is identified.
  668. If the delta removes the entity, entityState_t->number will be set to MAX_GENTITIES-1
  669. Can go from either a baseline or a previous packet_entity
  670. ==================
  671. */
  672. extern cvar_t *cl_shownet;
  673. #if 0 // Removed by BTO (VV)
  674. void MSG_ReadDeltaEntity( msg_t *msg, entityState_t *from, entityState_t *to, int number)
  675. {
  676. int i;
  677. const netField_t *field;
  678. int *fromF, *toF;
  679. int print = 0;
  680. int startBit, endBit;
  681. const int numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]);
  682. byte expandedVector[(numFields/8) + 1];
  683. if ( number < 0 || number >= MAX_GENTITIES) {
  684. Com_Error( ERR_DROP, "Bad delta entity number: %i", number );
  685. }
  686. if ( msg->bit == 0 ) {
  687. startBit = msg->readcount * 8 - GENTITYNUM_BITS;
  688. } else {
  689. startBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS;
  690. }
  691. // check for a remove
  692. if ( MSG_ReadBits( msg, 1 ) == 1 ) {
  693. memset( to, 0, sizeof( *to ) );
  694. to->number = MAX_GENTITIES - 1;
  695. if ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) {
  696. Com_Printf( "%3i: #%-3i remove\n", msg->readcount, number );
  697. }
  698. return;
  699. }
  700. // check for no delta
  701. if ( MSG_ReadBits( msg, 1 ) != 0 )
  702. {
  703. const int numFields = sizeof(entityStateFields)/sizeof(entityStateFields[0]);
  704. // shownet 2/3 will interleave with other printed info, -1 will
  705. // just print the delta records`
  706. if ( cl_shownet->integer >= 2 || cl_shownet->integer == -1 ) {
  707. print = 1;
  708. Com_Printf( "%3i: #%-3i ", msg->readcount, to->number );
  709. } else {
  710. print = 0;
  711. }
  712. // we need to write the entire delta
  713. for ( i = 0 ; i + 8 <= numFields ; i += 8 ) {
  714. expandedVector[i>>3] = MSG_ReadByte( msg );
  715. }
  716. if ( numFields & 7 ) {
  717. expandedVector[i>>3] = MSG_ReadBits( msg, numFields & 7 );
  718. }
  719. to->number = number;
  720. for ( i = 0, field = entityStateFields ; i < numFields ; i++, field++ ) {
  721. fromF = (int *)( (byte *)from + field->offset );
  722. toF = (int *)( (byte *)to + field->offset );
  723. if ( ! ( expandedVector[ i >> 3 ] & ( 1 << ( i & 7 ) ) ) ) {
  724. // no change
  725. *toF = *fromF;
  726. } else {
  727. MSG_ReadField(msg, toF, field, print);
  728. }
  729. }
  730. }
  731. else
  732. {
  733. memcpy(to, from,sizeof(entityState_t));
  734. to->number = number;
  735. }
  736. if ( print ) {
  737. if ( msg->bit == 0 ) {
  738. endBit = msg->readcount * 8 - GENTITYNUM_BITS;
  739. } else {
  740. endBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS;
  741. }
  742. Com_Printf( " (%i bits)\n", endBit - startBit );
  743. }
  744. }
  745. #endif
  746. /*
  747. Ghoul2 Insert End
  748. */
  749. /*
  750. ============================================================================
  751. plyer_state_t communication
  752. ============================================================================
  753. */
  754. // using the stringizing operator to save typing...
  755. #define PSF(x) #x,(int)&((playerState_t*)0)->x
  756. static const netField_t playerStateFields[] =
  757. {
  758. { PSF(commandTime), 32 },
  759. { PSF(pm_type), 8 },
  760. { PSF(bobCycle), 8 },
  761. { PSF(pm_flags), 32 },
  762. { PSF(pm_time), -16 },
  763. { PSF(origin[0]), 0 },
  764. { PSF(origin[1]), 0 },
  765. { PSF(origin[2]), 0 },
  766. { PSF(velocity[0]), 0 },
  767. { PSF(velocity[1]), 0 },
  768. { PSF(velocity[2]), 0 },
  769. { PSF(weaponTime), -16 },
  770. { PSF(weaponChargeTime), 32 }, //? really need 32 bits??
  771. { PSF(gravity), 16 },
  772. { PSF(leanofs), -8 },
  773. { PSF(friction), 16 },
  774. { PSF(speed), 16 },
  775. { PSF(delta_angles[0]), 16 },
  776. { PSF(delta_angles[1]), 16 },
  777. { PSF(delta_angles[2]), 16 },
  778. { PSF(groundEntityNum), GENTITYNUM_BITS },
  779. //{ PSF(animationTimer), 16 },
  780. { PSF(legsAnim), 16 },
  781. { PSF(torsoAnim), 16 },
  782. { PSF(movementDir), 4 },
  783. { PSF(eFlags), 32 },
  784. { PSF(eventSequence), 16 },
  785. { PSF(events[0]), 8 },
  786. { PSF(events[1]), 8 },
  787. { PSF(eventParms[0]), -9 },
  788. { PSF(eventParms[1]), -9 },
  789. { PSF(externalEvent), 8 },
  790. { PSF(externalEventParm), 8 },
  791. { PSF(clientNum), 32 },
  792. { PSF(weapon), 5 },
  793. { PSF(weaponstate), 4 },
  794. { PSF(batteryCharge), 16 },
  795. { PSF(viewangles[0]), 0 },
  796. { PSF(viewangles[1]), 0 },
  797. { PSF(viewangles[2]), 0 },
  798. { PSF(viewheight), -8 },
  799. { PSF(damageEvent), 8 },
  800. { PSF(damageYaw), 8 },
  801. { PSF(damagePitch), -8 },
  802. { PSF(damageCount), 8 },
  803. //{ PSF(saberColor), 8 },
  804. //{ PSF(saberActive), 8 },
  805. //{ PSF(saberLength), 32 },
  806. //{ PSF(saberLengthMax), 32 },
  807. { PSF(forcePowersActive), 32},
  808. { PSF(saberInFlight), 8 },
  809. /*{ PSF(vehicleIndex), 32 }, // WOAH, what do we do with this stuff???
  810. { PSF(vehicleArmor), 32 },
  811. { PSF(vehicleAngles[0]), 0 },
  812. { PSF(vehicleAngles[1]), 0 },
  813. { PSF(vehicleAngles[2]), 0 },*/
  814. { PSF(viewEntity), 32 },
  815. { PSF(serverViewOrg[0]), 0 },
  816. { PSF(serverViewOrg[1]), 0 },
  817. { PSF(serverViewOrg[2]), 0 },
  818. };
  819. /*
  820. =============
  821. MSG_WriteDeltaPlayerstate
  822. =============
  823. */
  824. void MSG_WriteDeltaPlayerstate( msg_t *msg, struct playerState_s *from, struct playerState_s *to ) {
  825. int i;
  826. playerState_t dummy;
  827. int statsbits;
  828. int persistantbits;
  829. int ammobits;
  830. int powerupbits;
  831. int numFields;
  832. int c;
  833. const netField_t *field;
  834. int *fromF, *toF;
  835. if (!from) {
  836. from = &dummy;
  837. memset (&dummy, 0, sizeof(dummy));
  838. }
  839. c = msg->cursize;
  840. numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] );
  841. for ( i = 0, field = playerStateFields ; i < numFields ; i++, field++ ) {
  842. fromF = (int *)( (byte *)from + field->offset );
  843. toF = (int *)( (byte *)to + field->offset );
  844. if ( *fromF == *toF ) {
  845. MSG_WriteBits( msg, 0, 1 ); // no change
  846. continue;
  847. }
  848. MSG_WriteBits( msg, 1, 1 ); // changed
  849. MSG_WriteField (msg, toF, field);
  850. }
  851. c = msg->cursize - c;
  852. //
  853. // send the arrays
  854. //
  855. statsbits = 0;
  856. for (i=0 ; i<MAX_STATS ; i++) {
  857. if (to->stats[i] != from->stats[i]) {
  858. statsbits |= 1<<i;
  859. }
  860. }
  861. if ( statsbits ) {
  862. MSG_WriteBits( msg, 1, 1 ); // changed
  863. MSG_WriteShort( msg, statsbits );
  864. for (i=0 ; i<MAX_STATS ; i++)
  865. if (statsbits & (1<<i) )
  866. MSG_WriteBits(msg, to->stats[i], 32);
  867. } else {
  868. MSG_WriteBits( msg, 0, 1 ); // no change
  869. }
  870. persistantbits = 0;
  871. for (i=0 ; i<MAX_PERSISTANT ; i++) {
  872. if (to->persistant[i] != from->persistant[i]) {
  873. persistantbits |= 1<<i;
  874. }
  875. }
  876. if ( persistantbits ) {
  877. MSG_WriteBits( msg, 1, 1 ); // changed
  878. MSG_WriteShort( msg, persistantbits );
  879. for (i=0 ; i<MAX_PERSISTANT ; i++)
  880. if (persistantbits & (1<<i) )
  881. MSG_WriteSShort (msg, to->persistant[i]);
  882. } else {
  883. MSG_WriteBits( msg, 0, 1 ); // no change
  884. }
  885. ammobits = 0;
  886. for (i=0 ; i<MAX_AMMO ; i++) {
  887. if (to->ammo[i] != from->ammo[i]) {
  888. ammobits |= 1<<i;
  889. }
  890. }
  891. if ( ammobits ) {
  892. MSG_WriteBits( msg, 1, 1 ); // changed
  893. MSG_WriteShort( msg, ammobits );
  894. for (i=0 ; i<MAX_AMMO ; i++)
  895. if (ammobits & (1<<i) )
  896. MSG_WriteSShort (msg, to->ammo[i]);
  897. } else {
  898. MSG_WriteBits( msg, 0, 1 ); // no change
  899. }
  900. powerupbits = 0;
  901. for (i=0 ; i<MAX_POWERUPS ; i++) {
  902. if (to->powerups[i] != from->powerups[i]) {
  903. powerupbits |= 1<<i;
  904. }
  905. }
  906. if ( powerupbits ) {
  907. MSG_WriteBits( msg, 1, 1 ); // changed
  908. MSG_WriteShort( msg, powerupbits );
  909. for (i=0 ; i<MAX_POWERUPS ; i++)
  910. if (powerupbits & (1<<i) )
  911. MSG_WriteLong( msg, to->powerups[i] );
  912. } else {
  913. MSG_WriteBits( msg, 0, 1 ); // no change
  914. }
  915. statsbits = 0;
  916. for (i=0 ; i<MAX_INVENTORY ; i++)
  917. {
  918. if (to->inventory[i] != from->inventory[i])
  919. {
  920. statsbits |= 1<<i;
  921. }
  922. }
  923. if ( statsbits )
  924. {
  925. MSG_WriteBits( msg, 1, 1 ); // changed
  926. MSG_WriteShort( msg, statsbits );
  927. for (i=0 ; i<MAX_INVENTORY ; i++)
  928. {
  929. if (statsbits & (1<<i) )
  930. {
  931. MSG_WriteShort (msg, to->inventory[i]);
  932. }
  933. }
  934. }
  935. else
  936. {
  937. MSG_WriteBits( msg, 0, 1 ); // no change
  938. }
  939. }
  940. /*
  941. ===================
  942. MSG_ReadDeltaPlayerstate
  943. ===================
  944. */
  945. void MSG_ReadDeltaPlayerstate (msg_t *msg, playerState_t *from, playerState_t *to ) {
  946. int i;
  947. int bits;
  948. const netField_t *field;
  949. int numFields;
  950. int startBit, endBit;
  951. int print;
  952. int *fromF, *toF;
  953. playerState_t dummy;
  954. if ( !from ) {
  955. from = &dummy;
  956. memset( &dummy, 0, sizeof( dummy ) );
  957. }
  958. *to = *from;
  959. if ( msg->bit == 0 ) {
  960. startBit = msg->readcount * 8 - GENTITYNUM_BITS;
  961. } else {
  962. startBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS;
  963. }
  964. // shownet 2/3 will interleave with other printed info, -2 will
  965. // just print the delta records
  966. if ( cl_shownet->integer >= 2 || cl_shownet->integer == -2 ) {
  967. print = 1;
  968. Com_Printf( "%3i: playerstate ", msg->readcount );
  969. } else {
  970. print = 0;
  971. }
  972. numFields = sizeof( playerStateFields ) / sizeof( playerStateFields[0] );
  973. for ( i = 0, field = playerStateFields ; i < numFields ; i++, field++ ) {
  974. fromF = (int *)( (byte *)from + field->offset );
  975. toF = (int *)( (byte *)to + field->offset );
  976. if ( ! MSG_ReadBits( msg, 1 ) ) {
  977. // no change
  978. *toF = *fromF;
  979. } else {
  980. MSG_ReadField( msg, toF, field, print);
  981. }
  982. }
  983. // read the arrays
  984. // parse stats
  985. if ( MSG_ReadBits( msg, 1 ) ) {
  986. LOG("PS_STATS");
  987. bits = MSG_ReadShort (msg);
  988. for (i=0 ; i<MAX_STATS ; i++) {
  989. if (bits & (1<<i) ) {
  990. to->stats[i] = MSG_ReadBits(msg,32);
  991. }
  992. }
  993. }
  994. // parse persistant stats
  995. if ( MSG_ReadBits( msg, 1 ) ) {
  996. LOG("PS_PERSISTANT");
  997. bits = MSG_ReadShort (msg);
  998. for (i=0 ; i<MAX_PERSISTANT ; i++) {
  999. if (bits & (1<<i) ) {
  1000. to->persistant[i] = MSG_ReadSShort(msg);
  1001. }
  1002. }
  1003. }
  1004. // parse ammo
  1005. if ( MSG_ReadBits( msg, 1 ) ) {
  1006. LOG("PS_AMMO");
  1007. bits = MSG_ReadShort (msg);
  1008. for (i=0 ; i<MAX_AMMO ; i++) {
  1009. if (bits & (1<<i) ) {
  1010. to->ammo[i] = MSG_ReadSShort(msg);
  1011. }
  1012. }
  1013. }
  1014. // parse powerups
  1015. if ( MSG_ReadBits( msg, 1 ) ) {
  1016. LOG("PS_POWERUPS");
  1017. bits = MSG_ReadShort (msg);
  1018. for (i=0 ; i<MAX_POWERUPS ; i++) {
  1019. if (bits & (1<<i) ) {
  1020. to->powerups[i] = MSG_ReadLong(msg);
  1021. }
  1022. }
  1023. }
  1024. // parse inventory
  1025. if ( MSG_ReadBits( msg, 1 ) ) {
  1026. LOG("PS_INVENTORY");
  1027. bits = MSG_ReadShort (msg);
  1028. for (i=0 ; i<MAX_INVENTORY ; i++) {
  1029. if (bits & (1<<i) ) {
  1030. to->inventory[i] = MSG_ReadShort(msg);
  1031. }
  1032. }
  1033. }
  1034. if ( print ) {
  1035. if ( msg->bit == 0 ) {
  1036. endBit = msg->readcount * 8 - GENTITYNUM_BITS;
  1037. } else {
  1038. endBit = ( msg->readcount - 1 ) * 8 + msg->bit - GENTITYNUM_BITS;
  1039. }
  1040. Com_Printf( " (%i bits)\n", endBit - startBit );
  1041. }
  1042. }
  1043. //===========================================================================