Bladeren bron

Projektdateien hinzufügen.

Kolja Strohm 7 jaren geleden
bovenliggende
commit
007c22773b
136 gewijzigde bestanden met toevoegingen van 3212 en 0 verwijderingen
  1. 13 0
      Data/psInit.ini
  2. 30 0
      Patch Server.sln
  3. 585 0
      PatchServer/Datenbank.cpp
  4. 66 0
      PatchServer/Datenbank.h
  5. 1771 0
      PatchServer/PatchServer.cpp
  6. 120 0
      PatchServer/PatchServer.h
  7. 72 0
      PatchServer/PatchServer.vcxproj
  8. 30 0
      PatchServer/PatchServer.vcxproj.filters
  9. 54 0
      PatchServer/main.cpp
  10. BIN
      PatchServer/readme/images/ArchOptions.gif
  11. BIN
      PatchServer/readme/images/ChangeRemote.gif
  12. BIN
      PatchServer/readme/images/ManageConnections.gif
  13. BIN
      PatchServer/readme/images/OutputTypes.gif
  14. BIN
      PatchServer/readme/images/debuggerexport.png
  15. BIN
      PatchServer/readme/images/firstconnection.png
  16. BIN
      PatchServer/readme/images/linker.png
  17. BIN
      PatchServer/readme/images/postbuild.png
  18. 85 0
      PatchServer/readme/readme.html
  19. 119 0
      PatchServer/readme/stylesheet.css
  20. BIN
      Versions/x32/live/data/bilder/game.ltdb
  21. BIN
      Versions/x32/live/data/bilder/system.ltdb
  22. BIN
      Versions/x32/live/data/client/bilder/chat.ltdb
  23. BIN
      Versions/x32/live/data/client/bilder/ladeanimation.ltdb
  24. BIN
      Versions/x32/live/data/client/bilder/spielen.ltdb
  25. BIN
      Versions/x32/live/data/client/bilder/titel.ltdb
  26. 2 0
      Versions/x32/live/data/optionen.ini
  27. BIN
      Versions/x32/live/data/patch/bilder/news.ltdb
  28. BIN
      Versions/x32/live/data/patch/bilder/patcher.ltdb
  29. 5 0
      Versions/x32/live/data/patch/news/Linie/data.new
  30. 6 0
      Versions/x32/live/data/patch/news/Stickman World/data.new
  31. 4 0
      Versions/x32/live/data/patch/news/Willkommen/data.new
  32. BIN
      Versions/x32/live/data/schriften/normal.ltds
  33. BIN
      Versions/x32/live/data/spiele/Linie/bilder/start.ltdb
  34. 1 0
      Versions/x32/live/data/spiele/Linie/data/beschreibung.ltgb
  35. 3 0
      Versions/x32/live/data/spiele/Linie/data/game.ini
  36. BIN
      Versions/x32/live/data/spiele/Linie/data/id.ltgid
  37. BIN
      Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/bilder/bilder.ltdb
  38. 6 0
      Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/data/beschreibung.ltgb
  39. 4 0
      Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/data/map.ini
  40. BIN
      Versions/x32/live/data/spiele/Stickman World Online/bilder/start.ltdb
  41. 1 0
      Versions/x32/live/data/spiele/Stickman World Online/data/beschreibung.ltgb
  42. 3 0
      Versions/x32/live/data/spiele/Stickman World Online/data/game.ini
  43. BIN
      Versions/x32/live/data/spiele/Stickman World Online/data/id.ltgid
  44. BIN
      Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/bilder/bilder.ltdb
  45. 22 0
      Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/data/beschreibung.ltgb
  46. 3 0
      Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/data/map.ini
  47. BIN
      Versions/x32/live/data/start/icon.exe
  48. BIN
      Versions/x32/live/data/version
  49. BIN
      Versions/x32/live/framework.dll
  50. BIN
      Versions/x32/live/network.dll
  51. BIN
      Versions/x32/live/start.exe
  52. BIN
      Versions/x32/version
  53. 2 0
      build.bat
  54. BIN
      systeme/Client/WIN32/data/bilder/game.ltdb
  55. BIN
      systeme/Client/WIN32/data/bilder/ladeanimation.ltdb
  56. BIN
      systeme/Client/WIN32/data/bilder/system.ltdb
  57. BIN
      systeme/Client/WIN32/data/client/bilder/account.ltdb
  58. BIN
      systeme/Client/WIN32/data/client/bilder/chat.ltdb
  59. BIN
      systeme/Client/WIN32/data/client/bilder/ladeanimation.ltdb
  60. BIN
      systeme/Client/WIN32/data/client/bilder/shop.ltdb
  61. BIN
      systeme/Client/WIN32/data/client/bilder/spielen.ltdb
  62. BIN
      systeme/Client/WIN32/data/client/bilder/titel.ltdb
  63. BIN
      systeme/Client/WIN32/data/client/bilder/video.ltdb
  64. 2 0
      systeme/Client/WIN32/data/optionen.ini
  65. BIN
      systeme/Client/WIN32/data/patch/bilder/news.ltdb
  66. BIN
      systeme/Client/WIN32/data/patch/bilder/patcher.ltdb
  67. 5 0
      systeme/Client/WIN32/data/patch/news/Linie/data.new
  68. 6 0
      systeme/Client/WIN32/data/patch/news/Stickman World/data.new
  69. 3 0
      systeme/Client/WIN32/data/patch/news/Willkommen/data.new
  70. BIN
      systeme/Client/WIN32/data/schriften/normal.ltds
  71. BIN
      systeme/Client/WIN32/data/start/icon.exe
  72. BIN
      systeme/Client/WIN32/data/version
  73. BIN
      systeme/Client/WIN32/framework.dll
  74. BIN
      systeme/Client/WIN32/network.dll
  75. BIN
      systeme/Client/WIN32/start.exe
  76. 26 0
      systeme/Client/WIN32/version.ini
  77. BIN
      systeme/Client/WIN64/data/bilder/game.ltdb
  78. BIN
      systeme/Client/WIN64/data/bilder/ladeanimation.ltdb
  79. BIN
      systeme/Client/WIN64/data/bilder/system.ltdb
  80. BIN
      systeme/Client/WIN64/data/client/bilder/account.ltdb
  81. BIN
      systeme/Client/WIN64/data/client/bilder/chat.ltdb
  82. BIN
      systeme/Client/WIN64/data/client/bilder/ladeanimation.ltdb
  83. BIN
      systeme/Client/WIN64/data/client/bilder/shop.ltdb
  84. BIN
      systeme/Client/WIN64/data/client/bilder/spielen.ltdb
  85. BIN
      systeme/Client/WIN64/data/client/bilder/titel.ltdb
  86. BIN
      systeme/Client/WIN64/data/client/bilder/video.ltdb
  87. 2 0
      systeme/Client/WIN64/data/optionen.ini
  88. BIN
      systeme/Client/WIN64/data/patch/bilder/news.ltdb
  89. BIN
      systeme/Client/WIN64/data/patch/bilder/patcher.ltdb
  90. 5 0
      systeme/Client/WIN64/data/patch/news/Linie/data.new
  91. 6 0
      systeme/Client/WIN64/data/patch/news/Stickman World/data.new
  92. 3 0
      systeme/Client/WIN64/data/patch/news/Willkommen/data.new
  93. BIN
      systeme/Client/WIN64/data/schriften/normal.ltds
  94. BIN
      systeme/Client/WIN64/data/start/icon.exe
  95. BIN
      systeme/Client/WIN64/data/version
  96. BIN
      systeme/Client/WIN64/framework.dll
  97. BIN
      systeme/Client/WIN64/network.dll
  98. BIN
      systeme/Client/WIN64/start.exe
  99. 26 0
      systeme/Client/WIN64/version.ini
  100. BIN
      systeme/Spiel_Linie/WIN32/bilder/start.ltdb
  101. 1 0
      systeme/Spiel_Linie/WIN32/data/beschreibung.ltgb
  102. 3 0
      systeme/Spiel_Linie/WIN32/data/game.ini
  103. BIN
      systeme/Spiel_Linie/WIN32/data/id.ltgid
  104. 5 0
      systeme/Spiel_Linie/WIN32/version.ini
  105. BIN
      systeme/Spiel_Linie/WIN64/bilder/start.ltdb
  106. 1 0
      systeme/Spiel_Linie/WIN64/data/beschreibung.ltgb
  107. 3 0
      systeme/Spiel_Linie/WIN64/data/game.ini
  108. BIN
      systeme/Spiel_Linie/WIN64/data/id.ltgid
  109. 5 0
      systeme/Spiel_Linie/WIN64/version.ini
  110. BIN
      systeme/Spiel_Linie_Karte_Normal/WIN32/bilder/bilder.ltdb
  111. 6 0
      systeme/Spiel_Linie_Karte_Normal/WIN32/data/beschreibung.ltgb
  112. 4 0
      systeme/Spiel_Linie_Karte_Normal/WIN32/data/map.ini
  113. 3 0
      systeme/Spiel_Linie_Karte_Normal/WIN32/version.ini
  114. BIN
      systeme/Spiel_Linie_Karte_Normal/WIN64/bilder/bilder.ltdb
  115. 6 0
      systeme/Spiel_Linie_Karte_Normal/WIN64/data/beschreibung.ltgb
  116. 4 0
      systeme/Spiel_Linie_Karte_Normal/WIN64/data/map.ini
  117. 3 0
      systeme/Spiel_Linie_Karte_Normal/WIN64/version.ini
  118. BIN
      systeme/Spiel_Stickman World Online/WIN32/bilder/start.ltdb
  119. 1 0
      systeme/Spiel_Stickman World Online/WIN32/data/beschreibung.ltgb
  120. 3 0
      systeme/Spiel_Stickman World Online/WIN32/data/game.ini
  121. BIN
      systeme/Spiel_Stickman World Online/WIN32/data/id.ltgid
  122. 4 0
      systeme/Spiel_Stickman World Online/WIN32/version.ini
  123. BIN
      systeme/Spiel_Stickman World Online/WIN64/bilder/start.ltdb
  124. 1 0
      systeme/Spiel_Stickman World Online/WIN64/data/beschreibung.ltgb
  125. 3 0
      systeme/Spiel_Stickman World Online/WIN64/data/game.ini
  126. BIN
      systeme/Spiel_Stickman World Online/WIN64/data/id.ltgid
  127. 4 0
      systeme/Spiel_Stickman World Online/WIN64/version.ini
  128. BIN
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/bilder/bilder.ltdb
  129. 22 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/data/beschreibung.ltgb
  130. 3 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/data/map.ini
  131. 3 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/version.ini
  132. BIN
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/bilder/bilder.ltdb
  133. 22 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/data/beschreibung.ltgb
  134. 3 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/data/map.ini
  135. 3 0
      systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/version.ini
  136. 5 0
      systeme/datei_gruppe.ini

+ 13 - 0
Data/psInit.ini

@@ -0,0 +1,13 @@
+DBBenutzer=patchserveru
+DBPasswort=LTPatchServerPW
+DBName=koljadb
+DBIP=127.0.0.1
+DBPort=5432
+ServerName=Name
+ServerPort=49150
+ServerIP=127.0.0.1
+AdminServerPort=49149
+Aktiv=FALSE
+MaxClients=50
+SystemPfad=../systeme
+ServerId=1

+ 30 - 0
Patch Server.sln

@@ -0,0 +1,30 @@
+
+Microsoft Visual Studio Solution File, Format Version 12.00
+# Visual Studio 15
+VisualStudioVersion = 15.0.26020.0
+MinimumVisualStudioVersion = 10.0.40219.1
+Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "PatchServer", "PatchServer\PatchServer.vcxproj", "{D8520018-1FF3-4829-BA75-29899D6DC2B1}"
+EndProject
+Global
+	GlobalSection(SolutionConfigurationPlatforms) = preSolution
+		Debug|ARM = Debug|ARM
+		Debug|x64 = Debug|x64
+		Debug|x86 = Debug|x86
+		Release|ARM = Release|ARM
+		Release|x64 = Release|x64
+		Release|x86 = Release|x86
+	EndGlobalSection
+	GlobalSection(ProjectConfigurationPlatforms) = postSolution
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Debug|ARM.ActiveCfg = Debug|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Debug|x64.ActiveCfg = Debug|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Debug|x64.Build.0 = Debug|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Debug|x86.ActiveCfg = Debug|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Release|ARM.ActiveCfg = Release|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Release|x64.ActiveCfg = Release|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Release|x64.Build.0 = Release|x64
+		{D8520018-1FF3-4829-BA75-29899D6DC2B1}.Release|x86.ActiveCfg = Release|x64
+	EndGlobalSection
+	GlobalSection(SolutionProperties) = preSolution
+		HideSolutionNode = FALSE
+	EndGlobalSection
+EndGlobal

+ 585 - 0
PatchServer/Datenbank.cpp

