EditorKlient.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492
  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->punkte, 4 );
  161. k->getNachrichtEncrypted( &ret, 1 );
  162. }
  163. if( ret == 3 )
  164. {
  165. unsigned char l = 0;
  166. k->getNachrichtEncrypted( (char*)&l, 1 );
  167. char *err = new char[ l + 1 ];
  168. err[ l ] = 0;
  169. k->getNachrichtEncrypted( err, l );
  170. error = err;
  171. delete[] err;
  172. ret = 0;
  173. }
  174. klient->endEditorMessage();
  175. return ret == 1;
  176. }
  177. bool EditorKlient::saveSpieler( const SpielerDaten *spieler )
  178. {
  179. Network::Klient *k = klient->beginEditorMessage();
  180. if( !k )
  181. {
  182. error = klient->getLetzterFehler();
  183. return 0;
  184. }
  185. error = "";
  186. char ret;
  187. k->sendeEncrypted( "\x6", 1 );
  188. k->getNachrichtEncrypted( &ret, 1 );
  189. if( ret == 1 )
  190. {
  191. k->sendeEncrypted( (char*)&spieler->id, 4 );
  192. k->sendeEncrypted( (char*)&spieler->pos.x, 4 );
  193. k->sendeEncrypted( (char*)&spieler->pos.y, 4 );
  194. k->sendeEncrypted( (char*)&spieler->rot, 8 );
  195. k->sendeEncrypted( (char*)&spieler->beschleunigung, 8 );
  196. k->sendeEncrypted( (char*)&spieler->maxStabilität, 4 );
  197. k->sendeEncrypted( (char*)&spieler->maxEnergie, 4 );
  198. k->sendeEncrypted( (char*)&spieler->reparatur, 8 );
  199. k->sendeEncrypted( (char*)&spieler->akkuLeistung, 8 );
  200. k->sendeEncrypted( (char*)&spieler->laserIntensität, 4 );
  201. k->sendeEncrypted( (char*)&spieler->laserEffizienz, 4 );
  202. k->sendeEncrypted( (char*)&spieler->laserTempo, 4 );
  203. k->sendeEncrypted( (char*)&spieler->wendigkeit, 8 );
  204. k->sendeEncrypted( (char*)&spieler->antriebEffizienz, 8 );
  205. k->sendeEncrypted( (char*)&spieler->netzwerk, 4 );
  206. k->sendeEncrypted( (char*)&spieler->skillPunkte, 4 );
  207. k->sendeEncrypted( (char*)&spieler->m2d, 4 );
  208. k->sendeEncrypted( (char*)&spieler->bild, 4 );
  209. k->getNachrichtEncrypted( &ret, 1 );
  210. }
  211. if( ret == 3 )
  212. {
  213. unsigned char l = 0;
  214. k->getNachrichtEncrypted( (char*)&l, 1 );
  215. char *err = new char[ l + 1 ];
  216. err[ l ] = 0;
  217. k->getNachrichtEncrypted( err, l );
  218. error = err;
  219. delete[] err;
  220. ret = 0;
  221. }
  222. klient->endEditorMessage();
  223. return ret == 1;
  224. }
  225. bool EditorKlient::saveObjekt( const ObjektDaten *objekt )
  226. {
  227. Network::Klient *k = klient->beginEditorMessage();
  228. if( !k )
  229. {
  230. error = klient->getLetzterFehler();
  231. return 0;
  232. }
  233. error = "";
  234. char ret;
  235. k->sendeEncrypted( "\x8", 1 );
  236. k->getNachrichtEncrypted( &ret, 1 );
  237. if( ret == 1 )
  238. {
  239. k->sendeEncrypted( (char*)&objekt->pos.x, 4 );
  240. k->sendeEncrypted( (char*)&objekt->pos.y, 4 );
  241. k->sendeEncrypted( (char*)&objekt->id, 4 );
  242. k->sendeEncrypted( (char*)&objekt->m2d, 4 );
  243. k->sendeEncrypted( (char*)&objekt->bild, 4 );
  244. k->sendeEncrypted( (char*)&objekt->style, 4 );
  245. k->sendeEncrypted( (char*)&objekt->maxStabilität, 4 );
  246. k->sendeEncrypted( (char*)&objekt->maxEnergie, 4 );
  247. k->sendeEncrypted( (char*)&objekt->energieRadius, 4 );
  248. k->sendeEncrypted( (char*)&objekt->reparatur, 8 );
  249. k->sendeEncrypted( (char*)&objekt->akkuLeistung, 8 );
  250. k->sendeEncrypted( (char*)&objekt->team, 1 );
  251. k->getNachrichtEncrypted( &ret, 1 );
  252. }
  253. if( ret == 3 )
  254. {
  255. unsigned char l = 0;
  256. k->getNachrichtEncrypted( (char*)&l, 1 );
  257. char *err = new char[ l + 1 ];
  258. err[ l ] = 0;
  259. k->getNachrichtEncrypted( err, l );
  260. error = err;
  261. delete[] err;
  262. ret = 0;
  263. }
  264. klient->endEditorMessage();
  265. return ret == 1;
  266. }
  267. bool EditorKlient::deleteObjekt( int id )
  268. {
  269. Network::Klient *k = klient->beginEditorMessage();
  270. if( !k )
  271. {
  272. error = klient->getLetzterFehler();
  273. return 0;
  274. }
  275. error = "";
  276. char ret;
  277. k->sendeEncrypted( "\x9", 1 );
  278. k->getNachrichtEncrypted( &ret, 1 );
  279. if( ret == 1 )
  280. {
  281. k->sendeEncrypted( (char*)&id, 4 );
  282. k->getNachrichtEncrypted( &ret, 1 );
  283. }
  284. if( ret == 3 )
  285. {
  286. unsigned char l = 0;
  287. k->getNachrichtEncrypted( (char*)&l, 1 );
  288. char *err = new char[ l + 1 ];
  289. err[ l ] = 0;
  290. k->getNachrichtEncrypted( err, l );
  291. error = err;
  292. delete[] err;
  293. ret = 0;
  294. }
  295. klient->endEditorMessage();
  296. return ret == 1;
  297. }
  298. bool EditorKlient::loadSpieler( Array< SpielerDaten* > &spieler )
  299. {
  300. Network::Klient *k = klient->beginEditorMessage();
  301. if( !k )
  302. {
  303. error = klient->getLetzterFehler();
  304. return 0;
  305. }
  306. error = "";
  307. char ret;
  308. k->sendeEncrypted( "\x3", 1 );
  309. k->getNachrichtEncrypted( &ret, 1 );
  310. if( ret == 1 )
  311. {
  312. int anz = 0;
  313. k->getNachrichtEncrypted( (char*)&anz, 4 );
  314. for( int i = 0; i < anz; i++ )
  315. {
  316. SpielerDaten *player = new SpielerDaten();
  317. k->getNachrichtEncrypted( (char*)&player->id, 4 );
  318. k->getNachrichtEncrypted( (char*)&player->pos.x, 4 );
  319. k->getNachrichtEncrypted( (char*)&player->pos.y, 4 );
  320. k->getNachrichtEncrypted( (char*)&player->rot, 8 );
  321. k->getNachrichtEncrypted( (char*)&player->beschleunigung, 8 );
  322. k->getNachrichtEncrypted( (char*)&player->maxStabilität, 4 );
  323. k->getNachrichtEncrypted( (char*)&player->maxEnergie, 4 );
  324. k->getNachrichtEncrypted( (char*)&player->reparatur, 8 );
  325. k->getNachrichtEncrypted( (char*)&player->akkuLeistung, 8 );
  326. k->getNachrichtEncrypted( (char*)&player->laserIntensität, 4 );
  327. k->getNachrichtEncrypted( (char*)&player->laserEffizienz, 4 );
  328. k->getNachrichtEncrypted( (char*)&player->laserTempo, 4 );
  329. k->getNachrichtEncrypted( (char*)&player->wendigkeit, 8 );
  330. k->getNachrichtEncrypted( (char*)&player->antriebEffizienz, 8 );
  331. k->getNachrichtEncrypted( (char*)&player->netzwerk, 4 );
  332. k->getNachrichtEncrypted( (char*)&player->skillPunkte, 4 );
  333. k->getNachrichtEncrypted( (char*)&player->m2d, 4 );
  334. k->getNachrichtEncrypted( (char*)&player->bild, 4 );
  335. spieler.add( player );
  336. }
  337. }
  338. if( ret == 3 )
  339. {
  340. unsigned char l = 0;
  341. k->getNachrichtEncrypted( (char*)&l, 1 );
  342. char *err = new char[ l + 1 ];
  343. err[ l ] = 0;
  344. k->getNachrichtEncrypted( err, l );
  345. error = err;
  346. delete[] err;
  347. ret = 0;
  348. }
  349. klient->endEditorMessage();
  350. return ret == 1;
  351. }
  352. bool EditorKlient::loadTeams( Array< TeamDaten* > &teams )
  353. {
  354. Network::Klient *k = klient->beginEditorMessage();
  355. if( !k )
  356. {
  357. error = klient->getLetzterFehler();
  358. return 0;
  359. }
  360. error = "";
  361. char ret;
  362. k->sendeEncrypted( "\x4", 1 );
  363. k->getNachrichtEncrypted( &ret, 1 );
  364. if( ret == 1 )
  365. {
  366. int anz = 0;
  367. k->getNachrichtEncrypted( (char*)&anz, 4 );
  368. for( int i = 0; i < anz; i++ )
  369. {
  370. TeamDaten *team = new TeamDaten();
  371. k->getNachrichtEncrypted( (char*)&team->id, 4 );
  372. k->getNachrichtEncrypted( (char*)&team->maxPunkte, 4 );
  373. k->getNachrichtEncrypted( (char*)&team->beschleunigung, 8 );
  374. k->getNachrichtEncrypted( (char*)&team->maxStabilität, 4 );
  375. k->getNachrichtEncrypted( (char*)&team->maxEnergie, 4 );
  376. k->getNachrichtEncrypted( (char*)&team->reparatur, 8 );
  377. k->getNachrichtEncrypted( (char*)&team->akkuLeistung, 8 );
  378. k->getNachrichtEncrypted( (char*)&team->laserIntensität, 4 );
  379. k->getNachrichtEncrypted( (char*)&team->laserEffizienz, 4 );
  380. k->getNachrichtEncrypted( (char*)&team->laserTempo, 4 );
  381. k->getNachrichtEncrypted( (char*)&team->wendigkeit, 8 );
  382. k->getNachrichtEncrypted( (char*)&team->antriebEffizienz, 8 );
  383. k->getNachrichtEncrypted( (char*)&team->punkte, 4 );
  384. teams.add( team );
  385. }
  386. }
  387. if( ret == 3 )
  388. {
  389. unsigned char l = 0;
  390. k->getNachrichtEncrypted( (char*)&l, 1 );
  391. char *err = new char[ l + 1 ];
  392. err[ l ] = 0;
  393. k->getNachrichtEncrypted( err, l );
  394. error = err;
  395. delete[] err;
  396. ret = 0;
  397. }
  398. klient->endEditorMessage();
  399. return ret == 1;
  400. }
  401. bool EditorKlient::loadObjekte( Array< ObjektDaten* > &objekte )
  402. {
  403. Network::Klient *k = klient->beginEditorMessage();
  404. if( !k )
  405. {
  406. error = klient->getLetzterFehler();
  407. return 0;
  408. }
  409. error = "";
  410. char ret;
  411. k->sendeEncrypted( "\x5", 1 );
  412. k->getNachrichtEncrypted( &ret, 1 );
  413. if( ret == 1 )
  414. {
  415. int anz = 0;
  416. k->getNachrichtEncrypted( (char*)&anz, 4 );
  417. for( int i = 0; i < anz; i++ )
  418. {
  419. ObjektDaten *objekt = new ObjektDaten();
  420. k->getNachrichtEncrypted( (char*)&objekt->pos.x, 4 );
  421. k->getNachrichtEncrypted( (char*)&objekt->pos.y, 4 );
  422. k->getNachrichtEncrypted( (char*)&objekt->id, 4 );
  423. k->getNachrichtEncrypted( (char*)&objekt->m2d, 4 );
  424. k->getNachrichtEncrypted( (char*)&objekt->bild, 4 );
  425. k->getNachrichtEncrypted( (char*)&objekt->style, 4 );
  426. k->getNachrichtEncrypted( (char*)&objekt->maxStabilität, 4 );
  427. k->getNachrichtEncrypted( (char*)&objekt->maxEnergie, 4 );
  428. k->getNachrichtEncrypted( (char*)&objekt->energieRadius, 4 );
  429. k->getNachrichtEncrypted( (char*)&objekt->reparatur, 8 );
  430. k->getNachrichtEncrypted( (char*)&objekt->akkuLeistung, 8 );
  431. k->getNachrichtEncrypted( (char*)&objekt->team, 1 );
  432. objekte.add( objekt );
  433. }
  434. }
  435. if( ret == 3 )
  436. {
  437. unsigned char l = 0;
  438. k->getNachrichtEncrypted( (char*)&l, 1 );
  439. char *err = new char[ l + 1 ];
  440. err[ l ] = 0;
  441. k->getNachrichtEncrypted( err, l );
  442. error = err;
  443. delete[] err;
  444. ret = 0;
  445. }
  446. klient->endEditorMessage();
  447. return ret == 1;
  448. }
  449. // Lädt die Spieler Team Struktur
  450. bool EditorKlient::getSpielerTeamStruktur( SpielerTeamStrukturV *sts )
  451. {
  452. return klient->ladeTeamDaten( sts );
  453. }
  454. // Gibt den Letzten Fehler zurück
  455. char *EditorKlient::getLastError() const
  456. {
  457. return error;
  458. }
  459. // Reference Counting
  460. EditorKlient *EditorKlient::getThis()
  461. {
  462. ref++;
  463. return this;
  464. }
  465. EditorKlient *EditorKlient::release()
  466. {
  467. if( !--ref )
  468. delete this;
  469. return 0;
  470. }