apppacketstats.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456
  1. /*
  2. ** Command & Conquer Renegade(tm)
  3. ** Copyright 2025 Electronic Arts Inc.
  4. **
  5. ** This program is free software: you can redistribute it and/or modify
  6. ** it under the terms of the GNU General Public License as published by
  7. ** the Free Software Foundation, either version 3 of the License, or
  8. ** (at your option) any later version.
  9. **
  10. ** This program is distributed in the hope that it will be useful,
  11. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. ** GNU General Public License for more details.
  14. **
  15. ** You should have received a copy of the GNU General Public License
  16. ** along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. */
  18. /***********************************************************************************************
  19. *** Confidential - Westwood Studios ***
  20. ***********************************************************************************************
  21. * *
  22. * Project Name : Commando *
  23. * *
  24. * $Archive:: /Commando/Code/Commando/apppacketstats.cpp $*
  25. * *
  26. * $Author:: Tom_s $*
  27. * *
  28. * $Modtime:: 2/21/02 3:01p $*
  29. * *
  30. * $Revision:: 24 $*
  31. * *
  32. *---------------------------------------------------------------------------------------------*
  33. * Functions: *
  34. * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
  35. #include "apppacketstats.h"
  36. #include <memory.h>
  37. #include <string.h>
  38. #include "wwdebug.h"
  39. #include "mathutil.h"
  40. #include "networkobjectmgr.h"
  41. #include "wwprofile.h"
  42. //
  43. // Class statics
  44. //
  45. DWORD cAppPacketStats::PacketsSent[];
  46. DWORD cAppPacketStats::BitsSent[];
  47. DWORD cAppPacketStats::BitsSentTier[][PACKET_TIER_COUNT];
  48. DWORD cAppPacketStats::ObjectTally[];
  49. StringClass cAppPacketStats::WorkingString;
  50. //-----------------------------------------------------------------------------
  51. void
  52. cAppPacketStats::Reset
  53. (
  54. void
  55. )
  56. {
  57. ::memset(&PacketsSent, 0, sizeof(PacketsSent));
  58. ::memset(&BitsSent, 0, sizeof(BitsSent));
  59. ::memset(&BitsSentTier, 0, sizeof(BitsSentTier));
  60. ::memset(&ObjectTally, 0, sizeof(ObjectTally));
  61. }
  62. //-----------------------------------------------------------------------------
  63. void
  64. cAppPacketStats::Dump_Diagnostics
  65. (
  66. void
  67. )
  68. {
  69. WWDEBUG_SAY(("\n"));
  70. WWDEBUG_SAY(("---------------------------------------------------------\n"));
  71. WWDEBUG_SAY(("cAppPacketStats::Dump_Diagnostics:\n"));
  72. WWDEBUG_SAY(("%s\n", Get_Heading()));
  73. for (BYTE i = 0; i < APPPACKETTYPE_COUNT; i++)
  74. {
  75. WWDEBUG_SAY(("%s\n", Get_Description(i)));
  76. }
  77. WWDEBUG_SAY(("\n"));
  78. WWDEBUG_SAY(("---------------------------------------------------------\n"));
  79. }
  80. //-----------------------------------------------------------------------------
  81. void
  82. cAppPacketStats::Increment_Packets_Sent
  83. (
  84. BYTE app_packet_type
  85. )
  86. {
  87. WWASSERT(app_packet_type != APPPACKETTYPE_ALL && app_packet_type < APPPACKETTYPE_COUNT);
  88. PacketsSent[app_packet_type]++;
  89. PacketsSent[APPPACKETTYPE_ALL]++;
  90. }
  91. //-----------------------------------------------------------------------------
  92. void
  93. cAppPacketStats::Increment_Bits_Sent
  94. (
  95. BYTE app_packet_type,
  96. DWORD bits
  97. )
  98. {
  99. WWASSERT(app_packet_type != APPPACKETTYPE_ALL && app_packet_type < APPPACKETTYPE_COUNT);
  100. WWASSERT(bits >= 0);
  101. BitsSent[app_packet_type] += bits;
  102. BitsSent[APPPACKETTYPE_ALL] += bits;
  103. }
  104. //-----------------------------------------------------------------------------
  105. void
  106. cAppPacketStats::Increment_Bits_Sent_Tier
  107. (
  108. BYTE app_packet_type,
  109. PACKET_TIER_ENUM tier,
  110. DWORD bits
  111. )
  112. {
  113. WWASSERT(app_packet_type != APPPACKETTYPE_ALL && app_packet_type < APPPACKETTYPE_COUNT);
  114. WWASSERT(bits >= 0);
  115. BitsSentTier[app_packet_type][tier] += bits;
  116. BitsSentTier[APPPACKETTYPE_ALL][tier] += bits;
  117. }
  118. //-----------------------------------------------------------------------------
  119. DWORD
  120. cAppPacketStats::Get_Packets_Sent
  121. (
  122. BYTE app_packet_type
  123. )
  124. {
  125. WWASSERT(app_packet_type < APPPACKETTYPE_COUNT);
  126. return PacketsSent[app_packet_type];
  127. }
  128. //-----------------------------------------------------------------------------
  129. DWORD
  130. cAppPacketStats::Get_Bits_Sent
  131. (
  132. BYTE app_packet_type
  133. )
  134. {
  135. WWASSERT(app_packet_type < APPPACKETTYPE_COUNT);
  136. return BitsSent[app_packet_type];
  137. }
  138. //-----------------------------------------------------------------------------
  139. DWORD
  140. cAppPacketStats::Get_Bits_Sent_Tier
  141. (
  142. BYTE app_packet_type,
  143. PACKET_TIER_ENUM tier
  144. )
  145. {
  146. WWASSERT(app_packet_type < APPPACKETTYPE_COUNT);
  147. return BitsSentTier[app_packet_type][tier];
  148. }
  149. //-----------------------------------------------------------------------------
  150. #define ADD_CASE(exp) case exp: return #exp;
  151. LPCSTR
  152. cAppPacketStats::Interpret_Type
  153. (
  154. BYTE app_packet_type
  155. )
  156. {
  157. switch (app_packet_type)
  158. {
  159. //
  160. // S->S
  161. //
  162. ADD_CASE(APPPACKETTYPE_UNKNOWN);
  163. ADD_CASE(APPPACKETTYPE_SIMPLE);
  164. ADD_CASE(APPPACKETTYPE_SOLDIER);
  165. ADD_CASE(APPPACKETTYPE_VEHICLE);
  166. ADD_CASE(APPPACKETTYPE_TURRET);
  167. ADD_CASE(APPPACKETTYPE_BUILDING);
  168. ADD_CASE(APPPACKETTYPE_PLAYER);
  169. ADD_CASE(APPPACKETTYPE_TEAM);
  170. ADD_CASE(APPPACKETTYPE_GAMEOPTIONSEVENT);
  171. ADD_CASE(APPPACKETTYPE_PLAYERKILLEVENT);
  172. ADD_CASE(APPPACKETTYPE_PURCHASERESPONSEEVENT);
  173. ADD_CASE(APPPACKETTYPE_SCTEXTOBJ);
  174. ADD_CASE(APPPACKETTYPE_SVRGOODBYEEVENT);
  175. ADD_CASE(APPPACKETTYPE_WINEVENT);
  176. ADD_CASE(APPPACKETTYPE_POWERUP);
  177. ADD_CASE(APPPACKETTYPE_STATIC);
  178. ADD_CASE(APPPACKETTYPE_DOOR);
  179. ADD_CASE(APPPACKETTYPE_ELEVATOR);
  180. ADD_CASE(APPPACKETTYPE_DSAPO);
  181. ADD_CASE(APPPACKETTYPE_SERVERFPS);
  182. ADD_CASE(APPPACKETTYPE_CONSOLECOMMANDEVENT);
  183. ADD_CASE(APPPACKETTYPE_RESETWINSEVENT);
  184. ADD_CASE(APPPACKETTYPE_EVICTIONEVENT);
  185. ADD_CASE(APPPACKETTYPE_NETWEATHER);
  186. ADD_CASE(APPPACKETTYPE_GAMEDATAUPDATEEVENT);
  187. ADD_CASE(APPPACKETTYPE_SCPINGRESPONSEEVENT);
  188. ADD_CASE(APPPACKETTYPE_BASECONTROLLER);
  189. ADD_CASE(APPPACKETTYPE_CINEMATIC);
  190. ADD_CASE(APPPACKETTYPE_C4);
  191. ADD_CASE(APPPACKETTYPE_BEACON);
  192. ADD_CASE(APPPACKETTYPE_SCEXPLOSIONEVENT);
  193. ADD_CASE(APPPACKETTYPE_SCOBELISKEVENT);
  194. ADD_CASE(APPPACKETTYPE_SCANNOUNCEMENT);
  195. ADD_CASE(APPPACKETTYPE_NETBACKGROUND);
  196. ADD_CASE(APPPACKETTYPE_GAMESPYSCCHALLENGEEVENT);
  197. //
  198. // C->S
  199. //
  200. ADD_CASE(APPPACKETTYPE_CLIENTCONTROL);
  201. ADD_CASE(APPPACKETTYPE_CSTEXTOBJ);
  202. ADD_CASE(APPPACKETTYPE_SUICIDEEVENT);
  203. ADD_CASE(APPPACKETTYPE_CHANGETEAMEVENT);
  204. ADD_CASE(APPPACKETTYPE_MONEYEVENT);
  205. ADD_CASE(APPPACKETTYPE_WARPEVENT);
  206. ADD_CASE(APPPACKETTYPE_PURCHASEREQUESTEVENT);
  207. ADD_CASE(APPPACKETTYPE_CLIENTGOODBYEEVENT);
  208. ADD_CASE(APPPACKETTYPE_BIOEVENT);
  209. ADD_CASE(APPPACKETTYPE_LOADINGEVENT);
  210. ADD_CASE(APPPACKETTYPE_GODMODEEVENT);
  211. ADD_CASE(APPPACKETTYPE_VIPMODEEVENT);
  212. ADD_CASE(APPPACKETTYPE_SCOREEVENT);
  213. ADD_CASE(APPPACKETTYPE_CLIENTBBOEVENT);
  214. ADD_CASE(APPPACKETTYPE_CLIENTFPS);
  215. ADD_CASE(APPPACKETTYPE_CSPINGREQUESTEVENT);
  216. ADD_CASE(APPPACKETTYPE_CSDAMAGEEVENT);
  217. ADD_CASE(APPPACKETTYPE_REQUESTKILLEVENT);
  218. ADD_CASE(APPPACKETTYPE_CSCONSOLECOMMANDEVENT);
  219. ADD_CASE(APPPACKETTYPE_CSHINT);
  220. ADD_CASE(APPPACKETTYPE_CSANNOUNCEMENT);
  221. ADD_CASE(APPPACKETTYPE_DONATEEVENT);
  222. ADD_CASE(APPPACKETTYPE_GAMESPYCSCHALLENGERESPONSEEVENT);
  223. //
  224. // Summation
  225. //
  226. ADD_CASE(APPPACKETTYPE_ALL);
  227. default:
  228. break;
  229. }
  230. return "ERROR";
  231. DIE;
  232. }
  233. //-----------------------------------------------------------------------------
  234. void
  235. cAppPacketStats::Update_Object_Tally
  236. (
  237. void
  238. )
  239. {
  240. ::memset(&ObjectTally, 0, sizeof(ObjectTally));
  241. int count = NetworkObjectMgrClass::Get_Object_Count();
  242. for (int index = 0; index < count; index ++)
  243. {
  244. NetworkObjectClass * p_object = NetworkObjectMgrClass::Get_Object(index);
  245. if (p_object != NULL)
  246. {
  247. BYTE type = p_object->Get_App_Packet_Type();
  248. WWASSERT(type < APPPACKETTYPE_ALL);
  249. ObjectTally[type]++;
  250. ObjectTally[APPPACKETTYPE_ALL]++;
  251. /*
  252. if (type == APPPACKETTYPE_UNKNOWN)
  253. {
  254. WWDEBUG_SAY(("WTF is this?\n"));
  255. }
  256. */
  257. }
  258. }
  259. }
  260. //-----------------------------------------------------------------------------
  261. DWORD
  262. cAppPacketStats::Get_Object_Tally
  263. (
  264. BYTE app_packet_type
  265. )
  266. {
  267. WWASSERT(app_packet_type < APPPACKETTYPE_COUNT);
  268. return ObjectTally[app_packet_type];
  269. }
  270. //-----------------------------------------------------------------------------
  271. StringClass &
  272. cAppPacketStats::Get_Heading
  273. (
  274. void
  275. )
  276. {
  277. //StringClass description;
  278. WorkingString.Format(
  279. "%-30s %-8s %-10s %-10s %-7s %-7s %-7s %-7s %-7s %-7s",
  280. "Type",
  281. "Tally",
  282. "Packets",
  283. "Bytes",
  284. "PC",
  285. "Avg.",
  286. "PC TC",
  287. "PC TR",
  288. "PC TO",
  289. "PC TF"
  290. );
  291. return WorkingString;
  292. }
  293. //-----------------------------------------------------------------------------
  294. StringClass &
  295. cAppPacketStats::Get_Description
  296. (
  297. BYTE type
  298. )
  299. {
  300. WWASSERT(type < APPPACKETTYPE_COUNT);
  301. float num_bytes = BitsSent[type] / 8.0f;
  302. DWORD average_bytes = 0;
  303. if (PacketsSent[type] > 0)
  304. {
  305. average_bytes = cMathUtil::Round(num_bytes / (float) PacketsSent[type]);
  306. }
  307. float percentage = 0;
  308. if (BitsSent[APPPACKETTYPE_ALL] > 0)
  309. {
  310. percentage = 100 * (BitsSent[type] / (float) BitsSent[APPPACKETTYPE_ALL]);
  311. }
  312. //
  313. // Strip the leading "APPPACKETTYPE_"
  314. //
  315. WWASSERT(::strlen(Interpret_Type(type)) > 14);
  316. char name[200] = "";
  317. ::strcpy(name, &Interpret_Type(type)[14]);
  318. //
  319. // Tier percentages
  320. //
  321. DWORD t0 = 0;
  322. DWORD t1 = 0;
  323. DWORD t2 = 0;
  324. DWORD t3 = 0;
  325. if (BitsSent[type] > 0)
  326. {
  327. float bits = BitsSent[type];
  328. t0 = cMathUtil::Round(100 * (BitsSentTier[type][0] / bits));
  329. t1 = cMathUtil::Round(100 * (BitsSentTier[type][1] / bits));
  330. t2 = cMathUtil::Round(100 * (BitsSentTier[type][2] / bits));
  331. t3 = cMathUtil::Round(100 * (BitsSentTier[type][3] / bits));
  332. }
  333. //StringClass description;
  334. WorkingString.Format(
  335. "%-30s %-8d %-10d %-10d %-7.1f %-7d %-7d %-7d %-7d %-7d",
  336. name,
  337. ObjectTally[type],
  338. PacketsSent[type],
  339. cMathUtil::Round(num_bytes),
  340. percentage,
  341. average_bytes,
  342. t0,
  343. t1,
  344. t2,
  345. t3
  346. );
  347. /**/
  348. //
  349. // Replace all solo zero's with a space.
  350. //
  351. char last = ' ';
  352. char next = ' ';
  353. char * p = WorkingString.Peek_Buffer();
  354. for (int i = 0; i < WorkingString.Get_Length(); i++)
  355. {
  356. if (i == 0)
  357. {
  358. last = ' ';
  359. }
  360. else
  361. {
  362. last = p[i - 1];
  363. }
  364. if (i == WorkingString.Get_Length() - 1)
  365. {
  366. next = ' ';
  367. }
  368. else
  369. {
  370. next = p[i + 1];
  371. }
  372. if (last == ' ' && next == ' ' && p[i] == '0')
  373. {
  374. p[i] = ' ';
  375. }
  376. }
  377. /**/
  378. return WorkingString;
  379. }
  380. //ADD_CASE(APPPACKETTYPE_FLAGCAPEVENT);
  381. //ADD_CASE(APPPACKETTYPE_STEALTHEVENT);