@@ -0,0 +1,585 @@
+#include "Datenbank.h"
+#include <iostream>
+
+// Inhalt der PSDatenbank Klasse aus Datenbank.h
+// Konstruktor
+PSDatenbank::PSDatenbank( InitDatei *zIni )
+{
+	datenbank = new Datenbank( zIni->zWert( "DBBenutzer" )->getText(), zIni->zWert( "DBPasswort" )->getText(),
+							   zIni->zWert( "DBName" )->getText(), zIni->zWert( "DBIP" )->getText(),
+							   (unsigned short)TextZuInt( zIni->zWert( "DBPort" )->getText(), 10 ) );
+    if( !datenbank->istOk() )
+    {
+        std::cout << "PS: Die Verbindung zur Datenbank konnte nicht hergestellt werden.\nDas Programm wird beendet.";
+        exit( 1 );
+    }
+	InitializeCriticalSection( &cs );
+	ref = 1;
+    Text befehl = "SELECT port, admin_port  FROM server WHERE id = ";
+    befehl += zIni->zWert( "ServerId" )->getText();
+    lock();
+    datenbank->befehl( befehl );
+    Result res = datenbank->getResult();
+    unlock();
+    if( res.zeilenAnzahl == 1 )
+    {
+        zIni->addWert( "ServerPort", res.values[ 0 ] );
+        zIni->addWert( "AdminServerPort", res.values[ 1 ] );
+    }
+    res.destroy();
+}
+
+// Destruktor
+PSDatenbank::~PSDatenbank()
+{
+	datenbank->release();
+	DeleteCriticalSection( &cs );
+}
+
+// nicht constant
+void PSDatenbank::lock()
+{
+	EnterCriticalSection( &cs );
+}
+
+void PSDatenbank::unlock()
+{
+	LeaveCriticalSection( &cs );
+}
+
+int PSDatenbank::istAdministrator( const char *name, const char *passwort )
+{
+	Text *befehl = new Text( "SELECT id FROM benutzer WHERE name = '" );
+	Text n( name );
+	n.ersetzen( "'", "''" );
+	befehl->append( (char*)n );
+	befehl->append( "' AND passwort = md5( '" );
+	Text p( passwort );
+	p.ersetzen( "'", "''" );
+	befehl->append( (char*)p );
+	befehl->append( "' )" );
+	lock();
+	datenbank->befehl( befehl->getText() );
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	int ret = 0;
+	if( res.zeilenAnzahl > 0 )
+		ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+	res.destroy();
+	return ret;
+}
+
+bool PSDatenbank::adminHatRecht( int id, int recht )
+{
+	Text *befehl = new Text( "SELECT * FROM benutzer_rechte WHERE benutzer_id = " );
+	befehl->append( id );
+	befehl->append( " AND rechte_id = " );
+	befehl->append( recht );
+	lock();
+	datenbank->befehl( befehl->getText() );
+	int ret = datenbank->getZeilenAnzahl();
+	unlock();
+	befehl->release();
+	return ret != 0;
+}
+
+bool PSDatenbank::proveKlient( int num, int sNum )
+{
+	Text *befehl = new Text( "SELECT * FROM server_client WHERE server_id = " );
+	befehl->append( sNum );
+	befehl->append( " AND client_id = " );
+	befehl->append( num );
+	lock();
+	datenbank->befehl( befehl->getText() );
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	bool ret = 0;
+	if( res.zeilenAnzahl == 1 )
+		ret = 1;
+	res.destroy();
+	return ret;
+}
+
+Text *PSDatenbank::getKlientKey( int cId )
+{
+	lock();
+	if( !datenbank->befehl( Text( "SELECT schluessel FROM client WHERE id = " ) += cId ) )
+	{
+		unlock();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	Text *ret = new Text( res.values[ 0 ].getText() );
+	res.destroy();
+	return ret;
+}
+
+void PSDatenbank::unregisterKlient( int num, int sNum )
+{
+	Text *befehl = new Text( "DELETE FROM server_client WHERE client_id = " );
+	befehl->append( num );
+	befehl->append( " AND server_id = " );
+	befehl->append( sNum );
+	lock();
+	datenbank->befehl( befehl->getText() );
+	int za = datenbank->getZeilenAnzahl();
+	unlock();
+	if( za == 1 )
+	{
+		befehl->setText( "UPDATE server SET tasks = tasks - 1 WHERE id = " );
+		befehl->append( sNum );
+		lock();
+		datenbank->befehl( befehl->getText() );
+		unlock();
+	}
+	befehl->release();
+}
+
+bool PSDatenbank::setServerStatus( int id, int status )
+{
+	Text *befehl = new Text( "UPDATE server SET server_status_id = " );
+	*befehl += status;
+	*befehl += "WHERE id = ";
+	*befehl += id;
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	bool ret = datenbank->getZeilenAnzahl() != 0;
+	unlock();
+	befehl->release();
+	return ret;
+}
+
+bool PSDatenbank::setMaxClients( int id, int maxC )
+{
+	Text *befehl = new Text( "UPDATE server SET max_tasks = " );
+	befehl->append( maxC );
+	befehl->append( " WHERE id = " );
+	befehl->append( id );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	bool ret = datenbank->getZeilenAnzahl() > 0;
+	unlock();
+	befehl->release();
+	return ret;
+}
+
+bool PSDatenbank::serverIstNichtPausiert( int id )
+{
+	Text *befehl = new Text( "SELECT server_status_id FROM server WHERE id = " );
+	befehl->append( id );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	bool ret = (int)res.values[ 0 ] == 3;
+	res.destroy();
+	return ret;
+}
+
+Result PSDatenbank::getSystemListe()
+{
+	lock();
+	if( !datenbank->befehl( "SELECT id, name FROM system" ) )
+	{
+		unlock();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	return res;
+}
+
+Result PSDatenbank::getDateiListe( int system, int gruppe )
+{
+	Text *befehl = new Text( "SELECT a.pfad, a.version FROM datei a LEFT JOIN datei_loeschen b ON a.id = b.datei_id WHERE b.datei_id IS NULL AND ( a.system_id = " );
+	befehl->append( system );
+	befehl->append( " OR a.system_id IS NULL ) AND a.datei_gruppe_id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	return res;
+}
+
+Result PSDatenbank::getDateiListeOhneOrdner( int system, int gruppe )
+{
+	Text *befehl = new Text( "SELECT a.pfad, a.version FROM datei a LEFT JOIN datei_loeschen b ON a.id = b.datei_id "
+							 "WHERE b.datei_id IS NULL AND a.aenderung_dat IS NOT NULL AND ( a.system_id = " );
+	befehl->append( system );
+	befehl->append( " OR a.system_id IS NULL ) AND a.datei_gruppe_id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	return res;
+}
+
+Result PSDatenbank::getDeletedFiles( int system, int gruppe )
+{
+	Text *befehl = new Text( "SELECT a.pfad FROM datei a, datei_loeschen b WHERE a.id = b.datei_id AND ( a.system_id = " );
+	befehl->append( system );
+	befehl->append( " OR a.system_id IS NULL ) AND a.datei_gruppe_id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	return res;
+}
+
+Text *PSDatenbank::getSystemName( int system )
+{
+	Text *befehl = new Text( "SELECT name FROM system WHERE id = " );
+	befehl->append( system );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	Text *ret = new Text( res.values[ 0 ].getText() );
+	res.destroy();
+	return ret;
+}
+
+Text *PSDatenbank::getDateiGruppeName( int gruppe )
+{
+	Text *befehl = new Text( "SELECT name FROM datei_gruppe WHERE id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	Text *ret = new Text( res.values[ 0 ].getText() );
+	res.destroy();
+	return ret;
+}
+
+bool PSDatenbank::supportedDateiGruppe( int server, int gruppe )
+{
+	Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
+							 "WHERE a.datei_gruppe_id = b.id AND a.version = b.version AND a.server_patch_id = " );
+	befehl->append( server );
+	befehl->append( " AND b.id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	int zeilen = datenbank->getZeilenAnzahl();
+	unlock();
+	befehl->release();
+	return zeilen != 0;
+}
+
+bool PSDatenbank::istDateigruppeStatusUpdate( int server, int gruppe )
+{
+	Text *befehl = new Text( "SELECT * FROM server_patch_datei_gruppe a, datei_gruppe b "
+							 "WHERE a.datei_gruppe_id = b.id AND a.server_patch_datei_gruppe_status_id = 2 AND a.server_patch_id = " );
+	befehl->append( server );
+	befehl->append( " AND b.id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	int zeilen = datenbank->getZeilenAnzahl();
+	unlock();
+	befehl->release();
+	return zeilen != 0;
+}
+
+bool PSDatenbank::setDateiGruppe( int server, int gruppe, int version )
+{
+	Text befehl = "SELECT server_patch_id FROM server_patch_datei_gruppe WHERE server_patch_id = ";
+	befehl += server;
+	befehl += " AND datei_gruppe_id = ";
+	befehl += gruppe;
+	lock();
+	if( !datenbank->befehl( befehl ) )
+	{
+		unlock();
+		return 0;
+	}
+	unlock();
+	if( !datenbank->getZeilenAnzahl() )
+	{
+		befehl = "INSERT INTO server_patch_datei_gruppe( server_patch_id, datei_gruppe_id, version, server_patch_datei_gruppe_status_id ) VALUES( ";
+		befehl += server;
+		befehl += ", ";
+		befehl += gruppe;
+		befehl += ", ";
+		befehl += version;
+		befehl += ", 1 )";
+		lock();
+		if( !datenbank->befehl( befehl ) )
+		{
+			unlock();
+			return 0;
+		}
+		unlock();
+	}
+	else
+	{
+		befehl = "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = 1, version = ";
+		befehl += version;
+		befehl += " WHERE server_patch_id = ";
+		befehl += server;
+		befehl += " AND datei_gruppe_id = ";
+		befehl += gruppe;
+		lock();
+		if( !datenbank->befehl( befehl ) )
+		{
+			unlock();
+			return 0;
+		}
+		unlock();
+	}
+	return 1;
+}
+
+bool PSDatenbank::setDateiGruppe( int server, int gruppe, bool update )
+{
+	Text *befehl = new Text( "UPDATE server_patch_datei_gruppe SET server_patch_datei_gruppe_status_id = " );
+	befehl->append( update ? 2 : 1 );
+	befehl->append( " WHERE server_patch_id = " );
+	befehl->append( server );
+	befehl->append( " AND datei_gruppe_id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	unlock();
+	befehl->release();
+	return 1;
+}
+
+bool PSDatenbank::dateiGruppeUpdateFertig( int server, int gruppe )
+{
+	Text *befehl = new Text( "UPDATE server_patch_datei_gruppe a SET version = b.version "
+							 "FROM datei_gruppe b WHERE a.datei_gruppe_id = b.id AND a.server_patch_id = " );
+	befehl->append( server );
+	befehl->append( " AND b.id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	unlock();
+	befehl->release();
+	setDateiGruppe( server, gruppe, false );
+	return 1;
+}
+
+int PSDatenbank::getDateiGruppePatchServer( int client, int gruppe )
+{
+	Text *befehl = new Text( "select such_datei_gruppe_patch_server( " );
+	befehl->append( client );
+	befehl->append( ", " );
+	befehl->append( gruppe );
+	befehl->append( " )" );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+	res.destroy();
+	return ret;
+}
+
+bool PSDatenbank::getPatchServerPortIp( int server, int *port, Text *zIp )
+{
+	if( !server )
+		return 0;
+	Text *befehl = new Text( "SELECT port, ip FROM server WHERE id = " );
+	befehl->append( server );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	*port = TextZuInt( res.values[ 0 ].getText(), 10 );
+	zIp->setText( res.values[ 1 ].getText() );
+	res.destroy();
+	return 1;
+}
+
+Result PSDatenbank::getGruppeIds()
+{
+	lock();
+	if( !datenbank->befehl( "SELECT id FROM datei_gruppe" ) )
+	{
+		unlock();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	return res;
+}
+
+Result PSDatenbank::getDateiGruppeListe()
+{
+	lock();
+	if( !datenbank->befehl( "SELECT id, pfad, version FROM datei_gruppe" ) )
+	{
+		unlock();
+		Result res = { 0, 0, 0, 0 };
+		return res;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	return res;
+}
+
+int PSDatenbank::getDateiGruppeVersion( int gruppe )
+{
+	Text *befehl = new Text( "SELECT version FROM datei_gruppe WHERE id = " );
+	befehl->append( gruppe );
+	lock();
+	if( !datenbank->befehl( befehl->getText() ) )
+	{
+		unlock();
+		befehl->release();
+		return 0;
+	}
+	Result res = datenbank->getResult();
+	unlock();
+	befehl->release();
+	if( !res.zeilenAnzahl )
+	{
+		res.destroy();
+		return 0;
+	}
+	int ret = TextZuInt( res.values[ 0 ].getText(), 10 );
+	res.destroy();
+	return ret;
+}
+
+// constant
+Text *PSDatenbank::getLetzterFehler() const
+{
+	return datenbank->getLetzterFehler();
+}
+
+// Reference Counting
+PSDatenbank *PSDatenbank::getThis()
+{
+	ref++;
+	return this;
+}
+
+PSDatenbank *PSDatenbank::release()
+{
+	ref--;
+	if( !ref )
+		delete this;
+	return 0;
+}

+ 66 - 0
PatchServer/Datenbank.h

@@ -0,0 +1,66 @@
+#ifndef Datenbank_H
+#define Datenbank_H
+
+#include <sql.h>
+#include <Text.h>
+#include <InitDatei.h>
+
+using namespace Framework;
+using namespace sql;
+ 
+namespace Admin_Recht
+{
+	const int PSStarten = 3;
+	const int PSBeenden = 4;
+	const int PSPausieren = 5;
+	const int PSMCChange = 6;
+	const int KSGCUpdate = 7;
+}
+
+class PSDatenbank
+{
+private:
+	Datenbank *datenbank;
+	CRITICAL_SECTION cs;
+	int ref;
+
+public:
+	// Konstruktor
+	PSDatenbank( InitDatei *zIni );
+	// Destruktor
+	~PSDatenbank();
+	// nicht constant
+	void lock();
+	void unlock();
+	int istAdministrator( const char *name, const char *passwort );
+	bool adminHatRecht( int id, int recht );
+	bool proveKlient( int num, int sNum );
+	Text *getKlientKey( int cId );
+	void unregisterKlient( int num, int sNum );
+	bool setServerStatus( int id, int status );
+	bool setMaxClients( int id, int maxC );
+	bool serverIstNichtPausiert( int id );
+	Result getSystemListe();
+	Result getDateiListe( int system, int gruppe );
+	Result getDateiListeOhneOrdner( int system, int gruppe );
+	Result getDeletedFiles( int system, int gruppe );
+	Text *getSystemName( int system );
+	Text *getDateiGruppeName( int gruppe );
+	bool supportedDateiGruppe( int server, int gruppe );
+	bool istDateigruppeStatusUpdate( int server, int gruppe );
+	bool setDateiGruppe( int server, int gruppe, int version );
+	bool setDateiGruppe( int server, int gruppe, bool update );
+	bool dateiGruppeUpdateFertig( int server, int gruppe );
+	int getDateiGruppePatchServer( int client, int gruppe );
+	bool getPatchServerPortIp( int server, int *port, Text *zIp );
+	Result getGruppeIds();
+	Result getDateiGruppeListe();
+	int getDateiGruppeVersion( int gruppe );
+	// constant
+	Text *getLetzterFehler() const;
+	// Reference Counting
+	PSDatenbank *getThis();
+	PSDatenbank *release();
+};
+
+#endif

+ 1771 - 0
PatchServer/PatchServer.cpp

@@ -0,0 +1,1771 @@
+#include "PatchServer.h"
+#include <iostream>
+#include <Klient.h>
+#include <Globals.h>
+
+// Inhalt der PatchServer Klasse aus PatchServer.h
+// Konstruktor 
+PatchServer::PatchServer( InitDatei *zIni )
+    : Thread()
+{
+    Network::Start( 100 );
+    std::cout << "PS: Verbindung mit Datenbank wird hergestellt...\n";
+    db = new PSDatenbank( zIni );
+    klientAnzahl = 0;
+    klients = new RCArray< PSKlient >();
+    empfangen = 0;
+    gesendet = 0;
+    fehler = new Text();
+    ini = zIni->getThis();
+    id = *zIni->zWert( "ServerId" );
+    Text *dgInitPfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+    dgInitPfad->append( "/datei_gruppe.ini" );
+    InitDatei *dgInit = new InitDatei( dgInitPfad );
+    dgInit->laden();
+    for( int i = 0; i < dgInit->getWertAnzahl(); i++ )
+        db->setDateiGruppe( id, TextZuInt( dgInit->zName( i )->getText(), 10 ), (int)TextZuInt( dgInit->zWert( i )->getText(), 10 ) );
+    dgInit->release();
+    server = new Server();
+    aServer = new Server();
+    std::cout << "PS: Starten des Admin Servers...\n";
+    if( !aServer->verbinde( (unsigned short)TextZuInt( ini->zWert( "AdminServerPort" )->getText(), 10 ), 10 ) )
+    {
+        std::cout << "PS: Der Admin Server konnte nicht gestartet werden. Das Programm wird beendet.\n";
+        exit( 1 );
+    }
+    db->setServerStatus( id, 2 );
+    end = 0;
+    nichtPausiert = 0;
+    InitializeCriticalSection( &cs );
+    updateAnzahl = 0;
+    updateGruppe = new Array< int >();
+    ref = 1;
+    if( zIni->zWert( "Aktiv" )->istGleich( "TRUE" ) )
+    {
+        serverStarten();
+        serverFortsetzen();
+    }
+}
+
+// Destruktor 
+PatchServer::~PatchServer()
+{
+    fehler->release();
+    server->trenne();
+    server->release();
+    aServer->trenne();
+    aServer->release();
+    if( klients )
+        klients->release();
+    ini->release();
+    db->release();
+    updateGruppe->release();
+    DeleteCriticalSection( &cs );
+}
+
+// nicht constant 
+void PatchServer::runn()
+{
+    while( !end )
+    {
+        SKlient *klient;
+        klient = aServer->getKlient();
+        if( end && klient )
+        {
+            klient->trenne();
+            klient = klient->release();
+            Sleep( 1000 );
+            return;
+        }
+        if( !klient )
+            return;
+        PSAKlient *clHandle = new PSAKlient( klient, getThis(), ini->getThis() );
+        clHandle->start();
+    }
+}
+
+void PatchServer::thread()
+{
+    while( 1 )
+    {
+        SKlient *klient;
+        klient = server->getKlient();
+        if( !klient )
+            break;
+		Framework::getThreadRegister()->cleanUpClosedThreads();
+        PSKlient *clHandle = new PSKlient( klient, getThis(), ini->getThis() );
+        EnterCriticalSection( &cs );
+        klients->set( clHandle, klientAnzahl );
+        klientAnzahl++;
+        LeaveCriticalSection( &cs );
+        clHandle->start();
+    }
+}
+
+void PatchServer::close()
+{
+    db->setServerStatus( id, 1 );
+    server->trenne();
+#ifdef WIN32
+    warteAufThread( 1000 );
+#endif
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+        klients->z( i )->absturz();
+    klients = klients->release();
+    klientAnzahl = 0;
+    LeaveCriticalSection( &cs );
+    ende();
+    run = 0;
+    end = 1;
+    Klient *klient = new Klient();
+    klient->verbinde( aServer->getPort(), "127.0.0.1" );
+    Sleep( 500 );
+    aServer->trenne();
+    klient->release();
+}
+
+bool PatchServer::serverStarten()
+{
+    if( nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht gestartet werden: Der Server läuft bereits." );
+        return 0;
+    }
+    if( server )
+        server->release();
+    server = new Server();
+    if( server->verbinde( (unsigned short)TextZuInt( ini->zWert( "ServerPort" )->getText(), 10 ), 10 ) )
+    {
+        nichtPausiert = 1;
+        start();
+        return 1;
+    }
+    else
+    {
+        serverBeenden();
+        fehler->setText( "Der Server konnte nicht gestartet werden: Eventuell ist der Port in benutzung." );
+        return 0;
+    }
+}
+
+bool PatchServer::serverPause()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht pausiert werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( !db->setServerStatus( id, 2 ) )
+    {
+        fehler->setText( "Der Server konnte nicht pausiert werden: " );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    return 1;
+}
+
+bool PatchServer::serverFortsetzen()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht fortgesetzt werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( !db->setServerStatus( id, 3 ) )
+    {
+        fehler->setText( "Der Server konnte nicht fortgesetzt werden: " );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    return 1;
+}
+
+bool PatchServer::serverBeenden()
+{
+    if( !nichtPausiert )
+    {
+        fehler->setText( "Der Server konnte nicht beendet werden: Der Server läuft nicht." );
+        return 0;
+    }
+    if( db->serverIstNichtPausiert( id ) )
+    {
+        fehler->setText( "Der Server konnte nicht beendet werden: Der Server muss erst pausiert werden." );
+        return 0;
+    }
+    nichtPausiert = 0;
+    ende();
+    if( server )
+        server->trenne();
+    return 1;
+}
+
+bool PatchServer::setMaxKlients( int mc )
+{
+    if( !db->setMaxClients( id, mc ) )
+    {
+        fehler->setText( "Die maximale Anzahl der Clients konnte nicht gesetzt werden:\n" );
+        fehler->append( db->getLetzterFehler() );
+        return 0;
+    }
+    ini->setWert( "MaxClients", Text() += mc );
+    return 1;
+}
+
+bool PatchServer::absturzKlient( int klientId )
+{
+    bool gefunden = 0;
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+    {
+        if( klients->z( i )->getKlientNummer() == klientId )
+        {
+            klients->z( i )->absturz();
+            klients->remove( i );
+            klientAnzahl--;
+            gefunden = 1;
+            break;
+        }
+    }
+    LeaveCriticalSection( &cs );
+    return gefunden;
+}
+
+bool PatchServer::removeKlient( PSKlient *zKlient )
+{
+    bool gefunden = 0;
+    EnterCriticalSection( &cs );
+    for( int i = 0; i < klientAnzahl; i++ )
+    {
+        if( klients->z( i ) == zKlient )
+        {
+            klients->remove( i );
+            klientAnzahl--;
+            gefunden = 1;
+            break;
+        }
+    }
+    LeaveCriticalSection( &cs );
+    return gefunden;
+}
+
+void PatchServer::addGesendet( int bytes )
+{
+    gesendet += bytes;
+}
+
+void PatchServer::addEmpfangen( int bytes )
+{
+    empfangen += bytes;
+}
+
+bool PatchServer::beginnUpdate( int gruppe )
+{
+    bool update = 0;
+    for( int i = 0; i < updateAnzahl; i++ )
+    {
+        if( updateGruppe->get( i ) == gruppe )
+        {
+            update = 1;
+            break;
+        }
+    }
+    if( update || proveVersion( gruppe ) )
+        return 0;
+    if( !db->supportedDateiGruppe( id, gruppe ) )
+    {
+        db->setDateiGruppe( id, gruppe, 0 );
+    }
+    if( !db->setDateiGruppe( id, gruppe, true ) )
+        return 0;
+    Text *gruppeN = db->getDateiGruppeName( gruppe );
+    if( !gruppeN )
+        return 0;
+    Result systemT = db->getSystemListe();
+    for( int i = 0; i < systemT.zeilenAnzahl; i++ )
+    {
+        Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+        pfad->append( "/" );
+        pfad->append( gruppeN->getText() );
+        pfad->append( "/" );
+        pfad->append( systemT.values[ i * 2 + 1 ].getText() );
+        pfad->append( "/version.ini" );
+        InitDatei *vIni = new InitDatei( pfad->getText() );
+        vIni->laden();
+        pfad->remove( pfad->getLength() - 11, pfad->getLength() );
+        Result dateiT = db->getDeletedFiles( TextZuInt( systemT.values[ i * 2 ].getText(), 10 ), gruppe );
+        for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
+        {
+            if( vIni->wertExistiert( dateiT.values[ j ].getText() ) )
+            {
+                Text *pf = new Text( pfad->getText() );
+                pf->append( dateiT.values[ j ].getText() );
+                DateiRemove( pf );
+                vIni->removeWert( dateiT.values[ j ].getText() );
+            }
+        }
+        dateiT.destroy();
+        DateiPfadErstellen( vIni->getPfad() );
+        vIni->speichern();
+        vIni->release();
+        pfad->release();
+    }
+    gruppeN->release();
+    systemT.destroy();
+    return 1;
+}
+
+void PatchServer::endUpdate( int gruppe )
+{
+    Text *dgInitPfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+    dgInitPfad->append( "/datei_gruppe.ini" );
+    InitDatei *dgInit = new InitDatei( dgInitPfad );
+    dgInit->laden();
+    Text *gT = new Text();
+    gT->append( gruppe );
+    Text *vT = new Text();
+    vT->append( db->getDateiGruppeVersion( gruppe ) );
+    if( !dgInit->wertExistiert( gT->getText() ) )
+        dgInit->addWert( gT->getText(), vT->getText() );
+    else
+        dgInit->setWert( gT->getText(), vT->getText() );
+    gT->release();
+    vT->release();
+    dgInit->speichern();
+    dgInit->release();
+    db->dateiGruppeUpdateFertig( id, gruppe );
+    for( int i = 0; i < updateAnzahl; i++ )
+    {
+        if( updateGruppe->get( i ) == gruppe )
+        {
+            updateAnzahl--;
+            updateGruppe->remove( i );
+            break;
+        }
+    }
+}
+
+void PatchServer::updateAbbruch( int gruppe )
+{
+    db->setDateiGruppe( id, gruppe, (bool)0 );
+    for( int i = 0; i < updateAnzahl; i++ )
+    {
+        if( updateGruppe->get( i ) == gruppe )
+        {
+            updateAnzahl--;
+            updateGruppe->remove( i );
+            break;
+        }
+    }
+}
+
+// constant
+bool PatchServer::istAn() const
+{
+    return db->serverIstNichtPausiert( id );
+}
+
+Server *PatchServer::zServer() const
+{
+    return server;
+}
+
+PSDatenbank *PatchServer::zDB() const
+{
+    return db;
+}
+
+bool PatchServer::hatClients() const
+{
+    return klientAnzahl > 0;
+}
+
+int PatchServer::getId() const
+{
+    return id;
+}
+
+char *PatchServer::getLetzterFehler() const
+{
+    return fehler->getText();
+}
+
+bool PatchServer::proveVersion( int gruppe ) const
+{
+    Result systemT = db->getSystemListe();
+    for( int i = 0; i < systemT.zeilenAnzahl; i++ )
+    {
+        int system = TextZuInt( systemT.values[ i * 2 ].getText(), 10 );
+        Result dateiT = db->getDateiListeOhneOrdner( system, gruppe );
+        Text *gruppeN = db->getDateiGruppeName( gruppe );
+        if( !gruppeN )
+            continue;
+        Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+        pfad->append( "/" );
+        pfad->append( gruppeN );
+        pfad->append( "/" );
+        pfad->append( systemT.values[ i * 2 + 1 ].getText() );
+        pfad->append( "/version.ini" );
+        InitDatei *vIni = new InitDatei( pfad );
+        vIni->laden();
+        int dAnz = vIni->getWertAnzahl();
+        if( dAnz != dateiT.zeilenAnzahl ) // nicht aktuell
+        {
+            systemT.destroy();
+            dateiT.destroy();
+            vIni->release();
+            return 0;
+        }
+        for( int j = 0; j < dAnz; j++ )
+        {
+            if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) ) // nicht aktuell
+            {
+                systemT.destroy();
+                dateiT.destroy();
+                vIni->release();
+                return 0;
+            }
+            if( !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) ) // nicht aktuell
+            {
+                systemT.destroy();
+                dateiT.destroy();
+                vIni->release();
+                return 0;
+            }
+        }
+        dateiT.destroy();
+        dateiT = db->getDeletedFiles( system, gruppe );
+        for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
+        {
+            if( vIni->wertExistiert( dateiT.values[ j ].getText() ) ) // nicht aktuell
+            {
+                systemT.destroy();
+                dateiT.destroy();
+                vIni->release();
+                return 0;
+            }
+        }
+        dateiT.destroy();
+        vIni->release();
+    }
+    systemT.destroy();
+    return 1;
+}
+
+bool PatchServer::proveVersion() const
+{
+    Result gruppeT = db->getGruppeIds();
+    for( int g = 0; g < gruppeT.zeilenAnzahl; g++ )
+    {
+        int gruppe = TextZuInt( gruppeT.values[ g ].getText(), 10 );
+        Result systemT = db->getSystemListe();
+        for( int i = 0; i < systemT.zeilenAnzahl; i++ )
+        {
+            int system = TextZuInt( systemT.values[ i * 2 ].getText(), 10 );
+            Result dateiT = db->getDateiListeOhneOrdner( system, gruppe );
+            Text *gruppeN = db->getDateiGruppeName( gruppe );
+            if( !gruppeN )
+                continue;
+            Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+            pfad->append( "/" );
+            pfad->append( gruppeN );
+            pfad->append( "/" );
+            pfad->append( systemT.values[ i * 2 + 1 ].getText() );
+            pfad->append( "/version.ini" );
+            InitDatei *vIni = new InitDatei( pfad );
+            vIni->laden();
+            int dAnz = vIni->getWertAnzahl();
+            if( dAnz != dateiT.zeilenAnzahl ) // nicht aktuell
+            {
+                gruppeT.destroy();
+                systemT.destroy();
+                dateiT.destroy();
+                vIni->release();
+                return 0;
+            }
+            for( int j = 0; j < dAnz; j++ )
+            {
+                if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) ) // nicht aktuell
+                {
+                    gruppeT.destroy();
+                    systemT.destroy();
+                    dateiT.destroy();
+                    vIni->release();
+                    return 0;
+                }
+                if( !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) ) // nicht aktuell
+                {
+                    gruppeT.destroy();
+                    systemT.destroy();
+                    dateiT.destroy();
+                    vIni->release();
+                    return 0;
+                }
+            }
+            dateiT.destroy();
+            dateiT = db->getDeletedFiles( system, gruppe );
+            for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
+            {
+                if( vIni->wertExistiert( dateiT.values[ j ].getText() ) ) // nicht aktuell
+                {
+                    gruppeT.destroy();
+                    systemT.destroy();
+                    dateiT.destroy();
+                    vIni->release();
+                    return 0;
+                }
+                Text tmp = vIni->zPfad()->getText();
+                tmp.remove( "version.ini" );
+                tmp += dateiT.values[ j ].getText();
+                if( DateiExistiert( tmp ) ) // nicht aktuell
+                {
+                    gruppeT.destroy();
+                    systemT.destroy();
+                    dateiT.destroy();
+                    vIni->release();
+                    return 0;
+                }
+            }
+            dateiT.destroy();
+            vIni->release();
+        }
+        systemT.destroy();
+    }
+    gruppeT.destroy();
+    return 1;
+}
+
+// Reference Counting
+PatchServer *PatchServer::getThis()
+{
+    ref++;
+    return this;
+}
+
+PatchServer *PatchServer::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}
+
+
+// Inhalt der PSAKlient Klasse aus PatchServer.h
+// Konstruktor 
+PSAKlient::PSAKlient( SKlient *klient, PatchServer *ps, InitDatei *ini )
+    : Thread()
+{
+    this->klient = klient;
+    unsigned char key[ 20 ] = { 178, 218, 37, 140, 30, 8, 70, 197, 79, 42, 201, 81, 87, 199, 177, 183, 173, 129, 66, 110 };
+    klient->setSendeKey( (char*)key, 20 );
+    klient->setEmpfangKey( (char*)key, 20 );
+    name = new Text( "" );
+    passwort = new Text( "" );
+    adminId = 0;
+    updateGruppe = 0;
+    gruppeN = 0;
+    this->ps = ps;
+    this->ini = ini;
+}
+
+// Destruktor 
+PSAKlient::~PSAKlient()
+{
+    klient->trenne();
+    klient->release();
+    ps->release();
+    name->release();
+    passwort->release();
+    ini->release();
+    if( gruppeN )
+        gruppeN->release();
+}
+
+// nicht constant 
+void PSAKlient::thread()
+{
+    while( 1 )
+    {
+        char c = 0;
+        if( !klient->getNachrichtEncrypted( &c, 1 ) )
+            break;
+        else
+        {
+            bool br = 0;
+            switch( c )
+            {
+            case 1: // Login
+                if( 1 )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    char len = 0;
+                    klient->getNachrichtEncrypted( &len, 1 );
+                    char *n = new char[ len + 1 ];
+                    n[ (int)len ] = 0;
+                    if( len )
+                        klient->getNachrichtEncrypted( n, len );
+                    char pLen = 0;
+                    klient->getNachrichtEncrypted( &pLen, 1 );
+                    char *p = new char[ pLen + 1 ];
+                    p[ (int)pLen ] = 0;
+                    if( pLen )
+                        klient->getNachrichtEncrypted( p, pLen );
+                    int adminId = ps->zDB()->istAdministrator( n, p );
+                    if( adminId )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        name->setText( n );
+                        passwort->setText( p );
+                        this->adminId = adminId;
+                    }
+                    else
+                        errorZuKlient( "Falsche Kombination aus Name und Passwort." );
+                    delete[] n;
+                    delete[] p;
+                }
+                break;
+            case 2: // Logout
+                adminId = 0;
+                name->setText( "" );
+                passwort->setText( "" );
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 3: // Trennen
+                br = 1;
+                klient->sendeEncrypted( "\1", 1 );
+                break;
+            case 4: // Server starten
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSStarten ) )
+                    {
+                        if( !ps->serverStarten() )
+                        {
+                            Text *err = new Text();
+                            err->append( ps->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                        else
+                            klient->sendeEncrypted( "\1", 1 );
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt den Server zu starten." );
+                }
+                break;
+            case 5: // Server beenden
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
+                    {
+                        if( ps->serverBeenden() )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( ps->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                }
+                break;
+            case 6: // Programm Schließen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    bool ok = 0;
+                    if( ps->isRunning() )
+                    {
+                        if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
+                        {
+                            if( ps->serverBeenden() )
+                                ok = 1;
+                            else
+                            {
+                                Text *err = new Text();
+                                err->append( ps->getLetzterFehler() );
+                                errorZuKlient( err->getText() );
+                                err->release();
+                            }
+                        }
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                    }
+                    else
+                        ok = 1;
+                    if( ok && ps->hatClients() )
+                    {
+                        errorZuKlient( "Es sind noch Klients Online. Bitte versuche es später erneut." );
+                        break;
+                    }
+                    if( ok )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        std::cout << "PS: Der Server wird von Benutzer " << adminId << " heruntergefahren.\n";
+                        ps->close();
+                        br = 1;
+                    }
+                }
+                break;
+            case 7: // Progtamm abstürzen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    bool ok = 0;
+                    if( ps->isRunning() )
+                    {
+                        if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSBeenden ) )
+                        {
+                            ps->serverBeenden();
+                            ok = 1;
+                        }
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu beenden." );
+                    }
+                    else
+                        ok = 1;
+                    if( ok )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        std::cout << "PS: Der Server wurde von Benutzer " << adminId << " terminiert.\n";
+                        ps->close();
+                        br = 1;
+                    }
+                }
+                break;
+            case 8: // Status Frage
+                if( 1 )
+                {
+                    char status = 0;
+                    if( ps->isRunning() )
+                    {
+                        status = 1;
+                        if( ps->istAn() )
+                            status = 2;
+                    }
+                    if( !ps->proveVersion() )
+                        status = 3;
+                    klient->sendeEncrypted( "\1", 1 );
+                    klient->sendeEncrypted( &status, 1 );
+                }
+                break;
+            case 9: // Server pausieren
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    char pause = 0;
+                    klient->getNachrichtEncrypted( &pause, 1 );
+                    if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSPausieren ) )
+                    {
+                        bool ok = 0;
+                        if( pause )
+                            ok = ps->serverPause();
+                        else
+                            ok = ps->serverFortsetzen();
+                        if( ok )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( ps->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                    {
+                        if( pause )
+                            errorZuKlient( "Du bist nicht berechtigt den Server zu pausieren." );
+                        else
+                            errorZuKlient( "Du bist nicht berechtigt den Server fortzusetzen." );
+                    }
+                }
+                break;
+            case 0xA: // maximale Anzahl der Clients setzen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int maxC = 0;
+                    klient->getNachrichtEncrypted( (char*)&maxC, 4 );
+                    if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::PSMCChange ) )
+                    {
+                        if( ps->setMaxKlients( maxC ) )
+                            klient->sendeEncrypted( "\1", 1 );
+                        else
+                        {
+                            Text *err = new Text();
+                            err->append( ps->getLetzterFehler() );
+                            errorZuKlient( err->getText() );
+                            err->release();
+                        }
+                    }
+                    else
+                        errorZuKlient( "Du bist nicht berechtigt die maximale Anzahl der Clients zu verändern." );
+                }
+                break;
+            case 0xB: // frage nach geänderten Dateien
+                if( !adminId )
+                {
+                    errorZuKlient( "Du musst dich einloggen." );
+                    break;
+                }
+                if( updateGruppe )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    Result systemT = ps->zDB()->getSystemListe();
+                    for( int i = 0; i < systemT.zeilenAnzahl; i++ )
+                    {
+                        int len = systemT.values[ i * 2 + 1 ].getLength();
+                        klient->sendeEncrypted( (char*)&len, 4 );
+                        klient->sendeEncrypted( systemT.values[ i * 2 + 1 ].getText(), len );
+                        Result dateiT = ps->zDB()->getDateiListeOhneOrdner( TextZuInt( systemT.values[ i * 2 ].getText(), 10 ), updateGruppe );
+                        Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+                        pfad->append( "/" );
+                        pfad->append( gruppeN->getText() );
+                        pfad->append( "/" );
+                        pfad->append( systemT.values[ i * 2 + 1 ].getText() );
+                        pfad->append( "/version.ini" );
+                        InitDatei *vIni = new InitDatei( pfad );
+                        vIni->laden();
+                        for( int j = 0; j < dateiT.zeilenAnzahl; j++ )
+                        {
+                            bool veraltet = 0;
+                            if( !vIni->wertExistiert( dateiT.values[ j * 2 ].getText() ) )
+                                veraltet = 1;
+                            if( !veraltet && !vIni->zWert( dateiT.values[ j * 2 ].getText() )->istGleich( dateiT.values[ j * 2 + 1 ].getText() ) )
+                                veraltet = 1;
+                            if( veraltet )
+                            {
+                                int len = dateiT.values[ j * 2 ].getLength();
+                                klient->sendeEncrypted( (char*)&len, 4 );
+                                klient->sendeEncrypted( dateiT.values[ j * 2 ].getText(), len );
+                            }
+                        }
+                        klient->sendeEncrypted( "\0\0\0\0", 4 );
+                        dateiT.destroy();
+                        vIni->release();
+                    }
+                    klient->sendeEncrypted( "\0\0\0\0", 4 );
+                    systemT.destroy();
+                }
+                else
+                    errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
+                break;
+            case 0xC: // Update Beendet
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !updateGruppe )
+                    {
+                        errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
+                        break;
+                    }
+                    ps->endUpdate( updateGruppe );
+                    updateGruppe = 0;
+                    if( gruppeN )
+                        gruppeN = gruppeN->release();
+                    std::cout << "PS: Update erfolgreich abgeschlossen.\n";
+                    klient->sendeEncrypted( "\1", 1 );
+                }
+                break;
+            case 0xD: // Update Vorgang starten
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( updateGruppe )
+                    {
+                        errorZuKlient( "Du musst die Aktualisierung erst beenden." );
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    klient->getNachrichtEncrypted( (char*)&updateGruppe, 4 );
+                    gruppeN = ps->zDB()->getDateiGruppeName( updateGruppe );
+                    if( !gruppeN )
+                    {
+                        updateGruppe = 0;
+                        errorZuKlient( "Die Dateigruppe existiert nicht." );
+                        break;
+                    }
+                    if( !ps->proveVersion() )
+                    {
+                        if( ps->zDB()->adminHatRecht( adminId, Admin_Recht::KSGCUpdate ) )
+                        {
+                            if( ps->beginnUpdate( updateGruppe ) )
+                            {
+                                klient->sendeEncrypted( "\1", 1 );
+                                std::cout << "PS: Die Dateigruppe " << updateGruppe << " wird von Benutzer " << adminId << " geupdatet.\n";
+                            }
+                            else
+                                errorZuKlient( "Es läuft bereits eine andere Aktualisierung." );
+                        }
+                        else
+                            errorZuKlient( "Die Version ist bereits aktuel." );
+                    }
+                    else
+                        errorZuKlient( "Dir fehlt die Berechtigung für diesen Vorgang." );
+                }
+                break;
+            case 0xE: // Datei übertragen
+                if( !adminId )
+                    errorZuKlient( "Du musst dich einloggen." );
+                else
+                {
+                    if( !updateGruppe )
+                    {
+                        errorZuKlient( "Du musst zunächst den Aktualisierungsvorgang starten." );
+                        break;
+                    }
+                    klient->sendeEncrypted( "\1", 1 );
+                    int system = 0;
+                    klient->getNachrichtEncrypted( (char*)&system, 4 );
+                    int version = 0;
+                    klient->getNachrichtEncrypted( (char*)&version, 4 );
+                    Text *sName = ps->zDB()->getSystemName( system );
+                    short len = 0;
+                    klient->getNachrichtEncrypted( (char*)&len, 2 );
+                    char *pfad = new char[ len + 1 ];
+                    pfad[ len ] = 0;
+                    if( len )
+                        klient->getNachrichtEncrypted( pfad, len );
+                    if( !len || !sName )
+                    {
+                        errorZuKlient( "Die Datei konnte nicht angelegt werden." );
+                        delete[] pfad;
+                        if( sName )
+                            sName->release();
+                        break;
+                    }
+                    Text *pf = new Text( ini->zWert( "SystemPfad" )->getText() );
+                    pf->append( "/" );
+                    pf->append( gruppeN->getText() );
+                    pf->append( "/" );
+                    pf->append( sName->getText() );
+                    sName->release();
+                    pf->append( "/version.ini" );
+                    InitDatei *vIni = new InitDatei( pf->getText() );
+                    vIni->laden();
+                    pf->remove( pf->getLength() - 11, pf->getLength() );
+                    pf->append( pfad );
+                    Datei *d = new Datei();
+                    d->setDatei( pf );
+                    d->erstellen();
+                    if( d->open( Datei::Style::schreiben ) )
+                    {
+                        klient->sendeEncrypted( "\1", 1 );
+                        klient->getNachricht( (char*)&len, 2 );
+                        while( len )
+                        {
+                            char *buff = new char[ len ];
+                            klient->getNachricht( buff, len );
+                            d->schreibe( buff, len );
+                            delete[] buff;
+                            klient->getNachricht( (char*)&len, 2 );
+                            ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+                            ps->addGesendet( klient->getUploadBytes( 1 ) );
+                        }
+                        klient->sendeEncrypted( "\1", 1 );
+                        Text *vT = new Text();
+                        vT->append( version );
+                        if( !vIni->wertExistiert( pfad ) )
+                            vIni->addWert( pfad, vT->getText() );
+                        else
+                            vIni->setWert( pfad, vT->getText() );
+                        vIni->speichern();
+                        vT->release();
+                    }
+                    else
+                        errorZuKlient( "Die Datei konnte nicht zum schreiben geöffnet werden." );
+                    d->close();
+                    d->release();
+                    vIni->release();
+                    delete[] pfad;
+                }
+                break;
+            case 0xF: // klient absturtz
+                if( 1 )
+                {
+                    klient->sendeEncrypted( "\1", 1 );
+                    int klientId = 0;
+                    klient->getNachrichtEncrypted( (char*)&klientId, 4 );
+                    if( klientId && ps->absturzKlient( klientId ) )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sendeEncrypted( "\0", 1 );
+                }
+                break;
+            default:
+                errorZuKlient( "Unbekannte Nachricht!" );
+                break;
+            }
+            if( br )
+                break;
+            ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+            ps->addGesendet( klient->getUploadBytes( 1 ) );
+        }
+    }
+    ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+    ps->addGesendet( klient->getUploadBytes( 1 ) );
+    if( updateGruppe )
+        ps->updateAbbruch( updateGruppe );
+    delete this;
+}
+
+void PSAKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
+{
+    klient->sendeEncrypted( "\3", 1 );
+    char len = (char)textLength( nachricht );
+    klient->sendeEncrypted( &len, 1 );
+    klient->sendeEncrypted( nachricht, len );
+}
+
+
+// Inhalt der PSKlient aus PatchServer.h
+// Konstruktor 
+PSKlient::PSKlient( SKlient *klient, PatchServer *ps, InitDatei *ini )
+    : Thread()
+{
+    this->klient = klient;
+    unsigned char key[ 20 ] = { 102, 139, 140, 143, 52, 52, 194, 167, 97, 106, 23, 72, 170, 121, 213, 178, 28, 28, 124, 185 };
+    klient->setSendeKey( (char*)key, 20 );
+    klient->setEmpfangKey( (char*)key, 20 );
+    klientNummer = 0;
+    system = 0;
+    this->ps = ps;
+    this->ini = ini;
+    encrypted = 0;
+    ref = 1;
+}
+
+// Destruktor 
+PSKlient::~PSKlient()
+{
+    ps->release();
+    klient->release();
+    ini->release();
+}
+
+// nicht constant 
+void PSKlient::absturz()
+{
+    ende();
+    klient->trenne();
+    ps->zDB()->unregisterKlient( klientNummer, ps->getId() );
+}
+
+void PSKlient::thread()
+{
+    int hack = 0;
+    while( 1 )
+    {
+        char c = 0;
+        if( ( !encrypted && !klient->getNachricht( &c, 1 ) ) || ( encrypted && !klient->getNachrichtEncrypted( &c, 1 ) ) )
+            break;
+        else
+        {
+            bool br = 0;
+            switch( c )
+            {
+            case 0:
+                encrypted = 1;
+                break;
+            case 1: // Klient identifikation
+                if( encrypted )
+                {
+                    klient->getNachrichtEncrypted( (char*)&klientNummer, 4 );
+                    klient->getNachrichtEncrypted( (char*)&system, 1 );
+                }
+                else
+                {
+                    klient->getNachricht( (char*)&klientNummer, 4 );
+                    klient->getNachricht( (char*)&system, 1 );
+                }
+                if( !ps->zDB()->proveKlient( klientNummer, ps->getId() ) )
+                {
+                    klientNummer = 0;
+                    errorZuKlient( "Du bist nicht für diesen Server eingetragen" );
+                }
+                else
+                {
+                    if( encrypted )
+                    {
+                        Text *key = ps->zDB()->getKlientKey( klientNummer );
+                        if( !key )
+                            errorZuKlient( "Es konnte kein Key ermittelt werden." );
+                        else
+                        {
+                            klient->sendeEncrypted( "\1", 1 );
+                            klient->setEmpfangKey( *key, key->getLength() );
+                            klient->setSendeKey( *key, key->getLength() );
+                            key->release();
+                        }
+                    }
+                    else
+                        klient->sende( "\1", 1 );
+                }
+                break;
+            case 2: // Erhaltung Server message
+                if( 1 )
+                {
+                    char befehl = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( &befehl, 1 );
+                    else
+                        klient->getNachricht( &befehl, 1 );
+                    switch( befehl )
+                    {
+                    case 2: // Klient absturz
+                        if( 1 )
+                        {
+                            int klientId = 0;
+                            if( encrypted )
+                            {
+                                klient->getNachrichtEncrypted( (char*)&klientId, 4 );
+                                if( klientId && ps->absturzKlient( klientId ) )
+                                    klient->sendeEncrypted( "\1", 1 );
+                                else
+                                    klient->sendeEncrypted( "\0", 1 );
+                            }
+                            else
+                            {
+                                klient->getNachricht( (char*)&klientId, 4 );
+                                if( klientId && ps->absturzKlient( klientId ) )
+                                    klient->sende( "\1", 1 );
+                                else
+                                    klient->sende( "\0", 1 );
+                            }
+                        }
+                        break;
+                    default:
+                        errorZuKlient( "Befehl nicht bekannt!" );
+                        break;
+                    }
+                }
+                break;
+            case 3: // Verbindungsende
+                br = 1;
+                if( encrypted )
+                    klient->sendeEncrypted( "\1", 1 );
+                else
+                    klient->sende( "\1", 1 );
+                break;
+            case 4: // unregister Klient
+                if( klientNummer )
+                {
+                    ps->zDB()->unregisterKlient( klientNummer, ps->getId() );
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 5: // update anfrage ****Altes Update System
+                if( klientNummer )
+                { // Keine Verkeyung bei den alten Clients
+                    klient->sende( "\1", 1 );
+                    char version[ 4 ];
+                    klient->getNachricht( version, 4 );
+                    //int v = ( ( version[ 3 ] << 24 ) & 0xFF000000 ) | ( ( version[ 2 ] << 16 ) & 0x00FF0000 ) | ( ( version[ 1 ] << 8 ) & 0x0000FF00 ) | ( version[ 0 ] & 0x000000FF );
+                    //Result änderungen = ps->zDB()->getGeänderteDateien( v, (int)X64 + 1 );
+                    char byte = 0;
+                    // ********neu beginn*********
+                    klient->sende( "\2", 1 );
+                    Text *pfad = new Text( "start.exe" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "framework.dll" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "network.dll" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "data/patch/bin/patcher.exe" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "data/patch/bin/übernehmen.exe" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "data/start/icon.exe" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    klient->sende( "\2", 1 );
+                    pfad->setText( "data/optionen.ini" );
+                    byte = (char)pfad->getLength();
+                    klient->sende( &byte, 1 );
+                    klient->sende( pfad->getText(), byte );
+                    pfad->release();
+                    klient->sende( "\4", 1 );
+                    // ********neu ende********
+                    //for( int i = 0; i < änderungen.zeilenAnzahl; i++ )
+                    //{
+                    //	if( änderungen.values[ i * 2 + 1 ].istGleich( "t" ) )
+                    //		byte = 1;
+                    //	else
+                    //		byte = 2;
+                    //	klient->sende( &byte, 1 );
+                    //	byte = änderungen.values[ i * 2 ].getLength();
+                    //	klient->sende( &byte, 1 );
+                    //	klient->sende( änderungen.values[ i * 2 ].getText(), byte );
+                    //}
+                    //änderungen.destroy();
+                    //Result remove = ps->zDB()->getGelöschteDateien( v, (int)X64 + 1 );
+                    //for( int i = 0; i < remove.zeilenAnzahl; i++ )
+                    //{
+                    //	klient->sende( "\3", 1 );
+                    //	byte = remove.values[ i * 2 ].getLength();
+                    //	klient->sende( &byte, 1 );
+                    //	klient->sende( remove.values[ i * 2 ].getText(), byte );
+                    //}
+                    //klient->sende( "\4", 1 );
+                    //remove.destroy();
+                }
+                else
+                    errorZuKlient( "Du bist nicht Identifiziert." );
+                break;
+            case 6: // Frage nach Datei ****Altes Update System
+                if( 1 )
+                { // Keine Verkeyung bei den alten Clients
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    klient->sende( "\1", 1 );
+                    unsigned char byte = 0;
+                    klient->getNachricht( (char*)&byte, 1 );
+                    Text *pfad = new Text( "" );
+                    pfad->fillText( ' ', byte );
+                    klient->getNachricht( pfad->getText(), byte );
+                    __int64 pos = 0;
+                    klient->getNachricht( (char *)&pos, 8 );
+                    if( system )
+                        pfad->insert( 0, "../versions/x64/live/" );
+                    else
+                        pfad->insert( 0, "../versions/x32/live/" );
+                    pfad->ersetzen( "ü", "ue" );
+                    Datei *datei = new Datei();
+                    datei->setDatei( pfad );
+                    datei->open( Datei::Style::lesen );
+                    if( pos )
+                        datei->setLPosition( pos, 0 );
+                    __int64 length = datei->getSize();
+                    length -= pos;
+                    char *bytes = new char[ 2048 ];
+                    unsigned short byteLen = 0;
+                    while( 1 )
+                    {
+                        if( !length )
+                        {
+                            klient->sende( "\0\0", 2 );
+                            break;
+                        }
+                        byteLen = 2048;
+                        if( length < 2048 )
+                            byteLen = (unsigned short)length;
+                        klient->sende( (char*)&byteLen, 2 );
+                        datei->lese( bytes, byteLen );
+                        klient->sende( bytes, byteLen );
+                        length -= byteLen;
+                        char ret = 0;
+                        if( byteLen != 2048 )
+                            break;
+                        klient->getNachricht( (char *)&ret, 1 );
+                        ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+                        ps->addGesendet( klient->getUploadBytes( 1 ) );
+                        if( ret == 1 )
+                            continue;
+                        if( !ret )
+                            break;
+                        if( ret == 2 )
+                        {
+                            pos = 0;
+                            klient->getNachricht( (char *)&pos, 8 );
+                            if( pos > length )
+                                pos = length;
+                            datei->setLPosition( pos, 0 );
+                            length = datei->getSize();
+                            length -= pos;
+                        }
+                    }
+                    delete[]bytes;
+                    datei->close();
+                    datei->release();
+                }
+                break;
+            case 7: // Frage nach neuster Version ****Altes Update System
+                if( 1 )
+                { // Keine Verkeyung bei den alten Clients
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    klient->sende( "\1", 1 );
+                    int version = 30;
+                    klient->sende( (char*)&version, 4 );
+                }
+                break;
+            case 8: // Frage nach Dateigröße ****Altes Update System
+                if( 1 )
+                { // Keine Verkeyung bei den alten Clients
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    klient->sende( "\1", 1 );
+                    char byte = 0;
+                    klient->getNachricht( &byte, 1 );
+                    Text *pfad = new Text( "" );
+                    pfad->fillText( ' ', byte );
+                    klient->getNachricht( pfad->getText(), byte );
+                    if( system )
+                        pfad->insert( 0, "../versions/x64/live/" );
+                    else
+                        pfad->insert( 0, "../versions/x32/live/" );
+                    pfad->ersetzen( "ü", "ue" );
+                    Datei *datei = new Datei();
+                    datei->setDatei( pfad );
+                    __int64 size = datei->getSize();
+                    datei->release();
+                    klient->sende( (char *)&size, 8 );
+                }
+                break;
+            case 9: // Frage nach Dateiliste ****Neues Update System
+                if( 1 )
+                {
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    int updateGruppe = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&updateGruppe, 4 );
+                    else
+                        klient->getNachricht( (char*)&updateGruppe, 4 );
+                    Result dateien = ps->zDB()->getDateiListeOhneOrdner( system, updateGruppe );
+                    if( !dateien.zeilenAnzahl )
+                    {
+                        dateien.destroy();
+                        errorZuKlient( "Dein System wird nicht unterstützt." );
+                        break;
+                    }
+                    Result deleted = ps->zDB()->getDeletedFiles( system, updateGruppe );
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    for( int i = 0; i < dateien.zeilenAnzahl; i++ )
+                    {
+                        int len = dateien.values[ i * 2 ].getLength();
+                        if( !len )
+                            break;
+                        if( encrypted )
+                        {
+                            klient->sendeEncrypted( (char*)&len, 4 );
+                            klient->sendeEncrypted( dateien.values[ i * 2 ].getText(), len );
+                            int version = TextZuInt( dateien.values[ i * 2 + 1 ].getText(), 10 );
+                            klient->sendeEncrypted( (char*)&version, 4 );
+                        }
+                        else
+                        {
+                            klient->sende( (char*)&len, 4 );
+                            klient->sende( dateien.values[ i * 2 ].getText(), len );
+                            int version = TextZuInt( dateien.values[ i * 2 + 1 ].getText(), 10 );
+                            klient->sende( (char*)&version, 4 );
+                        }
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\0\0\0\0", 4 );
+                    else
+                        klient->sende( "\0\0\0\0", 4 );
+                    for( int i = 0; i < deleted.zeilenAnzahl; i++ )
+                    {
+                        int len = deleted.values[ i ].getLength();
+                        if( !len )
+                            break;
+                        if( encrypted )
+                        {
+                            klient->sendeEncrypted( (char*)&len, 4 );
+                            klient->sendeEncrypted( deleted.values[ i ].getText(), len );
+                        }
+                        else
+                        {
+                            klient->sende( (char*)&len, 4 );
+                            klient->sende( deleted.values[ i ].getText(), len );
+                        }
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\0\0\0\0", 4 );
+                    else
+                        klient->sende( "\0\0\0\0", 4 );
+                    deleted.destroy();
+                    dateien.destroy();
+                }
+                break;
+            case 10: // Frage nach Dateigröße ****Neues Update System
+                if( 1 )
+                {
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    int updateGruppe = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&updateGruppe, 4 );
+                    else
+                        klient->getNachricht( (char*)&updateGruppe, 4 );
+                    if( !ps->zDB()->supportedDateiGruppe( ps->getId(), updateGruppe ) )
+                    {
+                        int s = ps->zDB()->getDateiGruppePatchServer( klientNummer, updateGruppe );
+                        int port = 0;
+                        Text *ip = new Text();
+                        bool ok = ps->zDB()->getPatchServerPortIp( s, &port, ip );
+                        if( !s || !ok )
+                            errorZuKlient( "Es ist momentan nicht möglich diese Datei herunterzuladen." );
+                        else
+                        {
+                            if( encrypted )
+                            {
+                                klient->sendeEncrypted( "\2", 1 );
+                                klient->sendeEncrypted( (char*)&port, 4 );
+                                int len = ip->getLength();
+                                klient->sendeEncrypted( (char*)&len, 4 );
+                                klient->sendeEncrypted( (char*)ip->getText(), len );
+                            }
+                            else
+                            {
+                                klient->sende( "\2", 1 );
+                                klient->sende( (char*)&port, 4 );
+                                int len = ip->getLength();
+                                klient->sende( (char*)&len, 4 );
+                                klient->sende( (char*)ip->getText(), len );
+                            }
+                        }
+                        ip->release();
+                        break;
+                    }
+                    Text *gruppeN = ps->zDB()->getDateiGruppeName( updateGruppe );
+                    if( !gruppeN )
+                    {
+                        errorZuKlient( "Dein System wird nicht unterstützt." );
+                        break;
+                    }
+                    Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+                    pfad->append( "/" );
+                    pfad->append( gruppeN );
+                    pfad->append( "/" );
+                    Text *tmp = ps->zDB()->getSystemName( system );
+                    if( !tmp )
+                    {
+                        errorZuKlient( "Dein System wird nicht unterstützt." );
+                        pfad->release();
+                        break;
+                    }
+                    pfad->append( tmp );
+                    pfad->append( "/" );
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    int len = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&len, 4 );
+                    else
+                        klient->getNachricht( (char*)&len, 4 );
+                    char *pf = new char[ len + 1 ];
+                    pf[ len ] = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( pf, len );
+                    else
+                        klient->getNachricht( pf, len );
+                    pfad->append( pf );
+                    delete[] pf;
+                    Datei *datei = new Datei();
+                    datei->setDatei( pfad );
+                    __int64 size = datei->getSize();
+                    datei->release();
+                    if( encrypted )
+                        klient->sendeEncrypted( (char *)&size, 8 );
+                    else
+                        klient->sende( (char *)&size, 8 );
+                }
+                break;
+            case 11: // Frage nach Datei ****Neues Update System
+                if( 1 )
+                {
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    int updateGruppe = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&updateGruppe, 4 );
+                    else
+                        klient->getNachricht( (char*)&updateGruppe, 4 );
+                    if( !ps->zDB()->supportedDateiGruppe( ps->getId(), updateGruppe ) )
+                    {
+                        int s = ps->zDB()->getDateiGruppePatchServer( klientNummer, updateGruppe );
+                        int port = 0;
+                        Text *ip = new Text();
+                        bool ok = ps->zDB()->getPatchServerPortIp( s, &port, ip );
+                        if( !s || !ok )
+                            errorZuKlient( "Es ist momentan nicht möglich diese Datei herunterzuladen." );
+                        else
+                        {
+                            if( encrypted )
+                            {
+                                klient->sendeEncrypted( "\2", 1 );
+                                klient->sendeEncrypted( (char*)&port, 4 );
+                                int len = ip->getLength();
+                                klient->sendeEncrypted( (char*)&len, 4 );
+                                klient->sendeEncrypted( (char*)ip->getText(), len );
+                            }
+                            else
+                            {
+                                klient->sende( "\2", 1 );
+                                klient->sende( (char*)&port, 4 );
+                                int len = ip->getLength();
+                                klient->sende( (char*)&len, 4 );
+                                klient->sende( (char*)ip->getText(), len );
+                            }
+                        }
+                        ip->release();
+                        break;
+                    }
+                    Text *gruppeN = ps->zDB()->getDateiGruppeName( updateGruppe );
+                    if( !gruppeN )
+                    {
+                        errorZuKlient( "Dein System wird nicht unterstützt." );
+                        break;
+                    }
+                    Text *pfad = new Text( ini->zWert( "SystemPfad" )->getText() );
+                    pfad->append( "/" );
+                    pfad->append( gruppeN );
+                    pfad->append( "/" );
+                    Text *tmp = ps->zDB()->getSystemName( system );
+                    if( !tmp )
+                    {
+                        errorZuKlient( "Dein System wird nicht unterstützt." );
+                        pfad->release();
+                        break;
+                    }
+                    pfad->append( tmp );
+                    pfad->append( "/" );
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    int len = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&len, 4 );
+                    else
+                        klient->getNachricht( (char*)&len, 4 );
+                    char *pf = new char[ len + 1 ];
+                    pf[ len ] = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( pf, len );
+                    else
+                        klient->getNachricht( pf, len );
+                    pfad->append( pf );
+                    delete[] pf;
+                    __int64 pos = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( (char*)&pos, 8 );
+                    else
+                        klient->getNachricht( (char*)&pos, 8 );
+                    Datei *datei = new Datei();
+                    datei->setDatei( pfad );
+                    datei->open( Datei::Style::lesen );
+                    if( pos )
+                        datei->setLPosition( pos, 0 );
+                    __int64 length = datei->getSize();
+                    length -= pos;
+                    char *bytes = new char[ 2048 ];
+                    unsigned short byteLen = 0;
+                    while( 1 )
+                    {
+                        if( !length )
+                        {
+                            klient->sende( "\0\0", 2 );
+                            break;
+                        }
+                        byteLen = 2048;
+                        if( length < 2048 )
+                            byteLen = (unsigned short)length;
+                        if( !klient->sende( (char*)&byteLen, 2 ) )
+                            break;
+                        datei->lese( bytes, byteLen );
+                        if( !klient->sende( bytes, byteLen ) )
+                            break;
+                        length -= byteLen;
+                        if( byteLen != 2048 )
+                            break;
+                        ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+                        ps->addGesendet( klient->getUploadBytes( 1 ) );
+                    }
+                    char ret = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( &ret, 1 );
+                    else
+                        klient->getNachricht( &ret, 1 );
+                    delete[] bytes;
+                    datei->close();
+                    datei->release();
+                }
+                break;
+            case 12: // Frage nach Datei Gruppen Liste ****Neues Update System
+                if( 1 )
+                {
+                    if( !klientNummer )
+                    {
+                        errorZuKlient( "Du bist nicht Identifiziert." );
+                        break;
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\1", 1 );
+                    else
+                        klient->sende( "\1", 1 );
+                    Result dgl = ps->zDB()->getDateiGruppeListe();
+                    for( int i = 0; i < dgl.zeilenAnzahl; i++ )
+                    {
+                        if( encrypted )
+                        {
+                            int id = TextZuInt( dgl.values[ i * 3 ].getText(), 10 );
+                            klient->sendeEncrypted( (char*)&id, 4 );
+                            int len = dgl.values[ i * 3 + 1 ].getLength();
+                            klient->sendeEncrypted( (char*)&len, 4 );
+                            if( len )
+                                klient->sendeEncrypted( dgl.values[ i * 3 + 1 ].getText(), len );
+                            int vs = TextZuInt( dgl.values[ i * 3 + 2 ].getText(), 10 );
+                            klient->sendeEncrypted( (char*)&vs, 4 );
+                        }
+                        else
+                        {
+                            int id = TextZuInt( dgl.values[ i * 3 ].getText(), 10 );
+                            klient->sende( (char*)&id, 4 );
+                            int len = dgl.values[ i * 3 + 1 ].getLength();
+                            klient->sende( (char*)&len, 4 );
+                            if( len )
+                                klient->sende( dgl.values[ i * 3 + 1 ].getText(), len );
+                            int vs = TextZuInt( dgl.values[ i * 3 + 2 ].getText(), 10 );
+                            klient->sende( (char*)&vs, 4 );
+                        }
+                    }
+                    if( encrypted )
+                        klient->sendeEncrypted( "\0\0\0\0", 4 );
+                    else
+                        klient->sende( "\0\0\0\0", 4 );
+                    dgl.destroy();
+                    char ret = 0;
+                    if( encrypted )
+                        klient->getNachrichtEncrypted( &ret, 1 );
+                    else
+                        klient->getNachricht( &ret, 1 );
+                }
+                break;
+            default:
+                hack++;
+                if( !errorZuKlient( "Unbekannte Nachricht!" ) )
+                    br = 1;
+                break;
+            }
+            if( br || hack >= 10 )
+                break;
+        }
+        ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+        ps->addGesendet( klient->getUploadBytes( 1 ) );
+    }
+    ps->addEmpfangen( klient->getDownloadBytes( 1 ) );
+    ps->addGesendet( klient->getUploadBytes( 1 ) );
+    ps->removeKlient( this ); // delete this
+}
+
+// constant
+bool PSKlient::errorZuKlient( const char *nachricht ) const // sendet eine Fehlernachricht zum Klient
+{
+    if( encrypted )
+    {
+        if( !klient->sendeEncrypted( "\3", 1 ) )
+            return 0;
+        char len = (char)textLength( nachricht );
+        if( !klient->sendeEncrypted( &len, 1 ) )
+            return 0;
+        if( !klient->sendeEncrypted( nachricht, len ) )
+            return 0;
+    }
+    else
+    {
+        if( !klient->sende( "\3", 1 ) )
+            return 0;
+        char len = (char)textLength( nachricht );
+        if( !klient->sende( &len, 1 ) )
+            return 0;
+        if( !klient->sende( nachricht, len ) )
+            return 0;
+    }
+    return 1;
+}
+
+int PSKlient::getKlientNummer() const // gibt die KlientId zurück
+{
+    return klientNummer;
+}
+
+// Reference Counting
+PSKlient *PSKlient::getThis()
+{
+    ref++;
+    return this;
+}
+
+PSKlient *PSKlient::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}

