start.cpp 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241
  1. #include <main.h>
  2. #include <Datei.h>
  3. #include <Fenster.h>
  4. #include <Globals.h>
  5. #include <InitDatei.h>
  6. #include <KSGNetwork.h>
  7. #include <Network.h>
  8. int KSGStart Framework::Start( Startparam p )
  9. {
  10. Network::Start( 10 );
  11. char serverReturn = 0;
  12. HANDLE Mutex = OpenMutex( MUTEX_ALL_ACCESS, false, "KSG_Client" );
  13. if( Mutex == NULL )
  14. {
  15. Mutex = CreateMutex( NULL, true, "KSG_Client" );
  16. DateiRemove( new Text( "data/tmp/k.id" ) );
  17. DateiRemove( new Text( "data/tmp/keinabsturz" ) );
  18. }
  19. else
  20. {
  21. WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Programm läuft bereits. Wenn dieß nicht der Fall ist,\nmusst du den Komputer neu starten." ), MB_ICONERROR );
  22. Network::Exit();
  23. return 0;
  24. }
  25. if( DateiExistiert( new Text( "data/update/unable/list.patch" ) ) )
  26. {
  27. PROCESS_INFORMATION prozessinfo3;
  28. STARTUPINFO startinfo3;
  29. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  30. startinfo3.cb = sizeof( STARTUPINFOW );
  31. if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  32. {
  33. Network::Exit();
  34. DateiRemove( new Text( "data/tmp" ) );
  35. exit( 0 );
  36. }
  37. else
  38. {
  39. WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten.\nBitte starte den Komputer neu. Sollte diese Meldung weiterhin\nerscheinen, so musst du das Spiel neu Installieren." ), MB_ICONERROR );
  40. exit( 0 );
  41. }
  42. }
  43. PROCESS_INFORMATION prozessinfo1;
  44. STARTUPINFO startinfo1;
  45. startinfo1.cb = sizeof( STARTUPINFOW );
  46. ZeroMemory( &startinfo1, sizeof( STARTUPINFOW ) );
  47. bool pe = 0;
  48. if( CreateProcess( 0, "data/start/icon.exe", 0, 0, 0, 0, 0, 0, &startinfo1, &prozessinfo1 ) == 1 )
  49. {
  50. CloseHandle( prozessinfo1.hThread );
  51. pe = 1;
  52. }
  53. // Laden des Main Clients
  54. HINSTANCE networkDLL = LoadLibrary( "data/bin/KSGNetwork.dll" );
  55. if( !networkDLL )
  56. {
  57. WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' konnte nicht geladen werden. Fallst diese Datei nicht existiert muss das Spiel neu Installiert werden." ), MB_ICONERROR );
  58. exit( 0 );
  59. }
  60. KSGClient::KSGNetworkCreateMain getMainClient = ( KSGClient::KSGNetworkCreateMain )GetProcAddress( networkDLL, KSGNETWORK_CREATE_MAIN );
  61. if( !getMainClient )
  62. {
  63. WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Einstiegspunkt '" KSGNETWORK_CREATE_MAIN "' wurde in der DLL Datei 'data/bin/KSGNetwork.dll' nicht gefunden. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
  64. exit( 0 );
  65. }
  66. KSGClient::MainServerClient *mainClient = getMainClient();
  67. if( !mainClient )
  68. {
  69. WMessageBox( 0, new Text( "Fehler" ), new Text( "Die DLL Datei 'data/bin/KSGNetwork.dll' scheint fehlerhaft zu sein. Fallst dieses Problem weiterhin auftritt muss das Spiel neu Installiert werden." ), MB_ICONERROR );
  70. exit( 0 );
  71. }
  72. // Laden der Adresse des Main Servers
  73. InitDatei *iDat = new InitDatei( "data/optionen.ini" );
  74. iDat->laden();
  75. if( !iDat->zWert( "ServerIP" ) )
  76. iDat->addWert( "ServerIP", "127.0.0.1" );
  77. if( !iDat->zWert( "ServerPort" ) )
  78. iDat->addWert( "ServerPort", "4225" );
  79. iDat->speichern();
  80. Text *ipT = iDat->zWert( "ServerIP" );
  81. unsigned short port = (unsigned short)TextZuInt( iDat->zWert( "ServerPort" )->getText(), 10 );
  82. // Registrieren beim Server
  83. if( !mainClient->registerSSL( ipT->getText(), port ) )
  84. {
  85. iDat->release();
  86. Text err = "Fehler beim Registrieren des Clients: ";
  87. err += mainClient->getLetzterFehler();
  88. WMessageBox( 0, new Text( "Fehler" ), err.getThis(), MB_ICONERROR );
  89. exit( 0 );
  90. }
  91. iDat->release();
  92. // Speichere Server Adresse für andere Anwendungen
  93. int klientNummer = mainClient->getClientId();
  94. Datei *dat = new Datei();
  95. dat->setDatei( "data/tmp/k.id" );
  96. dat->erstellen();
  97. dat->open( Datei::Style::schreiben );
  98. dat->schreibe( (char*)&klientNummer, 4 );
  99. dat->close();
  100. dat->setDatei( "data/tmp/m.port" );
  101. dat->erstellen();
  102. dat->open( Datei::Style::schreiben );
  103. int normPort = mainClient->getServerPort();
  104. dat->schreibe( (char*)&normPort, 4 );
  105. dat->close();
  106. dat->setDatei( "data/tmp/m.ip" );
  107. dat->erstellen();
  108. dat->open( Datei::Style::schreiben );
  109. char *serverIp = mainClient->getServerIp();
  110. unsigned char len = (unsigned char)textLength( serverIp );
  111. dat->schreibe( (char*)&len, 1 );
  112. dat->schreibe( serverIp, len );
  113. dat->close();
  114. dat->setDatei( "data/tmp/crypt.key" );
  115. dat->erstellen();
  116. dat->open( Datei::Style::schreiben );
  117. len = mainClient->getKeyLen();
  118. dat->schreibe( (char*)&len, 1 );
  119. dat->schreibe( mainClient->zKey(), len );
  120. dat->close();
  121. dat->release();
  122. KSGClient::ErhaltungServerClient *erhaltung = mainClient->createErhaltungServerClient();
  123. if( !erhaltung )
  124. {
  125. Text err = "Fehler beim erstellen des Erhaltung Servers: ";
  126. err += mainClient->getLetzterFehler();
  127. WMessageBox( 0, new Text( "Warnung" ), err.getThis(), MB_ICONWARNING );
  128. }
  129. else
  130. {
  131. if( !erhaltung->verbinde() )
  132. {
  133. Text err = "Fehler beim verbinden mit dem Erhaltung Server: ";
  134. err += erhaltung->getLetzterFehler();
  135. WMessageBox( 0, new Text( "Warnung" ), err.getThis(), MB_ICONWARNING );
  136. }
  137. }
  138. if( pe )
  139. {
  140. while( WaitForSingleObject( prozessinfo1.hProcess, 1000 ) == WAIT_TIMEOUT );
  141. CloseHandle( prozessinfo1.hProcess );
  142. }
  143. PROCESS_INFORMATION prozessinfo2;
  144. STARTUPINFO startinfo2;
  145. startinfo2.cb = sizeof( STARTUPINFOW );
  146. ZeroMemory( &startinfo2, sizeof( STARTUPINFOW ) );
  147. if( CreateProcess( 0, "data/patch/bin/patcher.exe", 0, 0, 0, 0, 0, 0, &startinfo2, &prozessinfo2 ) == 1 )
  148. {
  149. CloseHandle( prozessinfo2.hThread );
  150. while( WaitForSingleObject( prozessinfo2.hProcess, 5000 ) == WAIT_TIMEOUT );
  151. unsigned long erfolg = 0;
  152. GetExitCodeProcess( prozessinfo2.hProcess, &erfolg );
  153. if( erfolg != 0 && DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  154. {
  155. bool gamestart = erfolg == 2;
  156. if( erfolg == 1 )
  157. {
  158. PROCESS_INFORMATION prozessinfo3;
  159. STARTUPINFO startinfo3;
  160. startinfo3.cb = sizeof( STARTUPINFOW );
  161. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  162. if( CreateProcess( 0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  163. {
  164. // Trenne Verbindung zum Server
  165. if( erhaltung )
  166. {
  167. if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  168. erhaltung->abmelden();
  169. erhaltung->trenne();
  170. erhaltung->release();
  171. }
  172. mainClient->unregister();
  173. mainClient->release();
  174. Network::Exit();
  175. DateiRemove( new Text( "data/tmp" ) );
  176. exit( 0 );
  177. }
  178. else
  179. gamestart = 0;
  180. if( !gamestart )
  181. WMessageBox( 0, new Text( "Fehler" ), new Text( "Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten." ), MB_ICONERROR );
  182. }
  183. if( gamestart )
  184. {
  185. PROCESS_INFORMATION prozessinfo3;
  186. STARTUPINFO startinfo3;
  187. startinfo3.cb = sizeof( STARTUPINFOW );
  188. ZeroMemory( &startinfo3, sizeof( STARTUPINFOW ) );
  189. DateiRemove( new Text( "data/tmp/keinabsturz" ) );
  190. if( CreateProcess( 0, "\"data/client/bin/game client.exe\"", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3 ) == 1 )
  191. {
  192. CloseHandle( prozessinfo3.hThread );
  193. while( WaitForSingleObject( prozessinfo3.hProcess, 5000 ) == WAIT_TIMEOUT );
  194. CloseHandle( prozessinfo3.hProcess );
  195. }
  196. else
  197. WMessageBox( 0, new Text( "Fehler" ), new Text( "Das Spiel konnte nicht gestartet werden." ), MB_ICONERROR );
  198. }
  199. }
  200. CloseHandle( prozessinfo2.hProcess );
  201. }
  202. else
  203. {
  204. WMessageBox( 0, new Text( "Fehler" ), new Text( "Der Patcher konnte nicht gestartet werden." ), MB_ICONERROR );
  205. }
  206. // Verbindung zum Server Trennen
  207. if( DateiExistiert( new Text( "data/tmp/keinabsturz" ) ) )
  208. erhaltung->abmelden();
  209. if( erhaltung )
  210. {
  211. erhaltung->trenne();
  212. erhaltung->release();
  213. }
  214. mainClient->unregister();
  215. mainClient->release();
  216. Network::Exit();
  217. DateiRemove( new Text( "data/tmp" ) );
  218. return 0;
  219. }