PageRenderTime 56ms CodeModel.GetById 28ms RepoModel.GetById 0ms app.codeStats 1ms

/client/NetEngine.cpp

https://bitbucket.org/Ogre/worldapocalypse/
C++ | 876 lines | 858 code | 6 blank | 12 comment | 275 complexity | 7b9091c331d991bc76f799cf4e4435c3 MD5 | raw file
Possible License(s): AGPL-3.0, BSD-3-Clause
  1. /*
  2. This file is a part of World Apocalypse.
  3. Copyright (C) 2011 Le Sommer Leo Robin
  4. World Apocalypse is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
  5. World Apocalypse is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details.
  6. You should have received a copy of the GNU Affero General Public License along with this program. If not, see <http://www.gnu.org/licenses/>.
  7. */
  8. #include "NetEngine.h"
  9. #include "GameEngine.h"
  10. #include <time.h>
  11. #include <sstream>
  12. #include "sleep.h"
  13. #include "ConfigGlobalObject.h"
  14. namespace network
  15. {
  16. void* TreceiveRequestsFromServer(void* data);
  17. NetEngine::NetEngine()
  18. {
  19. m_isInitiated = false;
  20. requestBuffer = new char[500];
  21. }
  22. NetEngine::~NetEngine()
  23. {
  24. delete[] requestBuffer;
  25. }
  26. void NetEngine::init(game::GameEngine* gameEngine, gui::GUIEngine* guiEngine)
  27. {
  28. m_fileReceivedMutex = PTHREAD_MUTEX_INITIALIZER;
  29. m_isThreadReceiveRequestsFromServerEnabled = false;
  30. m_gameEngine = gameEngine;
  31. m_guiEngine = guiEngine;
  32. m_isNetEngineStoped = false;
  33. m_isInitiated = true;
  34. }
  35. void NetEngine::remove()
  36. {
  37. if(!m_isInitiated)
  38. return;
  39. clean();
  40. }
  41. bool NetEngine::init(std::string name, std::string mdp, const char* ip, int port, int domain, int protocol)
  42. {
  43. //connection a l'appli serveur
  44. #if defined (WIN32)
  45. WSADATA WSAData;
  46. int error = WSAStartup(MAKEWORD(2,2), &WSAData);
  47. #else
  48. int error = 0;
  49. #endif
  50. if(error)
  51. {
  52. std::cout<<"erreur : les sockets de windows ne semblent pas fonctionnelles"<<std::endl;
  53. return false;
  54. }
  55. m_sock = socket(domain, protocol, 0);
  56. if(m_sock == INVALID_SOCKET)
  57. {
  58. std::cout<<"erreur : erreur lors de la creation de la socket"<<std::endl;
  59. return false;
  60. }
  61. std::cout<<"La socket "<<m_sock<<" est desormais ouverte sur le port "<<port<<std::endl;
  62. m_sin.sin_addr.s_addr = inet_addr(ip);
  63. m_sin.sin_family = domain;
  64. m_sin.sin_port = htons(port);
  65. int sockError = connect(m_sock, (SOCKADDR*)&m_sin, sizeof(m_sin));
  66. if(sockError == SOCKET_ERROR)
  67. {
  68. std::cout<<"erreur : la connection a échoué"<<std::endl;
  69. return false;
  70. }
  71. std::cout<<"Connection a "<<inet_ntoa(m_sin.sin_addr)<<" sur le port "<<htons(m_sin.sin_port)<<" etabli"<<std::endl;
  72. std::cout<<"Envoie de la requete de connexion ... ";
  73. std::stringstream os;
  74. os<<name<<':'<<mdp<<'\n';
  75. if(send(m_sock, static_cast<const CAST_FOR_SOCKETS_FUNCTIONS>(os.str().c_str()), os.str().size(), 0) != SOCKET_ERROR)
  76. {
  77. std::cout<<"done"<<std::endl;
  78. int nBit;
  79. if((nBit = recv(m_sock, static_cast<CAST_FOR_SOCKETS_FUNCTIONS>(requestBuffer), 500, 0)) != SOCKET_ERROR)
  80. {
  81. separateReceivedRequests(requestBuffer, nBit);
  82. if(getRequest() == std::string("ok"))
  83. {
  84. std::cout<<"la connection a été établie"<<std::endl;
  85. createThread();
  86. return true;
  87. }
  88. else
  89. {
  90. std::cout<<"erreur : la connexion a été refusé"<<std::endl;
  91. return false;
  92. }
  93. }
  94. else
  95. {
  96. std::cout<<"erreur : la requete n'a pas été envoyé"<<std::endl;
  97. return false;
  98. }
  99. }
  100. else
  101. {
  102. std::cout<<std::endl<<"erreur : erreur lors de l'envoi de l'ID"<<std::endl;
  103. return false;
  104. }
  105. return false;
  106. }
  107. void NetEngine::createThread()
  108. {
  109. //création des thread
  110. pthread_create(&threadReceiveRequestsFromServer, NULL, TreceiveRequestsFromServer, static_cast<void*>(this));
  111. m_isThreadReceiveRequestsFromServerEnabled = true;
  112. }
  113. void NetEngine::clean()
  114. {
  115. if(!m_isThreadReceiveRequestsFromServerEnabled)
  116. return;
  117. std::cout<<"arret des thread ...";
  118. m_isNetEngineStoped = true;
  119. if(m_isThreadReceiveRequestsFromServerEnabled)
  120. pthread_cancel(threadReceiveRequestsFromServer);
  121. m_isThreadReceiveRequestsFromServerEnabled = false;
  122. std::cout<<" done"<<std::endl<<"envoi de la demande de deconnection au serveur ...";
  123. std::ostringstream os;
  124. os<<'q'<<m_id<<'\n';
  125. send(m_sock, static_cast<const CAST_FOR_SOCKETS_FUNCTIONS>(os.str().c_str()), os.str().size(), 0);
  126. std::cout<<" done"<<std::endl;
  127. std::cout<<"Fermeture de la socket ...";
  128. closesocket(m_sock);
  129. #if defined (WIN32)
  130. WSACleanup();
  131. #endif
  132. std::cout<<" done"<<std::endl;
  133. }
  134. void NetEngine::sendRequestToServer()
  135. {
  136. while(!m_fileRequest.empty())
  137. {
  138. std::string willBeSend = m_fileRequest.front() + '\n';
  139. send(m_sock, static_cast<const CAST_FOR_SOCKETS_FUNCTIONS>(willBeSend.c_str()), willBeSend.size(), 0);
  140. m_fileRequest.pop();
  141. }
  142. }
  143. void NetEngine::executeRequestsFromServer()
  144. {
  145. std::string received;
  146. while((received = getRequest()) != "")
  147. {
  148. if(received[0] == 'p')
  149. {
  150. int id;
  151. float posX, posY, posZ, rotY;
  152. sscanf(received.c_str(), "p%d/%f/%f/%f/%f", &id, &posX, &posY, &posZ, &rotY);
  153. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  154. if(perso != NULL)
  155. perso->setPositionAndRotationY(Ogre::Vector3(posX, posY, posZ), rotY);
  156. else
  157. m_gameEngine->addPersonnageAttaquableFromIdAndPos(id, posX, posY, posZ, rotY);
  158. }
  159. else if(received[0] == 'o')
  160. {
  161. int id;
  162. float rotY;
  163. sscanf(received.c_str(), "o%d/%f", &id, &rotY);
  164. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  165. if(perso != NULL)
  166. perso->setRotationY(rotY);
  167. }
  168. else if(received[0] == 'b')
  169. {
  170. int id;
  171. float vel;
  172. sscanf(received.c_str(), "b%d/%f", &id, &vel);
  173. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  174. if(perso != NULL)
  175. perso->setOrientatedVelocity(vel);
  176. }
  177. else if(received[0] == 't')
  178. {
  179. float time = 0.0;
  180. sscanf(received.c_str(), "t%f", &time);
  181. m_gameEngine->getSceneEngine()->setTime(time);
  182. }
  183. else if(received[0] == 's')
  184. {
  185. int id;
  186. int nbr1;
  187. sscanf(received.c_str(), "s%d/%d", &id, &nbr1);
  188. game::StateType state = (game::StateType)nbr1;
  189. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  190. if(perso != NULL)
  191. (static_cast<game::PersonnageJoueur*>(perso))->setState(state);
  192. }
  193. else if(received[0] == 'i')
  194. {
  195. if(received[1] == 'k')
  196. {
  197. std::string idString;
  198. std::string name;
  199. unsigned int i = 2;
  200. for(; i < received.size(); i++)
  201. {
  202. if(received[i] == '/')
  203. {
  204. i++;
  205. break;
  206. }
  207. idString += received[i];
  208. }
  209. for(; i < received.size(); i++)
  210. {
  211. if(received[i] == '\0')
  212. break;
  213. name += received[i];
  214. }
  215. unsigned int id = std::stoul(idString);
  216. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  217. if(perso != NULL)
  218. perso->setName(name);
  219. }
  220. else if(received[1] == 'h')
  221. {
  222. int id;
  223. int hp;
  224. sscanf(received.c_str(), "ih%d/%d", &id, &hp);
  225. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  226. if(perso != NULL)
  227. perso->setHP(hp);
  228. }
  229. else if(received[1] == 'f')
  230. {
  231. int id = 0, race = 0, sex = 0, haircut = 0, hairColor = 0, clothColor = 0, skinColor = 0;
  232. float noseSize = 0.0, noseWidth = 0.0, eyesHeight = 0.0, eyesWidth = 0.0, bodySize = 0.0, legsSize = 0.0, hipsSize = 0.0;
  233. sscanf(received.c_str(), "if%d/%d/%d/%d/%d/%d/%d/%f/%f/%f/%f/%f/%f/%f", &id, &race, &sex, &haircut, &hairColor, &clothColor, &skinColor, &noseSize, &noseWidth, &eyesHeight, &eyesWidth, &bodySize, &legsSize, &hipsSize);
  234. game::PersonnageJoueur* perso = static_cast<game::PersonnageJoueur*>(m_gameEngine->getPersonnageAttaquableFromId(id));
  235. if(perso != NULL)
  236. {
  237. std::cout<<race<<std::endl;
  238. perso->getCharacter()->setRace(GLOBAL_ConfigEngine->getRace(race));
  239. perso->getCharacter()->setSex(static_cast<scene::Character::Sex>(sex));
  240. perso->getCharacter()->setHaircut(haircut);
  241. perso->getCharacter()->setHairColor(hairColor);
  242. perso->getCharacter()->setClothColor(clothColor);
  243. perso->getCharacter()->setSkin(skinColor);
  244. perso->getCharacter()->setNoseSize(noseSize);
  245. perso->getCharacter()->setNoseWidth(noseWidth);
  246. perso->getCharacter()->setEyesHeight(eyesHeight);
  247. perso->getCharacter()->setEyesWidth(eyesWidth);
  248. perso->getCharacter()->setBodySize(bodySize);
  249. perso->getCharacter()->setLegsSize(legsSize);
  250. perso->getCharacter()->setHipsSize(hipsSize);
  251. }
  252. }
  253. else if(received[1] == 'd')
  254. {
  255. int receiver;
  256. int sender;
  257. sscanf(received.c_str(), "id%d/%d", &receiver, &sender);
  258. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(receiver);
  259. if(perso != NULL)
  260. {
  261. game::PersonnageAttaquable* perso2 = m_gameEngine->getPersonnageAttaquableFromId(sender);
  262. if(perso2 != NULL)
  263. {
  264. perso->isAttacked(perso2);
  265. }
  266. }
  267. }
  268. else if(received[1] == 'm')
  269. {
  270. int id;
  271. int mp;
  272. sscanf(received.c_str(), "im%d/%d", &id, &mp);
  273. if(id > 0)
  274. {
  275. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  276. if(perso != NULL)
  277. static_cast<game::PersonnageJoueur*>(perso)->setMP(mp);
  278. }
  279. }
  280. else if(received[1] == 'g')
  281. {
  282. int id;
  283. int hp;
  284. sscanf(received.c_str(), "ig%d/%d", &id, &hp);
  285. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  286. if(perso != NULL)
  287. perso->setHPMax(hp);
  288. }
  289. else if(received[1] == 'l')
  290. {
  291. int id;
  292. int mp;
  293. sscanf(received.c_str(), "il%d/%d", &id, &mp);
  294. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  295. if(id > 0)
  296. {
  297. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  298. if(perso != NULL)
  299. static_cast<game::PersonnageJoueur*>(perso)->setMPMax(mp);
  300. }
  301. }
  302. else if(received[1] == 'x')
  303. {
  304. int xp;
  305. sscanf(received.c_str(), "ix%d", &xp);
  306. m_gameEngine->setXp(xp);
  307. }
  308. else if(received[1] == 'y')
  309. {
  310. int money;
  311. sscanf(received.c_str(), "iy%d", &money);
  312. m_gameEngine->setMoney(money);
  313. m_guiEngine->refreshInventaire();
  314. }
  315. else if(received[1] == 'z')
  316. {
  317. int lv;
  318. sscanf(received.c_str(), "iz%d", &lv);
  319. m_gameEngine->setLevel(lv);
  320. }
  321. else if(received[1] == 'e')
  322. {
  323. std::string idString;
  324. std::string typeString;
  325. std::string mesh;
  326. unsigned int i = 2;
  327. for(; i < received.size(); i++)
  328. {
  329. if(received[i] == '/')
  330. {
  331. i++;
  332. break;
  333. }
  334. idString += received[i];
  335. }
  336. for(; i < received.size(); i++)
  337. {
  338. if(received[i] == '/')
  339. {
  340. i++;
  341. break;
  342. }
  343. typeString += received[i];
  344. }
  345. for(; i < received.size(); i++)
  346. {
  347. if(received[i] == '\0')
  348. break;
  349. mesh += received[i];
  350. }
  351. unsigned int id = std::stoul(idString);
  352. unsigned int type = std::stoul(typeString);
  353. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(id);
  354. if(perso != NULL)
  355. (static_cast<game::PersonnageJoueur*>(perso))->equiper(mesh, (game::TypeEquipment)type);
  356. }
  357. else if(received[1] == 'i')
  358. {
  359. std::string idString;
  360. std::string name;
  361. std::string description;
  362. std::string mesh;
  363. unsigned int i = 2;
  364. for(; i < received.size(); i++)
  365. {
  366. if(received[i] == '/')
  367. {
  368. i++;
  369. break;
  370. }
  371. idString += received[i];
  372. }
  373. unsigned int id = std::stoul(idString);
  374. for(; i < received.size(); i++)
  375. {
  376. if(received[i] == '/')
  377. {
  378. i++;
  379. break;
  380. }
  381. name += received[i];
  382. }
  383. for(; i < received.size(); i++)
  384. {
  385. if(received[i] == '/')
  386. {
  387. i++;
  388. break;
  389. }
  390. description += received[i];
  391. }
  392. for(; i < received.size(); i++)
  393. {
  394. if(received[i] == '\0')
  395. break;
  396. mesh += received[i];
  397. }
  398. m_gameEngine->addItem(game::Item(id, name, description, mesh));
  399. }
  400. else if(received[1] == 'n')
  401. {
  402. std::string idString;
  403. std::string name;
  404. std::string mesh;
  405. std::string posXString;
  406. std::string posYString;
  407. std::string posZString;
  408. std::string rotYString;
  409. unsigned int i = 2;
  410. for(; i < received.size(); i++)
  411. {
  412. if(received[i] == '/')
  413. {
  414. i++;
  415. break;
  416. }
  417. idString += received[i];
  418. }
  419. unsigned int id = std::stoul(idString);
  420. for(; i < received.size(); i++)
  421. {
  422. if(received[i] == '/')
  423. {
  424. i++;
  425. break;
  426. }
  427. name += received[i];
  428. }
  429. for(; i < received.size(); i++)
  430. {
  431. if(received[i] == '/')
  432. {
  433. i++;
  434. break;
  435. }
  436. mesh += received[i];
  437. }
  438. for(; i < received.size(); i++)
  439. {
  440. if(received[i] == '/')
  441. {
  442. i++;
  443. break;
  444. }
  445. posXString += received[i];
  446. }
  447. double posX = atof(posXString.c_str());
  448. for(; i < received.size(); i++)
  449. {
  450. if(received[i] == '/')
  451. {
  452. i++;
  453. break;
  454. }
  455. posYString += received[i];
  456. }
  457. double posY = atof(posYString.c_str());
  458. for(; i < received.size(); i++)
  459. {
  460. if(received[i] == '/')
  461. {
  462. i++;
  463. break;
  464. }
  465. posZString += received[i];
  466. }
  467. double posZ = atof(posZString.c_str());
  468. for(; i < received.size(); i++)
  469. {
  470. if(received[i] == '/')
  471. {
  472. i++;
  473. break;
  474. }
  475. rotYString += received[i];
  476. }
  477. double rotY = atof(rotYString.c_str());
  478. m_gameEngine->addPersonnageNonJoueur(id, name, mesh, posX, posY, posZ, rotY);
  479. }
  480. else if(received[1] == 's')
  481. {
  482. std::string idString;
  483. std::string name;
  484. std::string description;
  485. unsigned int i = 3;
  486. for(; i < received.size(); i++)
  487. {
  488. if(received[i] == '/')
  489. {
  490. i++;
  491. break;
  492. }
  493. idString += received[i];
  494. }
  495. unsigned int id = std::stoul(idString);
  496. for(; i < received.size(); i++)
  497. {
  498. if(received[i] == '/')
  499. {
  500. i++;
  501. break;
  502. }
  503. name += received[i];
  504. }
  505. for(; i < received.size(); i++)
  506. {
  507. if(received[i] == '/')
  508. {
  509. i++;
  510. break;
  511. }
  512. description += received[i];
  513. }
  514. m_gameEngine->addSkill(game::Skill(id, name, description));
  515. }
  516. else if(received[1] == 'r')
  517. {
  518. if(received[2] == 'i')
  519. {
  520. int id;
  521. int item;
  522. sscanf(received.c_str(), "iri%d/%d", &id, &item);
  523. if(m_id == id)
  524. {
  525. m_gameEngine->removeItem(item);
  526. m_guiEngine->refreshInventaire();
  527. }
  528. }
  529. }
  530. }
  531. else if(received[0] == 'v')
  532. {
  533. if(received[1] == 't')
  534. {
  535. std::string text = &received[2];
  536. m_guiEngine->getTextDialog()->init("", text);
  537. m_guiEngine->getTextDialog()->setCloseEvent(MyGUI::newDelegate(this, &NetEngine::textDialogButtonSuivantPressed));
  538. }
  539. else if(received[1] == 'c')
  540. {
  541. unsigned int i = 2;
  542. std::string choice1;
  543. while(received[i] != '|')
  544. {
  545. choice1 += received[i];
  546. i++;
  547. }
  548. i++;
  549. std::string choice2;
  550. while(received[i] != '|')
  551. {
  552. choice2 += received[i];
  553. i++;
  554. }
  555. i++;
  556. std::string text;
  557. while(received[i] != '\0')
  558. {
  559. text += received[i];
  560. i++;
  561. }
  562. m_guiEngine->getChoiceDialog()->init("", text, choice1, choice2);
  563. m_guiEngine->getChoiceDialog()->setFirstChoiceEvent(MyGUI::newDelegate(this, &NetEngine::buttonChoice1Pressed));
  564. m_guiEngine->getChoiceDialog()->setSecondChoiceEvent(MyGUI::newDelegate(this, &NetEngine::buttonChoice2Pressed));
  565. }
  566. else if(received[1] == 'i')
  567. {
  568. std::string idString;
  569. std::string priceString;
  570. std::string name;
  571. unsigned int i = 2;
  572. for(; i < received.size(); i++)
  573. {
  574. if(received[i] == '/')
  575. {
  576. i++;
  577. break;
  578. }
  579. idString += received[i];
  580. }
  581. unsigned int id = std::stoul(idString);
  582. for(; i < received.size(); i++)
  583. {
  584. if(received[i] == '/')
  585. {
  586. i++;
  587. break;
  588. }
  589. priceString += received[i];
  590. }
  591. unsigned int price = std::stoul(priceString);
  592. for(; i < received.size(); i++)
  593. {
  594. if(received[i] == '\0')
  595. break;
  596. name += received[i];
  597. }
  598. m_guiEngine->getMagasin()->addArticle(id, name, price);
  599. }
  600. else if(received[1] == 's')
  601. {
  602. m_guiEngine->getMagasin()->init();
  603. m_guiEngine->getMagasin()->setCloseEvent(MyGUI::newDelegate(this, &NetEngine::magasinButtonCloseEventPressed));
  604. }
  605. }
  606. else if(received[0] == 'x')
  607. {
  608. if(received[1] == 's')
  609. {
  610. m_gameEngine->setIfHaveGroup(true);
  611. }
  612. else if(received[1] == 'c')
  613. {
  614. m_gameEngine->setIfHaveGroup(false);
  615. }
  616. else if(received[1] == 'm')
  617. {
  618. int id = 0;
  619. sscanf(received.c_str(), "xm%d", &id);
  620. m_gameEngine->addGroupMember(id);
  621. }
  622. else if(received[1] == 'y')
  623. {
  624. int id = 0;
  625. sscanf(received.c_str(), "xy%d", &id);
  626. m_gameEngine->removeGroupMember(id);
  627. }
  628. else if(received[1] == 'o')
  629. {
  630. int algo = 0;
  631. sscanf(received.c_str(), "xo%d", &algo);
  632. m_gameEngine->setGroupDivisorAlgo(static_cast<game::DivisorAlgo>(algo));
  633. }
  634. else if(received[1] == 'f')
  635. {
  636. int id = 0;
  637. sscanf(received.c_str(), "xf%d", &id);
  638. m_gameEngine->setGroupAdmin(id);
  639. }
  640. else if(received[1] == 'd')
  641. {
  642. m_guiEngine->getChoiceDialog()->init("", "X vous invite dans son groupe.", "Accepter", "Refuser");
  643. m_guiEngine->getChoiceDialog()->setFirstChoiceEvent(MyGUI::newDelegate(this, &NetEngine::acceptGroupInvitation));
  644. m_guiEngine->getChoiceDialog()->setSecondChoiceEvent(MyGUI::newDelegate(this, &NetEngine::rejectGroupInvitation));
  645. }
  646. }
  647. else if(received[0] == 'e')
  648. {
  649. if(received[1] == 'x')
  650. {
  651. m_guiEngine->getTextDialog()->init("", "Vous ne pouvez pas quitter votre groupe si vous êtes admin, vous pouvez soit dissoudre le groupe soit léguer vos privilèges a un autre membre du groupe.");
  652. }
  653. }
  654. else if(received[0] == 'm')
  655. {
  656. m_guiEngine->addMessageToChatBox(received.substr(1, received.size() - 1));
  657. }
  658. else if(received[0] == 'd')
  659. {
  660. int receiver;
  661. int sender;
  662. int dammages;
  663. sscanf(received.c_str(), "d%d/%d/%d", &receiver, &sender, &dammages);
  664. game::PersonnageAttaquable* perso = m_gameEngine->getPersonnageAttaquableFromId(receiver);
  665. if(perso != NULL)
  666. perso->setHP(perso->m_hp - dammages);
  667. }
  668. else if(received[0] == 'z')
  669. {
  670. std::string zone = &received[1];
  671. m_gameEngine->changeZone(zone);
  672. }
  673. else if(received[0] == 'k')
  674. {
  675. int id;
  676. float posX, posY, posZ;
  677. sscanf(received.c_str(), "k%d/%f/%f/%f", &id, &posX, &posY, &posZ);
  678. scene::Particle* particle = m_gameEngine->getParticle(id);
  679. if(particle != 0)
  680. particle->setPosition(Ogre::Vector3(posX, posY, posZ));
  681. }
  682. else if(received[0] == 'h')
  683. {
  684. std::string idString;
  685. std::string scaleXString;
  686. std::string scaleYString;
  687. std::string scaleZString;
  688. std::string particle;
  689. unsigned int i = 1;
  690. for(; i < received.size(); i++)
  691. {
  692. if(received[i] == '/')
  693. {
  694. i++;
  695. break;
  696. }
  697. idString += received[i];
  698. }
  699. unsigned int id = std::stoul(idString);
  700. for(; i < received.size(); i++)
  701. {
  702. if(received[i] == '/')
  703. {
  704. i++;
  705. break;
  706. }
  707. scaleXString += received[i];
  708. }
  709. double scaleX = atof(scaleXString.c_str());
  710. for(; i < received.size(); i++)
  711. {
  712. if(received[i] == '/')
  713. {
  714. i++;
  715. break;
  716. }
  717. scaleYString += received[i];
  718. }
  719. double scaleY = atof(scaleYString.c_str());
  720. for(; i < received.size(); i++)
  721. {
  722. if(received[i] == '/')
  723. {
  724. i++;
  725. break;
  726. }
  727. scaleZString += received[i];
  728. }
  729. double scaleZ = atof(scaleZString.c_str());
  730. for(; i < received.size(); i++)
  731. {
  732. if(received[i] == '\0')
  733. break;
  734. particle += received[i];
  735. }
  736. m_gameEngine->addParticle(id, particle, Ogre::Vector3(scaleX, scaleY, scaleX));
  737. }
  738. else if(received[0] == 'j')
  739. {
  740. int id;
  741. sscanf(received.c_str(), "j%d", &id);
  742. m_gameEngine->removeParticle(id);
  743. }
  744. else if(received[0] == 'c')
  745. {
  746. m_gameEngine->setIfHaveToSignaleCursorPosition(true);
  747. }
  748. else if(received[0] == 'd')
  749. {
  750. m_gameEngine->setIfHaveToSignaleCursorPosition(false);
  751. }
  752. else if(received[0] == 'f')
  753. {
  754. float scaleX = 0.0, scaleY = 0.0, scaleZ = 0.0;
  755. sscanf(received.c_str(), "f%f/%f/%f", &scaleX, &scaleY, &scaleZ);
  756. m_gameEngine->show3DCursor(Ogre::Vector3(scaleX, scaleY, scaleZ));
  757. }
  758. else if(received[0] == 'g')
  759. {
  760. m_gameEngine->hide3DCursor();
  761. }
  762. else if(received[0] == 'q')
  763. {
  764. int id;
  765. sscanf(received.c_str(), "q%d", &id);
  766. m_gameEngine->removePersonnageAttaquableFromId(id);
  767. }
  768. }
  769. }
  770. void NetEngine::receiveRequestsFromServer()
  771. {
  772. int nBit = recv(m_sock, static_cast<CAST_FOR_SOCKETS_FUNCTIONS>(requestBuffer), 500, 0);
  773. separateReceivedRequests(requestBuffer, nBit);
  774. }
  775. void NetEngine::separateReceivedRequests(char* requestBuffer, int size)
  776. {
  777. for(unsigned int i = 0; i < size; i++)
  778. {
  779. if(requestBuffer[i] == '\n')
  780. {
  781. pthread_mutex_lock(&m_fileReceivedMutex);
  782. m_fileReceived.push(m_currentReceived);
  783. pthread_mutex_unlock(&m_fileReceivedMutex);
  784. m_currentReceived = "";
  785. }
  786. else
  787. {
  788. m_currentReceived += requestBuffer[i];
  789. }
  790. }
  791. }
  792. std::string NetEngine::getRequest()
  793. {
  794. pthread_mutex_lock(&m_fileReceivedMutex);
  795. if(!m_fileReceived.empty())
  796. {
  797. std::string request = m_fileReceived.front();
  798. m_fileReceived.pop();
  799. pthread_mutex_unlock(&m_fileReceivedMutex);
  800. return request;
  801. }
  802. pthread_mutex_unlock(&m_fileReceivedMutex);
  803. return std::string("");
  804. }
  805. bool NetEngine::receiveAndExecuteRequestsFromServer()
  806. {
  807. receiveRequestsFromServer();
  808. return m_isNetEngineStoped;
  809. }
  810. void NetEngine::addRequestToFile(std::string request)
  811. {
  812. m_fileRequest.push(request);
  813. sendRequestToServer();
  814. }
  815. int NetEngine::getId()
  816. {
  817. return m_id;
  818. }
  819. void NetEngine::setId(unsigned char id)
  820. {
  821. m_id = id;
  822. }
  823. SOCKET NetEngine::getSocket()
  824. {
  825. return m_sock;
  826. }
  827. void NetEngine::textDialogButtonSuivantPressed(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  828. {
  829. m_guiEngine->getTextDialog()->clean();
  830. std::string request("vn");
  831. addRequestToFile(request);
  832. }
  833. void NetEngine::buttonChoice1Pressed(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  834. {
  835. m_guiEngine->getChoiceDialog()->clean();
  836. std::string request("vr0");
  837. addRequestToFile(request);
  838. }
  839. void NetEngine::buttonChoice2Pressed(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  840. {
  841. m_guiEngine->getChoiceDialog()->clean();
  842. std::string request("vr1");
  843. addRequestToFile(request);
  844. }
  845. void NetEngine::magasinButtonCloseEventPressed(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  846. {
  847. m_guiEngine->getMagasin()->clean();
  848. std::string request("vn");
  849. addRequestToFile(request);
  850. }
  851. void NetEngine::acceptGroupInvitation(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  852. {
  853. addRequestToFile("xb");
  854. }
  855. void NetEngine::rejectGroupInvitation(MyGUI::Widget* widget, int x, int y, MyGUI::MouseButton button)
  856. {
  857. addRequestToFile("xr");
  858. }
  859. void* TreceiveRequestsFromServer(void* data)
  860. {
  861. while(!(static_cast<NetEngine*>(data))->receiveAndExecuteRequestsFromServer())
  862. {
  863. sleep(1.0 / GLOBAL_ConfigEngine->m_FPS);
  864. }
  865. return NULL;
  866. }
  867. }