+ 120 - 0
PatchServer/PatchServer.h

@@ -0,0 +1,120 @@
+#ifndef PatchServer_H
+#define PatchServer_H
+
+#include <Server.h>
+#include <Thread.h>
+#include <Datei.h>
+#include <Text.h>
+#include <InitDatei.h>
+#include "Datenbank.h"
+
+using namespace Framework;
+using namespace Network;
+
+class PSKlient;
+
+class PatchServer : public Thread
+{
+private:
+	Server *server;
+	Server *aServer;
+	InitDatei *ini;
+	PSDatenbank *db;
+	CRITICAL_SECTION cs;
+	RCArray< PSKlient > *klients;
+	Text *fehler;
+	int klientAnzahl;
+	int id;
+	bool nichtPausiert;
+	int empfangen;
+	int gesendet;
+	int updateAnzahl;
+	Array< int > *updateGruppe;
+	bool end;
+	int ref;
+
+public:
+	// Konstruktor 
+	PatchServer( InitDatei *zIni );
+	// Destruktor 
+	virtual ~PatchServer();
+	// nicht constant 
+	void runn();
+	void thread();
+	void close();
+	bool serverStarten();
+	bool serverPause();
+	bool serverFortsetzen();
+	bool serverBeenden();
+	bool setMaxKlients( int mc );
+	bool absturzKlient( int klientId );
+	bool removeKlient( PSKlient *zKlient );
+	void addGesendet( int bytes );
+	void addEmpfangen( int bytes );
+	bool beginnUpdate( int gruppe );
+	void endUpdate( int gruppe );
+	void updateAbbruch( int gruppe );
+	// conatant 
+	bool istAn() const;
+	Server *zServer() const;
+	PSDatenbank *zDB() const;
+	bool hatClients() const;
+	int getId() const;
+	char *getLetzterFehler() const;
+	bool proveVersion( int gruppe ) const;
+	bool proveVersion() const;
+	// Reference Counting
+	PatchServer *getThis();
+	PatchServer *release();
+};
+
+class PSAKlient : public Thread
+{
+private:
+	SKlient *klient;
+	Text *name;
+	Text *passwort;
+	int adminId;
+	PatchServer *ps;
+	int updateGruppe;
+	Text *gruppeN;
+	InitDatei *ini;
+
+public:
+	// Konstruktor 
+	PSAKlient( SKlient *klient, PatchServer *ps, InitDatei *ini );
+	// Destruktor 
+	virtual ~PSAKlient();
+	// nicht constant
+	void thread();
+	void errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum AKlient
+};
+
+class PSKlient : public Thread
+{
+private:
+	SKlient     *klient;
+	unsigned int klientNummer;
+	char system;
+	PatchServer *ps;
+	InitDatei *ini;
+	bool encrypted;
+	int ref;
+
+public:
+	// Konstruktor 
+	PSKlient( SKlient *klient, PatchServer *ps, InitDatei *ini );
+	// Destruktor 
+	virtual ~PSKlient();
+	// nicht constant 
+	void absturz();
+	void thread();
+	// constant
+	bool errorZuKlient( const char *nachricht ) const; // sendet eine Fehlernachricht zum Klient
+	int getKlientNummer() const; // gibt die KlientId zurück
+	// Reference Counting
+	PSKlient *getThis();
+	PSKlient *release();
+};
+
+#endif

