#include "Editor.h" #include #include "STS.h" #include "KartenLeser.h" #include "Strukturen.h" // Inhalt der Editor Klasse aus Editor.h // Konstruktor Editor::Editor() : ReferenceCounter() {} // Destruktor Editor::~Editor() {} // nicht constant void Editor::setPfad(const 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(dynamic_cast(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(dynamic_cast(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(dynamic_cast(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(dynamic_cast(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(dynamic_cast(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(dynamic_cast(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 = (int)*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* list = d.getDateiListe(); int nId = 0; bool found = 0; do { nId++; found = 0; for (auto t : *list) { 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 const char* Editor::getLetzterFehler() const { return err; } // 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 = (int)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) { 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* objList = obj.getDateiListe(); if (objList) { int anz = objList->getEintragAnzahl(); d.schreibe((char*)&anz, 4); for (auto objPf : *objList) { 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) { 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) { 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; }