ChatLeiste.cpp 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297
  1. #include "ChatLeiste.h"
  2. #include <Bild.h>
  3. #include <DateiSystem.h>
  4. #include <Globals.h>
  5. #include <GSLDateiV.h>
  6. #include <InitDatei.h>
  7. #include <Punkt.h>
  8. #include <Rahmen.h>
  9. #include <ToolTip.h>
  10. #include "..\..\Global\Initialisierung.h"
  11. #include "..\..\Global\Variablen.h"
  12. typedef GSL::GSLDateiV* (*GetGSLDatei)();
  13. // Inhalt der Chat Klasse aus ChatLeiste.h
  14. // Konstruktor
  15. Chat::Chat()
  16. : ReferenceCounter()
  17. {
  18. Bild* minimierenBild
  19. = bilder->get("data/client/bilder/chat.ltdb/minimieren.png");
  20. Bild* closeBild = bilder->get("data/client/bilder/chat.ltdb/entfernen.png");
  21. rahmen = new LRahmen();
  22. rahmen->setAlpha(1);
  23. rahmen->setFarbe(0xFFFFFFFF);
  24. rahmen->setRamenBreite(1);
  25. verlauf = initTextFeld(7, 7, 184, 210, TextFeld::Style::TextGebiet, "");
  26. verlauf->removeStyle(TextFeld::Style::Erlaubt);
  27. verlauf->updateVScroll();
  28. nachricht = initTextFeld(1, 220, 198, 20, TextFeld::Style::TextFeld, "");
  29. initToolTip(nachricht, "Nachricht senden.");
  30. name = initTextFeld(
  31. 1, 250, 198, 29, TextFeld::Style::Text | TextFeld::Style::VCenter, "");
  32. minimieren = initKnopf(159, 255, 20, 20, 0, "");
  33. minimieren->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  34. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  35. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  36. minimieren->setHintergrundBildZ(minimierenBild);
  37. initToolTip(minimieren, "Fenster einklappen.");
  38. close = initKnopf(179, 255, 20, 20, 0, "");
  39. close->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  40. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  41. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  42. close->setHintergrundBildZ(closeBild);
  43. initToolTip(close, "Fenster schließen.");
  44. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  45. admin = 0;
  46. tickVal = 0;
  47. sichtbar = 1;
  48. breite = 0;
  49. höhe = 30;
  50. animation = 1;
  51. rend = 0;
  52. msgSound = 0;
  53. HMODULE dll
  54. = Framework::getDLLRegister()->ladeDLL("GSL.dll", "data/bin/GSL.dll");
  55. if (dll)
  56. {
  57. GetGSLDatei getGSLDatei
  58. = (GetGSLDatei)GetProcAddress(dll, "getGSLDatei");
  59. if (getGSLDatei)
  60. {
  61. GSL::GSLDateiV* sDat = getGSLDatei();
  62. sDat->setDatei("data/sounds/popup.gsl");
  63. sDat->leseDaten();
  64. msgSound = sDat->getSound("chat.wav");
  65. sDat->release();
  66. if (msgSound) msgSound->setVolume(0xFFFF, 0xFFFF);
  67. }
  68. if (!msgSound) Framework::getDLLRegister()->releaseDLL("GSL.dll");
  69. }
  70. }
  71. // Destruktor
  72. Chat::~Chat()
  73. {
  74. if (msgSound)
  75. {
  76. msgSound->release();
  77. Framework::getDLLRegister()->releaseDLL("GSL.dll");
  78. }
  79. rahmen->release();
  80. verlauf = (TextFeld*)verlauf->release();
  81. nachricht = (TextFeld*)nachricht->release();
  82. name = (TextFeld*)name->release();
  83. minimieren = (Knopf*)minimieren->release();
  84. close = (Knopf*)close->release();
  85. }
  86. // nicht constant
  87. void Chat::setSichtbar(bool sichtbar)
  88. {
  89. if (sichtbar)
  90. animation = 2;
  91. else
  92. animation = 3;
  93. this->sichtbar = sichtbar;
  94. }
  95. void Chat::entfernen()
  96. {
  97. animation = 4;
  98. }
  99. void Chat::addNachricht(const char* txt)
  100. {
  101. int sound = userOptions->wertExistiert("GUISound")
  102. ? (int)*userOptions->zWert("GUISound")
  103. : 100;
  104. if (msgSound)
  105. {
  106. msgSound->setVolume(
  107. (int)((sound / 100.0) * 0xFFFF), (int)((sound / 100.0) * 0xFFFF));
  108. msgSound->playSound();
  109. }
  110. Text* n = new Text(txt);
  111. verlauf->zTextRenderer()->textFormatieren(n, verlauf->getBreite() - 20);
  112. if (n->getText()[n->getLength() - 1] != '\n') n->append("\n");
  113. verlauf->zText()->append(dynamic_cast<Text*>(n->getThis()));
  114. verlauf->setSchriftFarbe(verlauf->zText()->getLength() - n->getLength(),
  115. verlauf->zText()->getLength(),
  116. 0xFFFFFFFF);
  117. n->release();
  118. if (animation != 4) animation = 2;
  119. verlauf->updateVScroll();
  120. rend = 1;
  121. }
  122. void Chat::setAdmin()
  123. {
  124. admin = 1;
  125. rend = 1;
  126. }
  127. void Chat::addSpieler(int accountId)
  128. {
  129. // nur bei chatroom
  130. }
  131. void Chat::removeSpieler(int accountId)
  132. {
  133. // nur bei chatroom
  134. }
  135. bool Chat::tick(double tickVal)
  136. {
  137. // virtual
  138. return 0;
  139. }
  140. void Chat::doPublicMausEreignis(MausEreignis& me)
  141. {
  142. // virtual
  143. }
  144. void Chat::doTastaturEreignis(TastaturEreignis& te)
  145. {
  146. // virtual
  147. }
  148. void Chat::render(int x, Bild& zRObj)
  149. {
  150. // virtual
  151. }
  152. // constant
  153. TextFeld* Chat::getName() const
  154. {
  155. return dynamic_cast<TextFeld*>(name->getThis());
  156. }
  157. TextFeld* Chat::zName() const
  158. {
  159. return name;
  160. }
  161. int Chat::getAccountId() const
  162. {
  163. // nur bei chat
  164. return 0;
  165. }
  166. int Chat::getChatroomId() const
  167. {
  168. // nur bei chatroom
  169. return 0;
  170. }
  171. int Chat::getBreite() const
  172. {
  173. return breite;
  174. }
  175. bool Chat::istSichtbar() const
  176. {
  177. return sichtbar;
  178. }
  179. // Inhalt der ChatFenster Klasse aus ChatLeiste.h
  180. // Konstruktor
  181. ChatFenster::ChatFenster(int accountId)
  182. : Chat()
  183. {
  184. this->accountId = accountId;
  185. name->setTextZ(infoClient->getSpielerName(accountId));
  186. }
  187. // Destruktor
  188. ChatFenster::~ChatFenster() {}
  189. // nicht constant
  190. bool ChatFenster::tick(double tickVal)
  191. {
  192. rend |= close->tick(tickVal);
  193. rend |= minimieren->tick(tickVal);
  194. rend |= verlauf->tick(tickVal);
  195. rend |= nachricht->tick(tickVal);
  196. if (!animation)
  197. {
  198. bool ret = rend;
  199. rend = 0;
  200. return ret;
  201. }
  202. this->tickVal += tickVal * 300;
  203. int val = (int)this->tickVal;
  204. if (val < 1)
  205. {
  206. bool ret = rend;
  207. rend = 0;
  208. return ret;
  209. }
  210. if (val > 10) val = 10;
  211. this->tickVal -= val;
  212. switch (animation)
  213. {
  214. case 1: // erstellen
  215. case 2: // ausfahren
  216. if (breite == 200)
  217. {
  218. höhe += val;
  219. if (höhe > 280)
  220. {
  221. höhe = 280;
  222. animation = 0;
  223. }
  224. }
  225. else
  226. {
  227. breite += val;
  228. if (breite > 200) breite = 200;
  229. }
  230. rend = 1;
  231. break;
  232. case 3: // einfahren
  233. if (höhe == 30)
  234. {
  235. breite -= val;
  236. if (breite < 100)
  237. {
  238. breite = 100;
  239. animation = 0;
  240. }
  241. }
  242. else
  243. {
  244. höhe -= val;
  245. if (höhe < 30) höhe = 30;
  246. }
  247. rend = 1;
  248. break;
  249. case 4: // close
  250. if (höhe == 30)
  251. {
  252. breite -= val;
  253. if (breite < 0)
  254. {
  255. nachLogin->zChatLeiste()->removeChat(this); // delete this
  256. return 1;
  257. }
  258. }
  259. else
  260. {
  261. höhe -= val;
  262. if (höhe < 30) höhe = 30;
  263. }
  264. rend = 1;
  265. break;
  266. }
  267. bool ret = rend;
  268. rend = 0;
  269. return ret;
  270. }
  271. void ChatFenster::doPublicMausEreignis(MausEreignis& me)
  272. {
  273. bool tmp = me.verarbeitet;
  274. if (me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation)
  275. me.verarbeitet = 1;
  276. verlauf->doPublicMausEreignis(me);
  277. bool vera = me.verarbeitet;
  278. minimieren->doPublicMausEreignis(me);
  279. int aktion = me.verarbeitet && !vera ? 1 : 0;
  280. close->doPublicMausEreignis(me);
  281. if (!aktion) aktion = me.verarbeitet && !vera ? 2 : 0;
  282. nachricht->doPublicMausEreignis(me);
  283. if (me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation)
  284. {
  285. me.verarbeitet = tmp;
  286. return;
  287. }
  288. if (!aktion && !sichtbar && !vera)
  289. {
  290. if (me.mx < breite && me.mx > 0 && me.my > 250 && me.my < 280)
  291. aktion = 3;
  292. }
  293. switch (aktion)
  294. {
  295. case 1: // einfahren
  296. if (me.id == ME_RLinks) this->setSichtbar(0);
  297. break;
  298. case 2: // close
  299. if (me.id == ME_RLinks) animation = 4;
  300. break;
  301. case 3: // ausfahren
  302. if (me.id == ME_RLinks) this->setSichtbar(1);
  303. break;
  304. }
  305. }
  306. void ChatFenster::doTastaturEreignis(TastaturEreignis& te)
  307. {
  308. bool tmp = te.verarbeitet;
  309. if (animation) te.verarbeitet = 1;
  310. nachricht->doTastaturEreignis(te);
  311. int aktion = te.verarbeitet && !tmp ? 1 : 0;
  312. if (animation)
  313. {
  314. te.verarbeitet = tmp;
  315. return;
  316. }
  317. switch (aktion)
  318. {
  319. case 1:
  320. if (te.id == TE_Release && te.virtualKey == T_Enter)
  321. {
  322. if (!nachricht->zText()->getLength()) break;
  323. nachricht->zText()->remove("\n");
  324. if (chatClient->chatNachricht(
  325. accountId, nachricht->zText()->getText()))
  326. {
  327. Text* n = new Text(nachricht->zText()->getText());
  328. verlauf->zTextRenderer()->textFormatieren(
  329. n, verlauf->getBreite() - 15);
  330. if (n->getText()[n->getLength() - 1] != '\n') n->append("\n");
  331. verlauf->zText()->append(n->getText());
  332. verlauf->setSchriftFarbe(
  333. verlauf->zText()->getLength() - n->getLength(),
  334. verlauf->zText()->getLength(),
  335. 0xFF00FF00);
  336. n->release();
  337. verlauf->updateVScroll();
  338. nachricht->setText("");
  339. nachricht->setAuswahl(0, 0);
  340. rend = 1;
  341. }
  342. }
  343. break;
  344. }
  345. }
  346. void ChatFenster::render(int xPos, Bild& zRObj)
  347. {
  348. int x = xPos;
  349. int y = 280 - höhe;
  350. int br = breite;
  351. int hö = höhe;
  352. if (!zRObj.setDrawOptions(x, y, br, hö)) return;
  353. zRObj.alphaRegion(0, 0, br, hö, 0xA0000000);
  354. rahmen->setSize(br, hö);
  355. rahmen->render(zRObj);
  356. zRObj.addScrollOffset(0, 280 - höhe);
  357. verlauf->render(zRObj);
  358. nachricht->render(zRObj);
  359. name->render(zRObj);
  360. minimieren->render(zRObj);
  361. close->render(zRObj);
  362. zRObj.releaseDrawOptions();
  363. }
  364. // constant
  365. int ChatFenster::getAccountId() const
  366. {
  367. return accountId;
  368. }
  369. // Inhalt der ChatroomFenster Klasse aus ChatLeiste.h
  370. // Konstruktor
  371. ChatroomFenster::ChatroomFenster(int chatroomId)
  372. : Chat()
  373. {
  374. Bild* maximierenBild
  375. = bilder->get("data/client/bilder/chat.ltdb/maximieren.png");
  376. this->chatroomId = chatroomId;
  377. spielerName = initTextFeld(200, 5, 120, 0, TextFeld::Style::TextFeld, "");
  378. initToolTip(spielerName, "Name des Spielers der eingeladen werden soll.");
  379. einladen = initKnopf(325, 5, 20, 0, 0, "");
  380. einladen->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  381. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  382. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  383. einladen->setHintergrundBildZ(maximierenBild);
  384. initToolTip(einladen, "Spieler ins Chatroom einladen.");
  385. spieler = new ObjTabelle();
  386. spieler->setMausEreignis(_ret1ME);
  387. spieler->setStyle(ObjTabelle::Style::Sichtbar | ObjTabelle::Style::Rahmen
  388. | ObjTabelle::Style::VScroll | ObjTabelle::Style::Erlaubt
  389. | ObjTabelle::Style::VScroll | ObjTabelle::Style::Raster);
  390. spieler->setVertikalKlickScroll(5);
  391. spieler->setPosition(200, 1);
  392. spieler->setSize(149, 240);
  393. spieler->setRasterFarbe(0xFF555555);
  394. spieler->setRahmenFarbe(0xFFFFFFFF);
  395. spieler->addSpalte(0, "Name");
  396. spieler->addSpalte(1, "Freund");
  397. spieler->addSpalte(2, "Kick");
  398. spieler->setSpaltenBreite(0, 110);
  399. spieler->setSpaltenBreite(1, 20);
  400. spieler->setSpaltenBreite(2, 0);
  401. name->setTextZ(infoClient->getChatroomName(chatroomId));
  402. close->setPosition(close->getX() + 150, close->getY());
  403. minimieren->setPosition(minimieren->getX() + 150, minimieren->getY());
  404. neueSpieler = new Array<int>();
  405. alteSpieler = new Array<int>();
  406. neueSpielerAnzahl = 0;
  407. alteSpielerAnzahl = 0;
  408. }
  409. // Destruktor
  410. ChatroomFenster::~ChatroomFenster()
  411. {
  412. chatClient->chatroomVerlassen(chatroomId);
  413. neueSpieler->release();
  414. alteSpieler->release();
  415. spieler = (ObjTabelle*)spieler->release();
  416. spielerName = (TextFeld*)spielerName->release();
  417. einladen = (Knopf*)einladen->release();
  418. }
  419. // nicht constant
  420. void ChatroomFenster::addSpieler(int accountId)
  421. {
  422. Text* zeile = new Text();
  423. zeile->append(accountId);
  424. if (spieler->getZeilenNummer(zeile->getText()) >= 0) return;
  425. Bild* einladenBild
  426. = bilder->get("data/client/bilder/chat.ltdb/maximieren.png");
  427. Bild* closeBild = bilder->get("data/client/bilder/chat.ltdb/entfernen.png");
  428. spieler->addZeile(zeile->getText());
  429. spieler->setZeilenHeight(zeile->getText(), 0);
  430. Text* name = infoClient->getSpielerName(accountId);
  431. TextFeld* sName = initTextFeld(0,
  432. 0,
  433. 110,
  434. 20,
  435. TextFeld::Style::Sichtbar | TextFeld::Style::Text
  436. | TextFeld::Style::Center,
  437. name->getText());
  438. name->release();
  439. spieler->setZeichnungZ("Name", zeile->getText(), sName);
  440. Knopf* freund = initKnopf(0, 0, 20, 20, 0, "");
  441. freund->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  442. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  443. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  444. freund->setHintergrundBildZ(einladenBild);
  445. freund->setMausEreignisParameter(this);
  446. freund->setMausEreignis(chatroomFensterFreundME);
  447. initToolTip(freund, "Freundeseinladung an den Spieler schicken.");
  448. spieler->setZeichnungZ("Freund", zeile->getText(), freund);
  449. Knopf* entfernen = initKnopf(0, 0, 0, 20, 0, "");
  450. entfernen->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  451. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  452. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  453. entfernen->setHintergrundBildZ(closeBild);
  454. entfernen->setMausEreignisParameter(this);
  455. entfernen->setMausEreignis(chatroomFensterEntfernenME);
  456. initToolTip(entfernen, "Spieler aus Chatroom entfernen.");
  457. spieler->setZeichnungZ("Kick", zeile->getText(), entfernen);
  458. neueSpieler->add(accountId, neueSpielerAnzahl);
  459. neueSpielerAnzahl++;
  460. zeile->release();
  461. rend = 1;
  462. }
  463. void ChatroomFenster::removeSpieler(int accountId)
  464. {
  465. Text* zeile = new Text();
  466. zeile->append(accountId);
  467. if (spieler->getZeilenNummer(zeile) >= 0)
  468. {
  469. alteSpieler->add(accountId, alteSpielerAnzahl);
  470. alteSpielerAnzahl++;
  471. rend = 1;
  472. }
  473. }
  474. bool ChatroomFenster::tick(double tickVal)
  475. {
  476. rend |= close->tick(tickVal);
  477. rend |= minimieren->tick(tickVal);
  478. rend |= einladen->tick(tickVal);
  479. rend |= spieler->tick(tickVal);
  480. rend |= spielerName->tick(tickVal);
  481. rend |= verlauf->tick(tickVal);
  482. rend |= nachricht->tick(tickVal);
  483. this->tickVal += tickVal * 300;
  484. int val = (int)this->tickVal;
  485. if (val < 1)
  486. {
  487. bool ret = rend;
  488. rend = 0;
  489. return ret;
  490. }
  491. if (val > 10) val = 10;
  492. this->tickVal -= val;
  493. switch (animation)
  494. {
  495. case 1: // erstellen
  496. case 2: // ausfahren
  497. if (breite == 350)
  498. {
  499. höhe += val;
  500. if (höhe > 280)
  501. {
  502. höhe = 280;
  503. animation = 0;
  504. }
  505. }
  506. else
  507. {
  508. breite += val;
  509. if (breite > 350) breite = 350;
  510. }
  511. rend = 1;
  512. break;
  513. case 3: // einfahren
  514. if (höhe == 30)
  515. {
  516. breite -= val;
  517. if (breite < 100)
  518. {
  519. breite = 100;
  520. animation = 0;
  521. }
  522. }
  523. else
  524. {
  525. höhe -= val;
  526. if (höhe < 30) höhe = 30;
  527. }
  528. rend = 1;
  529. break;
  530. case 4: // close
  531. if (höhe == 30)
  532. {
  533. breite -= val;
  534. if (breite < 0)
  535. {
  536. nachLogin->zChatLeiste()->removeChat(this); // delete this
  537. return 1;
  538. }
  539. }
  540. else
  541. {
  542. höhe -= val;
  543. if (höhe < 30) höhe = 30;
  544. }
  545. rend = 1;
  546. break;
  547. }
  548. Text* zeile = new Text("");
  549. for (int i = 0; i < neueSpielerAnzahl; i++)
  550. {
  551. int id = neueSpieler->hat(i) ? neueSpieler->get(i) : 0;
  552. zeile->append(id);
  553. int z = spieler->getZeilenNummer(zeile->getText());
  554. spieler->setZeilenHeight(z, spieler->getZeilenHeight(z) + val / 2);
  555. if (spieler->getZeilenHeight(z) > 20)
  556. {
  557. spieler->setZeilenHeight(z, 20);
  558. neueSpieler->remove(i);
  559. neueSpielerAnzahl--;
  560. i--;
  561. }
  562. zeile->setText("");
  563. rend = 1;
  564. }
  565. for (int i = 0; i < alteSpielerAnzahl; i++)
  566. {
  567. int id = alteSpieler->hat(i) ? alteSpieler->get(i) : 0;
  568. zeile->append(id);
  569. int z = spieler->getZeilenNummer(zeile->getText());
  570. spieler->setZeilenHeight(z, spieler->getZeilenHeight(z) - val / 2);
  571. if (spieler->getZeilenHeight(z) <= 0)
  572. {
  573. spieler->removeZeile(z);
  574. alteSpieler->remove(i);
  575. alteSpielerAnzahl--;
  576. i--;
  577. }
  578. zeile->setText("");
  579. rend = 1;
  580. }
  581. zeile->release();
  582. if (admin)
  583. {
  584. if (spielerName->getHeight() != 20)
  585. {
  586. spielerName->setSize(
  587. spielerName->getBreite(), spielerName->getHeight() + val / 2);
  588. einladen->setSize(
  589. einladen->getBreite(), einladen->getHeight() + val / 2);
  590. spieler->setPosition(spieler->getX(), spieler->getY() + val / 2);
  591. spieler->setSize(
  592. spieler->getBreite(), spieler->getHeight() - val / 2);
  593. if (spielerName->getHeight() >= 20)
  594. {
  595. spielerName->setSize(spielerName->getBreite(), 20);
  596. einladen->setSize(einladen->getBreite(), 20);
  597. spieler->setPosition(spieler->getX(), 30);
  598. spieler->setSize(spieler->getBreite(), 210);
  599. }
  600. rend = 1;
  601. }
  602. if (spieler->getSpaltenBreite(2) != 20)
  603. {
  604. spieler->setSpaltenBreite(
  605. 2, spieler->getSpaltenBreite(2) + val / 2);
  606. spieler->setSpaltenBreite(
  607. 0, spieler->getSpaltenBreite(0) - val / 2);
  608. if (spieler->getSpaltenBreite(2) > 20)
  609. {
  610. spieler->setSpaltenBreite(2, 20);
  611. spieler->setSpaltenBreite(0, 90);
  612. }
  613. rend = 1;
  614. }
  615. }
  616. bool ret = rend;
  617. rend = 0;
  618. return ret;
  619. }
  620. void ChatroomFenster::doPublicMausEreignis(MausEreignis& me)
  621. {
  622. bool tmp = me.verarbeitet;
  623. if (me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation)
  624. me.verarbeitet = 1;
  625. verlauf->doPublicMausEreignis(me);
  626. bool vera = me.verarbeitet;
  627. minimieren->doPublicMausEreignis(me);
  628. int aktion = me.verarbeitet && !vera ? 1 : 0;
  629. close->doPublicMausEreignis(me);
  630. if (!aktion) aktion = me.verarbeitet && !vera ? 2 : 0;
  631. einladen->doPublicMausEreignis(me);
  632. if (!aktion) aktion = me.verarbeitet && !vera ? 4 : 0;
  633. nachricht->doPublicMausEreignis(me);
  634. spielerName->doPublicMausEreignis(me);
  635. spieler->doPublicMausEreignis(me);
  636. if (me.mx < 0 || me.mx > breite || me.my < 280 - höhe || animation)
  637. {
  638. me.verarbeitet = tmp;
  639. return;
  640. }
  641. if (!aktion && !sichtbar && !vera)
  642. {
  643. if (me.mx < breite && me.mx > 0 && me.my > 250 && me.my < 280)
  644. aktion = 3;
  645. }
  646. switch (aktion)
  647. {
  648. case 1: // einfahren
  649. if (me.id == ME_RLinks) this->setSichtbar(0);
  650. break;
  651. case 2: // close
  652. if (me.id == ME_RLinks) animation = 4;
  653. break;
  654. case 3: // ausfahren
  655. if (me.id == ME_RLinks) this->setSichtbar(1);
  656. break;
  657. case 4: // einladen
  658. if (me.id != ME_RLinks) break;
  659. if (spielerName->zText()->getLength())
  660. {
  661. int accountId
  662. = infoClient->getAccountId(spielerName->zText()->getText());
  663. if (accountId)
  664. {
  665. if (chatClient->chatroomEinladung(accountId, chatroomId))
  666. {
  667. nachLogin->zNachrichtenListe()->addNachricht(
  668. new Text("Chatroom Einladung"),
  669. new Text("Es wurde eine Chatroom Einladung an den "
  670. "Spieler gesendet."),
  671. new Text("Ok"),
  672. 0);
  673. spielerName->setText("");
  674. spielerName->setAuswahl(0, 0);
  675. rend = 1;
  676. }
  677. }
  678. else
  679. {
  680. nachLogin->zNachrichtenListe()->addNachricht(new Text("Fehler"),
  681. new Text("Der Spieler wurde nicht gefunden."),
  682. new Text("Ok"),
  683. 0);
  684. }
  685. }
  686. break;
  687. }
  688. }
  689. void ChatroomFenster::doTastaturEreignis(TastaturEreignis& te)
  690. {
  691. bool tmp = te.verarbeitet;
  692. if (animation) te.verarbeitet = 1;
  693. nachricht->doTastaturEreignis(te);
  694. int aktion = te.verarbeitet && !tmp ? 1 : 0;
  695. if (admin)
  696. {
  697. spielerName->doTastaturEreignis(te);
  698. if (!aktion) aktion = te.verarbeitet && !tmp ? 2 : 0;
  699. }
  700. if (animation)
  701. {
  702. te.verarbeitet = tmp;
  703. return;
  704. }
  705. switch (aktion)
  706. {
  707. case 1:
  708. if (te.id == TE_Release && te.virtualKey == T_Enter)
  709. {
  710. nachricht->zText()->remove("\n");
  711. chatClient->chatroomNachricht(
  712. chatroomId, nachricht->zText()->getText());
  713. nachricht->setText("");
  714. nachricht->setAuswahl(0, 0);
  715. rend = 1;
  716. }
  717. break;
  718. case 2:
  719. if (te.id == TE_Release && te.virtualKey == T_Enter)
  720. {
  721. if (!spielerName->zText()->getLength()) break;
  722. int accountId
  723. = infoClient->getAccountId(spielerName->zText()->getText());
  724. if (accountId)
  725. {
  726. if (chatClient->chatroomEinladung(accountId, chatroomId))
  727. {
  728. nachLogin->zNachrichtenListe()->addNachricht(
  729. new Text("Chatroom Einladung"),
  730. new Text("Es wurde eine Chatroom Einladung an den "
  731. "Spieler gesendet."),
  732. new Text("Ok"),
  733. 0);
  734. spielerName->setText("");
  735. spielerName->setAuswahl(0, 0);
  736. rend = 1;
  737. }
  738. }
  739. else
  740. {
  741. nachLogin->zNachrichtenListe()->addNachricht(new Text("Fehler"),
  742. new Text("Der Spieler wurde nicht gefunden."),
  743. new Text("Ok"),
  744. 0);
  745. }
  746. }
  747. break;
  748. }
  749. }
  750. void ChatroomFenster::render(int xPos, Bild& zRObj)
  751. {
  752. int x = xPos;
  753. int y = 280 - höhe;
  754. int br = breite;
  755. int hö = höhe;
  756. if (!zRObj.setDrawOptions(x, y, br, hö)) return;
  757. zRObj.alphaRegion(0, 0, br, hö, 0x88000000);
  758. rahmen->setSize(br, hö);
  759. rahmen->render(zRObj);
  760. zRObj.addScrollOffset(0, 280 - höhe);
  761. verlauf->render(zRObj);
  762. nachricht->render(zRObj);
  763. spieler->render(zRObj);
  764. name->render(zRObj);
  765. minimieren->render(zRObj);
  766. close->render(zRObj);
  767. if (spielerName->getHeight())
  768. {
  769. spielerName->render(zRObj);
  770. einladen->render(zRObj);
  771. }
  772. zRObj.releaseDrawOptions();
  773. }
  774. bool ChatroomFenster::druckFreund(void* obj, MausEreignis& me)
  775. {
  776. if (me.id == ME_RLinks)
  777. {
  778. Punkt p = spieler->getZeichnungPosition((Zeichnung*)obj);
  779. if (p.y >= 0)
  780. {
  781. int accountId = TextZuInt(spieler->zZeilenName(p.y)->getText(), 10);
  782. if (chatClient->freundesAnfrage(accountId))
  783. {
  784. nachLogin->zNachrichtenListe()->addNachricht(
  785. new Text("Freundes Einladung"),
  786. new Text("Es wurde eine Freundesanfrage an den Spieler "
  787. "gesendet."),
  788. new Text("Ok"),
  789. 0);
  790. }
  791. }
  792. return 0;
  793. }
  794. return 1;
  795. }
  796. bool ChatroomFenster::druckEntfernen(void* obj, MausEreignis& me)
  797. {
  798. if (me.id == ME_RLinks && admin)
  799. {
  800. Punkt p = spieler->getZeichnungPosition((Zeichnung*)obj);
  801. if (p.y >= 0)
  802. {
  803. int accountId = TextZuInt(spieler->zZeilenName(p.y)->getText(), 10);
  804. if (chatClient->chatroomKick(chatroomId, accountId))
  805. {
  806. nachLogin->zNachrichtenListe()->addNachricht(new Text("Kick"),
  807. new Text("Der Spieler musste das Chatroom verlassen."),
  808. new Text("Ok"),
  809. 0);
  810. }
  811. }
  812. return 0;
  813. }
  814. return 1;
  815. }
  816. // constant
  817. int ChatroomFenster::getChatroomId() const
  818. {
  819. return chatroomId;
  820. }
  821. // Inhalt der ChatLeisteObj Klasse aus ChatLeiste.h
  822. // Konstruktor
  823. ChatLeisteObj::ChatLeisteObj()
  824. : Zeichnung()
  825. {
  826. chats = new RCArray<Chat>();
  827. hsb = new HScrollBar();
  828. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  829. anzahl = 0;
  830. nowME = -1;
  831. }
  832. // Destruktor
  833. ChatLeisteObj::~ChatLeisteObj()
  834. {
  835. chats->release();
  836. hsb = (HScrollBar*)hsb->release();
  837. }
  838. // nicht constant
  839. void ChatLeisteObj::chatNachricht(int vonAccount, const char* txt)
  840. {
  841. if (!vonAccount) return;
  842. lockZeichnung();
  843. bool gefunden = 0;
  844. for (int i = 0; i < anzahl; i++)
  845. {
  846. Chat* tmp = chats->z(i);
  847. if (tmp->getAccountId() == vonAccount)
  848. {
  849. tmp->addNachricht(txt);
  850. gefunden = 1;
  851. break;
  852. }
  853. }
  854. if (!gefunden)
  855. {
  856. addChat(vonAccount, 0);
  857. chatNachricht(vonAccount, txt);
  858. }
  859. unlockZeichnung();
  860. }
  861. void ChatLeisteObj::chatroomNachricht(int chatroomId, const char* txt)
  862. {
  863. lockZeichnung();
  864. bool gefunden = 0;
  865. for (int i = 0; i < anzahl; i++)
  866. {
  867. Chat* tmp = chats->z(i);
  868. if (tmp->getChatroomId() == chatroomId)
  869. {
  870. tmp->addNachricht(txt);
  871. gefunden = 1;
  872. break;
  873. }
  874. }
  875. if (!gefunden)
  876. {
  877. addChat(0, chatroomId);
  878. chatroomNachricht(chatroomId, txt);
  879. }
  880. unlockZeichnung();
  881. }
  882. void ChatLeisteObj::addChat(int accountId, int chatroomId)
  883. {
  884. lockZeichnung();
  885. bool gefunden = 0;
  886. if (accountId)
  887. {
  888. for (int i = 0; i < anzahl; i++)
  889. {
  890. Chat* tmp = chats->z(i);
  891. if (tmp->getAccountId() == accountId)
  892. {
  893. tmp->setSichtbar(1);
  894. gefunden = 1;
  895. break;
  896. }
  897. }
  898. if (!gefunden)
  899. {
  900. ChatFenster* neu = new ChatFenster(accountId);
  901. chats->add(neu, anzahl);
  902. anzahl++;
  903. rend = 1;
  904. }
  905. }
  906. else if (chatroomId)
  907. {
  908. for (int i = 0; i < anzahl; i++)
  909. {
  910. Chat* tmp = chats->z(i);
  911. if (tmp->getChatroomId() == chatroomId)
  912. {
  913. tmp->setSichtbar(1);
  914. gefunden = 1;
  915. break;
  916. }
  917. }
  918. if (!gefunden)
  919. {
  920. ChatroomFenster* neu = new ChatroomFenster(chatroomId);
  921. chats->add(neu, anzahl);
  922. anzahl++;
  923. rend = 1;
  924. }
  925. }
  926. unlockZeichnung();
  927. }
  928. void ChatLeisteObj::removeChat(int accountId, int chatroomId)
  929. {
  930. lockZeichnung();
  931. if (accountId)
  932. {
  933. for (int i = 0; i < anzahl; i++)
  934. {
  935. Chat* tmp = chats->z(i);
  936. if (tmp->getAccountId() == accountId) tmp->entfernen();
  937. }
  938. }
  939. else if (chatroomId)
  940. {
  941. for (int i = 0; i < anzahl; i++)
  942. {
  943. Chat* tmp = chats->z(i);
  944. if (tmp->getChatroomId() == chatroomId) tmp->entfernen();
  945. }
  946. }
  947. rend = 1;
  948. unlockZeichnung();
  949. }
  950. void ChatLeisteObj::removeChat(Chat* zChat)
  951. {
  952. lockZeichnung();
  953. for (int i = 0; i < anzahl; i++)
  954. {
  955. if (chats->z(i) == zChat)
  956. {
  957. chats->remove(i);
  958. anzahl--;
  959. rend = 1;
  960. break;
  961. }
  962. }
  963. unlockZeichnung();
  964. }
  965. void ChatLeisteObj::removeAll()
  966. {
  967. lockZeichnung();
  968. chats->leeren();
  969. anzahl = 0;
  970. rend = 1;
  971. unlockZeichnung();
  972. }
  973. void ChatLeisteObj::addSpieler(int chatroomId, int accountId)
  974. {
  975. if (!chatroomId || !accountId) return;
  976. lockZeichnung();
  977. for (int i = 0; i < anzahl; i++)
  978. {
  979. Chat* tmp = chats->z(i);
  980. if (tmp->getChatroomId() == chatroomId)
  981. {
  982. tmp->addSpieler(accountId);
  983. break;
  984. }
  985. }
  986. unlockZeichnung();
  987. }
  988. void ChatLeisteObj::removeSpieler(int chatroomId, int accountId)
  989. {
  990. lockZeichnung();
  991. if (!chatroomId || !accountId) return;
  992. for (int i = 0; i < anzahl; i++)
  993. {
  994. Chat* tmp = chats->z(i);
  995. if (tmp->getChatroomId() == chatroomId)
  996. {
  997. tmp->removeSpieler(accountId);
  998. break;
  999. }
  1000. }
  1001. unlockZeichnung();
  1002. }
  1003. void ChatLeisteObj::setChatroomAdmin(int chatroomId)
  1004. {
  1005. lockZeichnung();
  1006. for (int i = 0; i < anzahl; i++)
  1007. {
  1008. Chat* tmp = chats->z(i);
  1009. if (tmp->getChatroomId() == chatroomId)
  1010. {
  1011. tmp->setAdmin();
  1012. break;
  1013. }
  1014. }
  1015. unlockZeichnung();
  1016. }
  1017. bool ChatLeisteObj::tick(double tickVal)
  1018. {
  1019. rend |= hsb->getRend();
  1020. rend |= nachLogin->zChatLeiste()->tick(tickVal);
  1021. for (int i = 0; i < anzahl; i++)
  1022. rend |= chats->z(i)->tick(tickVal);
  1023. bool ret = rend;
  1024. rend = 0;
  1025. return ret;
  1026. }
  1027. void ChatLeisteObj::doTastaturEreignis(TastaturEreignis& te)
  1028. {
  1029. for (int i = 0; i < anzahl; i++)
  1030. chats->z(i)->doTastaturEreignis(te);
  1031. }
  1032. void ChatLeisteObj::doPublicMausEreignis(MausEreignis& me)
  1033. {
  1034. int mx = me.mx;
  1035. int my = me.my;
  1036. me.my += 250;
  1037. me.mx += hsb->getScroll();
  1038. bool insideParent = me.insideParent;
  1039. me.insideParent = 1;
  1040. for (int i = 0; i < anzahl; i++)
  1041. {
  1042. Chat* tmp = chats->z(i);
  1043. nowME = i;
  1044. tmp->doPublicMausEreignis(me);
  1045. nowME = -1;
  1046. me.mx -= tmp->getBreite();
  1047. }
  1048. me.mx = mx;
  1049. me.my = my;
  1050. hsb->doMausMessage(1, 30, bildschirmGröße.x - 20, 20, me);
  1051. me.insideParent = insideParent;
  1052. }
  1053. void ChatLeisteObj::render(Bild& zRObj)
  1054. {
  1055. int x = pos.x;
  1056. int y = pos.y;
  1057. int br = bildschirmGröße.x - 20;
  1058. int hö = 300;
  1059. if (!zRObj.setDrawOptionsErzwingen(x, y - 250, br, hö)) return;
  1060. int breite = 0;
  1061. for (int i = 0; i < anzahl; i++)
  1062. {
  1063. Chat* tmp = chats->z(i);
  1064. tmp->render(breite - (hsb ? hsb->getScroll() : 0), zRObj);
  1065. breite += tmp->getBreite();
  1066. }
  1067. if (hsb)
  1068. {
  1069. hsb->update(breite, bildschirmGröße.x - 22);
  1070. hsb->render(0, 280, bildschirmGröße.x - 22, 20, zRObj);
  1071. }
  1072. zRObj.releaseDrawOptions();
  1073. }
  1074. // Inhalt der ChatLeiste Klasse aus ChatLeiste.h
  1075. // Konstruktor
  1076. ChatLeiste::ChatLeiste(Fenster* zNachLoginFenster)
  1077. : ReferenceCounter()
  1078. {
  1079. minimierenBild = bilder->get("data/client/bilder/chat.ltdb/minimieren.png");
  1080. maximierenBild = bilder->get("data/client/bilder/chat.ltdb/maximieren.png");
  1081. bildschirmGröße = uiFactory.initParam.bildschirm->getBackBufferSize();
  1082. fenster = initFenster(20 - bildschirmGröße.x,
  1083. bildschirmGröße.y - 50,
  1084. bildschirmGröße.x,
  1085. 50,
  1086. Fenster::Style::Sichtbar | Fenster::Style::Erlaubt
  1087. | Fenster::Style::BodyHintergrund | Fenster::Style::Rahmen,
  1088. "");
  1089. fenster->setKBgFarbe(0xFF000000);
  1090. minMax = initKnopf(bildschirmGröße.x - 21, 1, 20, 20, 0, "");
  1091. minMax->setStyle(Knopf::Style::Sichtbar | Knopf::Style::Erlaubt
  1092. | Knopf::Style::Hintergrund | Knopf::Style::HAlpha
  1093. | Knopf::Style::HBild | Knopf::Style::KlickBuffer);
  1094. minMax->setHintergrundBildZ(dynamic_cast<Bild*>(minimierenBild->getThis()));
  1095. minMax->setMausEreignisParameter(this);
  1096. minMax->setMausEreignis(chatLeisteMinMaxME);
  1097. initToolTip(minMax, "Chat Leiste minimieren.");
  1098. fenster->addMember(dynamic_cast<Zeichnung*>(minMax->getThis()));
  1099. chatLeiste = new ChatLeisteObj();
  1100. fenster->addMember(dynamic_cast<Zeichnung*>(chatLeiste->getThis()));
  1101. zNachLoginFenster->addMember(dynamic_cast<Zeichnung*>(fenster->getThis()));
  1102. tickVal = 0;
  1103. animation = 1;
  1104. rend = 0;
  1105. chatClient->chatNachrichtAnfrage();
  1106. }
  1107. // Destruktor
  1108. ChatLeiste::~ChatLeiste()
  1109. {
  1110. minimierenBild->release();
  1111. maximierenBild->release();
  1112. fenster = (Fenster*)fenster->release();
  1113. minMax = (Knopf*)minMax->release();
  1114. chatLeiste = (ChatLeisteObj*)chatLeiste->release();
  1115. }
  1116. // nicht constant
  1117. void ChatLeiste::chatNachricht(int vonAccount, const char* txt)
  1118. {
  1119. chatLeiste->chatNachricht(vonAccount, txt);
  1120. }
  1121. void ChatLeiste::chatroomNachricht(
  1122. int chatroomId, int vonAccount, const char* txt)
  1123. {
  1124. chatLeiste->chatroomNachricht(chatroomId, txt);
  1125. }
  1126. void ChatLeiste::addChat(int accountId, int chatroomId)
  1127. {
  1128. chatLeiste->addChat(accountId, chatroomId);
  1129. }
  1130. void ChatLeiste::removeChat(int accountId, int chatroomId)
  1131. {
  1132. chatLeiste->removeChat(accountId, chatroomId);
  1133. }
  1134. void ChatLeiste::removeChat(Chat* zChat)
  1135. {
  1136. chatLeiste->removeChat(zChat);
  1137. }
  1138. void ChatLeiste::removeAll()
  1139. {
  1140. chatLeiste->removeAll();
  1141. }
  1142. void ChatLeiste::addSpieler(int chatroomId, int accountId)
  1143. {
  1144. chatLeiste->addSpieler(chatroomId, accountId);
  1145. }
  1146. void ChatLeiste::removeSpieler(int chatroomId, int accountId)
  1147. {
  1148. chatLeiste->removeSpieler(chatroomId, accountId);
  1149. }
  1150. void ChatLeiste::setChatroomAdmin(int chatroomId)
  1151. {
  1152. chatLeiste->setChatroomAdmin(chatroomId);
  1153. }
  1154. bool ChatLeiste::tick(double tickVal)
  1155. {
  1156. this->tickVal += tickVal * 500;
  1157. int val = (int)this->tickVal;
  1158. if (val < 1)
  1159. {
  1160. bool ret = rend;
  1161. rend = 0;
  1162. return ret;
  1163. }
  1164. if (val > 16) val = 16;
  1165. this->tickVal -= val;
  1166. switch (animation)
  1167. {
  1168. case 1: // einfahren
  1169. if (fenster->getX() < 0)
  1170. fenster->setPosition(fenster->getX() + val, fenster->getY());
  1171. else
  1172. {
  1173. fenster->setPosition(0, fenster->getY());
  1174. animation = 0;
  1175. }
  1176. rend = 1;
  1177. break;
  1178. case 2: // ausfahren
  1179. if (fenster->getX() + fenster->getBreite() > 21)
  1180. fenster->setPosition(fenster->getX() - val, fenster->getY());
  1181. else
  1182. {
  1183. fenster->setPosition(21 - fenster->getBreite(), fenster->getY());
  1184. animation = 0;
  1185. }
  1186. rend = 1;
  1187. break;
  1188. }
  1189. bool ret = rend;
  1190. rend = 0;
  1191. return ret;
  1192. }
  1193. bool ChatLeiste::druckMinMax(MausEreignis& me)
  1194. {
  1195. if (animation) return 1;
  1196. if (me.id == ME_RLinks)
  1197. {
  1198. if (minMax->zHintergrundBild() == minimierenBild)
  1199. {
  1200. animation = 2;
  1201. minMax->setHintergrundBildZ(
  1202. dynamic_cast<Bild*>(maximierenBild->getThis()));
  1203. // TODO minMax->zToolTip()->setText( "Chat Leiste maximieren." );
  1204. }
  1205. else
  1206. {
  1207. animation = 1;
  1208. minMax->setHintergrundBildZ(
  1209. dynamic_cast<Bild*>(minimierenBild->getThis()));
  1210. // TODO minMax->zToolTip()->setText( "Chat Leiste minimieren." );
  1211. }
  1212. }
  1213. return 1;
  1214. }
  1215. // Nachrichten
  1216. bool chatLeisteMinMaxME(void* p, void* obj, MausEreignis me)
  1217. {
  1218. return ((ChatLeiste*)p)->druckMinMax(me);
  1219. }
  1220. bool chatroomFensterFreundME(void* p, void* obj, MausEreignis me)
  1221. {
  1222. return ((ChatroomFenster*)p)->druckFreund(obj, me);
  1223. }
  1224. bool chatroomFensterEntfernenME(void* p, void* obj, MausEreignis me)
  1225. {
  1226. return ((ChatroomFenster*)p)->druckEntfernen(obj, me);
  1227. }