#include "Editor.h" #include #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 += "/object"; 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.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->sendeEncrypted( (char*)&o.pos.x, 4 ); k->sendeEncrypted( (char*)&o.pos.y, 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 ); 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->sendeEncrypted( (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; } 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 += "/object/"; 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 *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 += "/object"; Datei obj; obj.setDatei( pf ); RCArray *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 *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 *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; }