SpielErstellt.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. #ifdef WIN32
  2. #include "..\SpielServer.h"
  3. #include "..\..\Datenbank\Datenbank.h"
  4. #else
  5. #include "SpielServer.h"
  6. #include "Datenbank.h"
  7. #include <unistd.h>
  8. #define Sleep( x ) usleep( (x) * 1000 )
  9. #endif
  10. #include <Zeit.h>
  11. // Inhalt der SpielErstellt Kasse aus SpielErstellt.h
  12. // Konstruktor
  13. SpielErstellt::SpielErstellt( int id, SpielServer *ss )
  14. : Thread()
  15. {
  16. this->ss = ss;
  17. this->id = id;
  18. karte = ss->zDB()->getKarteVonErstelltemSpiel( id );
  19. spielArt = ss->zDB()->getSpielArtId( karte );
  20. accounts = new Array< int >();
  21. spielerAnzahl = ss->zDB()->getSpielErstelltSpieler( id, accounts );
  22. klients = new RCArray< SSKlient >();
  23. status = new Array< int >();
  24. verbunden = 0;
  25. state = 0;
  26. abbr = 0;
  27. spielId = 0;
  28. }
  29. // Destruktor
  30. SpielErstellt::~SpielErstellt()
  31. {
  32. ss->release();
  33. accounts->release();
  34. klients->release();
  35. status->release();
  36. }
  37. // nicht constant
  38. void SpielErstellt::abbruch()
  39. {
  40. abbr = 1;
  41. }
  42. void SpielErstellt::sendeVerbindungsBefehl()
  43. {
  44. unsigned short sPort = (unsigned short)ss->getPort();
  45. char *sIp = ss->getIp();
  46. unsigned char *sIp4 = new unsigned char[ 4 ];
  47. Text *tmpT = new Text( sIp );
  48. Text *ip1 = tmpT->getTeilText( 0, tmpT->positionVon( '.' ) );
  49. Text *ip2 = tmpT->getTeilText( tmpT->positionVon( '.' ) + 1, tmpT->positionVon( '.', 1 ) );
  50. Text *ip3 = tmpT->getTeilText( tmpT->positionVon( '.', 1 ) + 1, tmpT->positionVon( '.', 2 ) );
  51. Text *ip4 = tmpT->getTeilText( tmpT->positionVon( '.', 2 ) + 1 );
  52. sIp4[ 0 ] = (unsigned char)TextZuInt( ip1->getText(), 10 );
  53. sIp4[ 1 ] = (unsigned char)TextZuInt( ip2->getText(), 10 );
  54. sIp4[ 2 ] = (unsigned char)TextZuInt( ip3->getText(), 10 );
  55. sIp4[ 3 ] = (unsigned char)TextZuInt( ip4->getText(), 10 );
  56. ip1->release();
  57. ip2->release();
  58. ip3->release();
  59. ip4->release();
  60. tmpT->release();
  61. for( int i = 0; i < spielerAnzahl; i++ )
  62. {
  63. int accId = accounts->hat( i ) ? accounts->get( i ) : 0;
  64. int port = 0;
  65. Text *ip = new Text( "" );
  66. if( ss->zDB()->getChatServerPortIp( accId, &port, ip ) )
  67. {
  68. char ret = 0;
  69. Klient *klient = new Klient();
  70. unsigned char key[ 20 ] = { 78, 20, 190, 133, 10, 175, 51, 96, 62, 1, 180, 194, 126, 50, 211, 154, 105, 227, 22, 101 };
  71. klient->setSendeKey( (char *)key, 20 );
  72. klient->setEmpfangKey( (char *)key, 20 );
  73. klient->verbinde( (unsigned short)port, ip->getText() );
  74. klient->sendeEncrypted( "\5\x1D", 2 );
  75. klient->getNachrichtEncrypted( &ret, 1 );
  76. if( ret != 3 )
  77. {
  78. klient->sendeEncrypted( (char *)&accId, 4 );
  79. klient->sendeEncrypted( (char *)&sPort, 2 );
  80. klient->sendeEncrypted( (char *)sIp4, 4 );
  81. klient->getNachrichtEncrypted( &ret, 1 );
  82. }
  83. if( ret == 3 )
  84. {
  85. unsigned char len = 0;
  86. klient->getNachrichtEncrypted( (char *)&len, 1 );
  87. char *err = new char[ len ];
  88. klient->getNachrichtEncrypted( err, len );
  89. delete[] err;
  90. }
  91. klient->sendeEncrypted( "\3", 1 );
  92. klient->getNachrichtEncrypted( &ret, 1 );
  93. ss->addEmpfangen( klient->getDownloadBytes( 1 ) );
  94. ss->addGesendet( klient->getUploadBytes( 1 ) );
  95. klient->trenne();
  96. klient->release();
  97. }
  98. ip->release();
  99. }
  100. delete[] sIp4;
  101. start();
  102. }
  103. bool SpielErstellt::klientVerbunden( SSKlient *klient )
  104. {
  105. if( verbunden == spielerAnzahl )
  106. {
  107. klient->release();
  108. return 0;
  109. }
  110. int accId = klient->getAccountId();
  111. bool ret = 0;
  112. for( int i = 0; i < spielerAnzahl; i++ )
  113. {
  114. if( accounts->hat( i ) && accounts->get( i ) == accId )
  115. {
  116. if( state == 1 )
  117. klient->spielGefunden( karte );
  118. klients->set( klient, i );
  119. status->set( 1, i );
  120. verbunden++;
  121. klient->setSpielErstellt( this );
  122. ret = 1;
  123. break;
  124. }
  125. }
  126. if( !ret )
  127. klient->release();
  128. return ret;
  129. }
  130. bool SpielErstellt::klientNimmtAn( int accountId )
  131. {
  132. if( !verbunden || state != 1 )
  133. return 0;
  134. bool ret = 0;
  135. for( int i = 0; i < spielerAnzahl; i++ )
  136. {
  137. if( accounts->hat( i ) && accounts->get( i ) == accountId )
  138. {
  139. status->set( 2, i );
  140. ret = 1;
  141. break;
  142. }
  143. }
  144. return ret;
  145. }
  146. bool SpielErstellt::klientLehntAb( int accountId )
  147. {
  148. if( !verbunden || state != 1 )
  149. return 0;
  150. bool ret = 0;
  151. for( int i = 0; i < spielerAnzahl; i++ )
  152. {
  153. if( accounts->hat( i ) && accounts->get( i ) == accountId )
  154. {
  155. status->set( 3, i );
  156. ret = 1;
  157. break;
  158. }
  159. }
  160. return ret;
  161. }
  162. bool SpielErstellt::klientGetrennt( SSKlient *zKlient )
  163. {
  164. if( !verbunden )
  165. return 0;
  166. int accId = zKlient->getAccountId();
  167. bool ret = 0;
  168. for( int i = 0; i < spielerAnzahl; i++ )
  169. {
  170. if( accounts->hat( i ) && accounts->get( i ) == accId )
  171. {
  172. if( status->hat( i ) && status->get( i ) != 0 )
  173. {
  174. zKlient->setSpielErstellt( 0 );
  175. status->set( 0, i );
  176. verbunden--;
  177. klients->set( 0, i );
  178. ret = 1;
  179. }
  180. break;
  181. }
  182. }
  183. return ret;
  184. }
  185. void SpielErstellt::thread()
  186. {
  187. state = 1;
  188. double time = 0;
  189. ZeitMesser *zeit = new ZeitMesser();
  190. int nachrichtSenden = 1;
  191. while( time < 10 )
  192. { // warten auf annahme von allen Spielern
  193. if( abbr )
  194. break;
  195. zeit->messungStart();
  196. Sleep( 100 );
  197. bool br = 0;
  198. bool st2 = 1;
  199. for( int i = 0; i < spielerAnzahl; i++ )
  200. {
  201. if( status->hat( i ) && status->get( i ) == 3 )
  202. {
  203. br = 1;
  204. for( int j = 0; j < spielerAnzahl; j++ )
  205. {
  206. if( j != i )
  207. status->set( 2, j );
  208. }
  209. break;
  210. }
  211. if( st2 )
  212. st2 = status->hat( i ) && status->get( i ) == 2;
  213. }
  214. if( st2 )
  215. br = 1;
  216. if( br )
  217. {
  218. zeit->messungEnde();
  219. break;
  220. }
  221. char verbleibend = (char)( 10 - (char)time );
  222. if( verbleibend < 0 )
  223. verbleibend = 0;
  224. if( time > nachrichtSenden )
  225. {
  226. for( int i = 0; i < spielerAnzahl; i++ )
  227. {
  228. if( status->hat( i ) && status->get( i ) != 0 )
  229. {
  230. SSKlient *tmp = klients->z( i );
  231. if( tmp )
  232. tmp->zeitVerbleibend( verbleibend );
  233. }
  234. }
  235. nachrichtSenden++;
  236. }
  237. zeit->messungEnde();
  238. time += zeit->getSekunden();
  239. } // prüfen ob alle Spieler bereit sind
  240. state = 2;
  241. bool abbruch = verbunden != spielerAnzahl;
  242. const char *err = "Ein Spieler konnte nicht erreicht werden.";
  243. if( !abbruch )
  244. {
  245. for( int i = 0; i < spielerAnzahl; i++ )
  246. {
  247. if( !status->hat( i ) || status->get( i ) != 2 )
  248. {
  249. abbruch = 1;
  250. err = "Ein Spieler ist noch nicht bereit.";
  251. break;
  252. }
  253. }
  254. }
  255. if( abbr )
  256. {
  257. err = "Das Spiel wurde Wegen abwesenheit eines Spielers Abgebrochen.";
  258. abbruch = 1;
  259. for( int j = 0; j < spielerAnzahl; j++ )
  260. status->set( 2, j );
  261. }
  262. if( abbruch )
  263. { // Es sind nicht alle bereit Vorgang abbrechen
  264. for( int i = 0; i < spielerAnzahl; i++ )
  265. {
  266. if( status->hat( i ) && status->get( i ) != 0 )
  267. {
  268. SSKlient *tmp = klients->z( i );
  269. if( tmp )
  270. tmp->erstellungAbgebrochen( (char *)err );
  271. }
  272. }
  273. Array< bool > *inWarteschlange = new Array< bool >();
  274. RCArray< Zeit > *wZeit = new RCArray< Zeit >();
  275. if( ss->zDB()->spielErstelltAbbruch( id, spielerAnzahl, accounts, status, inWarteschlange, wZeit ) ) // zurück in Warteschlange
  276. {
  277. for( int i = 0; i < spielerAnzahl; i++ )
  278. {
  279. if( inWarteschlange->hat( i ) && inWarteschlange->get( i ) )
  280. {
  281. SSKlient *tmp = klients->z( i );
  282. if( tmp )
  283. {
  284. Zeit *zTmp = wZeit->z( i );
  285. if( zTmp )
  286. tmp->backInWarteschlange( (char)zTmp->zUhrzeit()->getStunde(), (char)zTmp->zUhrzeit()->getMinute(), (char)zTmp->zUhrzeit()->getSekunde() );
  287. }
  288. }
  289. }
  290. }
  291. inWarteschlange->release();
  292. wZeit->release();
  293. for( int i = 0; i < spielerAnzahl; i++ )
  294. {
  295. SSKlient *tmp = klients->z( i );
  296. if( tmp )
  297. tmp->trenne();
  298. }
  299. zeit->release();
  300. ss->removeSpielErstellt( id ); // delete this
  301. return;
  302. }
  303. // alle Spieler sind bereit Vorgang fortsetzen
  304. spielId = ss->zDB()->spielErstelltFortsetzen( id );
  305. Spiel *weiter = new Spiel( spielId, dynamic_cast<SpielServer *>( getThis() ) );
  306. ss->addSpiel( weiter );
  307. weiter->setAccounts( spielerAnzahl, accounts );
  308. weiter->setKlients( spielerAnzahl, klients );
  309. weiter->setKarteId( karte );
  310. ss->removeSpielErstellt( id ); // delete this
  311. zeit->release();
  312. }
  313. // constant
  314. int SpielErstellt::getId() const
  315. {
  316. return id;
  317. }
  318. // Inhalt der SpielFinden Klasse aus SpielErstellt.h
  319. // Konstruktor
  320. SpielFinden::SpielFinden( SpielServer *ss )
  321. : Thread()
  322. {
  323. this->ss = ss;
  324. end = 0;
  325. spielServerId = 0;
  326. }
  327. // Destruktor
  328. SpielFinden::~SpielFinden()
  329. {
  330. end = 1;
  331. warteAufThread( 2000 );
  332. }
  333. // nicht constant
  334. void SpielFinden::setEnde()
  335. {
  336. end = 1;
  337. }
  338. void SpielFinden::setSpielServerId( int id )
  339. {
  340. spielServerId = id;
  341. }
  342. void SpielFinden::thread()
  343. {
  344. end = 0;
  345. while( !end )
  346. {
  347. for( int i = 0; i < 10 && !end; i++ )
  348. Sleep( 1000 );
  349. if( end )
  350. break;
  351. int ret = ss->zDB()->erstelleSpiel( spielServerId );
  352. if( !ret )
  353. { // erfolg
  354. int id = ss->zDB()->getSpielErstelltId( spielServerId );
  355. SpielErstellt *erstellt = new SpielErstellt( id, dynamic_cast<SpielServer *>( getThis() ) );
  356. ss->addSpielErstellt( erstellt );
  357. erstellt->sendeVerbindungsBefehl();
  358. ss->zDB()->deleteSpielErstelltNext( spielServerId );
  359. }
  360. }
  361. run = 0;
  362. end = 0;
  363. }