Statistik.cpp 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326
  1. #include <DateiSystem.h>
  2. #include <Datei.h>
  3. #include "Spieler.h"
  4. #include "Team.h"
  5. #include "SSKlient.h"
  6. #ifndef WIN32
  7. #define Sleep( x ) usleep( (x) * 1000 )
  8. #endif
  9. #include "Statistik.h"
  10. // Inhalt der Statistik Klasse aus Statistik.h
  11. // Konstruktor
  12. Statistik::Statistik()
  13. : ReferenceCounter()
  14. {
  15. spielId = 0;
  16. karteId = 0;
  17. db = 0;
  18. spielerAnzahl = 0;
  19. spieler = new RCArray< Spieler >();
  20. erstellt = 0;
  21. sOnline = new Array< bool >();
  22. sBereit = new Array< bool >();
  23. gss = new RCArray< SpielerStatistik >();
  24. gts = new RCArray< TeamStatistik >();
  25. teamNamen = 0;
  26. gewinnerTeam = 0;
  27. }
  28. // Destruktor
  29. Statistik::~Statistik()
  30. {
  31. if( db )
  32. db->release();
  33. for( auto s : *spieler )
  34. s->setTeam( 0 );
  35. spieler->release();
  36. sOnline->release();
  37. sBereit->release();
  38. gss->release();
  39. gts->release();
  40. if( teamNamen )
  41. teamNamen->release();
  42. }
  43. // privat
  44. void Statistik::sendeStatistik( int index )
  45. { // Sendet Statistik an Spieler index
  46. if( !sOnline->hat( index ) || !sOnline->get( index ) )
  47. return;
  48. Klient* zk = spieler->z( index )->zKlient();
  49. if( !zk )
  50. return;
  51. int anz = gss->getEintragAnzahl();
  52. for( int i = 0; i < anz; i++ )
  53. zk->sendeSpielerStatistik( gss->z( i ) );
  54. anz = gts->getEintragAnzahl();
  55. for( int i = 0; i < anz; i++ )
  56. zk->sendeTeamStatistik( gts->z( i ) );
  57. zk->sendeStatistikLadenFertig();
  58. for( int i = 0; i < spielerAnzahl; i++ )
  59. {
  60. if( !sOnline->hat( i ) || !sOnline->get( i ) )
  61. zk->sendeStatistikSpielerOffline( spieler->z( i )->getAccountId() );
  62. }
  63. }
  64. // nicht constant
  65. void Statistik::setSpielId( int id )
  66. {
  67. spielId = id;
  68. }
  69. void Statistik::setKarteId( int id )
  70. {
  71. karteId = id;
  72. }
  73. void Statistik::setPSQLDB( SSDatenbankV* db )
  74. {
  75. if( this->db )
  76. this->db->release();
  77. this->db = db;
  78. }
  79. void Statistik::setTeamNamen( RCArray< Text >* namen )
  80. {
  81. if( teamNamen )
  82. teamNamen->release();
  83. teamNamen = namen;
  84. }
  85. void Statistik::spielEnde( int team )
  86. {
  87. gewinnerTeam = team;
  88. }
  89. void Statistik::setSpieler( int anzahl, RCArray< Spieler >* zSpieler )
  90. {
  91. spielerAnzahl = anzahl;
  92. for( int i = 0; i < anzahl; i++ )
  93. {
  94. spieler->set( zSpieler->get( i ), i );
  95. sOnline->set( 0, i );
  96. sBereit->set( 0, i );
  97. }
  98. }
  99. void Statistik::klientOffline( int accountId )
  100. {
  101. for( int i = 0; i < spielerAnzahl; i++ )
  102. {
  103. if( spieler->z( i )->getAccountId() == accountId )
  104. {
  105. sOnline->set( 0, i );
  106. sBereit->set( 0, i );
  107. }
  108. else if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
  109. spieler->z( i )->zKlient()->sendeStatistikSpielerOffline( accountId );
  110. }
  111. }
  112. void Statistik::statistikAnfrage( int accountId, short len, char* bytes )
  113. {
  114. len--;
  115. switch( *bytes )
  116. {
  117. case 0: // Spieler ist Bereit
  118. for( int i = 0; i < spielerAnzahl; i++ )
  119. {
  120. if( !erstellt )
  121. {
  122. if( spieler->z( i )->getAccountId() == accountId )
  123. sBereit->set( 1, i );
  124. }
  125. else if( spieler->z( i )->getAccountId() == accountId )
  126. {
  127. sendeStatistik( i );
  128. break;
  129. }
  130. }
  131. break;
  132. case 1: // Chat Nachricht
  133. bytes++;
  134. char* txt = new char[ len + 1 ];
  135. txt[ len ] = 0;
  136. for( int i = 0; i < len; i++ )
  137. txt[ i ] = bytes[ i ];
  138. for( int i = 0; i < spielerAnzahl; i++ )
  139. {
  140. if( sOnline->hat( i ) && sOnline->get( i ) && spieler->z( i )->zKlient() )
  141. spieler->z( i )->zKlient()->sendeStatistikChatNachricht( accountId, txt );
  142. }
  143. delete[] txt;
  144. break;
  145. }
  146. }
  147. void Statistik::run()
  148. {
  149. for( int i = 0; i < spielerAnzahl; i++ )
  150. sOnline->set( spieler->z( i )->istOnline(), i );
  151. // Statistik erstellen
  152. // gesammt Spieler
  153. for( int i = 0; i < spielerAnzahl; i++ )
  154. {
  155. if( spieler->z( i ) )
  156. {
  157. Spieler* tmp = spieler->z( i );
  158. InitDatei* d = new InitDatei();
  159. Text w;
  160. w = tmp->getSpielerNummer();
  161. if( w.getLength() )
  162. d->addWert( "SpielerNummer", w.getText() );
  163. Text* sn = db->getAccountRufName( tmp->getAccountId() );
  164. if( sn && sn->getLength() )
  165. d->addWert( "SpielerName", sn->getText() );
  166. if( sn )
  167. sn->release();
  168. d->addWert( "TeamName", tmp->zTeam()->name );
  169. w = tmp->getSpielerFarbe();
  170. if( w.getLength() )
  171. d->addWert( "SpielerFarbe", w.getText() );
  172. w = tmp->zTeam()->farbe;
  173. if( w.getLength() )
  174. d->addWert( "TeamFarbe", w.getText() );
  175. w = tmp->getSchadenBekommen();
  176. if( w.getLength() )
  177. d->addWert( "SchadenBekommen", w.getText() );
  178. w = tmp->getSchadenGemacht();
  179. if( w.getLength() )
  180. d->addWert( "SchadenGemacht", w.getText() );
  181. w = tmp->getTreibstoffVerbraucht();
  182. if( w.getLength() )
  183. d->addWert( "TreibstoffVerbraucht", w.getText() );
  184. w = tmp->getShots();
  185. if( w.getLength() )
  186. d->addWert( "Schüsse", w.getText() );
  187. w = tmp->getTreffer();
  188. if( w.getLength() )
  189. d->addWert( "Treffer", w.getText() );
  190. w = tmp->getPunkte();
  191. if( w.getLength() )
  192. d->addWert( "Punkte", w.getText() );
  193. w = tmp->getKills();
  194. if( w.getLength() )
  195. d->addWert( "Kills", w.getText() );
  196. w = tmp->getTode();
  197. if( w.getLength() )
  198. d->addWert( "Tode", w.getText() );
  199. w = tmp->getZeitAmLeben();
  200. if( w.getLength() )
  201. d->addWert( "ZeitAmLeben", w.getText() );
  202. w = tmp->getZeitTod();
  203. if( w.getLength() )
  204. d->addWert( "ZeitTod", w.getText() );
  205. SpielerStatistik* gss = new SpielerStatistik();
  206. gss->initValues( d );
  207. this->gss->add( gss );
  208. }
  209. }
  210. // Gesamt Team
  211. for( int i = 0; i < spielerAnzahl; i++ )
  212. {
  213. Spieler* tmp = spieler->z( i );
  214. if( tmp )
  215. {
  216. int anz = gts->getEintragAnzahl();
  217. bool gefunden = 0;
  218. for( int j = 0; j < anz; j++ )
  219. {
  220. if( gts->z( j ) && gts->z( j )->getTeamNummer() == tmp->zTeam()->id )
  221. {
  222. gefunden = 1;
  223. break;
  224. }
  225. }
  226. if( gefunden )
  227. continue;
  228. InitDatei* d = new InitDatei();
  229. Text w;
  230. w = tmp->zTeam()->id;
  231. if( w.getLength() )
  232. d->addWert( "TeamNummer", w.getText() );
  233. d->addWert( "TeamName", tmp->zTeam()->name );
  234. w = tmp->zTeam()->farbe;
  235. if( w.getLength() )
  236. d->addWert( "TeamFarbe", w.getText() );
  237. int schadenBekommen = 0;
  238. int schadenGemacht = 0;
  239. int treibstoffVerbraucht = 0;
  240. int shots = 0;
  241. int treffer = 0;
  242. int punkte = 0;
  243. int kills = 0;
  244. int tode = 0;
  245. for( int j = 0; j < spielerAnzahl; j++ )
  246. {
  247. Spieler* s = spieler->z( j );
  248. if( s && s->zTeam()->id == tmp->zTeam()->id )
  249. {
  250. schadenBekommen += s->getSchadenBekommen();
  251. schadenGemacht += s->getSchadenGemacht();
  252. treibstoffVerbraucht += s->getTreibstoffVerbraucht();
  253. shots += s->getShots();
  254. treffer += s->getTreffer();
  255. punkte += s->getPunkte();
  256. kills += s->getKills();
  257. tode += s->getTode();
  258. }
  259. }
  260. w = schadenBekommen;
  261. if( w.getLength() )
  262. d->addWert( "SchadenBekommen", w.getText() );
  263. w = schadenGemacht;
  264. if( w.getLength() )
  265. d->addWert( "SchadenGemacht", w.getText() );
  266. w = treibstoffVerbraucht;
  267. if( w.getLength() )
  268. d->addWert( "TreibstoffVerbraucht", w.getText() );
  269. w = shots;
  270. if( w.getLength() )
  271. d->addWert( "Schüsse", w.getText() );
  272. w = treffer;
  273. if( w.getLength() )
  274. d->addWert( "Treffer", w.getText() );
  275. w = punkte;
  276. if( w.getLength() )
  277. d->addWert( "Punkte", w.getText() );
  278. w = kills;
  279. if( w.getLength() )
  280. d->addWert( "Kills", w.getText() );
  281. w = tode;
  282. if( w.getLength() )
  283. d->addWert( "Tode", w.getText() );
  284. w = (int)(gewinnerTeam == tmp->zTeam()->id);
  285. if( w.getLength() )
  286. d->addWert( "Gewonnen", w.getText() );
  287. TeamStatistik* gts = new TeamStatistik();
  288. gts->initValues( d );
  289. this->gts->add( gts );
  290. }
  291. }
  292. erstellt = 1;
  293. // Statistik senden
  294. for( int i = 0; i < spielerAnzahl; i++ )
  295. {
  296. if( sBereit->hat( i ) && sBereit->get( i ) )
  297. sendeStatistik( i );
  298. }
  299. // Statistik speichern
  300. Text* pfad = new Text( "../spiel log/" );
  301. pfad->append( spielId );
  302. pfad->append( "/fertig" );
  303. DateiPfadErstellen( pfad );
  304. // warten bis alle verlassen haben
  305. while( 1 )
  306. {
  307. Sleep( 1000 );
  308. int online = 0;
  309. for( int i = 0; i < spielerAnzahl; i++ )
  310. online += sOnline->hat( i ) && sOnline->get( i );
  311. if( !online )
  312. break;
  313. }
  314. }