+ 72 - 0
PatchServer/PatchServer.vcxproj

@@ -0,0 +1,72 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup Label="ProjectConfigurations">
+    <ProjectConfiguration Include="Debug|x64">
+      <Configuration>Debug</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+    <ProjectConfiguration Include="Release|x64">
+      <Configuration>Release</Configuration>
+      <Platform>x64</Platform>
+    </ProjectConfiguration>
+  </ItemGroup>
+  <PropertyGroup Label="Globals">
+    <ProjectGuid>{d8520018-1ff3-4829-ba75-29899d6dc2b1}</ProjectGuid>
+    <Keyword>Linux</Keyword>
+    <RootNamespace>PatchServer</RootNamespace>
+    <MinimumVisualStudioVersion>15.0</MinimumVisualStudioVersion>
+    <ApplicationType>Linux</ApplicationType>
+    <ApplicationTypeRevision>1.0</ApplicationTypeRevision>
+    <TargetLinuxPlatform>Generic</TargetLinuxPlatform>
+    <LinuxProjectType>{D51BCBC9-82E9-4017-911E-C93873C4EA2B}</LinuxProjectType>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
+    <UseDebugLibraries>true</UseDebugLibraries>
+    <RemoteRootDir>/home/kolja/projects</RemoteRootDir>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
+    <UseDebugLibraries>false</UseDebugLibraries>
+    <RemoteRootDir>/home/kolja/projects</RemoteRootDir>
+  </PropertyGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
+  <ImportGroup Label="ExtensionSettings" />
+  <ImportGroup Label="Shared" />
+  <ImportGroup Label="PropertySheets" />
+  <PropertyGroup Label="UserMacros" />
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <TargetExt />
+    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/Release</RemoteProjectDir>
+    <IncludePath>..\..\..\..\Allgemein\Framework;../../../Framework/Release;..\..\..\..\Allgemein\Network\Network;../../../Network/Release;..\..\..\..\Allgemein\sql\sql;../../../sql/Release;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <TargetExt />
+    <RemoteProjectDir>$(RemoteRootDir)/Server/$(ProjectName)/Debug</RemoteProjectDir>
+    <IncludePath>..\..\..\..\Allgemein\Framework;../../../Framework/Debug;..\..\..\..\Allgemein\Network\Network;../../../Network/Debug;..\..\..\..\Allgemein\sql\sql;../../../sql/Debug;$(IncludePath)</IncludePath>
+  </PropertyGroup>
+  <ItemGroup>
+    <ClInclude Include="Datenbank.h" />
+    <ClInclude Include="PatchServer.h" />
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Datenbank.cpp" />
+    <ClCompile Include="main.cpp" />
+    <ClCompile Include="PatchServer.cpp" />
+  </ItemGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
+    <Link>
+      <AdditionalLibraryDirectories>$(RemoteRootDir)/sql/Release/bin/x64/release;$(RemoteRootDir)/Network/Release/bin/x64/release;$(RemoteRootDir)/Framework/Release/bin/x64/release;/usr/lib/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <LibraryDependencies>Framework;Network;SQL;pq;pthread</LibraryDependencies>
+      <AdditionalOptions>-Wl,-rpath,../lib %(AdditionalOptions)</AdditionalOptions>
+    </Link>
+  </ItemDefinitionGroup>
+  <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
+    <Link>
+      <AdditionalLibraryDirectories>$(RemoteRootDir)/sql/Debug/bin/x64/debug;$(RemoteRootDir)/Network/Debug/bin/x64/debug;$(RemoteRootDir)/Framework/Debug/bin/x64/debug;/usr/lib/;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <LibraryDependencies>dbgFramework;dbgNetwork;dbgSQL;pq;pthread</LibraryDependencies>
+      <AdditionalOptions>-Wl,-rpath,../lib %(AdditionalOptions)</AdditionalOptions>
+    </Link>
+  </ItemDefinitionGroup>
+  <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
+  <ImportGroup Label="ExtensionTargets" />
+</Project>

