123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241 |
- #include <main.h>
- #include <Datei.h>
- #include <Fenster.h>
- #include <Globals.h>
- #include <InitDatei.h>
- #include <KSGNetwork.h>
- #include <Network.h>
- int KSGStart Framework::Start(Startparam p)
- {
- Network::Start(10);
- char serverReturn = 0;
- HANDLE Mutex = OpenMutex(MUTEX_ALL_ACCESS, false, "KSG_Client");
- if (Mutex == NULL)
- {
- Mutex = CreateMutex(NULL, true, "KSG_Client");
- DateiRemove(new Text("data/tmp/k.id"));
- DateiRemove(new Text("data/tmp/keinabsturz"));
- }
- else
- {
- 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);
- Network::Exit();
- return 0;
- }
- if (DateiExistiert(new Text("data/update/unable/list.patch")))
- {
- PROCESS_INFORMATION prozessinfo3;
- STARTUPINFO startinfo3;
- ZeroMemory(&startinfo3, sizeof(STARTUPINFOW));
- startinfo3.cb = sizeof(STARTUPINFOW);
- if (CreateProcess(0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3) == 1)
- {
- Network::Exit();
- DateiRemove(new Text("data/tmp"));
- exit(0);
- }
- else
- {
- 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);
- exit(0);
- }
- }
- PROCESS_INFORMATION prozessinfo1;
- STARTUPINFO startinfo1;
- startinfo1.cb = sizeof(STARTUPINFOW);
- ZeroMemory(&startinfo1, sizeof(STARTUPINFOW));
- bool pe = 0;
- if (CreateProcess(0, "data/start/icon.exe", 0, 0, 0, 0, 0, 0, &startinfo1, &prozessinfo1) == 1)
- {
- CloseHandle(prozessinfo1.hThread);
- pe = 1;
- }
- // Laden des Main Clients
- HINSTANCE networkDLL = LoadLibrary("data/bin/KSGNetwork.dll");
- if (!networkDLL)
- {
- 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);
- exit(0);
- }
- KSGClient::KSGNetworkCreateMain getMainClient = (KSGClient::KSGNetworkCreateMain)GetProcAddress(networkDLL, KSGNETWORK_CREATE_MAIN);
- if (!getMainClient)
- {
- 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);
- exit(0);
- }
- KSGClient::MainServerClient* mainClient = getMainClient();
- if (!mainClient)
- {
- 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);
- exit(0);
- }
- // Laden der Adresse des Main Servers
- InitDatei* iDat = new InitDatei("data/optionen.ini");
- iDat->laden();
- if (!iDat->zWert("ServerIP"))
- iDat->addWert("ServerIP", "127.0.0.1");
- if (!iDat->zWert("ServerPort"))
- iDat->addWert("ServerPort", "4225");
- iDat->speichern();
- Text* ipT = iDat->zWert("ServerIP");
- unsigned short port = (unsigned short)TextZuInt(iDat->zWert("ServerPort")->getText(), 10);
- // Registrieren beim Server
- if (!mainClient->registerSSL(ipT->getText(), port))
- {
- iDat->release();
- Text err = "Fehler beim Registrieren des Clients: ";
- err += mainClient->getLetzterFehler();
- WMessageBox(0, new Text("Fehler"), dynamic_cast<Text*>(err.getThis()), MB_ICONERROR);
- exit(0);
- }
- iDat->release();
- // Speichere Server Adresse für andere Anwendungen
- int klientNummer = mainClient->getClientId();
- Datei* dat = new Datei();
- dat->setDatei("data/tmp/k.id");
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- dat->schreibe((char*)&klientNummer, 4);
- dat->close();
- dat->setDatei("data/tmp/m.port");
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- int normPort = mainClient->getServerPort();
- dat->schreibe((char*)&normPort, 4);
- dat->close();
- dat->setDatei("data/tmp/m.ip");
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- const char* serverIp = mainClient->getServerIp();
- unsigned char len = (unsigned char)textLength(serverIp);
- dat->schreibe((char*)&len, 1);
- dat->schreibe(serverIp, len);
- dat->close();
- dat->setDatei("data/tmp/crypt.key");
- dat->erstellen();
- dat->open(Datei::Style::schreiben);
- len = mainClient->getKeyLen();
- dat->schreibe((char*)&len, 1);
- dat->schreibe(mainClient->zKey(), len);
- dat->close();
- dat->release();
- KSGClient::ErhaltungServerClient* erhaltung = mainClient->createErhaltungServerClient();
- if (!erhaltung)
- {
- Text err = "Fehler beim erstellen des Erhaltung Servers: ";
- err += mainClient->getLetzterFehler();
- WMessageBox(0, new Text("Warnung"), dynamic_cast<Text*>(err.getThis()), MB_ICONWARNING);
- }
- else
- {
- if (!erhaltung->verbinde())
- {
- Text err = "Fehler beim verbinden mit dem Erhaltung Server: ";
- err += erhaltung->getLetzterFehler();
- WMessageBox(0, new Text("Warnung"), dynamic_cast<Text*>(err.getThis()), MB_ICONWARNING);
- }
- }
- if (pe)
- {
- while (WaitForSingleObject(prozessinfo1.hProcess, 1000) == WAIT_TIMEOUT);
- CloseHandle(prozessinfo1.hProcess);
- }
- PROCESS_INFORMATION prozessinfo2;
- STARTUPINFO startinfo2;
- startinfo2.cb = sizeof(STARTUPINFOW);
- ZeroMemory(&startinfo2, sizeof(STARTUPINFOW));
- if (CreateProcess(0, "data/patch/bin/patcher.exe", 0, 0, 0, 0, 0, 0, &startinfo2, &prozessinfo2) == 1)
- {
- CloseHandle(prozessinfo2.hThread);
- while (WaitForSingleObject(prozessinfo2.hProcess, 5000) == WAIT_TIMEOUT);
- unsigned long erfolg = 0;
- GetExitCodeProcess(prozessinfo2.hProcess, &erfolg);
- if (erfolg != 0 && DateiExistiert(new Text("data/tmp/keinabsturz")))
- {
- bool gamestart = erfolg == 2;
- if (erfolg == 1)
- {
- PROCESS_INFORMATION prozessinfo3;
- STARTUPINFO startinfo3;
- startinfo3.cb = sizeof(STARTUPINFOW);
- ZeroMemory(&startinfo3, sizeof(STARTUPINFOW));
- if (CreateProcess(0, "data/patch/bin/übernehmen.exe", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3) == 1)
- {
- // Trenne Verbindung zum Server
- if (erhaltung)
- {
- if (DateiExistiert(new Text("data/tmp/keinabsturz")))
- erhaltung->abmelden();
- erhaltung->trenne();
- erhaltung->release();
- }
- mainClient->unregister();
- mainClient->release();
- Network::Exit();
- DateiRemove(new Text("data/tmp"));
- exit(0);
- }
- else
- gamestart = 0;
- if (!gamestart)
- WMessageBox(0, new Text("Fehler"), new Text("Bei dem Übernehen der Änderungen ist ein Fehler aufgetreten."), MB_ICONERROR);
- }
- if (gamestart)
- {
- PROCESS_INFORMATION prozessinfo3;
- STARTUPINFO startinfo3;
- startinfo3.cb = sizeof(STARTUPINFOW);
- ZeroMemory(&startinfo3, sizeof(STARTUPINFOW));
- DateiRemove(new Text("data/tmp/keinabsturz"));
- if (CreateProcess(0, "\"data/client/bin/game client.exe\"", 0, 0, 0, 0, 0, 0, &startinfo3, &prozessinfo3) == 1)
- {
- CloseHandle(prozessinfo3.hThread);
- while (WaitForSingleObject(prozessinfo3.hProcess, 5000) == WAIT_TIMEOUT);
- CloseHandle(prozessinfo3.hProcess);
- }
- else
- WMessageBox(0, new Text("Fehler"), new Text("Das Spiel konnte nicht gestartet werden."), MB_ICONERROR);
- }
- }
- CloseHandle(prozessinfo2.hProcess);
- }
- else
- {
- WMessageBox(0, new Text("Fehler"), new Text("Der Patcher konnte nicht gestartet werden."), MB_ICONERROR);
- }
- // Verbindung zum Server Trennen
- if (DateiExistiert(new Text("data/tmp/keinabsturz")))
- erhaltung->abmelden();
- if (erhaltung)
- {
- erhaltung->trenne();
- erhaltung->release();
- }
- mainClient->unregister();
- mainClient->release();
- Network::Exit();
- DateiRemove(new Text("data/tmp"));
- return 0;
- }
|