SpielK.cpp 20 KB

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