+ 30 - 0
PatchServer/PatchServer.vcxproj.filters

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+  <ItemGroup>
+    <Filter Include="Quelldateien">
+      <UniqueIdentifier>{ca8671b8-826f-4927-88fd-e207420e55ba}</UniqueIdentifier>
+    </Filter>
+    <Filter Include="Headerdateien">
+      <UniqueIdentifier>{eb90ab63-8b66-44c4-8e59-635619329e6d}</UniqueIdentifier>
+    </Filter>
+  </ItemGroup>
+  <ItemGroup>
+    <ClInclude Include="Datenbank.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+    <ClInclude Include="PatchServer.h">
+      <Filter>Headerdateien</Filter>
+    </ClInclude>
+  </ItemGroup>
+  <ItemGroup>
+    <ClCompile Include="Datenbank.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="main.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+    <ClCompile Include="PatchServer.cpp">
+      <Filter>Quelldateien</Filter>
+    </ClCompile>
+  </ItemGroup>
+</Project>

+ 54 - 0
PatchServer/main.cpp

@@ -0,0 +1,54 @@
+#include "PatchServer.h"
+#include <Zeit.h>
+#include <iostream>
+#include <fstream>
+#include <Globals.h>
+
+int main()
+{
+    Framework::initFramework();
+	Zeit *z = getZeit();
+	Text *pfad = new Text( "../log/patch/" );
+	pfad->append( z->getZeit( "y-m-d h-i-s.log" ) );
+	z->release();
+	DateiPfadErstellen( pfad->getThis() );
+	std::ofstream file;
+	file.open( pfad->getText() );
+	std::streambuf* sbuf = std::cout.rdbuf();
+	std::cout.rdbuf( file.rdbuf() );
+	pfad->release();
+
+	std::cout << "PS: Startet...\n";
+	std::cout << "PS: Lese init Datei ../data/psInit.ini ...\n";
+	InitDatei *dat = new InitDatei( "../data/psInit.ini" );
+	if( !dat->laden() )
+	{
+		std::cout << "PS: error: Datei konnte nicht gelesen werden. Das Programm wird geschlossen.\n";
+		dat->release();
+		exit( 1 );
+	}
+    const char *wichtig[] = { "ServerId", "DBBenutzer", "DBPasswort", "DBName", "DBIP", "DBPort", "Aktiv", "SystemPfad" };
+    for( const char *w : wichtig )
+    {
+        if( !dat->wertExistiert( w ) )
+        {
+            std::cout << "PS: error: Der Wert '" << w << "' wurde nicht gefunden. Das Programm wird geschlossen.\n";
+            dat->release();
+            exit( 1 );
+        }
+    }
+
+	PatchServer *pserver = new PatchServer( dat );
+
+	std::cout << "PS: Der Admin Server läuft. Startforgang beendet.\n";
+	pserver->runn();
+
+	pserver->ende();
+	pserver->release();
+	dat->release();
+	std::cout << "PS: Der Server ist heruntergefahren.\n";
+	file.close();
+	std::cout.rdbuf( sbuf );
+    Framework::releaseFramework();
+	return 0;
+}

