Statistik.cpp 7.8 KB

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