EditorKlient.cpp 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500
  1. #include "EditorKlient.h"
  2. #include <Klient.h>
  3. #include "../Karte/EditorKarte.h"
  4. using namespace Network;
  5. using namespace Editor;
  6. SpielerTeamStruktur::SpielerTeamStruktur()
  7. {
  8. spielerAnzahl = 0;
  9. teamAnzahl = 0;
  10. spielerFarbe = new Array< int >();
  11. teamFarbe = new Array< int >();
  12. teamName = new RCArray< Text >();
  13. teamSize = new Array< int >();
  14. ref = 1;
  15. }
  16. SpielerTeamStruktur::~SpielerTeamStruktur()
  17. {
  18. spielerFarbe->release();
  19. teamFarbe->release();
  20. teamName->release();
  21. teamSize->release();
  22. }
  23. SpielerTeamStrukturV *SpielerTeamStruktur::getThis()
  24. {
  25. ref++;
  26. return this;
  27. }
  28. SpielerTeamStrukturV *SpielerTeamStruktur::release()
  29. {
  30. ref--;
  31. if( !ref )
  32. delete this;
  33. return 0;
  34. }
  35. // Inhalt der EditorKlient Klasse aus EditorKlient.h
  36. // Konstruktor
  37. // k: Der zu verwendende Klient
  38. EditorKlient::EditorKlient( KSGClient::EditorServerClient *k )
  39. {
  40. klient = k;
  41. ref = 1;
  42. }
  43. // Destruktor
  44. EditorKlient::~EditorKlient()
  45. {
  46. klient->release();
  47. }
  48. // Initialisiert den Server
  49. // return: 1, falls erfolgreich
  50. // 2, falls bereits eine Sitzung existiert
  51. // 0, sonnst
  52. int EditorKlient::init()
  53. {
  54. Network::Klient *k = klient->beginEditorMessage();
  55. if( !k )
  56. {
  57. error = klient->getLetzterFehler();
  58. return 0;
  59. }
  60. error = "";
  61. k->sendeEncrypted( "\x0", 1 );
  62. char ret;
  63. k->getNachrichtEncrypted( &ret, 1 );
  64. if( ret == 1 )
  65. k->getNachrichtEncrypted( &ret, 1 );
  66. if( ret == 3 )
  67. {
  68. unsigned char l = 0;
  69. k->getNachrichtEncrypted( (char*)&l, 1 );
  70. char *err = new char[ l + 1 ];
  71. err[ l ] = 0;
  72. k->getNachrichtEncrypted( err, l );
  73. error = err;
  74. delete[] err;
  75. ret = 0;
  76. }
  77. klient->endEditorMessage();
  78. return ret;
  79. }
  80. // Verwirft die vorhandene Sitzung und erstellt eine neue
  81. bool EditorKlient::sitzungVerwerfen()
  82. {
  83. Network::Klient *k = klient->beginEditorMessage();
  84. if( !k )
  85. {
  86. error = klient->getLetzterFehler();
  87. return 0;
  88. }
  89. error = "";
  90. char ret;
  91. k->sendeEncrypted( "\x1", 1 );
  92. k->getNachrichtEncrypted( &ret, 1 );
  93. if( ret == 3 )
  94. {
  95. unsigned char l = 0;
  96. k->getNachrichtEncrypted( (char*)&l, 1 );
  97. char *err = new char[ l + 1 ];
  98. err[ l ] = 0;
  99. k->getNachrichtEncrypted( err, l );
  100. error = err;
  101. delete[] err;
  102. ret = 0;
  103. }
  104. klient->endEditorMessage();
  105. return ret == 1;
  106. }
  107. // Speichert Sitzung und beendet Editor
  108. bool EditorKlient::sitzungBeenden()
  109. {
  110. Network::Klient *k = klient->beginEditorMessage();
  111. if( !k )
  112. {
  113. error = klient->getLetzterFehler();
  114. return 0;
  115. }
  116. error = "";
  117. char ret;
  118. k->sendeEncrypted( "\x2", 1 );
  119. k->getNachrichtEncrypted( &ret, 1 );
  120. if( ret == 3 )
  121. {
  122. unsigned char l = 0;
  123. k->getNachrichtEncrypted( (char*)&l, 1 );
  124. char *err = new char[ l + 1 ];
  125. err[ l ] = 0;
  126. k->getNachrichtEncrypted( err, l );
  127. error = err;
  128. delete[] err;
  129. ret = 0;
  130. }
  131. klient->endEditorMessage();
  132. return ret == 1;
  133. }
  134. bool EditorKlient::saveTeam( const TeamDaten *team )
  135. {
  136. Network::Klient *k = klient->beginEditorMessage();
  137. if( !k )
  138. {
  139. error = klient->getLetzterFehler();
  140. return 0;
  141. }
  142. error = "";
  143. char ret;
  144. k->sendeEncrypted( "\x7", 1 );
  145. k->getNachrichtEncrypted( &ret, 1 );
  146. if( ret == 1 )
  147. {
  148. k->sendeEncrypted( (char*)&team->id, 4 );
  149. k->sendeEncrypted( (char*)&team->maxPunkte, 4 );
  150. k->sendeEncrypted( (char*)&team->beschleunigung, 8 );
  151. k->sendeEncrypted( (char*)&team->maxStabilität, 4 );
  152. k->sendeEncrypted( (char*)&team->maxEnergie, 4 );
  153. k->sendeEncrypted( (char*)&team->reparatur, 8 );
  154. k->sendeEncrypted( (char*)&team->akkuLeistung, 8 );
  155. k->sendeEncrypted( (char*)&team->laserIntensität, 4 );
  156. k->sendeEncrypted( (char*)&team->laserEffizienz, 4 );
  157. k->sendeEncrypted( (char*)&team->laserTempo, 4 );
  158. k->sendeEncrypted( (char*)&team->wendigkeit, 8 );
  159. k->sendeEncrypted( (char*)&team->antriebEffizienz, 8 );
  160. k->sendeEncrypted( (char*)&team->energieSchild, 8 );
  161. k->sendeEncrypted( (char*)&team->energieSchildEffizienz, 8 );
  162. k->sendeEncrypted( (char*)&team->punkte, 4 );
  163. k->getNachrichtEncrypted( &ret, 1 );
  164. }
  165. if( ret == 3 )
  166. {
  167. unsigned char l = 0;
  168. k->getNachrichtEncrypted( (char*)&l, 1 );
  169. char *err = new char[ l + 1 ];
  170. err[ l ] = 0;
  171. k->getNachrichtEncrypted( err, l );
  172. error = err;
  173. delete[] err;
  174. ret = 0;
  175. }
  176. klient->endEditorMessage();
  177. return ret == 1;
  178. }
  179. bool EditorKlient::saveSpieler( const SpielerDaten *spieler )
  180. {
  181. Network::Klient *k = klient->beginEditorMessage();
  182. if( !k )
  183. {
  184. error = klient->getLetzterFehler();
  185. return 0;
  186. }
  187. error = "";
  188. char ret;
  189. k->sendeEncrypted( "\x6", 1 );
  190. k->getNachrichtEncrypted( &ret, 1 );
  191. if( ret == 1 )
  192. {
  193. k->sendeEncrypted( (char*)&spieler->id, 4 );
  194. k->sendeEncrypted( (char*)&spieler->pos.x, 4 );
  195. k->sendeEncrypted( (char*)&spieler->pos.y, 4 );
  196. k->sendeEncrypted( (char*)&spieler->rot, 8 );
  197. k->sendeEncrypted( (char*)&spieler->beschleunigung, 8 );
  198. k->sendeEncrypted( (char*)&spieler->maxStabilität, 4 );
  199. k->sendeEncrypted( (char*)&spieler->maxEnergie, 4 );
  200. k->sendeEncrypted( (char*)&spieler->reparatur, 8 );
  201. k->sendeEncrypted( (char*)&spieler->akkuLeistung, 8 );
  202. k->sendeEncrypted( (char*)&spieler->laserIntensität, 4 );
  203. k->sendeEncrypted( (char*)&spieler->laserEffizienz, 4 );
  204. k->sendeEncrypted( (char*)&spieler->laserTempo, 4 );
  205. k->sendeEncrypted( (char*)&spieler->wendigkeit, 8 );
  206. k->sendeEncrypted( (char*)&spieler->antriebEffizienz, 8 );
  207. k->sendeEncrypted( (char*)&spieler->energieSchild, 8 );
  208. k->sendeEncrypted( (char*)&spieler->energieSchildEffizienz, 8 );
  209. k->sendeEncrypted( (char*)&spieler->netzwerk, 4 );
  210. k->sendeEncrypted( (char*)&spieler->skillPunkte, 4 );
  211. k->sendeEncrypted( (char*)&spieler->m2d, 4 );
  212. k->sendeEncrypted( (char*)&spieler->bild, 4 );
  213. k->getNachrichtEncrypted( &ret, 1 );
  214. }
  215. if( ret == 3 )
  216. {
  217. unsigned char l = 0;
  218. k->getNachrichtEncrypted( (char*)&l, 1 );
  219. char *err = new char[ l + 1 ];
  220. err[ l ] = 0;
  221. k->getNachrichtEncrypted( err, l );
  222. error = err;
  223. delete[] err;
  224. ret = 0;
  225. }
  226. klient->endEditorMessage();
  227. return ret == 1;
  228. }
  229. bool EditorKlient::saveObjekt( const ObjektDaten *objekt )
  230. {
  231. Network::Klient *k = klient->beginEditorMessage();
  232. if( !k )
  233. {
  234. error = klient->getLetzterFehler();
  235. return 0;
  236. }
  237. error = "";
  238. char ret;
  239. k->sendeEncrypted( "\x8", 1 );
  240. k->getNachrichtEncrypted( &ret, 1 );
  241. if( ret == 1 )
  242. {
  243. k->sendeEncrypted( (char*)&objekt->pos.x, 4 );
  244. k->sendeEncrypted( (char*)&objekt->pos.y, 4 );
  245. k->sendeEncrypted( (char*)&objekt->id, 4 );
  246. k->sendeEncrypted( (char*)&objekt->m2d, 4 );
  247. k->sendeEncrypted( (char*)&objekt->bild, 4 );
  248. k->sendeEncrypted( (char*)&objekt->style, 4 );
  249. k->sendeEncrypted( (char*)&objekt->maxStabilität, 4 );
  250. k->sendeEncrypted( (char*)&objekt->maxEnergie, 4 );
  251. k->sendeEncrypted( (char*)&objekt->energieRadius, 4 );
  252. k->sendeEncrypted( (char*)&objekt->reparatur, 8 );
  253. k->sendeEncrypted( (char*)&objekt->akkuLeistung, 8 );
  254. k->sendeEncrypted( (char*)&objekt->team, 1 );
  255. k->getNachrichtEncrypted( &ret, 1 );
  256. }
  257. if( ret == 3 )
  258. {
  259. unsigned char l = 0;
  260. k->getNachrichtEncrypted( (char*)&l, 1 );
  261. char *err = new char[ l + 1 ];
  262. err[ l ] = 0;
  263. k->getNachrichtEncrypted( err, l );
  264. error = err;
  265. delete[] err;
  266. ret = 0;
  267. }
  268. klient->endEditorMessage();
  269. return ret == 1;
  270. }
  271. bool EditorKlient::deleteObjekt( int id )
  272. {
  273. Network::Klient *k = klient->beginEditorMessage();
  274. if( !k )
  275. {
  276. error = klient->getLetzterFehler();
  277. return 0;
  278. }
  279. error = "";
  280. char ret;
  281. k->sendeEncrypted( "\x9", 1 );
  282. k->getNachrichtEncrypted( &ret, 1 );
  283. if( ret == 1 )
  284. {
  285. k->sendeEncrypted( (char*)&id, 4 );
  286. k->getNachrichtEncrypted( &ret, 1 );
  287. }
  288. if( ret == 3 )
  289. {
  290. unsigned char l = 0;
  291. k->getNachrichtEncrypted( (char*)&l, 1 );
  292. char *err = new char[ l + 1 ];
  293. err[ l ] = 0;
  294. k->getNachrichtEncrypted( err, l );
  295. error = err;
  296. delete[] err;
  297. ret = 0;
  298. }
  299. klient->endEditorMessage();
  300. return ret == 1;
  301. }
  302. bool EditorKlient::loadSpieler( Array< SpielerDaten* > &spieler )
  303. {
  304. Network::Klient *k = klient->beginEditorMessage();
  305. if( !k )
  306. {
  307. error = klient->getLetzterFehler();
  308. return 0;
  309. }
  310. error = "";
  311. char ret;
  312. k->sendeEncrypted( "\x3", 1 );
  313. k->getNachrichtEncrypted( &ret, 1 );
  314. if( ret == 1 )
  315. {
  316. int anz = 0;
  317. k->getNachrichtEncrypted( (char*)&anz, 4 );
  318. for( int i = 0; i < anz; i++ )
  319. {
  320. SpielerDaten *player = new SpielerDaten();
  321. k->getNachrichtEncrypted( (char*)&player->id, 4 );
  322. k->getNachrichtEncrypted( (char*)&player->pos.x, 4 );
  323. k->getNachrichtEncrypted( (char*)&player->pos.y, 4 );
  324. k->getNachrichtEncrypted( (char*)&player->rot, 8 );
  325. k->getNachrichtEncrypted( (char*)&player->beschleunigung, 8 );
  326. k->getNachrichtEncrypted( (char*)&player->maxStabilität, 4 );
  327. k->getNachrichtEncrypted( (char*)&player->maxEnergie, 4 );
  328. k->getNachrichtEncrypted( (char*)&player->reparatur, 8 );
  329. k->getNachrichtEncrypted( (char*)&player->akkuLeistung, 8 );
  330. k->getNachrichtEncrypted( (char*)&player->laserIntensität, 4 );
  331. k->getNachrichtEncrypted( (char*)&player->laserEffizienz, 4 );
  332. k->getNachrichtEncrypted( (char*)&player->laserTempo, 4 );
  333. k->getNachrichtEncrypted( (char*)&player->wendigkeit, 8 );
  334. k->getNachrichtEncrypted( (char*)&player->antriebEffizienz, 8 );
  335. k->getNachrichtEncrypted( (char*)&player->energieSchild, 8 );
  336. k->getNachrichtEncrypted( (char*)&player->energieSchildEffizienz, 8 );
  337. k->getNachrichtEncrypted( (char*)&player->netzwerk, 4 );
  338. k->getNachrichtEncrypted( (char*)&player->skillPunkte, 4 );
  339. k->getNachrichtEncrypted( (char*)&player->m2d, 4 );
  340. k->getNachrichtEncrypted( (char*)&player->bild, 4 );
  341. spieler.add( player );
  342. }
  343. }
  344. if( ret == 3 )
  345. {
  346. unsigned char l = 0;
  347. k->getNachrichtEncrypted( (char*)&l, 1 );
  348. char *err = new char[ l + 1 ];
  349. err[ l ] = 0;
  350. k->getNachrichtEncrypted( err, l );
  351. error = err;
  352. delete[] err;
  353. ret = 0;
  354. }
  355. klient->endEditorMessage();
  356. return ret == 1;
  357. }
  358. bool EditorKlient::loadTeams( Array< TeamDaten* > &teams )
  359. {
  360. Network::Klient *k = klient->beginEditorMessage();
  361. if( !k )
  362. {
  363. error = klient->getLetzterFehler();
  364. return 0;
  365. }
  366. error = "";
  367. char ret;
  368. k->sendeEncrypted( "\x4", 1 );
  369. k->getNachrichtEncrypted( &ret, 1 );
  370. if( ret == 1 )
  371. {
  372. int anz = 0;
  373. k->getNachrichtEncrypted( (char*)&anz, 4 );
  374. for( int i = 0; i < anz; i++ )
  375. {
  376. TeamDaten *team = new TeamDaten();
  377. k->getNachrichtEncrypted( (char*)&team->id, 4 );
  378. k->getNachrichtEncrypted( (char*)&team->maxPunkte, 4 );
  379. k->getNachrichtEncrypted( (char*)&team->beschleunigung, 8 );
  380. k->getNachrichtEncrypted( (char*)&team->maxStabilität, 4 );
  381. k->getNachrichtEncrypted( (char*)&team->maxEnergie, 4 );
  382. k->getNachrichtEncrypted( (char*)&team->reparatur, 8 );
  383. k->getNachrichtEncrypted( (char*)&team->akkuLeistung, 8 );
  384. k->getNachrichtEncrypted( (char*)&team->laserIntensität, 4 );
  385. k->getNachrichtEncrypted( (char*)&team->laserEffizienz, 4 );
  386. k->getNachrichtEncrypted( (char*)&team->laserTempo, 4 );
  387. k->getNachrichtEncrypted( (char*)&team->wendigkeit, 8 );
  388. k->getNachrichtEncrypted( (char*)&team->antriebEffizienz, 8 );
  389. k->getNachrichtEncrypted( (char*)&team->energieSchild, 8 );
  390. k->getNachrichtEncrypted( (char*)&team->energieSchildEffizienz, 8 );
  391. k->getNachrichtEncrypted( (char*)&team->punkte, 4 );
  392. teams.add( team );
  393. }
  394. }
  395. if( ret == 3 )
  396. {
  397. unsigned char l = 0;
  398. k->getNachrichtEncrypted( (char*)&l, 1 );
  399. char *err = new char[ l + 1 ];
  400. err[ l ] = 0;
  401. k->getNachrichtEncrypted( err, l );
  402. error = err;
  403. delete[] err;
  404. ret = 0;
  405. }
  406. klient->endEditorMessage();
  407. return ret == 1;
  408. }
  409. bool EditorKlient::loadObjekte( Array< ObjektDaten* > &objekte )
  410. {
  411. Network::Klient *k = klient->beginEditorMessage();
  412. if( !k )
  413. {
  414. error = klient->getLetzterFehler();
  415. return 0;
  416. }
  417. error = "";
  418. char ret;
  419. k->sendeEncrypted( "\x5", 1 );
  420. k->getNachrichtEncrypted( &ret, 1 );
  421. if( ret == 1 )
  422. {
  423. int anz = 0;
  424. k->getNachrichtEncrypted( (char*)&anz, 4 );
  425. for( int i = 0; i < anz; i++ )
  426. {
  427. ObjektDaten *objekt = new ObjektDaten();
  428. k->getNachrichtEncrypted( (char*)&objekt->pos.x, 4 );
  429. k->getNachrichtEncrypted( (char*)&objekt->pos.y, 4 );
  430. k->getNachrichtEncrypted( (char*)&objekt->id, 4 );
  431. k->getNachrichtEncrypted( (char*)&objekt->m2d, 4 );
  432. k->getNachrichtEncrypted( (char*)&objekt->bild, 4 );
  433. k->getNachrichtEncrypted( (char*)&objekt->style, 4 );
  434. k->getNachrichtEncrypted( (char*)&objekt->maxStabilität, 4 );
  435. k->getNachrichtEncrypted( (char*)&objekt->maxEnergie, 4 );
  436. k->getNachrichtEncrypted( (char*)&objekt->energieRadius, 4 );
  437. k->getNachrichtEncrypted( (char*)&objekt->reparatur, 8 );
  438. k->getNachrichtEncrypted( (char*)&objekt->akkuLeistung, 8 );
  439. k->getNachrichtEncrypted( (char*)&objekt->team, 1 );
  440. objekte.add( objekt );
  441. }
  442. }
  443. if( ret == 3 )
  444. {
  445. unsigned char l = 0;
  446. k->getNachrichtEncrypted( (char*)&l, 1 );
  447. char *err = new char[ l + 1 ];
  448. err[ l ] = 0;
  449. k->getNachrichtEncrypted( err, l );
  450. error = err;
  451. delete[] err;
  452. ret = 0;
  453. }
  454. klient->endEditorMessage();
  455. return ret == 1;
  456. }
  457. // Lädt die Spieler Team Struktur
  458. bool EditorKlient::getSpielerTeamStruktur( SpielerTeamStrukturV *sts )
  459. {
  460. return klient->ladeTeamDaten( sts );
  461. }
  462. // Gibt den Letzten Fehler zurück
  463. char *EditorKlient::getLastError() const
  464. {
  465. return error;
  466. }
  467. // Reference Counting
  468. EditorKlient *EditorKlient::getThis()
  469. {
  470. ref++;
  471. return this;
  472. }
  473. EditorKlient *EditorKlient::release()
  474. {
  475. if( !--ref )
  476. delete this;
  477. return 0;
  478. }