BIN
PatchServer/readme/images/ArchOptions.gif


BIN
PatchServer/readme/images/ChangeRemote.gif


BIN
PatchServer/readme/images/ManageConnections.gif


BIN
PatchServer/readme/images/OutputTypes.gif


BIN
PatchServer/readme/images/debuggerexport.png


BIN
PatchServer/readme/images/firstconnection.png


BIN
PatchServer/readme/images/linker.png


BIN
PatchServer/readme/images/postbuild.png


+ 85 - 0
PatchServer/readme/readme.html

@@ -0,0 +1,85 @@
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset='utf-8'>
+
+    <link rel="stylesheet" type="text/css" href="stylesheet.css" media="screen">
+
+    <title>Getting Started</title>
+  </head>
+
+<body>
+
+    <div class="container">
+        <div id="header">
+            <h1>Getting Started</h1>
+            <h2>Visual C++ for Linux Development extension</h2>
+        </div>
+    
+    <table>
+    <tr>    
+    <div id="main_content">
+        
+        <td>
+        <div id="lpanel">
+            <h1>Setting up your project for Linux Development</h1>
+
+            <p>With this extension you can author C++ code for Linux servers, desktops and devices. You can manage your connections to these machines from within VS. VS will automatically copy and remote build your sources and can launch your application with the debugger. Our project system supports targeting specific architectures, including ARM.</p>
+            <img src="images\ArchOptions.gif"/>
+            
+            <h1>Connecting to Linux</h1>
+            <h2>Prerequisites</h2>
+            <p>Today we only support building remotely on the Linux target machine. We are not limited by specific Linux distros but we do have dependencies on the presence of some tools. Specifically, we need openssh-server, g++, gdb and gdbserver. Use your favorite package manager to install them, e.g. on Debian based systems: sudo apt-get install openssh-server g++ gdb gdbserver</p>
+            
+            <h2>First connection</h2>
+            <p>The first time you target a Linux machine you will be prompted for connection information.  This is triggered by building the project.</p>
+            <img src="images\firstconnection.png"/>
+                
+            <h2>Adding and removing connections</h2>
+            <p>To add a new connection, go to Tools > Options and search for Linux. From here you can add and remove connections.</p>
+            <img src="images\ManageConnections.gif"/>
+            
+            <p>To change which connection a project is using go to the project properties remote settings and update the target machine.</p>
+            <img src="images\ChangeRemote.gif"/>
+            
+            <h1>Project Properties</h1>
+            <p>All of the options necessary to control C++ compilation are exposed on the project properies pages. We'll cover a few specific to how things work for Linux. First under remote settings, you will see the remote root is set to ~/projects/ by default and that we are setting the remote project directory to match our project name in that location. </p>
+            <img src="images\OutputTypes.gif"/>
+            
+            <p>Looking at the General settings for the project, you can see how our output and intermediate directories were configured. Additionally, you’ll see that this project was configured as an application – thus our executable is under bin/x64/Debug/ as ConsoleApplication1.out. Notice that for configuration types we also support static and dynamic libraries.</p>
+            
+            <p>Add additional library dependencies on the Linker > Input property page.</p>
+            <img src="images\linker.png"/>
+            
+            <p>You can pass additional pre launch commands to the debugger to do things like launch graphical apps on the remote linux machine.</p>
+            <img src="images\debuggerexport.png"/>
+            
+            <p>You can also send post build events to control remote behavior, as in this example that exports a gpio pin for use without requiring the executable run as super user.</p>
+            <img src="images\postbuild.png"/>
+            
+        </div>
+        </td>
+        <td>
+        <div id="rpanel">
+
+            <h1>Resources</h1>
+
+            <p>Check out the <a href="http://aka.ms/vslinuxext">VS Gallery VC++ for Linux Development page</a> where we will keep updates posted. You can also check out our <a href="https://blogs.msdn.microsoft.com/vcblog/2016/03/30/visual-c-for-linux-development">announcment blog post</a> for more in depth details on configuring the project properties.</p>
+            
+            <p>Here are other utilities you will find useful in connection with this extension.</p>
+            <ul>
+                <li>Learn more about <a href="http://aka.ms/vsiot">IoT Development</a></li>
+                <li><a href="http://aka.ms/vsiotext">VC++ for IoT Development Tools</a></li>
+                <li><a href="https://github.com/Azure/azure-iot-sdks">Azure IoT SDK</a>, includes a C API for connecting small devices to the Azure IoT Hub</li>
+            </ul>
+
+            <h1>Give us feedback</h1>
+            <p><a href="http://aka.ms/vslinux-feedback">UserVoice</a></p>
+        </div>
+        </td>   
+    </div>
+    </tr>
+    </table>
+    </div>
+</body>
+</html>

