SpielK.cpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637
  1. #include "../KSGKlient.h"
  2. #include "../KSGServer.h"
  3. #include "../../Global/Variablen.h"
  4. #include "../Keys.h"
  5. #include <Globals.h>
  6. // Inhalt der SpielKlient Klasse aus KSGKlient.h
  7. // Konstruktor
  8. SpielKlient::SpielKlient()
  9. : Thread()
  10. {
  11. verbunden = 0;
  12. senden = 0;
  13. empfangen = 0;
  14. fehler = new Text( "" );
  15. klientId = getKlientId();
  16. ref = 1;
  17. }
  18. // Destruktor
  19. SpielKlient::~SpielKlient()
  20. {
  21. cs.lock();
  22. if( senden )
  23. {
  24. char serverReturn = 0;
  25. if( verbunden )
  26. {
  27. senden->sendeEncrypted( "\3", 1 );
  28. senden->getNachrichtEncrypted( &serverReturn, 1 );
  29. senden->trenne();
  30. }
  31. senden = senden->release();
  32. verbunden = 0;
  33. if( empfangen )
  34. {
  35. warteAufThread( 5000 );
  36. ende();
  37. empfangen->trenne();
  38. empfangen = empfangen->release();
  39. }
  40. }
  41. fehler = fehler->release();
  42. cs.unlock();
  43. }
  44. // nicht constant
  45. bool SpielKlient::verbinde( unsigned short port, char *ip ) // verbindet ich mit dem Spiel Server
  46. {
  47. cs.lock();
  48. if( verbunden )
  49. {
  50. cs.unlock();
  51. return 1;
  52. }
  53. if( !senden )
  54. senden = new Klient();
  55. int keyLen = 0;
  56. char *key = 0;
  57. Framework::logLine( ( ( Text( "Zugeteilter Spiel Server:" ) += ip ) += ":" ) += port );
  58. Framework::logLine( "Verbinung mit Spiel Server wird hergestellt..." );
  59. Keys::getServerKey( &key, keyLen, Keys::SPIEL, Keys::SENDEN );
  60. senden->setSendeKey( key, keyLen );
  61. delete[] key;
  62. Keys::getServerKey( &key, keyLen, Keys::SPIEL, Keys::EMPFANGEN );
  63. senden->setEmpfangKey( key, keyLen );
  64. delete[] key;
  65. if( senden->verbinde( port, ip ) )
  66. {
  67. if( senden->sendeEncrypted( "\1", 1 ) )
  68. {
  69. char serverReturn = 0;
  70. senden->sendeEncrypted( (char*)&klientId, 4 );
  71. char ret = 0;
  72. senden->getNachrichtEncrypted( &ret, 1 );
  73. if( ret != 1 )
  74. {
  75. if( ret == 3 )
  76. {
  77. char byte = 0;
  78. senden->getNachrichtEncrypted( &byte, 1 );
  79. char *f = new char[ byte + 1 ];
  80. f[ byte ] = 0;
  81. senden->getNachrichtEncrypted( f, byte );
  82. Framework::logLine( Text( "ERROR: " ) += f );
  83. fehler->setText( f );
  84. delete[]f;
  85. }
  86. senden->sendeEncrypted( "\3", 1 );
  87. senden->getNachrichtEncrypted( &serverReturn, 1 );
  88. senden->trenne();
  89. WMessageBox( 0, new Text( "Fehler" ), new Text( "Server akzeptiert den Klient nicht" ), MB_ICONERROR );
  90. cs.unlock();
  91. return 0;
  92. }
  93. char *sl = 0;
  94. char slLän = getSchlüssel( &sl );
  95. senden->setSendeKey( sl, slLän );
  96. senden->setEmpfangKey( sl, slLän );
  97. delete[] sl;
  98. if( !empfangen )
  99. empfangen = new Klient();
  100. int keyLen = 0;
  101. char *key = 0;
  102. Keys::getServerKey( &key, keyLen, Keys::SPIEL, Keys::SENDEN );
  103. empfangen->setSendeKey( key, keyLen );
  104. delete[] key;
  105. Keys::getServerKey( &key, keyLen, Keys::SPIEL, Keys::EMPFANGEN );
  106. empfangen->setEmpfangKey( key, keyLen );
  107. delete[] key;
  108. if( empfangen->verbinde( senden->getServerPort(), senden->getServerIp() ) )
  109. {
  110. start();
  111. verbunden = 1;
  112. cs.unlock();
  113. Framework::logLine( "Erfolgreich mit Spiel Server verbunden." );
  114. return 1;
  115. }
  116. else
  117. {
  118. Framework::logLine( "ERROR: Empfang Server nicht erreichbar." );
  119. fehler->setText( "Der dir zugewiesene Spiel Server kann dir keine Nachrichten senden." );
  120. cs.unlock();
  121. return 1;
  122. }
  123. }
  124. else
  125. {
  126. Framework::logLine( "ERROR: Senden zum Server nicht moeglich." );
  127. fehler->setText( "Der dir zugewiesene Spiel Server hat die Verbindung abgebrochen. Bitte versuche es Später erneut." );
  128. senden = senden->release();
  129. }
  130. }
  131. else
  132. {
  133. Framework::logLine( "ERROR: Server nicht erreichbar." );
  134. fehler->setText( "Der dir zugewiesene Spiel Server antwortet nicht. Bitte versuche es Später erneut." );
  135. senden = senden->release();
  136. }
  137. cs.unlock();
  138. return 0;
  139. }
  140. bool SpielKlient::spielErstelltAnnehmen() // klient ist bereit dem erstellten Spiel beizutreten
  141. {
  142. if( !senden )
  143. return 0;
  144. char ret = 0;
  145. cs.lock();
  146. senden->sendeEncrypted( "\4", 1 );
  147. senden->getNachrichtEncrypted( &ret, 1 );
  148. cs.unlock();
  149. return ret == 1;
  150. }
  151. bool SpielKlient::spielErstelltAblehnen() // klient ist nicht bereit dem erstellten Spiel beizutreten
  152. {
  153. if( !senden )
  154. return 0;
  155. char ret = 0;
  156. cs.lock();
  157. senden->sendeEncrypted( "\5", 1 );
  158. senden->getNachrichtEncrypted( &ret, 1 );
  159. cs.unlock();
  160. return ret == 1;
  161. }
  162. bool SpielKlient::spielErstelltTeamWechseln( int team ) // wechselt das Team
  163. {
  164. if( !senden )
  165. return 0;
  166. char ret = 0;
  167. cs.lock();
  168. senden->sendeEncrypted( "\6", 1 );
  169. senden->getNachrichtEncrypted( &ret, 1 );
  170. if( !ret )
  171. {
  172. cs.unlock();
  173. return 0;
  174. }
  175. senden->sendeEncrypted( (char*)&team, 4 );
  176. senden->getNachrichtEncrypted( &ret, 1 );
  177. cs.unlock();
  178. return ret == 1;
  179. }
  180. bool SpielKlient::spielErstelltTeamFertig() // bestetigt die Team Auswahl
  181. {
  182. if( !senden )
  183. return 0;
  184. char ret = 0;
  185. cs.lock();
  186. senden->sendeEncrypted( "\xE", 1 );
  187. senden->getNachrichtEncrypted( &ret, 1 );
  188. cs.unlock();
  189. return ret == 1;
  190. }
  191. bool SpielKlient::spielErstelltChatNachricht( char *nachricht ) // sendet eine Chat Nachricht an die mitglieder des erstellten Spiels
  192. {
  193. char län = textLength( nachricht );
  194. if( !län )
  195. return 1;
  196. if( !senden )
  197. return 0;
  198. char ret = 0;
  199. cs.lock();
  200. senden->sendeEncrypted( "\7", 1 );
  201. senden->getNachrichtEncrypted( &ret, 1 );
  202. if( !ret )
  203. {
  204. cs.unlock();
  205. return 0;
  206. }
  207. senden->sendeEncrypted( &län, 1 );
  208. senden->sendeEncrypted( nachricht, län );
  209. senden->getNachrichtEncrypted( &ret, 1 );
  210. cs.unlock();
  211. return ret == 1;
  212. }
  213. bool SpielKlient::bereitZumLaden() // Klient ist bereit zum Laden
  214. {
  215. if( !senden )
  216. return 0;
  217. char ret = 0;
  218. cs.lock();
  219. senden->sendeEncrypted( "\x9", 1 );
  220. senden->getNachrichtEncrypted( &ret, 1 );
  221. cs.unlock();
  222. return ret == 1;
  223. }
  224. bool SpielKlient::setLadenProzent( int prozent ) // Setzt den Fortschritt des Klients
  225. {
  226. if( !senden )
  227. return 0;
  228. char ret = 0;
  229. cs.lock();
  230. senden->sendeEncrypted( "\xC", 1 );
  231. senden->getNachrichtEncrypted( &ret, 1 );
  232. if( ret )
  233. {
  234. senden->sendeEncrypted( (char*)&prozent, 4 );
  235. senden->getNachrichtEncrypted( &ret, 1 );
  236. }
  237. cs.unlock();
  238. return ret == 1;
  239. }
  240. bool SpielKlient::bereitZumSpiel() // Klient ist bereit zum Spiel
  241. {
  242. if( !senden )
  243. return 0;
  244. char ret = 0;
  245. cs.lock();
  246. senden->sendeEncrypted( "\xA", 1 );
  247. senden->getNachrichtEncrypted( &ret, 1 );
  248. cs.unlock();
  249. return ret == 1;
  250. }
  251. bool SpielKlient::spielNachricht( short län, char *bytes ) // Nachricht während des Spiels
  252. {
  253. if( !senden )
  254. return 0;
  255. cs.lock();
  256. senden->sendeEncrypted( "\xB", 1 );
  257. senden->sende( (char*)&län, 2 );
  258. senden->sende( bytes, län );
  259. cs.unlock();
  260. return 1;
  261. }
  262. bool SpielKlient::statistikNachricht( short län, char *bytes ) // Nachricht während der Statistik
  263. {
  264. if( !senden )
  265. return 0;
  266. char ret = 0;
  267. cs.lock();
  268. senden->sendeEncrypted( "\xD", 1 );
  269. senden->getNachrichtEncrypted( &ret, 1 );
  270. if( ret )
  271. {
  272. senden->sendeEncrypted( (char*)&län, 2 );
  273. senden->sendeEncrypted( bytes, län );
  274. senden->getNachrichtEncrypted( &ret, 1 );
  275. }
  276. cs.unlock();
  277. return ret == 1;
  278. }
  279. bool SpielKlient::keepAlive() // Erhält die Verbindung aufrecht
  280. {
  281. if( !verbunden )
  282. return 0;
  283. char res = 0;
  284. if( !cs.tryLock() )
  285. return 1;
  286. Framework::logLine( "Verbindungstest zum Spiel Server..." );
  287. bool ok = senden->sendeEncrypted( "\xF", 1 );
  288. ok &= senden->getNachrichtEncrypted( &res, 1 );
  289. cs.unlock();
  290. if( res != 1 || !ok )
  291. {
  292. Framework::logLine( "Verbindungsabbruch." );
  293. trenne();
  294. }
  295. else
  296. Framework::logLine( "Verbindung besteht." );
  297. return res == 1;
  298. }
  299. bool SpielKlient::trenne() // trennt sich von dem Chat Server
  300. {
  301. if( !verbunden )
  302. return 1;
  303. verbunden = 0;
  304. cs.lock();
  305. Framework::logLine( "Verbindung zum Spiel Server wird getrennt..." );
  306. senden->sendeEncrypted( "\3", 1 );
  307. char serverReturn = 0;
  308. senden->getNachrichtEncrypted( &serverReturn, 1 );
  309. senden->trenne();
  310. warteAufThread( 2000 );
  311. empfangen->trenne();
  312. cs.unlock();
  313. run = 0;
  314. ende();
  315. return 1;
  316. }
  317. void SpielKlient::thread() // empfangen von Nachrichten
  318. {
  319. if( !verbunden || !empfangen || !senden )
  320. return;
  321. empfangen->sendeEncrypted( "\1", 1 );
  322. empfangen->sendeEncrypted( (char*)&klientId, 4 );
  323. char res = 0;
  324. empfangen->getNachrichtEncrypted( &res, 1 );
  325. if( res == 3 )
  326. {
  327. char län = 0;
  328. empfangen->getNachrichtEncrypted( &län, 1 );
  329. char *nachricht = new char[ län + 1 ];
  330. nachricht[ län ] = 0;
  331. empfangen->getNachrichtEncrypted( nachricht, län );
  332. fehler->setText( nachricht );
  333. delete[]nachricht;
  334. }
  335. if( res == 1 )
  336. {
  337. char *sl = 0;
  338. char slLän = getSchlüssel( &sl );
  339. empfangen->setSendeKey( sl, slLän );
  340. empfangen->setEmpfangKey( sl, slLän );
  341. delete[] sl;
  342. }
  343. else if( res != 0 )
  344. {
  345. WMessageBox( 0, new Text( "Fehler" ), new Text( "Server hat keine Verwendung für den Client." ), MB_ICONERROR );
  346. return;
  347. }
  348. char befehl = 0;
  349. while( verbunden )
  350. {
  351. if( !empfangen->getNachrichtEncrypted( &befehl, 1 ) )
  352. {
  353. run = 0;
  354. return;
  355. }
  356. switch( befehl )
  357. {
  358. case 0: // verbindung getrennt
  359. trenne();
  360. run = 0;
  361. return;
  362. case 1: // verbleibende Zeit
  363. if( 1 )
  364. {
  365. char sekunden = 0;
  366. empfangen->getNachrichtEncrypted( &sekunden, 1 );
  367. if( nachLogin && nachLogin->zSpielenFenster() )
  368. nachLogin->zSpielenFenster()->spielGefundenZeitVerbleibend( sekunden );
  369. }
  370. break;
  371. case 2: // SpielErstellt abbruch
  372. if( 1 )
  373. {
  374. char län = 0;
  375. empfangen->getNachrichtEncrypted( &län, 1 );
  376. char *grund = new char[ län + 1 ];
  377. grund[ län ] = 0;
  378. empfangen->getNachrichtEncrypted( grund, län );
  379. if( nachLogin && nachLogin->zNachrichtenListe() )
  380. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Spiel Abgebrochen" ), new Text( grund ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  381. if( nachLogin && nachLogin->zSpielenFenster() )
  382. nachLogin->zSpielenFenster()->spielGefundenAbbruch();
  383. delete[] grund;
  384. }
  385. break;
  386. case 3: // Fehler
  387. if( 1 )
  388. {
  389. char länge = 0;
  390. empfangen->getNachrichtEncrypted( &länge, 1 );
  391. char *txt = new char[ länge + 1 ];
  392. txt[ länge ] = 0;
  393. empfangen->getNachrichtEncrypted( txt, länge );
  394. hauptScreen->lock();
  395. if( nachLogin && nachLogin->zNachrichtenListe() )
  396. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ), new Text( txt ), new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  397. hauptScreen->unlock();
  398. delete[]txt;
  399. }
  400. break;
  401. case 4: // zurück in Warteschlange
  402. if( 1 )
  403. {
  404. char stunden = 0;
  405. char minuten = 0;
  406. char sekunden = 0;
  407. empfangen->getNachrichtEncrypted( &stunden, 1 );
  408. empfangen->getNachrichtEncrypted( &minuten, 1 );
  409. empfangen->getNachrichtEncrypted( &sekunden, 1 );
  410. if( nachLogin && nachLogin->zSpielenFenster() )
  411. nachLogin->zSpielenFenster()->zurückInWarteschlange( stunden, minuten, sekunden );
  412. }
  413. break;
  414. case 5: // Erstellung fortsetzen
  415. if( nachLogin && nachLogin->zSpielenFenster() )
  416. nachLogin->zSpielenFenster()->teamAuswahlBetreten();
  417. break;
  418. case 6: // SpielErstellt Initialisierung
  419. if( 1 )
  420. {
  421. SpielerTeamStruktur *sts = new SpielerTeamStruktur();
  422. empfangen->getNachrichtEncrypted( (char*)&sts->spielerAnzahl, 4 );
  423. empfangen->getNachrichtEncrypted( (char*)&sts->teamAnzahl, 4 );
  424. for( int i = 0; i < sts->spielerAnzahl; i++ )
  425. {
  426. int farbe = 0;
  427. empfangen->getNachrichtEncrypted( (char*)&farbe, 4 );
  428. sts->spielerFarbe->set( farbe, i );
  429. }
  430. for( int i = 0; i < sts->teamAnzahl; i++ )
  431. {
  432. int farbe = 0;
  433. empfangen->getNachrichtEncrypted( (char*)&farbe, 4 );
  434. sts->teamFarbe->set( farbe, i );
  435. }
  436. for( int i = 0; i < sts->teamAnzahl; i++ )
  437. {
  438. char län = 0;
  439. empfangen->getNachrichtEncrypted( &län, 1 );
  440. char *name = new char[ län + 1 ];
  441. name[ län ] = 0;
  442. if( län )
  443. empfangen->getNachrichtEncrypted( name, län );
  444. Text *tmp = new Text( name );
  445. delete[] name;
  446. sts->teamName->set( tmp, i );
  447. }
  448. for( int i = 0; i < sts->teamAnzahl; i++ )
  449. {
  450. int größe = 0;
  451. empfangen->getNachrichtEncrypted( (char*)&größe, 4 );
  452. sts->teamGröße->set( größe, i );
  453. }
  454. if( nachLogin && nachLogin->zSpielenFenster() )
  455. nachLogin->zSpielenFenster()->teamAuswahlInit( sts );
  456. else
  457. sts->release();
  458. }
  459. break;
  460. case 7: // SpielErstellt Spieler hinzugefügt
  461. if( 1 )
  462. {
  463. int accountId = 0;
  464. empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
  465. if( nachLogin && nachLogin->zSpielenFenster() )
  466. nachLogin->zSpielenFenster()->teamAuswahlAddSpieler( accountId );
  467. }
  468. break;
  469. case 8: // SpielErstellt Spieler entfernt
  470. if( 1 )
  471. {
  472. int accountId = 0;
  473. empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
  474. if( nachLogin && nachLogin->zSpielenFenster() )
  475. nachLogin->zSpielenFenster()->teamAuswahlRemoveSpieler( accountId );
  476. }
  477. break;
  478. case 9: // SpielErstellt Spieler wechselt Team
  479. if( 1 )
  480. {
  481. int accountId = 0;
  482. int spielerNummer = 0;
  483. empfangen->getNachrichtEncrypted( (char*)&accountId, 4 );
  484. empfangen->getNachrichtEncrypted( (char*)&spielerNummer, 4 );
  485. if( nachLogin && nachLogin->zSpielenFenster() )
  486. nachLogin->zSpielenFenster()->teamAuswahlSpielerWehseltTeam( accountId, spielerNummer );
  487. }
  488. break;
  489. case 0xA: // SpielErstellt Chat Nachricht
  490. if( 1 )
  491. {
  492. char län = 0;
  493. empfangen->getNachrichtEncrypted( &län, 1 );
  494. char *nachricht = new char[ län + 1 ];
  495. nachricht[ län ] = 0;
  496. if( län )
  497. empfangen->getNachrichtEncrypted( nachricht, län );
  498. if( nachLogin && nachLogin->zSpielenFenster() )
  499. nachLogin->zSpielenFenster()->teamAuswahlChatNachricht( nachricht );
  500. delete[] nachricht;
  501. }
  502. break;
  503. case 0xB: // Spiel gefunden
  504. if( 1 )
  505. {
  506. int karteId = 0;
  507. empfangen->getNachrichtEncrypted( (char*)&karteId, 4 );
  508. if( nachLogin && nachLogin->zSpielenFenster() )
  509. nachLogin->zSpielenFenster()->spielGefunden( karteId );
  510. }
  511. break;
  512. case 0xC: // Spiel Laden beginnen
  513. aktion = 5;
  514. break;
  515. case 0xD: // Spiel Laden Spieler hinzufügen
  516. if( 1 )
  517. {
  518. int accId = 0;
  519. int spielerNummer = 0;
  520. empfangen->getNachrichtEncrypted( (char*)&accId, 4 );
  521. empfangen->getNachrichtEncrypted( (char*)&spielerNummer, 4 );
  522. if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
  523. nachLogin->zImSpiel()->lBAddSpieler( accId, spielerNummer );
  524. }
  525. break;
  526. case 0xE: // Spiel Laden Spieler Prozent
  527. if( 1 )
  528. {
  529. int accId = 0;
  530. int prozent = 0;
  531. empfangen->getNachrichtEncrypted( (char*)&accId, 4 );
  532. empfangen->getNachrichtEncrypted( (char*)&prozent, 4 );
  533. if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
  534. nachLogin->zImSpiel()->lBSetSpielerProzent( accId, prozent );
  535. }
  536. break;
  537. case 0xF: // Spiel Laden Spieler Ping
  538. if( 1 )
  539. {
  540. int accId = 0;
  541. int ping = 0;
  542. empfangen->getNachrichtEncrypted( (char*)&accId, 4 );
  543. empfangen->getNachrichtEncrypted( (char*)&ping, 4 );
  544. if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
  545. nachLogin->zImSpiel()->lBSetSpielerPing( accId, ping );
  546. }
  547. break;
  548. case 0x10: // ping
  549. empfangen->sendeEncrypted( "\1", 1 );
  550. break;
  551. case 0x11: // Spiel Laden Fertig
  552. if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
  553. nachLogin->zImSpiel()->endLaden();
  554. break;
  555. case 0x12: // Spiel Nachricht
  556. if( 1 )
  557. {
  558. short län = 0;
  559. empfangen->getNachricht( (char*)&län, 2 );
  560. char *n = new char[ län ];
  561. empfangen->getNachricht( n, län );
  562. if( nachLogin && nachLogin->zImSpiel() && nachLogin->zImSpiel()->istSichtbar() )
  563. nachLogin->zImSpiel()->spielNachricht( län, n );
  564. delete[] n;
  565. }
  566. break;
  567. case 0x13: // Statistik Nachricht
  568. if( 1 )
  569. {
  570. short län = 0;
  571. empfangen->getNachrichtEncrypted( (char*)&län, 2 );
  572. char *n = new char[ län ];
  573. empfangen->getNachrichtEncrypted( n, län );
  574. if( nachLogin && nachLogin->zSpielenFenster() )
  575. nachLogin->zSpielenFenster()->statistikNachricht( län, n );
  576. delete[] n;
  577. }
  578. break;
  579. case 0x14: // ping
  580. empfangen->sendeEncrypted( "\1", 1 );
  581. break;
  582. default: // Unbekannte Servernachricht
  583. if( nachLogin && nachLogin->zNachrichtenListe() )
  584. {
  585. hauptScreen->lock();
  586. nachLogin->zNachrichtenListe()->addNachricht( new Text( "Fehler" ),
  587. new Text( "Unbekannte Nachricht vom Server. Eventuel ist der Client nicht mehr Aktuell." ),
  588. new Text( "Ok" ), 0, NachrichtType::nachricht, 0 );
  589. hauptScreen->unlock();
  590. }
  591. break;
  592. }
  593. }
  594. run = 0;
  595. }
  596. // constant
  597. bool SpielKlient::istVerbunden() const // prüft, ob mit Chat Server verbunden
  598. {
  599. return verbunden;
  600. }
  601. char *SpielKlient::getLetzterFehler() const // gibt den Letzten Fehlertext zuück
  602. {
  603. return fehler->getText();
  604. }
  605. // Reference Counting
  606. SpielKlientV *SpielKlient::getThis()
  607. {
  608. ref++;
  609. return this;
  610. }
  611. SpielKlientV *SpielKlient::release()
  612. {
  613. ref--;
  614. if( !ref )
  615. delete this;
  616. return 0;
  617. }