#include "Editor.h"
#include <Datei.h>
#include "STS.h"
#include "KartenLeser.h"
#include "Strukturen.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/data.map";
    Datei d;
    d.setDatei( pf.getText() );
    if( d.open( Datei::Style::lesen ) )
    {
        pf = pfad.getText();
        pf += "/resource/";
        int rAnz = 0;
        d.lese( (char *)& rAnz, 4 );
        for( int i = 0; i < rAnz; i++ )
        {
            int id = 0;
            d.lese( (char *)& id, 4 );
            Text tmpPf = pf.getText();
            tmpPf += id;
            tmpPf += ".r";
            char len = 0;
            d.lese( &len, 1 );
            char *path = new char[ len + 1 ];
            path[ (int)len ] = 0;
            d.lese( path, len );
            Datei r;
            r.setDatei( tmpPf );
            r.erstellen();
            if( !r.open( Datei::Style::schreiben ) )
            {
                err += "Sitzung konnte nicht korrekt erstellt werden. Fehler beim lesen von ";
                err += tmpPf;
                err += ". Fehler Code: " __FILE__ ":";
                err += __LINE__;
                err += "\n";
            }
            r.schreibe( &len, 1 );
            r.schreibe( path, len );
            r.close();
            delete[] path;
        }
        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();
        int objAnz = 0;
        d.lese( (char *)& objAnz, 4 );
        for( int i = 0; i < objAnz; i++ )
        {
            ObjektStr objStr( &d );
            Text tmpPf = pfad.getText();
            tmpPf += "/objekt/";
            tmpPf += objStr.id;
            tmpPf += ".o";
            Datei obj;
            obj.setDatei( tmpPf.getText() );
            obj.erstellen();
            if( !obj.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";
            }
            objStr.save( &obj );
            obj.close();
        }
        SpielerTeamStruktur *sts = new SpielerTeamStruktur();
        Text tmp = pfad.getText();
        pf.remove( pf.getLength() - 12, pf.getLength() );
        tmp.remove( 0, tmp.positionVon( '/', tmp.anzahlVon( '/' ) ) );
        int kartenId = tmp;
        tmp = pfad.getText();
        tmp.remove( tmp.getLength() - 6, tmp.getLength() );
        tmp += "map/server/";
        KartenLeser *stsReader = new KartenLeser( kartenId, 0, tmp );
        stsReader->ladeSpielerTeamStruktur( sts );
        stsReader->release();
        for( int i = 0; i < sts->spielerAnzahl; i++ )
        {
            SpielerStr spStr( &d );
            Text tmpPf = pfad.getText();
            tmpPf += "/player/";
            tmpPf += spStr.id;
            tmpPf += ".p";
            Datei pl;
            pl.setDatei( tmpPf.getText() );
            pl.erstellen();
            if( !pl.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";
            }
            spStr.save( &pl );
            pl.close();
        }
        for( int i = 0; i < sts->teamAnzahl; i++ )
        {
            TeamStr tStr( &d );
            Text tmpPf = pfad.getText();
            tmpPf += "/team/";
            tmpPf += tStr.id;
            tmpPf += ".t";
            Datei pl;
            pl.setDatei( tmpPf.getText() );
            pl.erstellen();
            if( !pl.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";
            }
            tStr.save( &pl );
            pl.close();
        }
        sts->release();
        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;
}
