SpielErstellt.cpp 8.9 KB

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