+ 119 - 0
PatchServer/readme/stylesheet.css

@@ -0,0 +1,119 @@
+body {
+  margin: 0;
+  padding: 0;
+  border: 0;
+  color: #1E1E1E;
+  font-size: 13px;
+  font-family: "Segoe UI", Helvetica, Arial, sans-serif;
+  line-height: 1.45;
+  word-wrap: break-word;
+}
+
+/* General & 'Reset' Stuff */
+
+
+.container {
+  width: 1100px;
+  margin: 0 auto;
+}
+
+section {
+  display: block;
+  margin: 0;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  margin: 0;
+}
+
+table, tr {
+    width: 1100px;
+    padding: 0px;
+    vertical-align: top;
+  }
+
+/* Header, <header>
+   header   - container
+   h1       - project name
+   h2       - project description
+*/
+
+#header {
+  color: #FFF;
+  background: #68217a;
+  position:relative;
+}
+h1, h2 {
+  font-family: "Segoe UI Light", "Segoe UI", Helvetica, Arial, sans-serif;
+  line-height: 1;
+  margin: 0 18px;;
+  padding: 0;
+}
+#header h1 {
+  font-size: 3.4em;
+  padding-top: 18px;
+  font-weight: normal;
+  margin-left: 15px;
+}
+
+#header h2 {
+  font-size: 1.5em;
+  margin-top: 10px;
+  padding-bottom: 18px;
+  font-weight: normal;
+}
+
+#main_content {
+  width: 100%;
+  display: flex;
+  flex-direction: row;
+}
+
+
+h1, h2, h3, h4, h5, h6 {
+  font-weight: bolder;
+}
+
+#main_content h1 {
+  font-size: 1.8em;
+  margin-top: 34px;
+}
+
+    #main_content h1:first-child {
+        margin-top: 30px;
+    }
+
+#main_content h2 {
+  font-size: 1.8em;
+}
+p, ul {
+    margin: 11px 18px;
+}
+
+#main_content a {
+    color: #06C;
+    text-decoration: none;
+}
+ul {
+        margin-top: 13px;
+    margin-left: 18px;
+    padding-left: 0;
+}
+    ul li {
+        margin-left: 18px;
+        padding-left: 0;
+    }
+#lpanel {
+    width: 870px;
+    float: left;
+}
+#rpanel ul {
+    list-style-type: none;
+}
+    #rpanel ul li {
+        line-height: 1.8em;
+    }
+#rpanel {
+    background: #e7e7e7;
+    width: 230px;
+}

BIN
Versions/x32/live/data/bilder/game.ltdb


BIN
Versions/x32/live/data/bilder/system.ltdb


BIN
Versions/x32/live/data/client/bilder/chat.ltdb


BIN
Versions/x32/live/data/client/bilder/ladeanimation.ltdb


BIN
Versions/x32/live/data/client/bilder/spielen.ltdb


BIN
Versions/x32/live/data/client/bilder/titel.ltdb


+ 2 - 0
Versions/x32/live/data/optionen.ini

@@ -0,0 +1,2 @@
+ServerIP=78.47.203.169
+ServerPort=4253

BIN
Versions/x32/live/data/patch/bilder/news.ltdb


BIN
Versions/x32/live/data/patch/bilder/patcher.ltdb


+ 5 - 0
Versions/x32/live/data/patch/news/Linie/data.new

@@ -0,0 +1,5 @@
+b.png
+Das neue Spiel Linie ist jetzt
+verfügbar. Es ist ein kleines
+2D Spiel und ähnelt Tron oder
+curvefever2.

+ 6 - 0
Versions/x32/live/data/patch/news/Stickman World/data.new

@@ -0,0 +1,6 @@
+c.png
+Wir arbeiten momentan an einem
+neuen Spiel: Stickman World Online.
+Es wird ein 3D Third Person Shooter,
+bei dem verschiedene Stickmans
+gegeneinander antreten werden.

+ 4 - 0
Versions/x32/live/data/patch/news/Willkommen/data.new

@@ -0,0 +1,4 @@
+a.png
+Willkommen bei Lenck-Tech!
+Viel Spaß beim spielen...
+www.lencktech.com

BIN
Versions/x32/live/data/schriften/normal.ltds


BIN
Versions/x32/live/data/spiele/Linie/bilder/start.ltdb


+ 1 - 0
Versions/x32/live/data/spiele/Linie/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Bei dem spiel Linie bewegen sich die Spieler duch ein Spielfeld und können nur ihre Richtung beeinflussen. Dabei hinterlässt Jeder Spieler eine Linie die nicht berührt werden darf. Viel spaß wünscht ihnen Lenck Tech Games.

+ 3 - 0
Versions/x32/live/data/spiele/Linie/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
Versions/x32/live/data/spiele/Linie/data/id.ltgid


BIN
Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/bilder/bilder.ltdb


+ 6 - 0
Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/data/beschreibung.ltgb

@@ -0,0 +1,6 @@
+Karte zum testen von Linie.
+
+-Spieltyp: Deathmatch
+-Siegesbedingung: zuerst 10 Punkte erreichen.
+-Spieleranzahl: 10
+-Teamanzahl: 0

+ 4 - 0
Versions/x32/live/data/spiele/Linie/maps/offiziell/Normal/data/map.ini

@@ -0,0 +1,4 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb
+bilder/bilder.ltdb/spielladen.png

BIN
Versions/x32/live/data/spiele/Stickman World Online/bilder/start.ltdb


+ 1 - 0
Versions/x32/live/data/spiele/Stickman World Online/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Stickman World online ist eines der Ersten Spiele von Lenck Tech Games. Es gibt verschiedene Karten mit jeweils anderen Spielsystemen. Lenck Tech wünscht dir viel Spaß beim Spielen.

+ 3 - 0
Versions/x32/live/data/spiele/Stickman World Online/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
Versions/x32/live/data/spiele/Stickman World Online/data/id.ltgid


BIN
Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/bilder/bilder.ltdb


+ 22 - 0
Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/data/beschreibung.ltgb

