Selaa lähdekoodia

Editor.cpp hinzugefügt

Kolja Strohm 5 vuotta sitten
vanhempi
commit
b074370cbc
1 muutettua tiedostoa jossa 1172 lisäystä ja 0 poistoa
  1. 1172 0
      StickmanWorldOnline/Editor.cpp

+ 1172 - 0
StickmanWorldOnline/Editor.cpp

@@ -0,0 +1,1172 @@
+#include "Editor.h"
+#include <Datei.h>
+#include "Reader.h"
+
+// Inhalt der Editor Klasse aus Editor.h
+// Konstruktor
+Editor::Editor()
+{
+    ref = 1;
+}
+
+// Destruktor
+Editor::~Editor()
+{}
+
+// nicht constant
+void Editor::setPfad( char *pfad )
+{
+    this->pfad = pfad;
+    this->pfad += "/editor";
+}
+
+void Editor::open()
+{
+
+}
+
+bool Editor::nachricht( SKlient *k )
+{
+    err = "";
+    char n = 0;
+    k->getNachrichtEncrypted( &n, 1 );
+    switch( n )
+    {
+    case 0: // Initialisierung
+        k->sendeEncrypted( "\1", 1 );
+        if( DateiExistiert( pfad ) )
+            k->sendeEncrypted( "\2", 1 );
+        else
+        {
+            if( createSitzung() )
+                k->sendeEncrypted( "\1", 1 );
+            else
+                return 0;
+        }
+        return 1;
+    case 1: // Sitzung verwerfen
+        if( createSitzung() )
+            k->sendeEncrypted( "\1", 1 );
+        else
+            return 0;
+        return 1;
+    case 2: // Sitzung speichern unt beenden
+        if( saveSitzung() )
+            k->sendeEncrypted( "\1", 1 );
+        else
+            return 0;
+        return 1;
+    case 3: // Lade Spieler Daten
+    {
+        Text tmpPf = pfad.getText();
+        tmpPf += "/player";
+        Datei d;
+        d.setDatei( tmpPf );
+        RCArray< Text > *files = d.getDateiListe();
+        if( files )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            int anz = files->getEintragAnzahl();
+            k->sendeEncrypted( (char *)& anz, 4 );
+            for( int i = 0; i < anz; i++ )
+            {
+                Text pf = tmpPf;
+                pf += "/";
+                pf += files->z( i )->getText();
+                Datei player;
+                player.setDatei( pf );
+                player.open( Datei::Style::lesen );
+                SpielerStr p( player.getThis() );
+                player.close();
+                k->sendeEncrypted( (char *)& p.id, 4 );
+                k->sendeEncrypted( (char *)& p.pos.x, 4 );
+                k->sendeEncrypted( (char *)& p.pos.y, 4 );
+                k->sendeEncrypted( (char *)& p.rot, 8 );
+                k->sendeEncrypted( (char *)& p.beschleunigung, 8 );
+                k->sendeEncrypted( (char *)& p.maxStability, 4 );
+                k->sendeEncrypted( (char *)& p.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)& p.reparatur, 8 );
+                k->sendeEncrypted( (char *)& p.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)& p.laserIntensity, 4 );
+                k->sendeEncrypted( (char *)& p.laserEffizienz, 4 );
+                k->sendeEncrypted( (char *)& p.laserTempo, 4 );
+                k->sendeEncrypted( (char *)& p.wendigkeit, 8 );
+                k->sendeEncrypted( (char *)& p.antriebEffizienz, 8 );
+                k->sendeEncrypted( (char *)& p.energieSchild, 8 );
+                k->sendeEncrypted( (char *)& p.energieSchildEffizienz, 8 );
+                k->sendeEncrypted( (char *)& p.netzwerk, 4 );
+                k->sendeEncrypted( (char *)& p.skillPunkte, 4 );
+                k->sendeEncrypted( (char *)& p.m2d, 4 );
+                k->sendeEncrypted( (char *)& p.bild, 4 );
+            }
+        }
+        else
+        {
+            err = "Fehler beim laden von ";
+            err += tmpPf.getText();
+            return 0;
+        }
+        return 1;
+    }
+    case 4: // Lade Team Daten
+    {
+        Text tmpPf = pfad.getText();
+        tmpPf += "/team";
+        Datei d;
+        d.setDatei( tmpPf );
+        RCArray< Text > *files = d.getDateiListe();
+        if( files )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            int anz = files->getEintragAnzahl();
+            k->sendeEncrypted( (char *)& anz, 4 );
+            for( int i = 0; i < anz; i++ )
+            {
+                Text pf = tmpPf;
+                pf += "/";
+                pf += files->z( i )->getText();
+                Datei team;
+                team.setDatei( pf );
+                team.open( Datei::Style::lesen );
+                TeamStr t( team.getThis() );
+                team.close();
+                k->sendeEncrypted( (char *)& t.id, 4 );
+                k->sendeEncrypted( (char *)& t.maxPunkte, 4 );
+                k->sendeEncrypted( (char *)& t.beschleunigung, 8 );
+                k->sendeEncrypted( (char *)& t.maxStability, 4 );
+                k->sendeEncrypted( (char *)& t.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)& t.reparatur, 8 );
+                k->sendeEncrypted( (char *)& t.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)& t.laserIntensity, 4 );
+                k->sendeEncrypted( (char *)& t.laserEffizienz, 4 );
+                k->sendeEncrypted( (char *)& t.laserTempo, 4 );
+                k->sendeEncrypted( (char *)& t.wendigkeit, 8 );
+                k->sendeEncrypted( (char *)& t.antriebEffizienz, 8 );
+                k->sendeEncrypted( (char *)& t.energieSchild, 8 );
+                k->sendeEncrypted( (char *)& t.energieSchildEffizienz, 8 );
+                k->sendeEncrypted( (char *)& t.punkte, 4 );
+            }
+        }
+        else
+        {
+            err = "Fehler beim laden von ";
+            err += tmpPf.getText();
+            return 0;
+        }
+        return 1;
+    }
+    case 5: // Lade Objekt Daten
+    {
+        Text tmpPf = pfad.getText();
+        tmpPf += "/objekt";
+        Datei d;
+        d.setDatei( tmpPf );
+        RCArray< Text > *files = d.getDateiListe();
+        if( files )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            int anz = files->getEintragAnzahl();
+            k->sendeEncrypted( (char *)& anz, 4 );
+            for( int i = 0; i < anz; i++ )
+            {
+                Text pf = tmpPf;
+                pf += "/";
+                pf += files->z( i )->getText();
+                Datei object;
+                object.setDatei( pf );
+                object.open( Datei::Style::lesen );
+                ObjektStr o( object.getThis() );
+                object.close();
+                k->sendeEncrypted( (char *)& o.pos.x, 4 );
+                k->sendeEncrypted( (char *)& o.pos.y, 4 );
+                k->sendeEncrypted( (char *)& o.rot, 4 );
+                k->sendeEncrypted( (char *)& o.scale, 4 );
+                k->sendeEncrypted( (char *)& o.id, 4 );
+                k->sendeEncrypted( (char *)& o.m2d, 4 );
+                k->sendeEncrypted( (char *)& o.bild, 4 );
+                k->sendeEncrypted( (char *)& o.style, 4 );
+                k->sendeEncrypted( (char *)& o.maxStability, 4 );
+                k->sendeEncrypted( (char *)& o.maxEnergie, 4 );
+                k->sendeEncrypted( (char *)& o.energieRadius, 4 );
+                k->sendeEncrypted( (char *)& o.reparatur, 8 );
+                k->sendeEncrypted( (char *)& o.akkuLeistung, 8 );
+                k->sendeEncrypted( (char *)& o.team, 1 );
+            }
+        }
+        else
+        {
+            err = "Fehler beim laden von ";
+            err += tmpPf.getText();
+            return 0;
+        }
+        return 1;
+    }
+    case 6: // Save Player
+    {
+        k->sendeEncrypted( "\1", 1 );
+        SpielerStr p( 0 );
+        k->getNachrichtEncrypted( (char *)& p.id, 4 );
+        k->getNachrichtEncrypted( (char *)& p.pos.x, 4 );
+        k->getNachrichtEncrypted( (char *)& p.pos.y, 4 );
+        k->getNachrichtEncrypted( (char *)& p.rot, 8 );
+        k->getNachrichtEncrypted( (char *)& p.beschleunigung, 8 );
+        k->getNachrichtEncrypted( (char *)& p.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)& p.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)& p.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)& p.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)& p.laserIntensity, 4 );
+        k->getNachrichtEncrypted( (char *)& p.laserEffizienz, 4 );
+        k->getNachrichtEncrypted( (char *)& p.laserTempo, 4 );
+        k->getNachrichtEncrypted( (char *)& p.wendigkeit, 8 );
+        k->getNachrichtEncrypted( (char *)& p.antriebEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)& p.energieSchild, 8 );
+        k->getNachrichtEncrypted( (char *)& p.energieSchildEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)& p.netzwerk, 4 );
+        k->getNachrichtEncrypted( (char *)& p.skillPunkte, 4 );
+        k->getNachrichtEncrypted( (char *)& p.m2d, 4 );
+        k->getNachrichtEncrypted( (char *)& p.bild, 4 );
+        Text pf = pfad.getText();
+        pf += "/player/";
+        pf += p.id;
+        pf += ".p";
+        Datei player;
+        player.setDatei( pf );
+        if( player.open( Datei::Style::schreiben ) )
+        {
+            p.save( player.getThis() );
+            player.close();
+            k->sendeEncrypted( "\1", 1 );
+            return 1;
+        }
+        err = "Fehler beim Schreiben von ";
+        err += pf.getText();
+        return 0;
+    }
+    case 7: // Save Team
+    {
+        k->sendeEncrypted( "\1", 1 );
+        TeamStr t( 0 );
+        k->getNachrichtEncrypted( (char *)& t.id, 4 );
+        k->getNachrichtEncrypted( (char *)& t.maxPunkte, 4 );
+        k->getNachrichtEncrypted( (char *)& t.beschleunigung, 8 );
+        k->getNachrichtEncrypted( (char *)& t.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)& t.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)& t.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)& t.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)& t.laserIntensity, 4 );
+        k->getNachrichtEncrypted( (char *)& t.laserEffizienz, 4 );
+        k->getNachrichtEncrypted( (char *)& t.laserTempo, 4 );
+        k->getNachrichtEncrypted( (char *)& t.wendigkeit, 8 );
+        k->getNachrichtEncrypted( (char *)& t.antriebEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)& t.energieSchild, 8 );
+        k->getNachrichtEncrypted( (char *)& t.energieSchildEffizienz, 8 );
+        k->getNachrichtEncrypted( (char *)& t.punkte, 4 );
+        Text pf = pfad.getText();
+        pf += "/player/";
+        pf += t.id;
+        pf += ".t";
+        Datei team;
+        team.setDatei( pf );
+        if( team.open( Datei::Style::schreiben ) )
+        {
+            t.save( team.getThis() );
+            team.close();
+            k->sendeEncrypted( "\1", 1 );
+            return 1;
+        }
+        err = "Fehler beim Schreiben von ";
+        err += pf.getText();
+        return 0;
+    }
+    case 8: // Save Objekt
+    {
+        k->sendeEncrypted( "\1", 1 );
+        ObjektStr o( 0 );
+        k->getNachrichtEncrypted( (char *)& o.pos.x, 4 );
+        k->getNachrichtEncrypted( (char *)& o.pos.y, 4 );
+        k->getNachrichtEncrypted( (char *)& o.rot, 4 );
+        k->getNachrichtEncrypted( (char *)& o.scale, 4 );
+        k->getNachrichtEncrypted( (char *)& o.id, 4 );
+        k->getNachrichtEncrypted( (char *)& o.m2d, 4 );
+        k->getNachrichtEncrypted( (char *)& o.bild, 4 );
+        k->getNachrichtEncrypted( (char *)& o.style, 4 );
+        k->getNachrichtEncrypted( (char *)& o.maxStability, 4 );
+        k->getNachrichtEncrypted( (char *)& o.maxEnergie, 4 );
+        k->getNachrichtEncrypted( (char *)& o.energieRadius, 4 );
+        k->getNachrichtEncrypted( (char *)& o.reparatur, 8 );
+        k->getNachrichtEncrypted( (char *)& o.akkuLeistung, 8 );
+        k->getNachrichtEncrypted( (char *)& o.team, 1 );
+        Text pf = pfad.getText();
+        pf += "/objekt/";
+        pf += o.id;
+        pf += ".o";
+        Datei objekt;
+        objekt.setDatei( pf );
+        if( objekt.erstellen() && objekt.open( Datei::Style::schreiben ) )
+        {
+            o.save( objekt.getThis() );
+            objekt.close();
+            k->sendeEncrypted( "\1", 1 );
+            return 1;
+        }
+        err = "Fehler beim Schreiben von ";
+        err += pf.getText();
+        return 0;
+    }
+    case 9: // Delete Objekt
+    {
+        k->sendeEncrypted( "\1", 1 );
+        int id;
+        k->getNachrichtEncrypted( (char *)& id, 4 );
+        Text pf = pfad.getText();
+        pf += "/objekt/";
+        pf += id;
+        pf += ".o";
+        if( DateiRemove( pf ) )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            return 1;
+        }
+        err = "Fehler beim löschen der Datei ";
+        err += pf;
+        return 0;
+    }
+    case 0xA: // Lade Resourcen
+    {
+        Text tmpPf = pfad.getText();
+        tmpPf += "/resource";
+        Datei d;
+        d.setDatei( tmpPf );
+        RCArray< Text > *files = d.getDateiListe();
+        if( files )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            int anz = files->getEintragAnzahl();
+            k->sendeEncrypted( (char *)& anz, 4 );
+            for( int i = 0; i < anz; i++ )
+            {
+                Text pf = tmpPf;
+                pf += "/";
+                pf += files->z( i )->getText();
+                Datei resource;
+                resource.setDatei( pf );
+                resource.open( Datei::Style::lesen );
+                int id = *files->z( i );
+                k->sendeEncrypted( (char *)& id, 4 );
+                char len = 0;
+                resource.lese( &len, 1 );
+                char *path = new char[ len + 1 ];
+                path[ (int)len ] = 0;
+                resource.lese( path, len );
+                k->sendeEncrypted( &len, 1 );
+                k->sendeEncrypted( path, len );
+                delete[] path;
+                resource.close();
+            }
+        }
+        else
+        {
+            err = "Fehler beim laden von ";
+            err += tmpPf.getText();
+            return 0;
+        }
+        return 1;
+    }
+    case 0xB: // Map Size
+    {
+        Text tmpPf = pfad.getText();
+        tmpPf += "/size";
+        Datei d;
+        d.setDatei( tmpPf );
+        if( d.open( Datei::Style::lesen ) )
+        {
+            k->sendeEncrypted( "\1", 1 );
+            int size = 0;
+            d.lese( (char *)& size, 4 );
+            k->sendeEncrypted( (char *)& size, 4 );
+            d.lese( (char *)& size, 4 );
+            k->sendeEncrypted( (char *)& size, 4 );
+            d.close();
+        }
+        else
+        {
+            err = "Fehler beim laden von ";
+            err += tmpPf.getText();
+            return 0;
+        }
+        return 1;
+    }
+    case 0xC: // Add Resource
+    {
+        k->sendeEncrypted( "\1", 1 );
+        Datei d;
+        d.setDatei( Text( pfad.getText() ) + "/resource" );
+        RCArray<Text> *list = d.getDateiListe();
+        int nId = 0;
+        bool found = 0;
+        do
+        {
+            nId++;
+            found = 0;
+            for( auto t = list->getIterator(); t; t++ )
+            {
+                if( t->istGleich( Text( nId ) + ".r" ) )
+                {
+                    found = 1;
+                    break;
+                }
+            }
+        } while( found );
+        list->release();
+        unsigned char len = 0;
+        k->getNachrichtEncrypted( (char *)& len, 1 );
+        char *path = new char[ len + 1 ];
+        path[ len ] = 0;
+        k->getNachrichtEncrypted( path, len );
+        d.setDatei( Text( pfad.getText() ) + "/resource/" + nId + ".r" );
+        if( d.open( Datei::Style::schreiben ) )
+        {
+            d.schreibe( (char *)& len, 1 );
+            d.schreibe( path, len );
+            d.close();
+            k->sendeEncrypted( "\1", 1 );
+            k->sendeEncrypted( (char *)& nId, 4 );
+            return 1;
+        }
+        err = "Fehler beim schreiben der Datei.";
+        return 0;
+    }
+    default:
+        err = "Unbekannte Nachricht. Error Code: " __FILE__ ":";
+        err += __LINE__;
+        return 0;
+    }
+    return 0;
+}
+
+// constant
+char *Editor::getLetzterFehler() const
+{
+    return err;
+}
+
+// Reference Counting 
+ESEditorV *Editor::getThis()
+{
+    ref++;
+    return this;
+}
+
+ESEditorV *Editor::release()
+{
+    ref--;
+    if( !ref )
+        delete this;
+    return 0;
+}
+
+// privat
+bool Editor::createSitzung()
+{
+    DateiRemove( pfad );
+    Text pf = pfad.getText();
+    pf.remove( pf.getLength() - 6, pf.getLength() );
+    pf += "map/server/sts.ltgd";
+    int spielerAnzahl;
+    int teamAnzahl;
+    Datei d;
+    d.setDatei( pf );
+    if( !d.existiert() || d.istOrdner() )
+    {
+        err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim lesen von ";
+        err += pf;
+        err += ". Fehler Code: " __FILE__ ":";
+        err += __LINE__;
+        err += "\n";
+        return 0;
+    }
+    d.open( Datei::Style::lesen );
+    d.lese( (char *)& spielerAnzahl, 4 );
+    d.lese( (char *)& teamAnzahl, 4 );
+    d.close();
+    pf = pfad.getText();
+    pf.remove( pf.getLength() - 6, pf.getLength() );
+    pf += "map/server/data.map";
+    d.setDatei( pf.getText() );
+    if( d.open( Datei::Style::lesen ) )
+    {
+        // map size
+        pf = pfad.getText();
+        pf += "/size";
+        Datei s;
+        s.setDatei( pf.getText() );
+        if( !s.open( Datei::Style::schreiben ) )
+        {
+            err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim lesen von ";
+            err += pf;
+            err += ". Fehler Code: " __FILE__ ":";
+            err += __LINE__;
+            err += "\n";
+        }
+        __int64 size = 0;
+        d.lese( (char *)& size, 8 );
+        s.schreibe( (char *)& size, 8 );
+        s.close();
+        // teams
+        pf = pfad.getText();
+        pf += "/team/";
+        for( int i = 0; i < teamAnzahl; i++ )
+        {
+            Text tmpPf = pf.getText();
+            tmpPf += i;
+            tmpPf += ".t";
+            int maxWbZeit;
+            int punkte;
+            d.lese( (char *)& maxWbZeit, 4 );
+            d.lese( (char *)& punkte, 4 );
+            Datei t;
+            t.setDatei( tmpPf );
+            t.erstellen();
+            if( !t.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            t.schreibe( (char *)& maxWbZeit, 4 );
+            t.schreibe( (char *)& punkte, 4 );
+            t.close();
+        }
+        // spieler
+        pf = pfad.getText();
+        pf += "/player/";
+        for( int i = 0; i < spielerAnzahl; i++ )
+        {
+            Text tmpPf = pf.getText();
+            tmpPf += i;
+            tmpPf += ".t";
+            int spawnX;
+            int spawnY;
+            d.lese( (char *)& spawnX, 4 );
+            d.lese( (char *)& spawnY, 4 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( (char *)& spawnX, 4 );
+            s.schreibe( (char *)& spawnY, 4 );
+            s.close();
+        }
+        // barieren
+        pf = pfad.getText();
+        pf += "/bariere/";
+        int anz;
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 32 ];
+            d.lese( buffer, 32 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 32 );
+            s.close();
+        }
+        // basen
+        pf = pfad.getText();
+        pf += "/base/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 24 ];
+            d.lese( buffer, 24 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 24 );
+            s.close();
+        }
+        // drops
+        pf = pfad.getText();
+        pf += "/drop/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 96 ];
+            d.lese( buffer, 96 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 96 );
+            unsigned char len;
+            d.lese( (char *)&len, 1 );
+            char *name = new char[ (int)len + 1 ];
+            d.lese( name, len );
+            name[ (int)len ] = 0;
+            s.schreibe( (char *)&len, 1 );
+            s.schreibe( (char *)&name, len );
+            delete[] name;
+            s.close();
+        }
+        // schalter
+        pf = pfad.getText();
+        pf += "/schalter/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 17 ];
+            d.lese( buffer, 17 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 17 );
+            s.close();
+        }
+        // schiene
+        pf = pfad.getText();
+        pf += "/schiene/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 16 ];
+            d.lese( buffer, 16 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 16 );
+            s.close();
+        }
+        // timer
+        pf = pfad.getText();
+        pf += "/timer/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 19 ];
+            d.lese( buffer, 19 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 19 );
+            unsigned char len;
+            d.lese( (char *)& len, 1 );
+            char *name = new char[ (int)len + 1 ];
+            d.lese( name, len );
+            name[ (int)len ] = 0;
+            s.schreibe( (char *)& len, 1 );
+            s.schreibe( (char *)& name, len );
+            delete[] name;
+            s.close();
+        }
+        // tunnel
+        pf = pfad.getText();
+        pf += "/tunnel/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 25 ];
+            d.lese( buffer, 25 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 25 );
+            s.close();
+        }
+        // umlenkung
+        pf = pfad.getText();
+        pf += "/umlenkung/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            char buffer[ 23 ];
+            d.lese( buffer, 23 );
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            s.schreibe( buffer, 23 );
+            s.close();
+        }
+        // trigger
+        MapReader mr;
+        pf = pfad.getText();
+        pf += "/trigger/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            int id;
+            d.lese( (char *)& id, 4 );
+            Text tmpPf = pf.getText();
+            tmpPf += id;
+            tmpPf += ".t";
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            unsigned char len;
+            d.lese( (char *)&len, 1 );
+            char *name = new char[ (int)len + 1 ];
+            d.lese( name, len );
+            name[ (int)len ] = 0;
+            s.schreibe( (char *)&len, 1 );
+            s.schreibe( (char *)&name, len );
+            delete[] name;
+            int ereignisAnzahl;
+            int bedingungAnzahl;
+            int aktionAnzahl;
+            d.lese( (char *)&ereignisAnzahl, 4 );
+            d.lese( (char *)&bedingungAnzahl, 4 );
+            d.lese( (char *)&aktionAnzahl, 4 );
+            s.schreibe( (char *)&ereignisAnzahl, 4 );
+            s.schreibe( (char *)&bedingungAnzahl, 4 );
+            s.schreibe( (char *)&aktionAnzahl, 4 );
+            for( int j = 0; j < ereignisAnzahl; j++ )
+            {
+                int typ;
+                d.lese( (char *)& typ, 4 );
+                s.schreibe( (char *)& typ, 4 );
+            }
+            for( int j = 0; j < bedingungAnzahl; j++ )
+                mr.writeAktion( mr.readAktion( d ), s );
+            for( int j = 0; j < aktionAnzahl; j++ )
+                mr.writeAktion( mr.readAktion( d ), s );
+            s.close();
+        }
+        // variable
+        pf = pfad.getText();
+        pf += "/variable/";
+        d.lese( (char *)&anz, 4 );
+        for( int i = 0; i < anz; i++ )
+        {
+            char len;
+            d.lese( (char *)& len, 1 );
+            char *name = new char[ (int)len + 1 ];
+            d.lese( name, len );
+            name[ (int)len ] = 0;
+            Text tmpPf = pf.getText();
+            tmpPf += name;
+            tmpPf += ".v";
+            delete[] name;
+            Datei s;
+            s.setDatei( tmpPf );
+            s.erstellen();
+            if( !s.open( Datei::Style::schreiben ) )
+            {
+                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim schreiben von ";
+                err += tmpPf;
+                err += ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                err += "\n";
+            }
+            char typ;
+            d.lese( &typ, 1 );
+            char def;
+            d.lese( &def, 1 );
+            s.schreibe( &typ, 1 );
+            s.schreibe( &def, 1 );
+            if( def )
+            {
+                if( typ == BOOLEAN || typ == TASTE )
+                {
+                    char v;
+                    d.lese( &v, 1 );
+                    s.schreibe( &v, 1 );
+                }
+                else if( typ == STRING || typ == RICHTUNG )
+                {
+                    char len;
+                    d.lese( (char *)& len, 1 );
+                    char *str = new char[ (int)len + 1 ];
+                    d.lese( str, len );
+                    s.schreibe( &len, 1 );
+                    s.schreibe( str, len );
+                    delete[] str;
+                }
+                else if( typ != NICHTS )
+                {
+                    int v;
+                    d.lese( (char *)&v, 4 );
+                    s.schreibe( (char *)&v, 4 );
+                }
+            }            
+            s.close();
+        }
+        d.close();
+    }
+    else
+    {
+        err = "Sitzung konnte nicht korrekt erstellt werden. Fehler beim lesen von ";
+        err += pf;
+        err += ". Fehler Code: " __FILE__ ":";
+        err += __LINE__;
+        pf = pfad.getText();
+        pf += "/empty.file";
+        DateiPfadErstellen( pf );
+        DateiRemove( pf );
+    }
+    if( !err.getLength() )
+        return 1;
+    else
+        return 0;
+}
+
+bool Editor::saveSitzung()
+{
+    Text pf = pfad.getText();
+    pf.remove( pf.getLength() - 6, pf.getLength() );
+    pf += "map/server/data_tmp.map";
+    Datei d;
+    d.setDatei( pf.getText() );
+    if( d.open( Datei::Style::schreiben ) )
+    {
+        pf = pfad.getText();
+        pf += "/resource";
+        Datei res;
+        res.setDatei( pf );
+        RCArray<Text> *resList = res.getDateiListe();
+        if( resList )
+        {
+            int anz = resList->getEintragAnzahl();
+            d.schreibe( (char *)& anz, 4 );
+            for( auto resPf = resList->getIterator(); resPf && resPf._; resPf++ )
+            {
+                Text tmp = pf.getText();
+                tmp += "/";
+                tmp += resPf->getText();
+                Datei r;
+                r.setDatei( tmp );
+                if( r.open( Datei::Style::lesen ) )
+                {
+                    int id = (int)* resPf;
+                    d.schreibe( (char *)& id, 4 );
+                    char b = 0;
+                    r.lese( &b, 1 );
+                    char *buffer = new char[ b + 1 ];
+                    buffer[ (int)b ] = 0;
+                    r.lese( buffer, b );
+                    d.schreibe( &b, 1 );
+                    d.schreibe( buffer, b );
+                    r.close();
+                }
+                else
+                {
+                    err = "Fehler beim Lesen von ";
+                    err += tmp.getText();
+                    err += ". Fehler Code: " __FILE__ ":";
+                    err += __LINE__;
+                    d.close();
+                    d.remove();
+                    resList->release();
+                    return 0;
+                }
+            }
+            resList->release();
+        }
+        else
+            d.schreibe( "\0\0\0\0", 4 );
+        pf = pfad.getText();
+        pf += "/size";
+        Datei s;
+        s.setDatei( pf.getText() );
+        if( s.open( Datei::Style::lesen ) )
+        {
+            __int64 size = 0;
+            s.lese( (char *)& size, 8 );
+            d.schreibe( (char *)& size, 8 );
+            s.close();
+        }
+        else
+        {
+            err = "Fehler beim Lesen von ";
+            err += pf.getText();
+            err = ". Fehler Code: " __FILE__ ":";
+            err += __LINE__;
+            d.close();
+            d.remove();
+            return 0;
+        }
+        pf = pfad.getText();
+        pf += "/objekt";
+        Datei obj;
+        obj.setDatei( pf );
+        RCArray<Text> *objList = obj.getDateiListe();
+        if( objList )
+        {
+            int anz = objList->getEintragAnzahl();
+            d.schreibe( (char *)& anz, 4 );
+            for( auto objPf = objList->getIterator(); objPf && objPf._; objPf++ )
+            {
+                Text tmp = pf.getText();
+                tmp += "/";
+                tmp += objPf->getText();
+                Datei r;
+                r.setDatei( tmp );
+                if( r.open( Datei::Style::lesen ) )
+                {
+                    ObjektStr objStr( &r );
+                    objStr.save( &d );
+                    r.close();
+                }
+                else
+                {
+                    err = "Fehler beim Lesen von ";
+                    err += tmp.getText();
+                    err = ". Fehler Code: " __FILE__ ":";
+                    err += __LINE__;
+                    d.close();
+                    d.remove();
+                    objList->release();
+                    return 0;
+                }
+            }
+            objList->release();
+        }
+        else
+            d.schreibe( "\0\0\0\0", 4 );
+        pf = pfad.getText();
+        pf += "/player";
+        Datei pl;
+        pl.setDatei( pf );
+        RCArray<Text> *plList = pl.getDateiListe();
+        if( !plList )
+        {
+            err = "Fehler beim Lesen von ";
+            err += pf.getText();
+            err = ". Fehler Code: " __FILE__ ":";
+            err += __LINE__;
+            d.close();
+            d.remove();
+            return 0;
+        }
+        for( auto plPf = plList->getIterator(); plPf && plPf._; plPf++ )
+        {
+            Text tmp = pf.getText();
+            tmp += "/";
+            tmp += plPf->getText();
+            Datei r;
+            r.setDatei( tmp );
+            if( r.open( Datei::Style::lesen ) )
+            {
+                SpielerStr spStr( &r );
+                spStr.save( &d );
+                r.close();
+            }
+            else
+            {
+                err = "Fehler beim Lesen von ";
+                err += tmp.getText();
+                err = ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                d.close();
+                d.remove();
+                plList->release();
+                return 0;
+            }
+        }
+        plList->release();
+        pf = pfad.getText();
+        pf += "/team";
+        Datei tm;
+        tm.setDatei( pf );
+        RCArray<Text> *tmList = tm.getDateiListe();
+        if( !tmList )
+        {
+            err = "Fehler beim Lesen von ";
+            err += pf.getText();
+            err = ". Fehler Code: " __FILE__ ":";
+            err += __LINE__;
+            d.close();
+            d.remove();
+            return 0;
+        }
+        for( auto tmPf = tmList->getIterator(); tmPf && tmPf._; tmPf++ )
+        {
+            Text tmp = pf.getText();
+            tmp += "/";
+            tmp += tmPf->getText();
+            Datei r;
+            r.setDatei( tmp );
+            if( r.open( Datei::Style::lesen ) )
+            {
+                TeamStr tStr( &r );
+                tStr.save( &d );
+                r.close();
+            }
+            else
+            {
+                err = "Fehler beim Lesen von ";
+                err += tmp.getText();
+                err = ". Fehler Code: " __FILE__ ":";
+                err += __LINE__;
+                d.close();
+                d.remove();
+                tmList->release();
+                return 0;
+            }
+        }
+        tmList->release();
+        pf = pfad.getText();
+        pf.remove( pf.getLength() - 6, pf.getLength() );
+        pf += "map/server/data.map";
+        d.close();
+        if( !DateiRemove( pf ) || !d.umbenennen( pf ) )
+        {
+            err = "Fehler beim Übernehmen der Änderungen. Fehler Code: " __FILE__ ":";
+            err += __LINE__;
+            return 0;
+        }
+    }
+    else
+    {
+        err = "Fehler beim Speichern der Änderungen (Server). Fehler Code: " __FILE__ ":";
+        err += __LINE__;
+        return 0;
+    }
+    pf = pfad.getText();
+    pf.remove( pf.getLength() - 6, pf.getLength() );
+    pf += "map/client/map/data/data.map";
+    Datei d2;
+    d2.setDatei( pf.getText() );
+    if( d2.open( Datei::Style::schreiben ) && d.open( Datei::Style::lesen ) )
+    {
+        __int64 size = d.getSize();
+        char *buffer = new char[ 2048 ];
+        while( size > 0 )
+        {
+            int len = (int)( size > 2048 ? 2048 : size );
+            d.lese( buffer, len );
+            d2.schreibe( buffer, len );
+            size -= len;
+        }
+        delete[] buffer;
+        d.close();
+        d2.close();
+    }
+    else
+    {
+        err = "Fehler beim Speichern der Änderungen (Client). Fehler Code: " __FILE__ ":";
+        err += __LINE__;
+        return 0;
+    }
+    DateiRemove( pfad.getText() );
+    return 1;
+}