Klient.cpp 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497
  1. #include "Klient.h"
  2. #include "Spieler.h"
  3. #include <Text.h>
  4. // Inhalt der Klient Klasse aus Klient.h
  5. // Konstruktor
  6. Klient::Klient( SSKlientV *klient )
  7. {
  8. this->klient = klient;
  9. ref = 1;
  10. }
  11. // Destruktor
  12. Klient::~Klient()
  13. {
  14. if( klient )
  15. klient->release();
  16. }
  17. // nicht constant
  18. void Klient::offline()
  19. {
  20. klient = klient->release();
  21. }
  22. void Klient::online( SSKlientV *zKlient )
  23. {
  24. if( klient )
  25. klient = klient->release();
  26. klient = zKlient->getThis();
  27. }
  28. void Klient::sendeSpielerNummer( int sNum, double spielZeit )
  29. {
  30. if( !klient )
  31. return;
  32. short len = 13;
  33. char *bytes = new char[ len ];
  34. *(double*)bytes = spielZeit;
  35. *(char*)( bytes + 8 ) = 0;
  36. *(int*)( bytes + 9 ) = sNum;
  37. klient->spielNachricht( len, bytes );
  38. delete[] bytes;
  39. }
  40. void Klient::sendeInitSpieler( int anzahl, RCArray< Spieler > *zSpieler, double spielZeit )
  41. {
  42. if( !klient )
  43. return;
  44. short len = (short)( 13 + 20 * anzahl );
  45. char *bytes = new char[ len ];
  46. *(double*)bytes = spielZeit;
  47. *(char*)( bytes + 8 ) = 1;
  48. *(int*)( bytes + 9 ) = anzahl;
  49. for( int i = 0; i < anzahl; i++ )
  50. {
  51. *(int*)( bytes + i * 20 + 13 ) = zSpieler->z( i )->getSpielerNummer();
  52. *(int*)( bytes + i * 20 + 17 ) = zSpieler->z( i )->getSpielerTeam();
  53. *(int*)( bytes + i * 20 + 21 ) = zSpieler->z( i )->getSpielerFarbe();
  54. *(int*)( bytes + i * 20 + 25 ) = zSpieler->z( i )->getTeamFarbe();
  55. *(int*)( bytes + i * 20 + 29 ) = zSpieler->z( i )->getAccountId();
  56. }
  57. klient->spielNachricht( len, bytes );
  58. delete[] bytes;
  59. }
  60. void Klient::sendeSpielerPosition( Spieler *zSpieler, double spielZeit )
  61. {
  62. if( !klient )
  63. return;
  64. short len = 29;
  65. char *bytes = new char[ len ];
  66. *(double*)bytes = spielZeit;
  67. *(char*)( bytes + 8 ) = 2;
  68. *(int*)( bytes + 9 ) = zSpieler->getSpielerNummer();
  69. *(double*)( bytes + 13 ) = zSpieler->getX();
  70. *(double*)( bytes + 21 ) = zSpieler->getY();
  71. klient->spielNachricht( len, bytes );
  72. delete[] bytes;
  73. }
  74. void Klient::sendeKammeraSize( int br, int hi, double spielZeit )
  75. {
  76. if( !klient )
  77. return;
  78. short len = 17;
  79. char *bytes = new char[ len ];
  80. *(double*)bytes = spielZeit;
  81. *(char*)( bytes + 8 ) = 3;
  82. *(int*)( bytes + 9 ) = br;
  83. *(int*)( bytes + 13 ) = hi;
  84. klient->spielNachricht( len, bytes );
  85. delete[] bytes;
  86. }
  87. void Klient::sendeStart( double spielZeit )
  88. {
  89. if( !klient )
  90. return;
  91. short len = 9;
  92. char *bytes = new char[ len ];
  93. *(double*)bytes = spielZeit;
  94. *(char*)( bytes + 8 ) = 4;
  95. klient->spielNachricht( len, bytes );
  96. delete[] bytes;
  97. }
  98. void Klient::sendeSpielerTod( Spieler *zSpieler, double spielZeit )
  99. {
  100. if( !klient )
  101. return;
  102. short len = 13;
  103. char *bytes = new char[ len ];
  104. *(double*)bytes = spielZeit;
  105. *(char*)( bytes + 8 ) = 5;
  106. *(int*)( bytes + 9 ) = zSpieler->getSpielerNummer();
  107. klient->spielNachricht( len, bytes );
  108. delete[] bytes;
  109. }
  110. void Klient::sendeSpielEnde( char gewonnen, double spielZeit )
  111. {
  112. if( !klient )
  113. return;
  114. short len = 10;
  115. char *bytes = new char[ len ];
  116. *(double*)bytes = spielZeit;
  117. *(char*)( bytes + 8 ) = 6;
  118. *(char*)( bytes + 9 ) = gewonnen;
  119. klient->spielNachricht( len, bytes );
  120. delete[] bytes;
  121. }
  122. void Klient::sendeSpielerGeschwindigkeit( Spieler *zSpieler, double spielZeit )
  123. {
  124. if( !klient )
  125. return;
  126. short len = 29;
  127. char *bytes = new char[ len ];
  128. *(double*)bytes = spielZeit;
  129. *(char*)( bytes + 8 ) = 7;
  130. *(int*)( bytes + 9 ) = zSpieler->getSpielerNummer();
  131. *(double*)( bytes + 13 ) = zSpieler->getSpeedX();
  132. *(double*)( bytes + 21 ) = zSpieler->getSpeedY();
  133. klient->spielNachricht( len, bytes );
  134. delete[] bytes;
  135. }
  136. void Klient::sendeSpielerWendigkeit( Spieler *zSpieler, double spielZeit )
  137. {
  138. if( !klient )
  139. return;
  140. short len = 21;
  141. char *bytes = new char[ len ];
  142. *(double*)bytes = spielZeit;
  143. *(char*)( bytes + 8 ) = 8;
  144. *(int*)( bytes + 9 ) = zSpieler->getSpielerNummer();
  145. *(double*)( bytes + 13 ) = zSpieler->getKurve();
  146. klient->spielNachricht( len, bytes );
  147. delete[] bytes;
  148. }
  149. void Klient::sendeSpielerKurve( int sNum, char kurve, double spielZeit )
  150. {
  151. if( !klient )
  152. return;
  153. short len = 14;
  154. char *bytes = new char[ len ];
  155. *(double*)bytes = spielZeit;
  156. *(char*)( bytes + 8 ) = 9;
  157. *(int*)( bytes + 9 ) = sNum;
  158. bytes[ 13 ] = kurve;
  159. klient->spielNachricht( len, bytes );
  160. delete[] bytes;
  161. }
  162. void Klient::sendeKartenSize( int br, int hi, double spielZeit )
  163. {
  164. if( !klient )
  165. return;
  166. short len = 17;
  167. char *bytes = new char[ len ];
  168. *(double*)bytes = spielZeit;
  169. *(char*)( bytes + 8 ) = 0xA;
  170. *(int*)( bytes + 9 ) = br;
  171. *(int*)( bytes + 13 ) = hi;
  172. klient->spielNachricht( len, bytes );
  173. delete[] bytes;
  174. }
  175. void Klient::sendeChatNachricht( char *txt, double spielZeit )
  176. {
  177. if( !klient )
  178. return;
  179. short len = (short)( 9 + textLength( txt ) );
  180. char *bytes = new char[ len ];
  181. *(double*)bytes = spielZeit;
  182. *(char*)( bytes + 8 ) = 0xB;
  183. for( int i = 9; i < len; i++ )
  184. bytes[ i ] = txt[ i - 9 ];
  185. klient->spielNachricht( len, bytes );
  186. delete[] bytes;
  187. }
  188. void Klient::sendeLinienUnterbrechung( int sNum, bool unterbrochen, double spielZeit )
  189. {
  190. if( !klient )
  191. return;
  192. char *bytes = new char[ 14 ];
  193. *(double*)bytes = spielZeit;
  194. *(char*)( bytes + 8 ) = 0xC;
  195. *(int*)( bytes + 9 ) = sNum;
  196. *( bytes + 13 ) = (char)unterbrochen;
  197. klient->spielNachricht( 14, bytes );
  198. delete[] bytes;
  199. }
  200. void Klient::sendeTeamMaxPunkte( int team, int mP, double spielZeit )
  201. {
  202. if( !klient )
  203. return;
  204. char *bytes = new char[ 17 ];
  205. *(double*)bytes = spielZeit;
  206. *(char*)( bytes + 8 ) = 0xD;
  207. *(int*)( bytes + 9 ) = team;
  208. *(int*)( bytes + 13 ) = mP;
  209. klient->spielNachricht( 17, bytes );
  210. delete[] bytes;
  211. }
  212. void Klient::sendeTeamPunkte( int team, int p, double spielZeit )
  213. {
  214. if( !klient )
  215. return;
  216. char *bytes = new char[ 17 ];
  217. *(double*)bytes = spielZeit;
  218. *(char*)( bytes + 8 ) = 0xE;
  219. *(int*)( bytes + 9 ) = team;
  220. *(int*)( bytes + 13 ) = p;
  221. klient->spielNachricht( 17, bytes );
  222. delete[] bytes;
  223. }
  224. void Klient::sendeSpielerPunkte( int sNum, int p, double spielZeit )
  225. {
  226. if( !klient )
  227. return;
  228. char *bytes = new char[ 17 ];
  229. *(double*)bytes = spielZeit;
  230. *(char*)( bytes + 8 ) = 0xF;
  231. *(int*)( bytes + 9 ) = sNum;
  232. *(int*)( bytes + 13 ) = p;
  233. klient->spielNachricht( 17, bytes );
  234. delete[] bytes;
  235. }
  236. void Klient::sendeTeamTod( int team, double spielZeit )
  237. {
  238. if( !klient )
  239. return;
  240. char *bytes = new char[ 13 ];
  241. *(double*)bytes = spielZeit;
  242. *(char*)( bytes + 8 ) = 0x10;
  243. *(int*)( bytes + 9 ) = team;
  244. klient->spielNachricht( 13, bytes );
  245. delete[] bytes;
  246. }
  247. void Klient::sendeTeamName( int team, char *name )
  248. {
  249. if( !klient )
  250. return;
  251. int nL = textLength( name );
  252. char *bytes = new char[ 13 + nL ];
  253. *(double*)bytes = 0;
  254. *(char*)( bytes + 8 ) = 0x13;
  255. *(int*)( bytes + 9 ) = team;
  256. memcpy( bytes + 13, name, nL );
  257. klient->spielNachricht( (short)( 13 + nL ), bytes );
  258. delete[] bytes;
  259. }
  260. void Klient::sendeRundenEnde( int winTeam, double spielZeit )
  261. {
  262. if( !klient )
  263. return;
  264. char *bytes = new char[ 13 ];
  265. *(double*)bytes = spielZeit;
  266. *(char*)( bytes + 8 ) = 0x11;
  267. *(int*)( bytes + 9 ) = winTeam;
  268. klient->spielNachricht( 13, bytes );
  269. delete[] bytes;
  270. }
  271. void Klient::sendeZeitVerbleibend( int sekunden, double spielZeit )
  272. {
  273. if( !klient )
  274. return;
  275. char *bytes = new char[ 13 ];
  276. *(double*)bytes = spielZeit;
  277. *(char*)( bytes + 8 ) = 0x12;
  278. *(int*)( bytes + 9 ) = sekunden;
  279. klient->spielNachricht( 13, bytes );
  280. delete[] bytes;
  281. }
  282. void Klient::sendeStatistikChatNachricht( int vonAccount, char *txt )
  283. {
  284. if( !klient )
  285. return;
  286. short len = (short)( 5 + textLength( txt ) );
  287. char *bytes = new char[ len ];
  288. *(char*)( bytes ) = 8;
  289. *(int*)( bytes + 1 ) = vonAccount;
  290. for( int i = 5; i < len; i++ )
  291. bytes[ i ] = txt[ i - 5 ];
  292. klient->statistikNachricht( len, bytes );
  293. delete[] bytes;
  294. }
  295. void Klient::sendeStatistikSpielerOffline( int account )
  296. {
  297. if( !klient )
  298. return;
  299. char *bytes = new char[ 5 ];
  300. *(char*)( bytes ) = 9;
  301. *(int*)( bytes + 1 ) = account;
  302. klient->statistikNachricht( 5, bytes );
  303. delete[] bytes;
  304. }
  305. void Klient::sendeGesamtSpielerStatistik( GesamtSpielerStatistik *zS )
  306. {
  307. if( !zS || !klient )
  308. return;
  309. char snl = (char)zS->zSpielerName()->getLength();
  310. char tnl = (char)zS->zTeamName()->getLength();
  311. int len = 43 + snl + tnl;
  312. char *bytes = new char[ len ];
  313. bytes[ 0 ] = 2;
  314. *(int*)( bytes + 1 ) = zS->getSpielerNummer();
  315. *(char*)( bytes + 5 ) = (char)zS->zSpielerName()->getLength();
  316. for( int i = 0; i < snl; i++ )
  317. bytes[ i + 6 ] = zS->zSpielerName()->getText()[ i ];
  318. *(char*)( bytes + 6 + snl ) = tnl;
  319. for( int i = 0; i < tnl; i++ )
  320. bytes[ i + 7 + snl ] = zS->zTeamName()->getText()[ i ];
  321. *(int*)( bytes + 7 + snl + tnl ) = zS->getSpielerFarbe();
  322. *(int*)( bytes + 11 + snl + tnl ) = zS->getTeamFarbe();
  323. *(int*)( bytes + 15 + snl + tnl ) = zS->getGewonneneRunden();
  324. *(int*)( bytes + 19 + snl + tnl ) = zS->getPunkte();
  325. *(int*)( bytes + 23 + snl + tnl ) = zS->getLinienLength();
  326. *(int*)( bytes + 27 + snl + tnl ) = zS->getZeitAmLeben();
  327. *(int*)( bytes + 31 + snl + tnl ) = zS->getZeitTod();
  328. *(int*)( bytes + 35 + snl + tnl ) = zS->getKills();
  329. *(int*)( bytes + 39 + snl + tnl ) = zS->getTode();
  330. klient->statistikNachricht( (short)len, bytes );
  331. delete[] bytes;
  332. }
  333. void Klient::sendeGesamtTeamStatistik( GesamtTeamStatistik *zS )
  334. {
  335. if( !zS || !klient )
  336. return;
  337. char tnl = (char)zS->zTeamName()->getLength();
  338. int len = 30 + tnl;
  339. char *bytes = new char[ len ];
  340. bytes[ 0 ] = 3;
  341. *(int*)( bytes + 1 ) = zS->getTeamNummer();
  342. *(char*)( bytes + 5 ) = tnl;
  343. for( int i = 0; i < tnl; i++ )
  344. bytes[ i + 6 ] = zS->zTeamName()->getText()[ i ];
  345. *(int*)( bytes + 6 + tnl ) = zS->getTeamFarbe();
  346. *(int*)( bytes + 10 + tnl ) = zS->getGewonneneRunden();
  347. *(int*)( bytes + 14 + tnl ) = zS->getPunkte();
  348. *(int*)( bytes + 18 + tnl ) = zS->getLinienLength();
  349. *(int*)( bytes + 22 + tnl ) = zS->getKills();
  350. *(int*)( bytes + 26 + tnl ) = zS->getTode();
  351. klient->statistikNachricht( (short)len, bytes );
  352. delete[] bytes;
  353. }
  354. void Klient::sendeRundeStatistik( RundenRundenStatistik *zS )
  355. {
  356. if( !zS || !klient )
  357. return;
  358. char *bytes = new char[ 25 ];
  359. bytes[ 0 ] = 4;
  360. *(int*)( bytes + 1 ) = zS->getRundenNummer();
  361. *(int*)( bytes + 5 ) = zS->getRundenDauer();
  362. *(int*)( bytes + 9 ) = zS->getSiegerTeam();
  363. *(int*)( bytes + 13 ) = zS->getSpielFeldNutzung();
  364. *(int*)( bytes + 17 ) = zS->zRundenBild()->getBreite();
  365. *(int*)( bytes + 21 ) = zS->zRundenBild()->getHeight();
  366. klient->statistikNachricht( 25, bytes );
  367. delete[] bytes;
  368. Bild *zB = zS->zRundenBild();
  369. int pixel = zB->getBreite() * zB->getHeight();
  370. while( pixel )
  371. {
  372. int pStart = zB->getBreite() * zB->getHeight() - pixel;
  373. int pLen = pixel > 200 ? 200 : pixel;
  374. char *bytes = new char[ 13 + pLen * 4 ];
  375. bytes[ 0 ] = 5;
  376. *(int*)( bytes + 1 ) = zS->getRundenNummer();
  377. *(int*)( bytes + 5 ) = pStart;
  378. *(int*)( bytes + 9 ) = pLen;
  379. for( int i = 0; i < pLen; i++ )
  380. *(int*)( bytes + 13 + i * 4 ) = zB->getBuffer()[ pStart + i ];
  381. klient->statistikNachricht( (short)( 13 + pLen * 4 ), bytes );
  382. delete[] bytes;
  383. pixel -= pLen;
  384. }
  385. int anz = zS->getSpielerAnzahl();
  386. for( int i = 0; i < anz; i++ )
  387. sendeRundeSpielerStatistik( zS->zSpielerStatistik( i ), zS->getRundenNummer() );
  388. anz = zS->getTeamAnzahl();
  389. for( int i = 0; i < anz; i++ )
  390. sendeRundeTeamStatistik( zS->zTeamStatistik( i ), zS->getRundenNummer() );
  391. }
  392. void Klient::sendeRundeSpielerStatistik( RundenSpielerStatistik *zS, int runde )
  393. {
  394. if( !zS || !klient )
  395. return;
  396. char snl = (char)zS->zSpielerName()->getLength();
  397. char tnl = (char)zS->zTeamName()->getLength();
  398. int len = 31 + snl + tnl;
  399. char *bytes = new char[ len ];
  400. bytes[ 0 ] = 6;
  401. *(int*)( bytes + 1 ) = runde;
  402. *(int*)( bytes + 5 ) = zS->getSpielerNummer();
  403. *(char*)( bytes + 9 ) = snl;
  404. for( int i = 0; i < snl; i++ )
  405. bytes[ i + 10 ] = zS->zSpielerName()->getText()[ i ];
  406. *(char*)( bytes + 10 + snl ) = tnl;
  407. for( int i = 0; i < tnl; i++ )
  408. bytes[ i + 11 + snl ] = zS->zTeamName()->getText()[ i ];
  409. *(int*)( bytes + 11 + snl + tnl ) = zS->getSpielerFarbe();
  410. *(int*)( bytes + 15 + snl + tnl ) = zS->getTeamFarbe();
  411. *(int*)( bytes + 19 + snl + tnl ) = zS->getLinienLength();
  412. *(int*)( bytes + 23 + snl + tnl ) = zS->getKills();
  413. *(int*)( bytes + 27 + snl + tnl ) = zS->getTodesZeit();
  414. klient->statistikNachricht( (short)len, bytes );
  415. delete[] bytes;
  416. }
  417. void Klient::sendeRundeTeamStatistik( RundenTeamStatistik *zS, int runde )
  418. {
  419. if( !zS || !klient )
  420. return;
  421. char tnl = (char)zS->zTeamName()->getLength();
  422. int len = 27 + tnl;
  423. char *bytes = new char[ len ];
  424. bytes[ 0 ] = 7;
  425. *(int*)( bytes + 1 ) = runde;
  426. *(int*)( bytes + 5 ) = zS->getTeamNummer();
  427. *(char*)( bytes + 9 ) = tnl;
  428. for( int i = 0; i < tnl; i++ )
  429. bytes[ i + 10 ] = zS->zTeamName()->getText()[ i ];
  430. *(int*)( bytes + 10 + tnl ) = zS->getTeamFarbe();
  431. *(char*)( bytes + 14 + tnl ) = (char)zS->getErgebnis();
  432. *(int*)( bytes + 15 + tnl ) = zS->getLinienLength();
  433. *(int*)( bytes + 19 + tnl ) = zS->getKills();
  434. *(int*)( bytes + 23 + tnl ) = zS->getTode();
  435. klient->statistikNachricht( (short)len, bytes );
  436. delete[] bytes;
  437. }
  438. void Klient::sendeStatistikLadenFertig()
  439. {
  440. if( !klient )
  441. return;
  442. char byte = 1;
  443. klient->statistikNachricht( 1, &byte );
  444. }
  445. // constant
  446. bool Klient::istOnline() const
  447. {
  448. return klient != 0;
  449. }
  450. // reference Counting
  451. Klient *Klient::getThie()
  452. {
  453. ref++;
  454. return this;
  455. }
  456. Klient *Klient::release()
  457. {
  458. ref--;
  459. if( !ref )
  460. delete this;
  461. return 0;
  462. }