@@ -0,0 +1,22 @@
+Karte zum testen von Stickman World online.
+
+-Spieltyp: Team Deathmatch
+-Siegesbedingung: Jeder andere Spieler muss mindestens 1 mal von deinem Team getötet werden.
+-Spieleranzahl: 24
+-Teamanzahl: 4
+ -Team 1 (grün):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 2, Team 3, Team 4
+ -Team 2 (blau):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 3, Team 4
+ -Team 3 (gelb):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 4
+-Team 4 (rot):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 3

+ 3 - 0
Versions/x32/live/data/spiele/Stickman World Online/maps/offiziell/Test Karte/data/map.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb

BIN
Versions/x32/live/data/start/icon.exe


BIN
Versions/x32/live/data/version


BIN
Versions/x32/live/framework.dll


BIN
Versions/x32/live/network.dll


BIN
Versions/x32/live/start.exe


BIN
Versions/x32/version


+ 2 - 0
build.bat

@@ -0,0 +1,2 @@
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Patch Server.sln" /t:rebuild /p:configuration=debug /p:platform=x64
+"D:\Visual Studio 2017\MSBuild\15.0\Bin\MSBuild.exe" "Patch Server.sln" /t:rebuild /p:configuration=release /p:platform=x64

BIN
systeme/Client/WIN32/data/bilder/game.ltdb


BIN
systeme/Client/WIN32/data/bilder/ladeanimation.ltdb


BIN
systeme/Client/WIN32/data/bilder/system.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/account.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/chat.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/ladeanimation.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/shop.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/spielen.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/titel.ltdb


BIN
systeme/Client/WIN32/data/client/bilder/video.ltdb


+ 2 - 0
systeme/Client/WIN32/data/optionen.ini

@@ -0,0 +1,2 @@
+ServerIP=78.47.203.169
+ServerPort=4253

BIN
systeme/Client/WIN32/data/patch/bilder/news.ltdb


BIN
systeme/Client/WIN32/data/patch/bilder/patcher.ltdb


+ 5 - 0
systeme/Client/WIN32/data/patch/news/Linie/data.new

@@ -0,0 +1,5 @@
+b.png
+Das neue Spiel Linie ist jetzt
+verfügbar. Es ist ein kleines
+2D Spiel und ähnelt Tron oder
+curvefever2.

+ 6 - 0
systeme/Client/WIN32/data/patch/news/Stickman World/data.new

@@ -0,0 +1,6 @@
+c.png
+Wir arbeiten momentan an einem
+neuen Spiel: Stickman World Online.
+Es wird ein 3D Third Person Shooter,
+bei dem verschiedene Stickmans
+gegeneinander antreten werden.

+ 3 - 0
systeme/Client/WIN32/data/patch/news/Willkommen/data.new

@@ -0,0 +1,3 @@
+a.png
+Willkommen bei Kolja-Strohm Games!
+Viel Spaß beim spielen...

BIN
systeme/Client/WIN32/data/schriften/normal.ltds


BIN
systeme/Client/WIN32/data/start/icon.exe


BIN
systeme/Client/WIN32/data/version


BIN
systeme/Client/WIN32/framework.dll


BIN
systeme/Client/WIN32/network.dll


BIN
systeme/Client/WIN32/start.exe


+ 26 - 0
systeme/Client/WIN32/version.ini

@@ -0,0 +1,26 @@
+data/bilder/game.ltdb=1
+data/bilder/system.ltdb=1
+data/client/bilder/chat.ltdb=1
+data/client/bilder/ladeanimation.ltdb=1
+data/client/bilder/spielen.ltdb=1
+data/client/bilder/titel.ltdb=1
+data/client/bin/game client.exe=14
+data/optionen.ini=2
+data/patch/bilder/news.ltdb=1
+data/patch/bilder/patcher.ltdb=1
+data/patch/bin/patcher.exe=9
+data/patch/bin/übernehmen.exe=2
+data/patch/news/Linie/data.new=1
+data/patch/news/Stickman World/data.new=1
+data/patch/news/Willkommen/data.new=1
+data/schriften/normal.ltds=1
+data/start/icon.exe=8
+data/version=4
+framework.dll=8
+network.dll=5
+start.exe=8
+data/client/bilder/shop.ltdb=1
+data/client/bilder/account.ltdb=1
+data/client/bilder/video.ltdb=1
+data/bin/KSGScript.dll=8
+data/bilder/ladeanimation.ltdb=1

BIN
systeme/Client/WIN64/data/bilder/game.ltdb


BIN
systeme/Client/WIN64/data/bilder/ladeanimation.ltdb


BIN
systeme/Client/WIN64/data/bilder/system.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/account.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/chat.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/ladeanimation.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/shop.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/spielen.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/titel.ltdb


BIN
systeme/Client/WIN64/data/client/bilder/video.ltdb


+ 2 - 0
systeme/Client/WIN64/data/optionen.ini

@@ -0,0 +1,2 @@
+ServerIP=78.47.203.169
+ServerPort=4253

BIN
systeme/Client/WIN64/data/patch/bilder/news.ltdb


BIN
systeme/Client/WIN64/data/patch/bilder/patcher.ltdb


+ 5 - 0
systeme/Client/WIN64/data/patch/news/Linie/data.new

@@ -0,0 +1,5 @@
+b.png
+Das neue Spiel Linie ist jetzt
+verfügbar. Es ist ein kleines
+2D Spiel und ähnelt Tron oder
+curvefever2.

+ 6 - 0
systeme/Client/WIN64/data/patch/news/Stickman World/data.new

@@ -0,0 +1,6 @@
+c.png
+Wir arbeiten momentan an einem
+neuen Spiel: Stickman World Online.
+Es wird ein 3D Third Person Shooter,
+bei dem verschiedene Stickmans
+gegeneinander antreten werden.

+ 3 - 0
systeme/Client/WIN64/data/patch/news/Willkommen/data.new

@@ -0,0 +1,3 @@
+a.png
+Willkommen bei Kolja-Strohm Games!
+Viel Spaß beim spielen...

BIN
systeme/Client/WIN64/data/schriften/normal.ltds


BIN
systeme/Client/WIN64/data/start/icon.exe


BIN
systeme/Client/WIN64/data/version


BIN
systeme/Client/WIN64/framework.dll


BIN
systeme/Client/WIN64/network.dll


BIN
systeme/Client/WIN64/start.exe


+ 26 - 0
systeme/Client/WIN64/version.ini

@@ -0,0 +1,26 @@
+data/bilder/game.ltdb=1
+data/bilder/system.ltdb=1
+data/client/bilder/chat.ltdb=1
+data/client/bilder/ladeanimation.ltdb=1
+data/client/bilder/spielen.ltdb=1
+data/client/bilder/titel.ltdb=1
+data/client/bin/game client.exe=15
+data/optionen.ini=3
+data/patch/bilder/news.ltdb=1
+data/patch/bilder/patcher.ltdb=1
+data/patch/bin/patcher.exe=9
+data/patch/bin/übernehmen.exe=2
+data/patch/news/Linie/data.new=1
+data/patch/news/Stickman World/data.new=1
+data/patch/news/Willkommen/data.new=1
+data/schriften/normal.ltds=1
+data/start/icon.exe=8
+data/version=4
+framework.dll=8
+network.dll=5
+start.exe=8
+data/client/bilder/shop.ltdb=1
+data/bin/KSGScript.dll=8
+data/client/bilder/account.ltdb=1
+data/client/bilder/video.ltdb=1
+data/bilder/ladeanimation.ltdb=1

BIN
systeme/Spiel_Linie/WIN32/bilder/start.ltdb


+ 1 - 0
systeme/Spiel_Linie/WIN32/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Bei dem spiel Linie bewegen sich die Spieler duch ein Spielfeld und können nur ihre Richtung beeinflussen. Dabei hinterlässt Jeder Spieler eine Linie die nicht berührt werden darf. Viel spaß wünscht ihnen Kolja-Strohm Games.

+ 3 - 0
systeme/Spiel_Linie/WIN32/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
systeme/Spiel_Linie/WIN32/data/id.ltgid


+ 5 - 0
systeme/Spiel_Linie/WIN32/version.ini

@@ -0,0 +1,5 @@
+bilder/start.ltdb=2
+bin/Linie.dll=17
+data/beschreibung.ltgb=1
+data/game.ini=1
+data/id.ltgid=1

BIN
systeme/Spiel_Linie/WIN64/bilder/start.ltdb


+ 1 - 0
systeme/Spiel_Linie/WIN64/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Bei dem spiel Linie bewegen sich die Spieler duch ein Spielfeld und können nur ihre Richtung beeinflussen. Dabei hinterlässt Jeder Spieler eine Linie die nicht berührt werden darf. Viel spaß wünscht ihnen Kolja-Strohm Games.

+ 3 - 0
systeme/Spiel_Linie/WIN64/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
systeme/Spiel_Linie/WIN64/data/id.ltgid


+ 5 - 0
systeme/Spiel_Linie/WIN64/version.ini

@@ -0,0 +1,5 @@
+bilder/start.ltdb=2
+bin/Linie.dll=17
+data/beschreibung.ltgb=1
+data/game.ini=1
+data/id.ltgid=1

BIN
systeme/Spiel_Linie_Karte_Normal/WIN32/bilder/bilder.ltdb


+ 6 - 0
systeme/Spiel_Linie_Karte_Normal/WIN32/data/beschreibung.ltgb

@@ -0,0 +1,6 @@
+Karte zum testen von Linie.
+
+-Spieltyp: Deathmatch
+-Siegesbedingung: zuerst 10 Punkte erreichen.
+-Spieleranzahl: 10
+-Teamanzahl: 0

+ 4 - 0
systeme/Spiel_Linie_Karte_Normal/WIN32/data/map.ini

@@ -0,0 +1,4 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb
+bilder/bilder.ltdb/spielladen.png

+ 3 - 0
systeme/Spiel_Linie_Karte_Normal/WIN32/version.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb=1
+data/beschreibung.ltgb=1
+data/map.ini=1

BIN
systeme/Spiel_Linie_Karte_Normal/WIN64/bilder/bilder.ltdb


+ 6 - 0
systeme/Spiel_Linie_Karte_Normal/WIN64/data/beschreibung.ltgb

@@ -0,0 +1,6 @@
+Karte zum testen von Linie.
+
+-Spieltyp: Deathmatch
+-Siegesbedingung: zuerst 10 Punkte erreichen.
+-Spieleranzahl: 10
+-Teamanzahl: 0

+ 4 - 0
systeme/Spiel_Linie_Karte_Normal/WIN64/data/map.ini

@@ -0,0 +1,4 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb
+bilder/bilder.ltdb/spielladen.png

+ 3 - 0
systeme/Spiel_Linie_Karte_Normal/WIN64/version.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb=1
+data/beschreibung.ltgb=1
+data/map.ini=1

BIN
systeme/Spiel_Stickman World Online/WIN32/bilder/start.ltdb


+ 1 - 0
systeme/Spiel_Stickman World Online/WIN32/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Stickman World online ist eines der Ersten Spiele von Kolja-Strohm Games. Es gibt verschiedene Karten mit jeweils anderen Spielsystemen. Kolja-Strohm Games wünscht ihnen viel Spaß beim Spielen.

+ 3 - 0
systeme/Spiel_Stickman World Online/WIN32/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
systeme/Spiel_Stickman World Online/WIN32/data/id.ltgid


+ 4 - 0
systeme/Spiel_Stickman World Online/WIN32/version.ini

@@ -0,0 +1,4 @@
+bilder/start.ltdb=1
+data/beschreibung.ltgb=1
+data/game.ini=1
+data/id.ltgid=1

BIN
systeme/Spiel_Stickman World Online/WIN64/bilder/start.ltdb


+ 1 - 0
systeme/Spiel_Stickman World Online/WIN64/data/beschreibung.ltgb

@@ -0,0 +1 @@
+Stickman World online ist eines der Ersten Spiele von Kolja-Strohm Games. Es gibt verschiedene Karten mit jeweils anderen Spielsystemen. Kolja-Strohm Games wünscht ihnen viel Spaß beim Spielen.

+ 3 - 0
systeme/Spiel_Stickman World Online/WIN64/data/game.ini

@@ -0,0 +1,3 @@
+start.ltdb
+beschreibung.ltgb
+id.ltgid

BIN
systeme/Spiel_Stickman World Online/WIN64/data/id.ltgid


+ 4 - 0
systeme/Spiel_Stickman World Online/WIN64/version.ini

@@ -0,0 +1,4 @@
+bilder/start.ltdb=1
+data/beschreibung.ltgb=1
+data/game.ini=1
+data/id.ltgid=1

BIN
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/bilder/bilder.ltdb


+ 22 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/data/beschreibung.ltgb

@@ -0,0 +1,22 @@
+Karte zum testen von Stickman World online.
+
+-Spieltyp: Team Deathmatch
+-Siegesbedingung: Jeder andere Spieler muss mindestens 1 mal von deinem Team getötet werden.
+-Spieleranzahl: 24
+-Teamanzahl: 4
+ -Team 1 (grün):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 2, Team 3, Team 4
+ -Team 2 (blau):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 3, Team 4
+ -Team 3 (gelb):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 4
+-Team 4 (rot):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 3

+ 3 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/data/map.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb

+ 3 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN32/version.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb=1
+data/beschreibung.ltgb=1
+data/map.ini=1

BIN
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/bilder/bilder.ltdb


+ 22 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/data/beschreibung.ltgb

@@ -0,0 +1,22 @@
+Karte zum testen von Stickman World online.
+
+-Spieltyp: Team Deathmatch
+-Siegesbedingung: Jeder andere Spieler muss mindestens 1 mal von deinem Team getötet werden.
+-Spieleranzahl: 24
+-Teamanzahl: 4
+ -Team 1 (grün):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 2, Team 3, Team 4
+ -Team 2 (blau):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 3, Team 4
+ -Team 3 (gelb):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 4
+-Team 4 (rot):
+  -Spieleranzahl: 6
+  -Verbündete: --
+  -Feinde: Team 1, Team 2, Team 3

+ 3 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/data/map.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb/icon.png
+bilder/bilder.ltdb/vorschau.png
+data/beschreibung.ltgb

+ 3 - 0
systeme/Spiel_Stickman World Online_Karte_Test Karte/WIN64/version.ini

@@ -0,0 +1,3 @@
+bilder/bilder.ltdb=1
+data/beschreibung.ltgb=1
+data/map.ini=1

+ 5 - 0
systeme/datei_gruppe.ini

@@ -0,0 +1,5 @@
+3=2
+5=2
+2=34
+4=2
+1=29