KarteEditor.cpp 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701
  1. #include "KarteEditor.h"
  2. #include <Datei.h>
  3. #include <DateiSystem.h>
  4. #include <Bild.h>
  5. #include <Zeit.h>
  6. #include "KsgsBeschreibung.h"
  7. #include "KsgsShopSeite.h"
  8. #include <unistd.h>
  9. #define Sleep( x ) usleep( (x) * 1000 )
  10. #include <dlfcn.h>
  11. #define LoadLibrary( x ) dlopen( (x), RTLD_LAZY )
  12. #define GetProcAddress dlsym
  13. #define FreeLibrary dlclose
  14. typedef ESEditorV* (*DllStart)();
  15. // Inhalt der KarteEditor Klasse aus KarteEditor.h
  16. // Konstruktor
  17. KarteEditor::KarteEditor(int id, EdSDatenbank* datenbank, const char* pf, InitDatei* zIni)
  18. : ReferenceCounter()
  19. {
  20. this->id = id;
  21. db = datenbank;
  22. ini = dynamic_cast<InitDatei*>(zIni->getThis());
  23. pfad = new Text(pf);
  24. pfad->append("/");
  25. pfad->append(id);
  26. if (!DateiExistiert(*pfad))
  27. { // Karte erstellen
  28. // Client Daten
  29. Text dn = pfad->getText();
  30. dn += "/live/map/client/titel.ltdb";
  31. LTDBDatei bilder;
  32. bilder.setDatei(dynamic_cast<Text*>(dn.getThis()));
  33. bilder.erstellen();
  34. Bild* bild = new Bild();
  35. bild->neuBild(200, 100, 0x00000000);
  36. bilder.speichern(0, dynamic_cast<Bild*>(bild->getThis()), new Text("titel"));
  37. dn = pfad->getText();
  38. dn += "/live/map/client/minimap.ltdb";
  39. bilder.setDatei(dynamic_cast<Text*>(dn.getThis()));
  40. bilder.erstellen();
  41. bild->neuBild(348, 348, 0x00000000);
  42. bilder.speichern(0, dynamic_cast<Bild*>(bild->getThis()), new Text("vorschau"));
  43. dn = pfad->getText();
  44. dn += "/live/map/client/ladebild.ltdb";
  45. bilder.setDatei(dynamic_cast<Text*>(dn.getThis()));
  46. bilder.erstellen();
  47. bild->neuBild(1300, 900, 0x00000000);
  48. bilder.speichern(0, bild, new Text("spielladen"));
  49. dn = pfad->getText();
  50. dn += "/live/map/client/beschreibung.ksgs";
  51. Datei d;
  52. d.setDatei(dn);
  53. d.erstellen();
  54. d.open(Datei::Style::schreiben);
  55. d.schreibe((char*)_neu_karte_ksgs_beschreibung, textLength(_neu_karte_ksgs_beschreibung));
  56. d.close();
  57. dn = pfad->getText();
  58. dn += "/live/map/client/map/data/data.sts";
  59. d.setDatei(dn);
  60. d.erstellen();
  61. d.open(Datei::Style::schreiben);
  62. int i = 0;
  63. d.schreibe((char*)&i, 4);
  64. d.schreibe((char*)&i, 4);
  65. d.close();
  66. // Shop Seite
  67. dn = pfad->getText();
  68. dn += "/live/shop/seite/seite.ksgs";
  69. d.setDatei(dn);
  70. d.erstellen();
  71. d.open(Datei::Style::schreiben);
  72. d.schreibe((char*)_neu_karte_ksgs_shop_seite, textLength(_neu_karte_ksgs_shop_seite));
  73. d.close();
  74. dn = pfad->getText();
  75. dn += "/live/shop/titelbg.ltdb";
  76. bilder.setDatei(dynamic_cast<Text*>(dn.getThis()));
  77. bilder.erstellen();
  78. bild->neuBild(200, 100, 0x00000000);
  79. bilder.speichern(0, dynamic_cast<Bild*>(bild->getThis()), new Text("auswbg.jpg"));
  80. // Server Daten
  81. dn = pfad->getText();
  82. dn += "/live/map/server/sts.ltgd";
  83. d.setDatei(dn);
  84. d.erstellen();
  85. d.open(Datei::Style::schreiben);
  86. i = 0;
  87. d.schreibe((char*)&i, 4);
  88. d.schreibe((char*)&i, 4);
  89. d.close();
  90. dn = pfad->getText();
  91. dn += "/live/map/server/...";
  92. }
  93. shop = new SSEditor(pfad->getText());
  94. beschreibung = new BeschreibungEditor(pfad->getText());
  95. teams = new TeamsEditor(id, pfad->getText(), dynamic_cast<EdSDatenbank*>(db->getThis()));
  96. dateien = new DateienEditor(pfad->getText(), zIni);
  97. editor = 0;
  98. editorDll = 0;
  99. fehler = "";
  100. }
  101. // Destruktor
  102. KarteEditor::~KarteEditor()
  103. {
  104. shop->release();
  105. beschreibung->release();
  106. teams->release();
  107. dateien->release();
  108. db->release();
  109. pfad->release();
  110. if (editor)
  111. editor->release();
  112. if (editorDll)
  113. FreeLibrary(editorDll);
  114. ini->release();
  115. }
  116. // private
  117. int KarteEditor::findeDateien(const char* pf, RCArray< Text >* pfad)
  118. {
  119. Datei d;
  120. d.setDatei(pf);
  121. if (d.existiert() && !d.istOrdner())
  122. {
  123. pfad->add(new Text(pf));
  124. return 1;
  125. }
  126. if (d.istOrdner())
  127. {
  128. RCArray< Text >* list = d.getDateiListe();
  129. int anz = list->getEintragAnzahl();
  130. int ret = 0;
  131. for (int i = 0; i < anz; i++)
  132. {
  133. Text p = pf;
  134. p += "/";
  135. p += list->z(i)->getText();
  136. ret += findeDateien(p, pfad);
  137. }
  138. list->release();
  139. return ret;
  140. }
  141. return 0;
  142. }
  143. // nicht constant
  144. bool KarteEditor::getAbbildListe(RCArray< Text >* name, RCArray< Zeit >* datum)
  145. {
  146. name->leeren();
  147. datum->leeren();
  148. Text pf = pfad->getText();
  149. pf += "/abbilder";
  150. Datei d;
  151. d.setDatei(pf);
  152. if (!d.existiert() || !d.istOrdner())
  153. return 1;
  154. RCArray< Text >* list = d.getDateiListe();
  155. if (!list)
  156. return 0;
  157. int anz = list->getEintragAnzahl();
  158. for (int i = 0; i < anz; i++)
  159. {
  160. Text p = pf.getText();
  161. p += "/";
  162. p += list->z(i)->getText();
  163. d.setDatei(p);
  164. Zeit* z = d.getLastChange();
  165. if (z)
  166. {
  167. name->add(list->get(i));
  168. datum->add(z);
  169. }
  170. }
  171. list->release();
  172. return 1;
  173. }
  174. int KarteEditor::getDateiUpdateListe(const char* p, RCArray< Text >* pfad)
  175. {
  176. pfad->leeren();
  177. Text pf = this->pfad->getText();
  178. pf += "/live/";
  179. pf += p;
  180. RCArray< Text >* list = new RCArray< Text >();
  181. int anz = findeDateien(pf, list);
  182. for (int i = 0; i < anz; i++)
  183. {
  184. list->z(i)->remove(pf.getText());
  185. pfad->add(list->get(i));
  186. }
  187. list->release();
  188. return anz;
  189. }
  190. bool KarteEditor::abbildErstellen(const char* name)
  191. {
  192. Text pf = pfad->getText();
  193. pf += "/abbilder/";
  194. pf += name;
  195. if (DateiExistiert(pf))
  196. {
  197. fehler = "Es existiert bereits ein Abbild mit diesem Namen. Du musst es vorher remove, oder einen anderen Namen angeben.";
  198. return 0;
  199. }
  200. Text live = pfad->getText();
  201. live += "/live";
  202. RCArray< Text >* list = new RCArray< Text >();
  203. int anz = findeDateien(live, list);
  204. bool ret = 1;
  205. for (int i = 0; i < anz; i++)
  206. {
  207. Datei alt;
  208. Datei neu;
  209. alt.setDatei(list->z(i)->getText());
  210. Text pfNeu = pf.getText();
  211. pfNeu += (list->z(i)->getText() + live.getLength());
  212. neu.setDatei(pfNeu);
  213. neu.erstellen();
  214. ret &= alt.open(Datei::Style::lesen);
  215. ret &= neu.open(Datei::Style::schreiben);
  216. __int64 size = alt.getSize();
  217. char* buffer = new char[2048];
  218. while (size > 0)
  219. {
  220. int l = size > 2048 ? 2048 : (int)size;
  221. alt.lese(buffer, l);
  222. neu.schreibe(buffer, l);
  223. size -= l;
  224. }
  225. delete[] buffer;
  226. alt.close();
  227. neu.close();
  228. }
  229. list->release();
  230. if (!ret)
  231. {
  232. DateiRemove(pf);
  233. fehler = "Es ist ein Fehler beim Lesen oder Schreiben einer Datei aufgetreten.";
  234. }
  235. return ret;
  236. }
  237. bool KarteEditor::abbildRemove(const char* name)
  238. {
  239. Text pf = pfad->getText();
  240. pf += "/abbilder/";
  241. pf += name;
  242. if (!DateiRemove(pf))
  243. {
  244. fehler = "Es ist ein Fehler beim Löschen des Abbildes aufgetreten.";
  245. return 0;
  246. }
  247. return 1;
  248. }
  249. bool KarteEditor::abbildHerstellen(const char* name)
  250. {
  251. if (inUpdate())
  252. {
  253. fehler = "Die Karte wird momentan aktualisiert. Bitte haben sie Geduld, bis dieser Vorgang abgeschlossen ist.";
  254. return 0;
  255. }
  256. Text pf = pfad->getText();
  257. pf += "/abbilder/";
  258. pf += name;
  259. if (!DateiExistiert(pf))
  260. {
  261. fehler = "Es existiert kein Abbild mit dem angegebenen Namen.";
  262. return 0;
  263. }
  264. Text live = pfad->getText();
  265. live += "/live";
  266. if (!DateiRemove(live))
  267. {
  268. fehler = "Es ist ein Fehler beim Löschen der aktuellen Version aufgetreten.";
  269. return 0;
  270. }
  271. RCArray< Text >* list = new RCArray< Text >();
  272. int anz = findeDateien(pf, list);
  273. bool ret = 1;
  274. for (int i = 0; i < anz; i++)
  275. {
  276. Datei alt;
  277. Datei neu;
  278. alt.setDatei(list->z(i)->getText());
  279. Text pfNeu = live.getText();
  280. pfNeu += (list->z(i)->getText() + pf.getLength());
  281. neu.setDatei(pfNeu);
  282. neu.erstellen();
  283. ret |= alt.open(Datei::Style::lesen);
  284. ret |= neu.open(Datei::Style::schreiben);
  285. __int64 size = alt.getSize();
  286. char* buffer = new char[2048];
  287. while (size > 0)
  288. {
  289. int l = size > 2048 ? 2048 : (int)size;
  290. alt.lese(buffer, l);
  291. neu.schreibe(buffer, l);
  292. size -= l;
  293. }
  294. delete[] buffer;
  295. alt.close();
  296. neu.close();
  297. }
  298. list->release();
  299. if (!ret)
  300. {
  301. DateiRemove(pf);
  302. fehler = "Es ist ein Fehler beim Lesen oder Schreiben einer Datei aufgetreten.";
  303. }
  304. return ret;
  305. }
  306. bool KarteEditor::startUpdate()
  307. {
  308. if (inUpdate())
  309. {
  310. fehler = "Die Karte wird momentan aktualisiert. Bitte haben sie Geduld, bis dieser Vorgang abgeschlossen ist.";
  311. return 0;
  312. }
  313. if (!db->startKarteUpdate(id))
  314. {
  315. Text* t = db->getLetzterFehler();
  316. fehler = t->getText();
  317. t->release();
  318. return 0;
  319. }
  320. return 1;
  321. }
  322. bool KarteEditor::startShopUpdate()
  323. {
  324. if (!db->startShopUpdate(id))
  325. {
  326. Text* t = db->getLetzterFehler();
  327. fehler = t->getText();
  328. t->release();
  329. return 0;
  330. }
  331. return 1;
  332. }
  333. bool KarteEditor::prozessMessage(SKlient* zKlient)
  334. {
  335. char message = 0;
  336. zKlient->getNachrichtEncrypted(&message, 1);
  337. switch (message)
  338. {
  339. case 0x1: // Abbild Erstellen
  340. {
  341. zKlient->sendeEncrypted("\1", 1);
  342. unsigned char l = 0;
  343. zKlient->getNachrichtEncrypted((char*)&l, 1);
  344. char* name = new char[l + 1];
  345. name[(int)l] = 0;
  346. if (l)
  347. zKlient->getNachrichtEncrypted(name, l);
  348. if (!textLength(name))
  349. {
  350. delete[] name;
  351. fehler = "Du musst einen Namen angeben.";
  352. return 0;
  353. }
  354. if (!abbildErstellen(name))
  355. {
  356. delete[] name;
  357. return 0;
  358. }
  359. delete[] name;
  360. zKlient->sendeEncrypted("\1", 1);
  361. return 1;
  362. }
  363. case 0x2: // Abbild Löschen
  364. {
  365. zKlient->sendeEncrypted("\1", 1);
  366. unsigned char l = 0;
  367. zKlient->getNachrichtEncrypted((char*)&l, 1);
  368. char* name = new char[l + 1];
  369. name[(int)l] = 0;
  370. if (l)
  371. zKlient->getNachrichtEncrypted(name, l);
  372. if (!textLength(name))
  373. {
  374. delete[] name;
  375. fehler = "Du musst einen Namen angeben.";
  376. return 0;
  377. }
  378. if (!abbildRemove(name))
  379. {
  380. delete[] name;
  381. return 0;
  382. }
  383. delete[] name;
  384. zKlient->sendeEncrypted("\1", 1);
  385. return 1;
  386. }
  387. case 0x3: // Abbild Herstellen
  388. {
  389. zKlient->sendeEncrypted("\1", 1);
  390. unsigned char l = 0;
  391. zKlient->getNachrichtEncrypted((char*)&l, 1);
  392. char* name = new char[l + 1];
  393. name[(int)l] = 0;
  394. if (l)
  395. zKlient->getNachrichtEncrypted(name, l);
  396. if (!textLength(name))
  397. {
  398. delete[] name;
  399. fehler = "Du musst einen Namen angeben.";
  400. return 0;
  401. }
  402. if (!abbildHerstellen(name))
  403. {
  404. delete[] name;
  405. return 0;
  406. }
  407. delete[] name;
  408. zKlient->sendeEncrypted("\1", 1);
  409. return 1;
  410. }
  411. case 0x4: // Karte Veröffentlichen
  412. {
  413. zKlient->sendeEncrypted("\1", 1);
  414. if (!startUpdate())
  415. return 0;
  416. else
  417. zKlient->sendeEncrypted("\1", 1);
  418. return 1;
  419. }
  420. case 0x5: // get Abbild Liste
  421. {
  422. zKlient->sendeEncrypted("\1", 1);
  423. RCArray< Text >* name = new RCArray< Text >();
  424. RCArray< Zeit >* datum = new RCArray< Zeit >();
  425. getAbbildListe(name, datum);
  426. int anz = name->getEintragAnzahl();
  427. zKlient->sendeEncrypted((char*)&anz, 4);
  428. for (int i = 0; i < anz; i++)
  429. {
  430. Text n = name->z(i)->getText();
  431. char len = (char)n.getLength();
  432. zKlient->sendeEncrypted(&len, 1);
  433. zKlient->sendeEncrypted(n, len);
  434. int d = datum->z(i)->zDatum()->getJahr();
  435. zKlient->sendeEncrypted((char*)&d, 4);
  436. d = datum->z(i)->zDatum()->getMonat();
  437. zKlient->sendeEncrypted((char*)&d, 4);
  438. d = datum->z(i)->zDatum()->getTag();
  439. zKlient->sendeEncrypted((char*)&d, 4);
  440. d = datum->z(i)->zUhrzeit()->getStunde();
  441. zKlient->sendeEncrypted((char*)&d, 4);
  442. d = datum->z(i)->zUhrzeit()->getMinute();
  443. zKlient->sendeEncrypted((char*)&d, 4);
  444. d = datum->z(i)->zUhrzeit()->getSekunde();
  445. zKlient->sendeEncrypted((char*)&d, 4);
  446. }
  447. name->release();
  448. datum->release();
  449. return 1;
  450. }
  451. case 0x6: // Shop Seite Veröffentlichen
  452. {
  453. zKlient->sendeEncrypted("\1", 1);
  454. if (!startShopUpdate())
  455. return 0;
  456. else
  457. zKlient->sendeEncrypted("\1", 1);
  458. return 1;
  459. }
  460. case 0x7: // Shop Seite Nachricht
  461. {
  462. zKlient->sendeEncrypted("\1", 1);
  463. if (!shop->prozessMessage(zKlient))
  464. fehler = shop->getLetzterFehler();
  465. else
  466. return 1;
  467. return 0;
  468. }
  469. case 0x8: // Shop Seite herunterladen
  470. {
  471. zKlient->sendeEncrypted("\1", 1);
  472. RCArray< Text >* list = new RCArray< Text >();
  473. Text pf = pfad->getText();
  474. pf += "/live/shop";
  475. int anz = findeDateien(pf, list);
  476. zKlient->sendeEncrypted((char*)&anz, 4);
  477. for (int i = 0; i < anz; i++)
  478. {
  479. Text p = list->z(i)->getText();
  480. char l = (char)(p.getLength() - pf.getLength());
  481. zKlient->sendeEncrypted(&l, 1);
  482. zKlient->sendeEncrypted(p + pf.getLength(), l);
  483. Datei d;
  484. d.setDatei(p);
  485. __int64 size = d.getSize();
  486. zKlient->sendeEncrypted((char*)&size, 8);
  487. d.open(Datei::Style::lesen);
  488. char* buffer = new char[2048];
  489. while (size > 0)
  490. {
  491. int l = size > 2048 ? 2048 : (int)size;
  492. d.lese(buffer, l);
  493. zKlient->sende(buffer, l);
  494. size -= l;
  495. }
  496. delete[] buffer;
  497. d.close();
  498. }
  499. list->release();
  500. return 1;
  501. }
  502. case 0x9: // Shop Daten laden
  503. {
  504. int es = 0, tp = 0, vp = 0;
  505. if (!db->getKarteShopDaten(id, es, tp, vp))
  506. {
  507. fehler = "Fehler beim laden der Shop Informationen.";
  508. return 0;
  509. }
  510. zKlient->sendeEncrypted("\1", 1);
  511. zKlient->sendeEncrypted((char*)&es, 4);
  512. zKlient->sendeEncrypted((char*)&tp, 4);
  513. zKlient->sendeEncrypted((char*)&vp, 4);
  514. return 1;
  515. }
  516. case 0xA: // Set Shop Daten
  517. {
  518. zKlient->sendeEncrypted("\1", 1);
  519. int es = 0, tp = 0, vp = 0;
  520. zKlient->getNachrichtEncrypted((char*)&es, 4);
  521. zKlient->getNachrichtEncrypted((char*)&tp, 4);
  522. zKlient->getNachrichtEncrypted((char*)&vp, 4);
  523. if (db->setKarteShopDaten(id, es, tp, vp))
  524. {
  525. zKlient->sendeEncrypted("\1", 1);
  526. return 1;
  527. }
  528. fehler = "Fehler beim setzen der Shop Werte.";
  529. return 0;
  530. }
  531. case 0xB: // Beschreibung Nachricht
  532. {
  533. zKlient->sendeEncrypted("\1", 1);
  534. if (!beschreibung->prozessMessage(zKlient))
  535. fehler = beschreibung->getLetzterFehler();
  536. else
  537. return 1;
  538. return 0;
  539. }
  540. case 0xC: // Teams Nachricht
  541. {
  542. zKlient->sendeEncrypted("\1", 1);
  543. if (!teams->prozessMessage(zKlient))
  544. fehler = teams->getLetzterFehler();
  545. else
  546. return 1;
  547. return 0;
  548. }
  549. case 0xD: // Dateien Nachicht
  550. {
  551. zKlient->sendeEncrypted("\1", 1);
  552. if (!dateien->prozessMessage(zKlient))
  553. fehler = dateien->getLetzterFehler();
  554. else
  555. return 1;
  556. return 0;
  557. }
  558. case 0xE: // Init Editor
  559. {
  560. if (editorDll)
  561. {
  562. if (editor)
  563. editor = (ESEditorV*)editor->release();
  564. FreeLibrary(editorDll);
  565. }
  566. if (!ini->wertExistiert("SpielePfad"))
  567. {
  568. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  569. fehler += __LINE__;
  570. return 0;
  571. }
  572. Text pf = ini->zWert("SpielePfad")->getText();
  573. pf += "/";
  574. int said = db->getSpielArtId(id);
  575. if (!said)
  576. {
  577. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  578. fehler += __LINE__;
  579. return 0;
  580. }
  581. pf += said;
  582. pf += "/bin/game";
  583. pf += ".so";
  584. editorDll = LoadLibrary(pf.getText());
  585. if (!editorDll)
  586. {
  587. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  588. fehler += __LINE__;
  589. return 0;
  590. }
  591. DllStart getEditorKlasse = (DllStart)GetProcAddress(editorDll, "getEditorKlasse");
  592. if (!getEditorKlasse)
  593. {
  594. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  595. fehler += __LINE__;
  596. FreeLibrary(editorDll);
  597. editorDll = 0;
  598. return 0;
  599. }
  600. editor = getEditorKlasse();
  601. if (!editor)
  602. {
  603. fehler = "Diese Option ist noch nicht verfügbar. Error Code: " __FILE__ ":";
  604. fehler += __LINE__;
  605. FreeLibrary(editorDll);
  606. editorDll = 0;
  607. return 0;
  608. }
  609. zKlient->sendeEncrypted("\1", 1);
  610. Text p = pfad->getText();
  611. p += "/live";
  612. editor->setPfad(p);
  613. editor->open();
  614. return 1;
  615. }
  616. case 0xF:
  617. { // Editor Nachricht
  618. if (!editor)
  619. {
  620. fehler = "Der Editor wurde nicht initialisiert. Error Code: " __FILE__ ":";
  621. fehler += __LINE__;
  622. editorDll = 0;
  623. return 0;
  624. }
  625. zKlient->sendeEncrypted("\1", 1);
  626. if (!editor->nachricht(zKlient))
  627. fehler = editor->getLetzterFehler();
  628. else
  629. return 1;
  630. return 0;
  631. }
  632. case 0x10:
  633. { // Get Verkauf Statistik
  634. Array< int > einkommen;
  635. Array< int > verkauft;
  636. Array< int > spiele;
  637. if (db->getLast30DaysIncomeStatistik(id, &einkommen, &verkauft) && db->getLast30DaysSpielStatistik(id, &spiele))
  638. {
  639. zKlient->sendeEncrypted("\1", 1);
  640. int kaufAnz = db->getKaufAnz(id);
  641. zKlient->sendeEncrypted((char*)&kaufAnz, 4);
  642. char anz = (char)einkommen.getEintragAnzahl();
  643. zKlient->sendeEncrypted(&anz, 1);
  644. for (int i = 0; i < anz; i++)
  645. {
  646. int kupfer = einkommen.get(i);
  647. int kauf = verkauft.get(i);
  648. int games = spiele.get(i);
  649. zKlient->sendeEncrypted((char*)&kupfer, 4);
  650. zKlient->sendeEncrypted((char*)&kauf, 4);
  651. zKlient->sendeEncrypted((char*)&games, 4);
  652. }
  653. return 1;
  654. }
  655. fehler = "Die Statistik konnte nicht erstellt werden.";
  656. return 0;
  657. }
  658. default:
  659. fehler = "Unbekannte Nachricht. Eventuell ist der Client nicht auf dem neusten Stand.";
  660. }
  661. return 0;
  662. }
  663. void KarteEditor::removeError()
  664. {
  665. fehler = "";
  666. }
  667. // constant
  668. bool KarteEditor::inUpdate() const
  669. {
  670. return db->istKarteInUpdate(id);
  671. }
  672. bool KarteEditor::istOk() const
  673. {
  674. return fehler.getLength() == 0;
  675. }
  676. const char* KarteEditor::getLetzterFehler() const
  677. {
  678. return fehler;
  679. }
  680. const char* KarteEditor::getPfad() const
  681. {
  682. return pfad->getText();
  683. }