start.cpp 8.9 KB

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