Advertisement
Guest User

Cole's CPP

a guest
May 3rd, 2019
2,128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 189.53 KB | None | 0 0
  1. /******************************************************************************
  2. First Growtopia Private Server made with ENet.
  3. Copyright (C) 2018 Growtopia Noobs
  4.  
  5. This program is free software: you can redistribute it and/or modify
  6. it under the terms of the GNU Affero General Public License as published
  7. by the Free Software Foundation, either version 3 of the License, or
  8. (at your option) any later version.
  9.  
  10. This program is distributed in the hope that it will be useful,
  11. but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. GNU Affero General Public License for more details.
  14.  
  15. You should have received a copy of the GNU Affero General Public License
  16. along with this program. If not, see <http://www.gnu.org/licenses/>.
  17. **********************************************************************************/
  18.  
  19.  
  20. #include "stdafx.h"
  21. #include <iostream>
  22.  
  23. #include "enet/enet.h"
  24. #include <string>
  25. #include <windows.h>
  26. #include <vector>
  27. #include <sstream>
  28. #include <chrono>
  29. #include <fstream>
  30. #include "json.hpp"
  31. #include "bcrypt.h"
  32. #include "crypt_blowfish/crypt_gensalt.c"
  33. #include "crypt_blowfish/crypt_blowfish.h"
  34. #include "crypt_blowfish/crypt_blowfish.c"
  35. #include "crypt_blowfish/wrapper.c"
  36. #include "bcrypt.c"
  37. #include <conio.h>
  38. #include <thread> // TODO
  39. #include <mutex> // TODO
  40.  
  41. using namespace std;
  42. using json = nlohmann::json;
  43.  
  44. //#define TOTAL_LOG
  45. #define REGISTRATION
  46.  
  47. ENetHost* server;
  48. int cId = 1;
  49. BYTE* itemsDat = 0;
  50. int itemsDatSize = 0;
  51.  
  52. /***bcrypt***/
  53.  
  54. bool verifyPassword(string password, string hash) {
  55. int ret;
  56.  
  57. ret = bcrypt_checkpw(password.c_str(), hash.c_str());
  58. assert(ret != -1);
  59.  
  60. return !ret;
  61. }
  62.  
  63. string hashPassword(string password) {
  64. char salt[BCRYPT_HASHSIZE];
  65. char hash[BCRYPT_HASHSIZE];
  66. int ret;
  67.  
  68. ret = bcrypt_gensalt(12, salt);
  69. assert(ret == 0);
  70. ret = bcrypt_hashpw(password.c_str(), salt, hash);
  71. assert(ret == 0);
  72. return hash;
  73. }
  74.  
  75. /***bcrypt**/
  76.  
  77. void sendData(ENetPeer * peer, int num, char* data, int len)
  78. {
  79. /* Create a reliable packet of size 7 containing "packet\0" */
  80. ENetPacket* packet = enet_packet_create(0,
  81. len + 5,
  82. ENET_PACKET_FLAG_RELIABLE);
  83. /* Extend the packet so and append the string "foo", so it now */
  84. /* contains "packetfoo\0" */
  85. /* Send the packet to the peer over channel id 0. */
  86. /* One could also broadcast the packet by */
  87. /* enet_host_broadcast (host, 0, packet); */
  88. memcpy(packet->data, &num, 4);
  89. if (data != NULL)
  90. {
  91. memcpy(packet->data + 4, data, len);
  92. }
  93. char zero = 0;
  94. memcpy(packet->data + 4 + len, &zero, 1);
  95. enet_peer_send(peer, 0, packet);
  96. enet_host_flush(server);
  97. }
  98.  
  99. int getPacketId(char* data)
  100. {
  101. return *data;
  102. }
  103.  
  104. char* getPacketData(char* data)
  105. {
  106. return data + 4;
  107. }
  108.  
  109. string text_encode(char* text)
  110. {
  111. string ret = "";
  112. while (text[0] != 0)
  113. {
  114. switch (text[0])
  115. {
  116. case '\n':
  117. ret += "\\n";
  118. break;
  119. case '\t':
  120. ret += "\\t";
  121. break;
  122. case '\b':
  123. ret += "\\b";
  124. break;
  125. case '\\':
  126. ret += "\\\\";
  127. break;
  128. case '\r':
  129. ret += "\\r";
  130. break;
  131. default:
  132. ret += text[0];
  133. break;
  134. }
  135. text++;
  136. }
  137. return ret;
  138. }
  139.  
  140. int ch2n(char x)
  141. {
  142. switch (x)
  143. {
  144. case '0':
  145. return 0;
  146. case '1':
  147. return 1;
  148. case '2':
  149. return 2;
  150. case '3':
  151. return 3;
  152. case '4':
  153. return 4;
  154. case '5':
  155. return 5;
  156. case '6':
  157. return 6;
  158. case '7':
  159. return 7;
  160. case '8':
  161. return 8;
  162. case '9':
  163. return 9;
  164. case 'A':
  165. return 10;
  166. case 'B':
  167. return 11;
  168. case 'C':
  169. return 12;
  170. case 'D':
  171. return 13;
  172. case 'E':
  173. return 14;
  174. case 'F':
  175. return 15;
  176. default:
  177. break;
  178. }
  179. }
  180.  
  181.  
  182. char* GetTextPointerFromPacket(ENetPacket * packet)
  183. {
  184. char zero = 0;
  185. memcpy(packet->data + packet->dataLength - 1, &zero, 1);
  186. return (char*)(packet->data + 4);
  187. }
  188.  
  189. BYTE* GetStructPointerFromTankPacket(ENetPacket * packet)
  190. {
  191. unsigned int packetLenght = packet->dataLength;
  192. BYTE* result = NULL;
  193. if (packetLenght >= 0x3C)
  194. {
  195. BYTE* packetData = packet->data;
  196. result = packetData + 4;
  197. if (*(BYTE*)(packetData + 16) & 8)
  198. {
  199. if (packetLenght < *(int*)(packetData + 56) + 60)
  200. {
  201. cout << "Packet too small for extended packet to be valid" << endl;
  202. cout << "Sizeof float is 4. TankUpdatePacket size: 56" << endl;
  203. result = 0;
  204. }
  205. }
  206. else
  207. {
  208. int zero = 0;
  209. memcpy(packetData + 56, &zero, 4);
  210. }
  211. }
  212. return result;
  213. }
  214.  
  215. int GetMessageTypeFromPacket(ENetPacket * packet)
  216. {
  217. int result;
  218.  
  219. if (packet->dataLength > 3u)
  220. {
  221. result = *(packet->data);
  222. }
  223. else
  224. {
  225. cout << "Bad packet length, ignoring message" << endl;
  226. result = 0;
  227. }
  228. return result;
  229. }
  230.  
  231.  
  232. vector<string> explode(const string & delimiter, const string & str)
  233. {
  234. vector<string> arr;
  235.  
  236. int strleng = str.length();
  237. int delleng = delimiter.length();
  238. if (delleng == 0)
  239. return arr;//no change
  240.  
  241. int i = 0;
  242. int k = 0;
  243. while (i < strleng)
  244. {
  245. int j = 0;
  246. while (i + j < strleng && j < delleng && str[i + j] == delimiter[j])
  247. j++;
  248. if (j == delleng)//found delimiter
  249. {
  250. arr.push_back(str.substr(k, i - k));
  251. i += delleng;
  252. k = i;
  253. }
  254. else
  255. {
  256. i++;
  257. }
  258. }
  259. arr.push_back(str.substr(k, i - k));
  260. return arr;
  261. }
  262.  
  263. struct GamePacket
  264. {
  265. BYTE* data;
  266. int len;
  267. int indexes;
  268. };
  269.  
  270.  
  271. GamePacket appendFloat(GamePacket p, float val)
  272. {
  273. //p.data[56] += 1;
  274. BYTE* n = new BYTE[p.len + 2 + 4];
  275. memcpy(n, p.data, p.len);
  276. delete p.data;
  277. p.data = n;
  278. n[p.len] = p.indexes;
  279. n[p.len + 1] = 1;
  280. memcpy(n + p.len + 2, &val, 4);
  281. p.len = p.len + 2 + 4;
  282. p.indexes++;
  283. return p;
  284. }
  285.  
  286. GamePacket appendFloat(GamePacket p, float val, float val2)
  287. {
  288. //p.data[56] += 1;
  289. BYTE* n = new BYTE[p.len + 2 + 8];
  290. memcpy(n, p.data, p.len);
  291. delete p.data;
  292. p.data = n;
  293. n[p.len] = p.indexes;
  294. n[p.len + 1] = 3;
  295. memcpy(n + p.len + 2, &val, 4);
  296. memcpy(n + p.len + 6, &val2, 4);
  297. p.len = p.len + 2 + 8;
  298. p.indexes++;
  299. return p;
  300. }
  301.  
  302. GamePacket appendFloat(GamePacket p, float val, float val2, float val3)
  303. {
  304. //p.data[56] += 1;
  305. BYTE* n = new BYTE[p.len + 2 + 12];
  306. memcpy(n, p.data, p.len);
  307. delete p.data;
  308. p.data = n;
  309. n[p.len] = p.indexes;
  310. n[p.len + 1] = 4;
  311. memcpy(n + p.len + 2, &val, 4);
  312. memcpy(n + p.len + 6, &val2, 4);
  313. memcpy(n + p.len + 10, &val3, 4);
  314. p.len = p.len + 2 + 12;
  315. p.indexes++;
  316. return p;
  317. }
  318.  
  319. GamePacket appendInt(GamePacket p, int val)
  320. {
  321. //p.data[56] += 1;
  322. BYTE* n = new BYTE[p.len + 2 + 4];
  323. memcpy(n, p.data, p.len);
  324. delete p.data;
  325. p.data = n;
  326. n[p.len] = p.indexes;
  327. n[p.len + 1] = 9;
  328. memcpy(n + p.len + 2, &val, 4);
  329. p.len = p.len + 2 + 4;
  330. p.indexes++;
  331. return p;
  332. }
  333.  
  334. GamePacket appendIntx(GamePacket p, int val)
  335. {
  336. //p.data[56] += 1;
  337. BYTE* n = new BYTE[p.len + 2 + 4];
  338. memcpy(n, p.data, p.len);
  339. delete p.data;
  340. p.data = n;
  341. n[p.len] = p.indexes;
  342. n[p.len + 1] = 5;
  343. memcpy(n + p.len + 2, &val, 4);
  344. p.len = p.len + 2 + 4;
  345. p.indexes++;
  346. return p;
  347. }
  348.  
  349. GamePacket appendString(GamePacket p, string str)
  350. {
  351. //p.data[56] += 1;
  352. BYTE* n = new BYTE[p.len + 2 + str.length() + 4];
  353. memcpy(n, p.data, p.len);
  354. delete p.data;
  355. p.data = n;
  356. n[p.len] = p.indexes;
  357. n[p.len + 1] = 2;
  358. int sLen = str.length();
  359. memcpy(n + p.len + 2, &sLen, 4);
  360. memcpy(n + p.len + 6, str.c_str(), sLen);
  361. p.len = p.len + 2 + str.length() + 4;
  362. p.indexes++;
  363. return p;
  364. }
  365.  
  366. GamePacket createPacket()
  367. {
  368. BYTE* data = new BYTE[61];
  369. string asdf = "0400000001000000FFFFFFFF00000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
  370. for (int i = 0; i < asdf.length(); i += 2)
  371. {
  372. char x = ch2n(asdf[i]);
  373. x = x << 4;
  374. x += ch2n(asdf[i + 1]);
  375. memcpy(data + (i / 2), &x, 1);
  376. if (asdf.length() > 61 * 2) throw 0;
  377. }
  378. GamePacket packet;
  379. packet.data = data;
  380. packet.len = 61;
  381. packet.indexes = 0;
  382. return packet;
  383. }
  384.  
  385. GamePacket packetEnd(GamePacket p)
  386. {
  387. BYTE* n = new BYTE[p.len + 1];
  388. memcpy(n, p.data, p.len);
  389. delete p.data;
  390. p.data = n;
  391. char zero = 0;
  392. memcpy(p.data + p.len, &zero, 1);
  393. p.len += 1;
  394. //*(int*)(p.data + 52) = p.len;
  395. *(int*)(p.data + 56) = p.indexes;//p.len-60;//p.indexes;
  396. *(BYTE*)(p.data + 60) = p.indexes;
  397. //*(p.data + 57) = p.indexes;
  398. return p;
  399. }
  400.  
  401. struct InventoryItem {
  402. __int16 itemID;
  403. __int8 itemCount;
  404. };
  405.  
  406. struct PlayerInventory {
  407. vector<InventoryItem> items;
  408. int inventorySize = 100;
  409. };
  410.  
  411. #define cloth0 cloth_hair
  412. #define cloth1 cloth_shirt
  413. #define cloth2 cloth_pants
  414. #define cloth3 cloth_feet
  415. #define cloth4 cloth_face
  416. #define cloth5 cloth_hand
  417. #define cloth6 cloth_back
  418. #define cloth7 cloth_mask
  419. #define cloth8 cloth_necklace
  420.  
  421. struct PlayerInfo {
  422. bool isIn = false;
  423. int netID;
  424. bool cantalk = true;
  425. bool namechange = false;
  426. string rank = "";
  427. bool haveGrowId = false;
  428. string tankIDName = "";
  429. string tankIDPass = "";
  430. string requestedName = "";
  431. string rawName = "";
  432. int effect = 0;
  433. string displayName = "";
  434. string country = "";
  435. int adminLevel = 0;
  436. string currentWorld = "EXIT";
  437. bool radio = true;
  438. int x;
  439. int y;
  440. int x1;
  441. int y1;
  442. unsigned long long gems = 0;
  443. int totalpunched = 0;
  444. bool isRotatedLeft = false;
  445.  
  446. bool isUpdating = false;
  447. bool joinClothesUpdated = false;
  448.  
  449. bool taped = false;
  450.  
  451. int cloth_hair = 0; // 0
  452. int cloth_shirt = 0; // 1
  453. int cloth_pants = 0; // 2
  454. int cloth_feet = 0; // 3
  455. int cloth_face = 0; // 4
  456. int cloth_hand = 0; // 5
  457. int cloth_back = 0; // 6
  458. int cloth_mask = 0; // 7
  459. int cloth_necklace = 0; // 8
  460.  
  461. bool canWalkInBlocks = false; // 1
  462. bool canDoubleJump = false; // 2
  463. bool isInvisible = false; // 4
  464. bool noHands = false; // 8
  465. bool noEyes = false; // 16
  466. bool noBody = false; // 32
  467. bool devilHorns = false; // 64
  468. bool goldenHalo = false; // 128
  469. bool isFrozen = false; // 2048
  470. bool isCursed = false; // 4096
  471. bool isDuctaped = false; // 8192
  472. bool haveCigar = false; // 16384
  473. bool isShining = false; // 32768
  474. bool isZombie = false; // 65536
  475. bool isHitByLava = false; // 131072
  476. bool haveHauntedShadows = false; // 262144
  477. bool haveGeigerRadiation = false; // 524288
  478. bool haveReflector = false; // 1048576
  479. bool isEgged = false; // 2097152
  480. bool havePineappleFloag = false; // 4194304
  481. bool haveFlyingPineapple = false; // 8388608
  482. bool haveSuperSupporterName = false; // 16777216
  483. bool haveSupperPineapple = false; // 33554432
  484. bool isGhost = false;
  485. //bool
  486. int skinColor = 0x8295C3FF; //normal SKin color like gt!
  487.  
  488. PlayerInventory inventory;
  489.  
  490. long long int lastSB = 0;
  491. };
  492.  
  493.  
  494. int getState(PlayerInfo * info) {
  495. int val = 0;
  496. val |= info->canWalkInBlocks << 0;
  497. val |= info->canDoubleJump << 1;
  498. val |= info->isInvisible << 2;
  499. val |= info->noHands << 3;
  500. val |= info->noEyes << 4;
  501. val |= info->noBody << 5;
  502. val |= info->devilHorns << 6;
  503. val |= info->goldenHalo << 7;
  504. return val;
  505. }
  506.  
  507.  
  508. struct WorldItem {
  509. __int16 foreground = 0;
  510. __int16 background = 0;
  511. int breakLevel = 0;
  512. long long int breakTime = 0;
  513. bool water = false;
  514. bool fire = false;
  515. bool glue = false;
  516. bool red = false;
  517. bool green = false;
  518. bool blue = false;
  519.  
  520. };
  521.  
  522. struct WorldInfo {
  523. int width = 100;
  524. int height = 60;
  525. string name = "TEST";
  526. WorldItem* items;
  527. string owner = "";
  528. bool isPublic = false;
  529. };
  530.  
  531. WorldInfo generateWorld(string name, int width, int height)
  532. {
  533. WorldInfo world;
  534. world.name = name;
  535. world.width = width;
  536. world.height = height;
  537. world.items = new WorldItem[world.width * world.height];
  538. for (int i = 0; i < world.width * world.height; i++)
  539. {
  540. if (i >= 3800 && i < 5400 && !(rand() % 50)) { world.items[i].foreground = 10; }
  541. else if (i >= 3700 && i < 5400) {
  542. if (i > 5000) {
  543. if (i % 7 == 0) { world.items[i].foreground = 4; }
  544. else { world.items[i].foreground = 2; }
  545. }
  546. else { world.items[i].foreground = 2; }
  547. }
  548. else if (i >= 5400) { world.items[i].foreground = 8; }
  549. if (i >= 3700)
  550. world.items[i].background = 14;
  551. if (i == 3650)
  552. world.items[i].foreground = 6;
  553. else if (i >= 3600 && i < 3700)
  554. world.items[i].foreground = 0; //fixed the grass in the world!
  555. if (i == 3750)
  556. world.items[i].foreground = 8;
  557. }
  558. return world;
  559. }
  560.  
  561. class PlayerDB {
  562. public:
  563. static string getProperName(string name);
  564. static string PlayerDB::fixColors(string text);
  565. static int saveset(string username, int cloth_hair, int cloth_shirt, int cloth_pants, int cloth_feet, int cloth_face, int cloth_hand, int cloth_back, int cloth_mask);
  566. static int playerLogin(ENetPeer* peer, string username, string password);
  567. static int playerRegister(string username, string password, string passwordverify, string email, string discord);
  568. };
  569.  
  570. string PlayerDB::getProperName(string name) {
  571. string newS;
  572. for (char c : name) newS += (c >= 'A' && c <= 'Z') ? c - ('A' - 'a') : c;
  573. string ret;
  574. for (int i = 0; i < newS.length(); i++)
  575. {
  576. if (newS[i] == '`') i++; else ret += newS[i];
  577. }
  578. string ret2;
  579. for (char c : ret) if ((c >= 'a' && c <= 'z') || (c >= '0' && c <= '9')) ret2 += c;
  580. return ret2;
  581. }
  582.  
  583. string PlayerDB::fixColors(string text) {
  584. string ret = "";
  585. int colorLevel = 0;
  586. for (int i = 0; i < text.length(); i++)
  587. {
  588. if (text[i] == '`')
  589. {
  590. ret += text[i];
  591. if (i + 1 < text.length())
  592. ret += text[i + 1];
  593.  
  594.  
  595. if (i + 1 < text.length() && text[i + 1] == '`')
  596. {
  597. colorLevel--;
  598. }
  599. else {
  600. colorLevel++;
  601. }
  602. i++;
  603. }
  604. else {
  605. ret += text[i];
  606. }
  607. }
  608. for (int i = 0; i < colorLevel; i++) {
  609. ret += "``";
  610. }
  611. for (int i = 0; i > colorLevel; i--) {
  612. ret += "`w";
  613. }
  614. return ret;
  615. }
  616.  
  617. int PlayerDB::playerLogin(ENetPeer * peer, string username, string password) {
  618. std::ifstream ifs("players/" + PlayerDB::getProperName(username) + ".json");
  619. if (ifs.is_open()) {
  620. json j;
  621. ifs >> j;
  622. string pss = j["password"];
  623. if (verifyPassword(password, pss)) {
  624. ENetPeer* currentPeer;
  625.  
  626. for (currentPeer = server->peers;
  627. currentPeer < &server->peers[server->peerCount];
  628. ++currentPeer)
  629. {
  630. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  631. continue;
  632. if (currentPeer == peer)
  633. continue;
  634. if (((PlayerInfo*)(currentPeer->data))->rawName == PlayerDB::getProperName(username))
  635. {
  636. {
  637. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Someone else logged into this account!"));
  638. ENetPacket* packet = enet_packet_create(p.data,
  639. p.len,
  640. ENET_PACKET_FLAG_RELIABLE);
  641. enet_peer_send(currentPeer, 0, packet);
  642. delete p.data;
  643. }
  644. {
  645. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Someone else was logged into this account! He was kicked out now."));
  646. ENetPacket* packet = enet_packet_create(p.data,
  647. p.len,
  648. ENET_PACKET_FLAG_RELIABLE);
  649. enet_peer_send(peer, 0, packet);
  650. delete p.data;
  651. }
  652. //enet_host_flush(server);
  653. enet_peer_disconnect_later(currentPeer, 0);
  654. }
  655. }
  656. return 1;
  657. }
  658. else {
  659. return -1;
  660. }
  661. }
  662. else {
  663. return -2;
  664. }
  665. }
  666.  
  667. int PlayerDB::playerRegister(string username, string password, string passwordverify, string email, string discord) {
  668. username = PlayerDB::getProperName(username);
  669. if (discord.find("#") == std::string::npos && discord.length() != 0) return -5;
  670. if (email.find("@") == std::string::npos && email.length() != 0) return -4;
  671. if (passwordverify != password) return -3;
  672. if (username.length() < 3) return -2;
  673. std::ifstream ifs("players/" + username + ".json");
  674. if (ifs.is_open()) {
  675. return -1;
  676. }
  677.  
  678. std::ofstream o("players/" + username + ".json");
  679. if (!o.is_open()) {
  680. cout << GetLastError() << endl;
  681. _getch();
  682. }
  683. json j;
  684. j["username"] = username;
  685. j["password"] = hashPassword(password);
  686. j["email"] = email;
  687. j["discord"] = discord;
  688. j["adminLevel"] = 0;
  689. o << j << std::endl;
  690. return 1;
  691. }
  692. int PlayerDB::saveset(string username, int cloth_hair, int cloth_shirt, int cloth_pants, int cloth_feet, int cloth_face, int cloth_hand, int cloth_back, int cloth_mask) {
  693. if (username.length() < 3) return -2;
  694. std::ifstream ifs("sets" + username + ".json");
  695.  
  696. std::ofstream o("sets/" + username + ".json");
  697. if (!o.is_open()) {
  698. cout << GetLastError() << endl;
  699. _getch();
  700. }
  701. json j;
  702. j["cloth_hair"] = cloth_hair;
  703. j["cloth_shirt"] = cloth_shirt;
  704. j["cloth_pants"] = cloth_pants;
  705. j["cloth_feet"] = cloth_feet;
  706. j["cloth_face"] = cloth_face;
  707. j["cloth_hand"] = cloth_hand;
  708. j["cloth_back"] = cloth_back;
  709. j["cloth_mask"] = cloth_mask;
  710. o << j << std::endl;
  711. return 1;
  712. }
  713. struct AWorld {
  714. WorldInfo* ptr;
  715. WorldInfo info;
  716. int id;
  717. };
  718.  
  719. class WorldDB {
  720. public:
  721. WorldInfo get(string name);
  722. AWorld get2(string name);
  723. void flush(WorldInfo info);
  724. void flush2(AWorld info);
  725. void save(AWorld info);
  726. void saveAll();
  727. void saveRedundant();
  728. vector<WorldInfo> getRandomWorlds();
  729. WorldDB();
  730. private:
  731. vector<WorldInfo> worlds;
  732. };
  733.  
  734. WorldDB::WorldDB() {
  735. // Constructor
  736. }
  737.  
  738. void sendConsoleMsg(ENetPeer * peer, string message) {
  739. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), message));
  740. ENetPacket* packet = enet_packet_create(p.data,
  741. p.len,
  742. ENET_PACKET_FLAG_RELIABLE);
  743. enet_peer_send(peer, 0, packet);
  744. delete p.data;
  745. }
  746.  
  747. string getStrUpper(string txt) {
  748. string ret;
  749. for (char c : txt) ret += toupper(c);
  750. return ret;
  751. }
  752.  
  753. AWorld WorldDB::get2(string name) {
  754. if (worlds.size() > 200) {
  755. #ifdef TOTAL_LOG
  756. cout << "Saving redundant worlds!" << endl;
  757. #endif
  758. saveRedundant();
  759. #ifdef TOTAL_LOG
  760. cout << "Redundant worlds are saved!" << endl;
  761. #endif
  762. }
  763. AWorld ret;
  764. name = getStrUpper(name);
  765. if (name.length() < 1) throw 1; // too short name
  766. for (char c : name) {
  767. if ((c<'A' || c>'Z') && (c<'0' || c>'9'))
  768. throw 2; // wrong name
  769. }
  770. if (name == "EXIT") {
  771. throw 3;
  772. }
  773. for (int i = 0; i < worlds.size(); i++) {
  774. if (worlds.at(i).name == name)
  775. {
  776. ret.id = i;
  777. ret.info = worlds.at(i);
  778. ret.ptr = &worlds.at(i);
  779. return ret;
  780. }
  781.  
  782. }
  783. std::ifstream ifs("worlds/" + name + ".json");
  784. if (ifs.is_open()) {
  785.  
  786. json j;
  787. ifs >> j;
  788. WorldInfo info;
  789. info.name = j["name"].get<string>();
  790. info.width = j["width"];
  791. info.height = j["height"];
  792. info.owner = j["owner"].get<string>();
  793. info.isPublic = j["isPublic"];
  794. json tiles = j["tiles"];
  795. int square = info.width * info.height;
  796. info.items = new WorldItem[square];
  797. for (int i = 0; i < square; i++) {
  798. info.items[i].foreground = tiles[i]["fg"];
  799. info.items[i].background = tiles[i]["bg"];
  800. }
  801. worlds.push_back(info);
  802. ret.id = worlds.size() - 1;
  803. ret.info = info;
  804. ret.ptr = &worlds.at(worlds.size() - 1);
  805. return ret;
  806. }
  807. else {
  808. WorldInfo info = generateWorld(name, 100, 60);
  809.  
  810. worlds.push_back(info);
  811. ret.id = worlds.size() - 1;
  812. ret.info = info;
  813. ret.ptr = &worlds.at(worlds.size() - 1);
  814. return ret;
  815. }
  816. throw 1;
  817. }
  818.  
  819. WorldInfo WorldDB::get(string name) {
  820.  
  821. return this->get2(name).info;
  822. }
  823.  
  824. void WorldDB::flush(WorldInfo info)
  825. {
  826. std::ofstream o("worlds/" + info.name + ".json");
  827. if (!o.is_open()) {
  828. cout << GetLastError() << endl;
  829. }
  830. json j;
  831. j["name"] = info.name;
  832. j["width"] = info.width;
  833. j["height"] = info.height;
  834. j["owner"] = info.owner;
  835. j["isPublic"] = info.isPublic;
  836. json tiles = json::array();
  837. int square = info.width * info.height;
  838.  
  839. for (int i = 0; i < square; i++)
  840. {
  841. json tile;
  842. tile["fg"] = info.items[i].foreground;
  843. tile["bg"] = info.items[i].background;
  844. tiles.push_back(tile);
  845. }
  846. j["tiles"] = tiles;
  847. o << j << std::endl;
  848. }
  849.  
  850. void WorldDB::flush2(AWorld info)
  851. {
  852. this->flush(info.info);
  853. }
  854.  
  855. void WorldDB::save(AWorld info)
  856. {
  857. flush2(info);
  858. delete info.info.items;
  859. worlds.erase(worlds.begin() + info.id);
  860. }
  861.  
  862. void WorldDB::saveAll()
  863. {
  864. for (int i = 0; i < worlds.size(); i++) {
  865. flush(worlds.at(i));
  866. delete worlds.at(i).items;
  867. }
  868. worlds.clear();
  869. }
  870.  
  871. vector<WorldInfo> WorldDB::getRandomWorlds() {
  872. vector<WorldInfo> ret;
  873. for (int i = 0; i < ((worlds.size() < 10) ? worlds.size() : 10); i++)
  874. { // load first four worlds, it is excepted that they are special
  875. ret.push_back(worlds.at(i));
  876. }
  877. // and lets get up to 6 random
  878. if (worlds.size() > 4) {
  879. for (int j = 0; j < 6; j++)
  880. {
  881. bool isPossible = true;
  882. WorldInfo world = worlds.at(rand() % (worlds.size() - 4));
  883. for (int i = 0; i < ret.size(); i++)
  884. {
  885. if (world.name == ret.at(i).name || world.name == "EXIT")
  886. {
  887. isPossible = false;
  888. }
  889. }
  890. if (isPossible)
  891. ret.push_back(world);
  892. }
  893. }
  894. return ret;
  895. }
  896.  
  897. void WorldDB::saveRedundant()
  898. {
  899. for (int i = 4; i < worlds.size(); i++) {
  900. bool canBeFree = true;
  901. ENetPeer* currentPeer;
  902.  
  903. for (currentPeer = server->peers;
  904. currentPeer < &server->peers[server->peerCount];
  905. ++currentPeer)
  906. {
  907. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  908. continue;
  909. if (((PlayerInfo*)(currentPeer->data))->currentWorld == worlds.at(i).name)
  910. canBeFree = false;
  911. }
  912. if (canBeFree)
  913. {
  914. flush(worlds.at(i));
  915. delete worlds.at(i).items;
  916. worlds.erase(worlds.begin() + i);
  917. i--;
  918. }
  919. }
  920. }
  921.  
  922. //WorldInfo world;
  923. //vector<WorldInfo> worlds;
  924. WorldDB worldDB;
  925.  
  926. string stripSymbols(string str) {
  927. int stringSize = strlen(str.c_str());
  928.  
  929. for (int i = 0; i < stringSize; i++)
  930. if (str[i] == 0x46)
  931. str[i] = 0x32;
  932. return str;
  933. }
  934. void saveAllWorlds() // atexit hack plz fix
  935. {
  936. cout << "Saving worlds..." << endl;
  937. worldDB.saveAll();
  938. cout << "Worlds saved!" << endl;
  939. }
  940.  
  941. WorldInfo* getPlyersWorld(ENetPeer * peer)
  942. {
  943. try {
  944. return worldDB.get2(((PlayerInfo*)(peer->data))->currentWorld).ptr;
  945. }
  946. catch (int e) {
  947. return NULL;
  948. }
  949. }
  950.  
  951. struct PlayerMoving {
  952. int packetType;
  953. int netID;
  954. float x;
  955. float y;
  956. int characterState;
  957. int plantingTree;
  958. float XSpeed;
  959. float YSpeed;
  960. int punchX;
  961. int punchY;
  962.  
  963. };
  964.  
  965.  
  966. enum ClothTypes {
  967. HAIR,
  968. SHIRT,
  969. PANTS,
  970. FEET,
  971. FACE,
  972. HAND,
  973. BACK,
  974. MASK,
  975. NECKLACE,
  976. NONE
  977. };
  978.  
  979. enum BlockTypes {
  980. FOREGROUND,
  981. BACKGROUND,
  982. CONSUMABLE,
  983. SEED,
  984. PAIN_BLOCK,
  985. BEDROCK,
  986. MAIN_DOOR,
  987. SIGN,
  988. DOOR,
  989. CLOTHING,
  990. FIST,
  991. UNKNOWN
  992. };
  993.  
  994. struct ItemDefinition {
  995. int id;
  996. string name;
  997. int rarity;
  998. int breakHits;
  999. int growTime;
  1000. ClothTypes clothType;
  1001. BlockTypes blockType;
  1002. string description = "This item has no description.";
  1003. };
  1004.  
  1005. vector<ItemDefinition> itemDefs;
  1006.  
  1007. struct DroppedItem { // TODO
  1008. int id;
  1009. int uid;
  1010. int count;
  1011. };
  1012.  
  1013. vector<DroppedItem> droppedItems;
  1014.  
  1015. ItemDefinition getItemDef(int id)
  1016. {
  1017. if (id < itemDefs.size() && id > -1)
  1018. return itemDefs.at(id);
  1019. /*for (int i = 0; i < itemDefs.size(); i++)
  1020. {
  1021. if (id == itemDefs.at(i).id)
  1022. {
  1023. return itemDefs.at(i);
  1024. }
  1025. }*/
  1026. throw 0;
  1027. return itemDefs.at(0);
  1028. }
  1029.  
  1030. void craftItemDescriptions() {
  1031. int current = -1;
  1032. std::ifstream infile("Descriptions.txt");
  1033. for (std::string line; getline(infile, line);)
  1034. {
  1035. if (line.length() > 3 && line[0] != '/' && line[1] != '/')
  1036. {
  1037. vector<string> ex = explode("|", line);
  1038. ItemDefinition def;
  1039. if (atoi(ex[0].c_str()) + 1 < itemDefs.size())
  1040. {
  1041. itemDefs.at(atoi(ex[0].c_str())).description = ex[1];
  1042. if (!(atoi(ex[0].c_str()) % 2))
  1043. itemDefs.at(atoi(ex[0].c_str()) + 1).description = "This is a tree.";
  1044. }
  1045. }
  1046. }
  1047. }
  1048.  
  1049. void buildItemsDatabase()
  1050. {
  1051. int current = -1;
  1052. std::ifstream infile("CoreData.txt");
  1053. for (std::string line; getline(infile, line);)
  1054. {
  1055. if (line.length() > 8 && line[0] != '/' && line[1] != '/')
  1056. {
  1057. vector<string> ex = explode("|", line);
  1058. ItemDefinition def;
  1059. def.id = atoi(ex[0].c_str());
  1060. def.name = ex[1];
  1061. def.rarity = atoi(ex[2].c_str());
  1062. string bt = ex[4];
  1063. if (bt == "Foreground_Block") {
  1064. def.blockType = BlockTypes::FOREGROUND;
  1065. }
  1066. else if (bt == "Seed") {
  1067. def.blockType = BlockTypes::SEED;
  1068. }
  1069. else if (bt == "Consummable") {
  1070. def.blockType = BlockTypes::CONSUMABLE;
  1071. }
  1072. else if (bt == "Pain_Block") {
  1073. def.blockType = BlockTypes::PAIN_BLOCK;
  1074. }
  1075. else if (bt == "Main_Door") {
  1076. def.blockType = BlockTypes::MAIN_DOOR;
  1077. }
  1078. else if (bt == "Bedrock") {
  1079. def.blockType = BlockTypes::BEDROCK;
  1080. }
  1081. else if (bt == "Door") {
  1082. def.blockType = BlockTypes::DOOR;
  1083. }
  1084. else if (bt == "Fist") {
  1085. def.blockType = BlockTypes::FIST;
  1086. }
  1087. else if (bt == "Sign") {
  1088. def.blockType = BlockTypes::SIGN;
  1089. }
  1090. else if (bt == "Background_Block") {
  1091. def.blockType = BlockTypes::BACKGROUND;
  1092. }
  1093. else {
  1094. def.blockType = BlockTypes::UNKNOWN;
  1095. }
  1096. def.breakHits = atoi(ex[7].c_str());
  1097. def.growTime = atoi(ex[8].c_str());
  1098. string cl = ex[9];
  1099. if (cl == "None") {
  1100. def.clothType = ClothTypes::NONE;
  1101. }
  1102. else if (cl == "Hat") {
  1103. def.clothType = ClothTypes::HAIR;
  1104. }
  1105. else if (cl == "Shirt") {
  1106. def.clothType = ClothTypes::SHIRT;
  1107. }
  1108. else if (cl == "Pants") {
  1109. def.clothType = ClothTypes::PANTS;
  1110. }
  1111. else if (cl == "Feet") {
  1112. def.clothType = ClothTypes::FEET;
  1113. }
  1114. else if (cl == "Face") {
  1115. def.clothType = ClothTypes::FACE;
  1116. }
  1117. else if (cl == "Hand") {
  1118. def.clothType = ClothTypes::HAND;
  1119. }
  1120. else if (cl == "Back") {
  1121. def.clothType = ClothTypes::BACK;
  1122. }
  1123. else if (cl == "Hair") {
  1124. def.clothType = ClothTypes::MASK;
  1125. }
  1126. else if (cl == "Chest") {
  1127. def.clothType = ClothTypes::NECKLACE;
  1128. }
  1129. else {
  1130. def.clothType = ClothTypes::NONE;
  1131. }
  1132.  
  1133. if (++current != def.id)
  1134. {
  1135. cout << "Critical error! Unordered database at item " << std::to_string(current) << "/" << std::to_string(def.id) << "!" << endl;
  1136. }
  1137.  
  1138. itemDefs.push_back(def);
  1139. }
  1140. }
  1141. craftItemDescriptions();
  1142. }
  1143.  
  1144. struct Admin {
  1145. string username;
  1146. string password;
  1147. int level = 0;
  1148. long long int lastSB = 0;
  1149. };
  1150.  
  1151. vector<Admin> admins;
  1152.  
  1153. void addAdmin(string username, string password, int level)
  1154. {
  1155. Admin admin;
  1156. admin.username = username;
  1157. admin.password = password;
  1158. admin.level = level;
  1159. admins.push_back(admin);
  1160. }
  1161.  
  1162. int getAdminLevel(string username, string password) {
  1163. for (int i = 0; i < admins.size(); i++) {
  1164. Admin admin = admins[i];
  1165. if (admin.username == username && admin.password == password) {
  1166. return admin.level;
  1167. }
  1168. }
  1169. return 0;
  1170. }
  1171.  
  1172. bool canSB(string username, string password) {
  1173. for (int i = 0; i < admins.size(); i++) {
  1174. Admin admin = admins[i];
  1175. if (admin.username == username && admin.password == password && admin.level > 1) {
  1176. using namespace std::chrono;
  1177. if (admin.lastSB + 900000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count() || admin.level == 999)
  1178. {
  1179. admins[i].lastSB = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count();
  1180. return true;
  1181. }
  1182. else {
  1183. return false;
  1184. }
  1185. }
  1186. }
  1187. return false;
  1188. }
  1189.  
  1190. bool canClear(string username, string password) {
  1191. for (int i = 0; i < admins.size(); i++) {
  1192. Admin admin = admins[i];
  1193. if (admin.username == username && admin.password == password) {
  1194. return admin.level > 0;
  1195. }
  1196. }
  1197. return false;
  1198. }
  1199.  
  1200. bool isSuperAdmin(string username, string password) {
  1201. for (int i = 0; i < admins.size(); i++) {
  1202. Admin admin = admins[i];
  1203. if (admin.username == username && admin.password == password && admin.level == 999) {
  1204. return true;
  1205. }
  1206. }
  1207. return false;
  1208. }
  1209. bool isCreator(string username, string password) {
  1210. for (int i = 0; i < admins.size(); i++) {
  1211. Admin admin = admins[i];
  1212. if (admin.username == username && admin.password == password && admin.level == 1) {
  1213. return true;
  1214. }
  1215. }
  1216. return false;
  1217. }
  1218. bool isVIP(string username, string password) {
  1219. for (int i = 0; i < admins.size(); i++) {
  1220. Admin admin = admins[i];
  1221. if (admin.username == username && admin.password == password && admin.level == 2) {
  1222. return true;
  1223. }
  1224. }
  1225. return false;
  1226. }
  1227. bool isHelper(string username, string password) {
  1228. for (int i = 0; i < admins.size(); i++) {
  1229. Admin admin = admins[i];
  1230. if (admin.username == username && admin.password == password && admin.level == 5) {
  1231. return true;
  1232. }
  1233. }
  1234. return false;
  1235. }
  1236. bool isMod(string username, string password) {
  1237. for (int i = 0; i < admins.size(); i++) {
  1238. Admin admin = admins[i];
  1239. if (admin.username == username && admin.password == password && admin.level == 3) {
  1240. return true;
  1241. }
  1242. }
  1243. return false;
  1244. }
  1245. bool isAdmin(string username, string password) {
  1246. for (int i = 0; i < admins.size(); i++) {
  1247. Admin admin = admins[i];
  1248. if (admin.username == username && admin.password == password && admin.level == 4) {
  1249. return true;
  1250. }
  1251. }
  1252. return false;
  1253. }
  1254.  
  1255. bool isHere(ENetPeer * peer, ENetPeer * peer2)
  1256. {
  1257. return ((PlayerInfo*)(peer->data))->currentWorld == ((PlayerInfo*)(peer2->data))->currentWorld;
  1258. }
  1259.  
  1260. void sendInventory(ENetPeer * peer, PlayerInventory inventory)
  1261. {
  1262. string asdf2 = "0400000009A7379237BB2509E8E0EC04F8720B050000000000000000FBBB0000010000007D920100FDFDFDFD04000000040000000000000000000000000000000000";
  1263. int inventoryLen = inventory.items.size();
  1264. int packetLen = (asdf2.length() / 2) + (inventoryLen * 4) + 4;
  1265. BYTE * data2 = new BYTE[packetLen];
  1266. for (int i = 0; i < asdf2.length(); i += 2)
  1267. {
  1268. char x = ch2n(asdf2[i]);
  1269. x = x << 4;
  1270. x += ch2n(asdf2[i + 1]);
  1271. memcpy(data2 + (i / 2), &x, 1);
  1272. }
  1273. int endianInvVal = _byteswap_ulong(inventoryLen);
  1274. memcpy(data2 + (asdf2.length() / 2) - 4, &endianInvVal, 4);
  1275. endianInvVal = _byteswap_ulong(inventory.inventorySize);
  1276. memcpy(data2 + (asdf2.length() / 2) - 8, &endianInvVal, 4);
  1277. int val = 0;
  1278. for (int i = 0; i < inventoryLen; i++)
  1279. {
  1280. val = 0;
  1281. val |= inventory.items.at(i).itemID;
  1282. val |= inventory.items.at(i).itemCount << 16;
  1283. val &= 0x00FFFFFF;
  1284. val |= 0x00 << 24;
  1285. memcpy(data2 + (i * 4) + (asdf2.length() / 2), &val, 4);
  1286. }
  1287. ENetPacket* packet3 = enet_packet_create(data2,
  1288. packetLen,
  1289. ENET_PACKET_FLAG_RELIABLE);
  1290. enet_peer_send(peer, 0, packet3);
  1291. delete data2;
  1292. //enet_host_flush(server);
  1293. }
  1294.  
  1295. BYTE* packPlayerMoving(PlayerMoving * dataStruct)
  1296. {
  1297. BYTE* data = new BYTE[56];
  1298. for (int i = 0; i < 56; i++)
  1299. {
  1300. data[i] = 0;
  1301. }
  1302. memcpy(data, &dataStruct->packetType, 4);
  1303. memcpy(data + 4, &dataStruct->netID, 4);
  1304. memcpy(data + 12, &dataStruct->characterState, 4);
  1305. memcpy(data + 20, &dataStruct->plantingTree, 4);
  1306. memcpy(data + 24, &dataStruct->x, 4);
  1307. memcpy(data + 28, &dataStruct->y, 4);
  1308. memcpy(data + 32, &dataStruct->XSpeed, 4);
  1309. memcpy(data + 36, &dataStruct->YSpeed, 4);
  1310. memcpy(data + 44, &dataStruct->punchX, 4);
  1311. memcpy(data + 48, &dataStruct->punchY, 4);
  1312. return data;
  1313. }
  1314.  
  1315. PlayerMoving* unpackPlayerMoving(BYTE * data)
  1316. {
  1317. PlayerMoving* dataStruct = new PlayerMoving;
  1318. memcpy(&dataStruct->packetType, data, 4);
  1319. memcpy(&dataStruct->netID, data + 4, 4);
  1320. memcpy(&dataStruct->characterState, data + 12, 4);
  1321. memcpy(&dataStruct->plantingTree, data + 20, 4);
  1322. memcpy(&dataStruct->x, data + 24, 4);
  1323. memcpy(&dataStruct->y, data + 28, 4);
  1324. memcpy(&dataStruct->XSpeed, data + 32, 4);
  1325. memcpy(&dataStruct->YSpeed, data + 36, 4);
  1326. memcpy(&dataStruct->punchX, data + 44, 4);
  1327. memcpy(&dataStruct->punchY, data + 48, 4);
  1328. return dataStruct;
  1329. }
  1330.  
  1331. void SendPacket(int a1, string a2, ENetPeer * enetPeer)
  1332. {
  1333. if (enetPeer)
  1334. {
  1335. ENetPacket* v3 = enet_packet_create(0, a2.length() + 5, 1);
  1336. memcpy(v3->data, &a1, 4);
  1337. //*(v3->data) = (DWORD)a1;
  1338. memcpy((v3->data) + 4, a2.c_str(), a2.length());
  1339.  
  1340. //cout << std::hex << (int)(char)v3->data[3] << endl;
  1341. enet_peer_send(enetPeer, 0, v3);
  1342. }
  1343. }
  1344.  
  1345. void SendPacketRaw(int a1, void* packetData, size_t packetDataSize, void* a4, ENetPeer * peer, int packetFlag)
  1346. {
  1347. ENetPacket* p;
  1348.  
  1349. if (peer) // check if we have it setup
  1350. {
  1351. if (a1 == 4 && *((BYTE*)packetData + 12) & 8)
  1352. {
  1353. p = enet_packet_create(0, packetDataSize + *((DWORD*)packetData + 13) + 5, packetFlag);
  1354. int four = 4;
  1355. memcpy(p->data, &four, 4);
  1356. memcpy((char*)p->data + 4, packetData, packetDataSize);
  1357. memcpy((char*)p->data + packetDataSize + 4, a4, *((DWORD*)packetData + 13));
  1358. enet_peer_send(peer, 0, p);
  1359. }
  1360. else
  1361. {
  1362. p = enet_packet_create(0, packetDataSize + 5, packetFlag);
  1363. memcpy(p->data, &a1, 4);
  1364. memcpy((char*)p->data + 4, packetData, packetDataSize);
  1365. enet_peer_send(peer, 0, p);
  1366. }
  1367. }
  1368. delete packetData;
  1369. }
  1370.  
  1371.  
  1372. void onPeerConnect(ENetPeer * peer)
  1373. {
  1374. ENetPeer* currentPeer;
  1375.  
  1376. for (currentPeer = server->peers;
  1377. currentPeer < &server->peers[server->peerCount];
  1378. ++currentPeer)
  1379. {
  1380. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1381. continue;
  1382. if (peer != currentPeer)
  1383. {
  1384. if (isHere(peer, currentPeer))
  1385. {
  1386. string netIdS = std::to_string(((PlayerInfo*)(currentPeer->data))->netID);
  1387. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnSpawn"), "spawn|avatar\nnetID|" + netIdS + "\nuserID|" + netIdS + "\ncolrect|0|0|20|30\nposXY|" + std::to_string(((PlayerInfo*)(currentPeer->data))->x) + "|" + std::to_string(((PlayerInfo*)(currentPeer->data))->y) + "\nname|``" + ((PlayerInfo*)(currentPeer->data))->displayName + "``\ncountry|" + ((PlayerInfo*)(currentPeer->data))->country + "\ninvis|0\nmstate|0\nsmstate|0\n")); // ((PlayerInfo*)(server->peers[i].data))->tankIDName
  1388. ENetPacket * packet = enet_packet_create(p.data,
  1389. p.len,
  1390. ENET_PACKET_FLAG_RELIABLE);
  1391.  
  1392. enet_peer_send(peer, 0, packet);
  1393. delete p.data;
  1394. string netIdS2 = std::to_string(((PlayerInfo*)(peer->data))->netID);
  1395. GamePacket p2 = packetEnd(appendString(appendString(createPacket(), "OnSpawn"), "spawn|avatar\nnetID|" + netIdS2 + "\nuserID|" + netIdS2 + "\ncolrect|0|0|20|30\nposXY|" + std::to_string(((PlayerInfo*)(peer->data))->x) + "|" + std::to_string(((PlayerInfo*)(peer->data))->y) + "\nname|``" + ((PlayerInfo*)(peer->data))->displayName + "``\ncountry|" + ((PlayerInfo*)(peer->data))->country + "\ninvis|0\nmstate|0\nsmstate|0\n")); // ((PlayerInfo*)(server->peers[i].data))->tankIDName
  1396. ENetPacket * packet2 = enet_packet_create(p2.data,
  1397. p2.len,
  1398. ENET_PACKET_FLAG_RELIABLE);
  1399. enet_peer_send(currentPeer, 0, packet2);
  1400. delete p2.data;
  1401. //enet_host_flush(server);
  1402. }
  1403. }
  1404. }
  1405.  
  1406. }
  1407.  
  1408. void updateAllClothes(ENetPeer * peer)
  1409. {
  1410. ENetPeer* currentPeer;
  1411. for (currentPeer = server->peers;
  1412. currentPeer < &server->peers[server->peerCount];
  1413. ++currentPeer)
  1414. {
  1415. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1416. continue;
  1417. if (isHere(peer, currentPeer))
  1418. {
  1419. GamePacket p3 = packetEnd(appendFloat(appendIntx(appendFloat(appendFloat(appendFloat(appendString(createPacket(), "OnSetClothing"), ((PlayerInfo*)(peer->data))->cloth_hair, ((PlayerInfo*)(peer->data))->cloth_shirt, ((PlayerInfo*)(peer->data))->cloth_pants), ((PlayerInfo*)(peer->data))->cloth_feet, ((PlayerInfo*)(peer->data))->cloth_face, ((PlayerInfo*)(peer->data))->cloth_hand), ((PlayerInfo*)(peer->data))->cloth_back, ((PlayerInfo*)(peer->data))->cloth_mask, ((PlayerInfo*)(peer->data))->cloth_necklace), ((PlayerInfo*)(peer->data))->skinColor), 0.0f, 0.0f, 0.0f));
  1420. memcpy(p3.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4); // ffloor
  1421. ENetPacket* packet3 = enet_packet_create(p3.data,
  1422. p3.len,
  1423. ENET_PACKET_FLAG_RELIABLE);
  1424.  
  1425. enet_peer_send(currentPeer, 0, packet3);
  1426. delete p3.data;
  1427. //enet_host_flush(server);
  1428. GamePacket p4 = packetEnd(appendFloat(appendIntx(appendFloat(appendFloat(appendFloat(appendString(createPacket(), "OnSetClothing"), ((PlayerInfo*)(currentPeer->data))->cloth_hair, ((PlayerInfo*)(currentPeer->data))->cloth_shirt, ((PlayerInfo*)(currentPeer->data))->cloth_pants), ((PlayerInfo*)(currentPeer->data))->cloth_feet, ((PlayerInfo*)(currentPeer->data))->cloth_face, ((PlayerInfo*)(currentPeer->data))->cloth_hand), ((PlayerInfo*)(currentPeer->data))->cloth_back, ((PlayerInfo*)(currentPeer->data))->cloth_mask, ((PlayerInfo*)(currentPeer->data))->cloth_necklace), ((PlayerInfo*)(currentPeer->data))->skinColor), 0.0f, 0.0f, 0.0f));
  1429. memcpy(p4.data + 8, &(((PlayerInfo*)(currentPeer->data))->netID), 4); // ffloor
  1430. ENetPacket* packet4 = enet_packet_create(p4.data,
  1431. p4.len,
  1432. ENET_PACKET_FLAG_RELIABLE);
  1433. enet_peer_send(peer, 0, packet4);
  1434. delete p4.data;
  1435. //enet_host_flush(server);
  1436. }
  1437. }
  1438. }
  1439.  
  1440. void sendClothes(ENetPeer * peer)
  1441. {
  1442. ENetPeer* currentPeer;
  1443. GamePacket p3 = packetEnd(appendFloat(appendIntx(appendFloat(appendFloat(appendFloat(appendString(createPacket(), "OnSetClothing"), ((PlayerInfo*)(peer->data))->cloth_hair, ((PlayerInfo*)(peer->data))->cloth_shirt, ((PlayerInfo*)(peer->data))->cloth_pants), ((PlayerInfo*)(peer->data))->cloth_feet, ((PlayerInfo*)(peer->data))->cloth_face, ((PlayerInfo*)(peer->data))->cloth_hand), ((PlayerInfo*)(peer->data))->cloth_back, ((PlayerInfo*)(peer->data))->cloth_mask, ((PlayerInfo*)(peer->data))->cloth_necklace), ((PlayerInfo*)(peer->data))->skinColor), 0.0f, 0.0f, 0.0f));
  1444. for (currentPeer = server->peers;
  1445. currentPeer < &server->peers[server->peerCount];
  1446. ++currentPeer)
  1447. {
  1448. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1449. continue;
  1450. if (isHere(peer, currentPeer))
  1451. {
  1452.  
  1453. memcpy(p3.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4); // ffloor
  1454. ENetPacket* packet3 = enet_packet_create(p3.data,
  1455. p3.len,
  1456. ENET_PACKET_FLAG_RELIABLE);
  1457.  
  1458. enet_peer_send(currentPeer, 0, packet3);
  1459. }
  1460.  
  1461. }
  1462. //enet_host_flush(server);
  1463. delete p3.data;
  1464. }
  1465.  
  1466. void sendPData(ENetPeer * peer, PlayerMoving * data)
  1467. {
  1468. ENetPeer* currentPeer;
  1469.  
  1470. for (currentPeer = server->peers;
  1471. currentPeer < &server->peers[server->peerCount];
  1472. ++currentPeer)
  1473. {
  1474. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1475. continue;
  1476. if (peer != currentPeer)
  1477. {
  1478. if (isHere(peer, currentPeer))
  1479. {
  1480. data->netID = ((PlayerInfo*)(peer->data))->netID;
  1481.  
  1482. SendPacketRaw(4, packPlayerMoving(data), 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  1483. }
  1484. }
  1485. }
  1486. }
  1487.  
  1488. int getPlayersCountInWorld(string name)
  1489. {
  1490. int count = 0;
  1491. ENetPeer* currentPeer;
  1492. for (currentPeer = server->peers;
  1493. currentPeer < &server->peers[server->peerCount];
  1494. ++currentPeer)
  1495. {
  1496. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1497. continue;
  1498. if (((PlayerInfo*)(currentPeer->data))->currentWorld == name)
  1499. count++;
  1500. }
  1501. return count;
  1502. }
  1503.  
  1504. void sendRoulete(ENetPeer * peer, int x, int y)
  1505. {
  1506. ENetPeer* currentPeer;
  1507. int val = rand() % 37;
  1508. for (currentPeer = server->peers;
  1509. currentPeer < &server->peers[server->peerCount];
  1510. ++currentPeer)
  1511. {
  1512. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1513. continue;
  1514. if (isHere(peer, currentPeer))
  1515. {
  1516. GamePacket p2 = packetEnd(appendIntx(appendString(appendIntx(appendString(createPacket(), "OnTalkBubble"), ((PlayerInfo*)(peer->data))->netID), "`w[" + ((PlayerInfo*)(peer->data))->displayName + " `wspun the wheel and got `b" + std::to_string(val) + "`w!]"), 0));
  1517. ENetPacket * packet2 = enet_packet_create(p2.data,
  1518. p2.len,
  1519. ENET_PACKET_FLAG_RELIABLE);
  1520. enet_peer_send(currentPeer, 0, packet2);
  1521. delete p2.data;
  1522. }
  1523.  
  1524.  
  1525. //cout << "Tile update at: " << data2->punchX << "x" << data2->punchY << endl;
  1526. }
  1527. }
  1528.  
  1529. void sendNothingHappened(ENetPeer * peer, int x, int y) {
  1530. PlayerMoving data;
  1531. data.netID = ((PlayerInfo*)(peer->data))->netID;
  1532. data.packetType = 0x8;
  1533. data.plantingTree = 0;
  1534. data.netID = -1;
  1535. data.x = x;
  1536. data.y = y;
  1537. data.punchX = x;
  1538. data.punchY = y;
  1539. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  1540. }
  1541.  
  1542. void sendTileUpdate(int x, int y, int tile, int causedBy, ENetPeer * peer)
  1543. {
  1544. PlayerMoving data;
  1545. //data.packetType = 0x14;
  1546. data.packetType = 0x3;
  1547.  
  1548. //data.characterState = 0x924; // animation
  1549. data.characterState = 0x0; // animation
  1550. data.x = x;
  1551. data.y = y;
  1552. data.punchX = x;
  1553. data.punchY = y;
  1554. data.XSpeed = 0;
  1555. data.YSpeed = 0;
  1556. data.netID = causedBy;
  1557. data.plantingTree = tile;
  1558.  
  1559. WorldInfo* world = getPlyersWorld(peer);
  1560.  
  1561. if (getItemDef(tile).blockType == BlockTypes::CONSUMABLE) return;
  1562.  
  1563. if (world == NULL) return;
  1564. if (x<0 || y<0 || x>world->width || y>world->height) return;
  1565. sendNothingHappened(peer, x, y);
  1566. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass))
  1567. {
  1568. if (world->items[x + (y * world->width)].foreground == 6 || world->items[x + (y * world->width)].foreground == 8 || world->items[x + (y * world->width)].foreground == 3760)
  1569. return;
  1570. if (tile == 6 || tile == 8 || tile == 3760 || tile == 6864)
  1571. return;
  1572. }
  1573. if (world->name == "ADMIN" && !getAdminLevel(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass))
  1574. {
  1575. if (world->items[x + (y * world->width)].foreground == 758)
  1576. sendRoulete(peer, x, y);
  1577. return;
  1578. }
  1579. if (world->name != "ADMIN") {
  1580. if (world->owner != "") {
  1581. if (((PlayerInfo*)(peer->data))->rawName == world->owner) {
  1582. // WE ARE GOOD TO GO
  1583. if (tile == 32) {
  1584. if (world->items[x + (y * world->width)].foreground == 242 or world->items[x + (y * world->width)].foreground == 202 or world->items[x + (y * world->width)].foreground == 204 or world->items[x + (y * world->width)].foreground == 206 or world->items[x + (y * world->width)].foreground == 2408 or world->items[x + (y * world->width)].foreground == 5980 or world->items[x + (y * world->width)].foreground == 2950 or world->items[x + (y * world->width)].foreground == 5814 or world->items[x + (y * world->width)].foreground == 4428 or world->items[x + (y * world->width)].foreground == 1796 or world->items[x + (y * world->width)].foreground == 4802 or world->items[x + (y * world->width)].foreground == 4994 or world->items[x + (y * world->width)].foreground == 5260 or world->items[x + (y * world->width)].foreground == 7188)
  1585. {
  1586. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`wShould this world be publicly breakable?``|left|242|\n\nadd_spacer|small|\nadd_button_with_icon|worldPublic|Public|noflags|2408||\nadd_button_with_icon|worldPrivate|Private|noflags|202||\nadd_spacer|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  1587. ENetPacket* packet = enet_packet_create(p.data,
  1588. p.len,
  1589. ENET_PACKET_FLAG_RELIABLE);
  1590. enet_peer_send(peer, 0, packet);
  1591.  
  1592. //enet_host_flush(server);
  1593. delete p.data;
  1594. }
  1595. }
  1596. }
  1597. else if (world->isPublic)
  1598. {
  1599. if (world->items[x + (y * world->width)].foreground == 242)
  1600. {
  1601. return;
  1602. }
  1603. }
  1604. else {
  1605. return;
  1606. }
  1607. if (tile == 242) {
  1608. return;
  1609. }
  1610. }
  1611. }
  1612. if (tile == 32) {
  1613. // TODO
  1614. return;
  1615. }
  1616. if (tile == 822) {
  1617. world->items[x + (y * world->width)].water = !world->items[x + (y * world->width)].water;
  1618. return;
  1619. }
  1620. if (tile == 3062)
  1621. {
  1622. world->items[x + (y * world->width)].fire = !world->items[x + (y * world->width)].fire;
  1623. return;
  1624. }
  1625. if (tile == 1866)
  1626. {
  1627. world->items[x + (y * world->width)].glue = !world->items[x + (y * world->width)].glue;
  1628. return;
  1629. }
  1630. ItemDefinition def;
  1631. try {
  1632. def = getItemDef(tile);
  1633. if (def.clothType != ClothTypes::NONE) return;
  1634. }
  1635. catch (int e) {
  1636. def.breakHits = 4;
  1637. def.blockType = BlockTypes::UNKNOWN;
  1638. #ifdef TOTAL_LOG
  1639. cout << "Ugh, unsupported item " << tile << endl;
  1640. #endif
  1641. }
  1642.  
  1643. if (tile == 544 || tile == 546 || tile == 4520 || tile == 382 || tile == 3116 || tile == 4520 || tile == 1792 || tile == 5666 || tile == 2994 || tile == 4368) return;
  1644. if (tile == 5708 || tile == 5709 || tile == 5780 || tile == 5781 || tile == 5782 || tile == 5783 || tile == 5784 || tile == 5785 || tile == 5710 || tile == 5711 || tile == 5786 || tile == 5787 || tile == 5788 || tile == 5789 || tile == 5790 || tile == 5791 || tile == 6146 || tile == 6147 || tile == 6148 || tile == 6149 || tile == 6150 || tile == 6151 || tile == 6152 || tile == 6153 || tile == 5670 || tile == 5671 || tile == 5798 || tile == 5799 || tile == 5800 || tile == 5801 || tile == 5802 || tile == 5803 || tile == 5668 || tile == 5669 || tile == 5792 || tile == 5793 || tile == 5794 || tile == 5795 || tile == 5796 || tile == 5797 || tile == 544 || tile == 546 || tile == 4520 || tile == 382 || tile == 3116 || tile == 1792 || tile == 5666 || tile == 2994 || tile == 4368) return;
  1645. if (tile == 1902 || tile == 1508 || tile == 428) return;
  1646. if (tile == 410 || tile == 1770 || tile == 4720 || tile == 4882 || tile == 6392 || tile == 3212 || tile == 1832 || tile == 4742 || tile == 3496 || tile == 3270 || tile == 4722) return;
  1647. if (tile >= 7068) return;
  1648. if (tile == 18) {
  1649. if (world->items[x + (y * world->width)].background == 6864 && world->items[x + (y * world->width)].foreground == 0) return;
  1650. if (world->items[x + (y * world->width)].background == 0 && world->items[x + (y * world->width)].foreground == 0) return;
  1651. //data.netID = -1;
  1652. data.packetType = 0x8;
  1653. data.plantingTree = 4;
  1654. using namespace std::chrono;
  1655. //if (world->items[x + (y*world->width)].foreground == 0) return;
  1656. if ((duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count() - world->items[x + (y * world->width)].breakTime >= 4000)
  1657. {
  1658. world->items[x + (y * world->width)].breakTime = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count();
  1659. world->items[x + (y * world->width)].breakLevel = 4; // TODO
  1660. if (world->items[x + (y * world->width)].foreground == 758)
  1661. sendRoulete(peer, x, y);
  1662. }
  1663. else
  1664. if (y < world->height && world->items[x + (y * world->width)].breakLevel + 4 >= def.breakHits * 4) { // TODO
  1665. data.packetType = 0x3;// 0xC; // 0xF // World::HandlePacketTileChangeRequest
  1666. data.netID = -1;
  1667. data.plantingTree = 0;
  1668. world->items[x + (y * world->width)].breakLevel = 0;
  1669. if (world->items[x + (y * world->width)].foreground != 0)
  1670. {
  1671. if (world->items[x + (y * world->width)].foreground == 242)
  1672. {
  1673. world->owner = "";
  1674. world->isPublic = false;
  1675. }
  1676. world->items[x + (y * world->width)].foreground = 0;
  1677.  
  1678.  
  1679. int randomGem = (rand() % 5) + 1;
  1680. ((PlayerInfo*)peer->data)->gems = ((PlayerInfo*)peer->data)->gems + randomGem;
  1681. GamePacket p = packetEnd(appendInt(appendString(createPacket(), "OnSetBux"), ((PlayerInfo*)peer->data)->gems));
  1682. ENetPacket* packet = enet_packet_create(p.data,
  1683. p.len,
  1684. ENET_PACKET_FLAG_RELIABLE);
  1685. enet_peer_send(peer, 0, packet);
  1686. delete p.data;
  1687. world->items[x + (y * world->width)].background = 14;
  1688. ((PlayerInfo*)peer->data)->totalpunched = ((PlayerInfo*)peer->data)->totalpunched + 1;
  1689. }
  1690. else {
  1691. data.plantingTree = 6864;
  1692. world->items[x + (y * world->width)].background = 6864;
  1693. }
  1694.  
  1695. }
  1696. else
  1697. if (y < world->height)
  1698. {
  1699. world->items[x + (y * world->width)].breakTime = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count();
  1700. world->items[x + (y * world->width)].breakLevel += 4; // TODO
  1701. if (world->items[x + (y * world->width)].foreground == 758)
  1702. sendRoulete(peer, x, y);
  1703. }
  1704.  
  1705. }
  1706. else {
  1707. for (int i = 0; i < ((PlayerInfo*)(peer->data))->inventory.items.size(); i++)
  1708. {
  1709. if (((PlayerInfo*)(peer->data))->inventory.items.at(i).itemID == tile)
  1710. {
  1711. if ((unsigned int)((PlayerInfo*)(peer->data))->inventory.items.at(i).itemCount > 1)
  1712. {
  1713. ((PlayerInfo*)(peer->data))->inventory.items.at(i).itemCount--;
  1714. }
  1715. else {
  1716. ((PlayerInfo*)(peer->data))->inventory.items.erase(((PlayerInfo*)(peer->data))->inventory.items.begin() + i);
  1717.  
  1718. }
  1719. }
  1720. }
  1721. if (def.blockType == BlockTypes::BACKGROUND)
  1722. {
  1723. world->items[x + (y * world->width)].background = tile;
  1724. }
  1725. else {
  1726. world->items[x + (y * world->width)].foreground = tile;
  1727. if (tile == 242) {
  1728. world->owner = ((PlayerInfo*)(peer->data))->rawName;
  1729. world->isPublic = false;
  1730. ENetPeer* currentPeer;
  1731.  
  1732. for (currentPeer = server->peers;
  1733. currentPeer < &server->peers[server->peerCount];
  1734. ++currentPeer)
  1735. {
  1736. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1737. continue;
  1738. if (isHere(peer, currentPeer)) {
  1739. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`3[`w" + world->name + " `ohas been World Locked by `2" + ((PlayerInfo*)(peer->data))->displayName + "`3]"));
  1740. ENetPacket * packet = enet_packet_create(p.data,
  1741. p.len,
  1742. ENET_PACKET_FLAG_RELIABLE);
  1743. enet_peer_send(currentPeer, 0, packet);
  1744. delete p.data;
  1745. }
  1746. }
  1747. }
  1748.  
  1749. }
  1750.  
  1751. world->items[x + (y * world->width)].breakLevel = 0;
  1752. }
  1753.  
  1754. ENetPeer* currentPeer;
  1755.  
  1756. for (currentPeer = server->peers;
  1757. currentPeer < &server->peers[server->peerCount];
  1758. ++currentPeer)
  1759. {
  1760. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1761. continue;
  1762. if (isHere(peer, currentPeer))
  1763. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  1764.  
  1765. //cout << "Tile update at: " << data2->punchX << "x" << data2->punchY << endl;
  1766. }
  1767. }
  1768.  
  1769. void sendPlayerLeave(ENetPeer * peer, PlayerInfo * player)
  1770. {
  1771. ENetPeer* currentPeer;
  1772. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnRemove"), "netID|" + std::to_string(player->netID) + "\n")); // ((PlayerInfo*)(server->peers[i].data))->tankIDName
  1773. GamePacket p2 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`5<`w" + player->displayName + "`5 left, `w" + std::to_string(getPlayersCountInWorld(player->currentWorld)) + "`5 others here>``"));
  1774. GamePacket p3 = packetEnd(appendIntx(appendString(appendIntx(appendString(createPacket(), "OnTalkBubble"), ((PlayerInfo*)(peer->data))->netID), "`5<`w" + player->displayName + "`5 left, `w" + std::to_string(getPlayersCountInWorld(player->currentWorld) - 1) + "`5 others here>``"), 0));
  1775. string text = "action|play_sfx\nfile|audio/door_shut.wav\ndelayMS|0\n";
  1776. BYTE * data = new BYTE[5 + text.length()];
  1777. BYTE zero = 0;
  1778. int type = 3;
  1779. memcpy(data, &type, 4);
  1780. memcpy(data + 4, text.c_str(), text.length());
  1781. memcpy(data + 4 + text.length(), &zero, 1);
  1782.  
  1783. for (currentPeer = server->peers;
  1784. currentPeer < &server->peers[server->peerCount];
  1785. ++currentPeer)
  1786. {
  1787. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1788. continue;
  1789. if (isHere(peer, currentPeer)) {
  1790. {
  1791. ENetPacket* packet1 = enet_packet_create(p.data,
  1792. p.len,
  1793. ENET_PACKET_FLAG_RELIABLE);
  1794.  
  1795. enet_peer_send(currentPeer, 0, packet1);
  1796.  
  1797. if (!((PlayerInfo*)(peer->data))->isGhost) {
  1798. ENetPacket* packet3 = enet_packet_create(p3.data,
  1799. p3.len,
  1800. ENET_PACKET_FLAG_RELIABLE);
  1801.  
  1802. enet_peer_send(currentPeer, 0, packet3);
  1803. }
  1804.  
  1805. if (((PlayerInfo*)(peer->data))->currentWorld != "EXIT") {
  1806. ENetPacket* packet2 = enet_packet_create(p2.data,
  1807. p2.len,
  1808. ENET_PACKET_FLAG_RELIABLE);
  1809.  
  1810. enet_peer_send(currentPeer, 0, packet2);
  1811. if (!((PlayerInfo*)(peer->data))->isGhost) {
  1812.  
  1813. ENetPacket* packet4 = enet_packet_create(data,
  1814. 5 + text.length(),
  1815. ENET_PACKET_FLAG_RELIABLE);
  1816.  
  1817. enet_peer_send(currentPeer, 0, packet4);
  1818.  
  1819. }
  1820. }
  1821. }
  1822. }
  1823. }
  1824. delete p.data;
  1825. delete p2.data;
  1826. delete p3.data;
  1827. delete data;
  1828. }
  1829.  
  1830. void sendPlayerEnter(ENetPeer * peer, PlayerInfo * player)
  1831. {
  1832. ENetPeer* currentPeer;
  1833. int count = 0;
  1834. for (currentPeer = server->peers;
  1835. currentPeer < &server->peers[server->peerCount];
  1836. ++currentPeer)
  1837. {
  1838. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1839. continue;
  1840. count++;
  1841. }
  1842. WorldInfo* world = getPlyersWorld(peer);
  1843. string nameworld = world->name;
  1844. GamePacket p2 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`5<`w" + player->displayName + "`5 entered, `w" + std::to_string(getPlayersCountInWorld(player->currentWorld)) + "`5 others here>``"));
  1845. GamePacket p3 = packetEnd(appendIntx(appendString(appendIntx(appendString(createPacket(), "OnTalkBubble"), ((PlayerInfo*)(peer->data))->netID), "`5<`w" + player->displayName + "`5 entered, `w" + std::to_string(getPlayersCountInWorld(player->currentWorld)) + "`5 others here>``"), 0));
  1846. GamePacket p5 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`oWorld `w" + nameworld + " `oentered. There are `w" + std::to_string(getPlayersCountInWorld(player->currentWorld)) + " `oother people here, `w" + std::to_string(count) + " `oonline."));
  1847. ENetPacket * packet5 = enet_packet_create(p5.data,
  1848. p5.len,
  1849. ENET_PACKET_FLAG_RELIABLE);
  1850. enet_peer_send(peer, 0, packet5);
  1851. delete p5.data;
  1852. string text = "action|play_sfx\nfile|audio/door_open.wav\ndelayMS|0\n";
  1853. BYTE * data = new BYTE[5 + text.length()];
  1854. BYTE zero = 0;
  1855. int type = 3;
  1856. memcpy(data, &type, 4);
  1857. memcpy(data + 4, text.c_str(), text.length());
  1858. memcpy(data + 4 + text.length(), &zero, 1);
  1859.  
  1860. delete data;
  1861. delete p2.data;
  1862. delete p3.data;
  1863.  
  1864. }
  1865. void sendChatMessage(ENetPeer * peer, int netID, string message)
  1866. {
  1867.  
  1868. if (!((PlayerInfo*)(peer->data))->haveGrowId) {
  1869. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`o>> `4You need to be registered first in able to talk."));
  1870. ENetPacket* packet = enet_packet_create(p.data,
  1871. p.len,
  1872. ENET_PACKET_FLAG_RELIABLE);
  1873.  
  1874. enet_peer_send(peer, 0, packet);
  1875. delete p.data;
  1876. }
  1877. else {
  1878. if (message.length() != 0) {
  1879. ENetPeer* currentPeer;
  1880. string name = "";
  1881. for (currentPeer = server->peers;
  1882. currentPeer < &server->peers[server->peerCount];
  1883. ++currentPeer)
  1884. {
  1885. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1886. continue;
  1887. if (((PlayerInfo*)(currentPeer->data))->netID == netID)
  1888. name = ((PlayerInfo*)(currentPeer->data))->displayName;
  1889.  
  1890. }
  1891. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`o<`w" + name + "`o> " + message));
  1892. GamePacket p2 = packetEnd(appendIntx(appendString(appendIntx(appendString(createPacket(), "OnTalkBubble"), netID), message), 0));
  1893. for (currentPeer = server->peers;
  1894. currentPeer < &server->peers[server->peerCount];
  1895. ++currentPeer)
  1896. {
  1897. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1898. continue;
  1899. if (isHere(peer, currentPeer))
  1900. {
  1901.  
  1902. ENetPacket* packet = enet_packet_create(p.data,
  1903. p.len,
  1904. ENET_PACKET_FLAG_RELIABLE);
  1905.  
  1906. enet_peer_send(currentPeer, 0, packet);
  1907.  
  1908. //enet_host_flush(server);
  1909.  
  1910. ENetPacket* packet2 = enet_packet_create(p2.data,
  1911. p2.len,
  1912. ENET_PACKET_FLAG_RELIABLE);
  1913. enet_peer_send(currentPeer, 0, packet2);
  1914.  
  1915. //enet_host_flush(server);
  1916. }
  1917. }
  1918. delete p.data;
  1919. delete p2.data;
  1920. }
  1921. }
  1922. }
  1923.  
  1924. void sendWho(ENetPeer * peer)
  1925. {
  1926. ENetPeer* currentPeer;
  1927. string name = "";
  1928. for (currentPeer = server->peers;
  1929. currentPeer < &server->peers[server->peerCount];
  1930. ++currentPeer)
  1931. {
  1932. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  1933. continue;
  1934. if (isHere(peer, currentPeer))
  1935. {
  1936. if (((PlayerInfo*)(currentPeer->data))->isGhost)
  1937. continue;
  1938. GamePacket p2 = packetEnd(appendIntx(appendString(appendIntx(appendString(createPacket(), "OnTalkBubble"), ((PlayerInfo*)(currentPeer->data))->netID), ((PlayerInfo*)(currentPeer->data))->displayName), 1));
  1939. ENetPacket* packet2 = enet_packet_create(p2.data,
  1940. p2.len,
  1941. ENET_PACKET_FLAG_RELIABLE);
  1942.  
  1943. enet_peer_send(peer, 0, packet2);
  1944. delete p2.data;
  1945. //enet_host_flush(server);
  1946. }
  1947. }
  1948. }
  1949.  
  1950. void sendWorld(ENetPeer * peer, WorldInfo * worldInfo)
  1951. {
  1952. #ifdef TOTAL_LOG
  1953. cout << "Entering a world..." << endl;
  1954. #endif
  1955. ((PlayerInfo*)(peer->data))->joinClothesUpdated = false;
  1956. string asdf = "0400000004A7379237BB2509E8E0EC04F8720B050000000000000000FBBB0000010000007D920100FDFDFDFD04000000040000000000000000000000070000000000"; // 0400000004A7379237BB2509E8E0EC04F8720B050000000000000000FBBB0000010000007D920100FDFDFDFD04000000040000000000000000000000080000000000000000000000000000000000000000000000000000000000000048133A0500000000BEBB0000070000000000
  1957. string worldName = worldInfo->name;
  1958. int xSize = worldInfo->width;
  1959. int ySize = worldInfo->height;
  1960. int square = xSize * ySize;
  1961. __int16 nameLen = worldName.length();
  1962. int payloadLen = asdf.length() / 2;
  1963. int dataLen = payloadLen + 2 + nameLen + 12 + (square * 8) + 4;
  1964. int allocMem = payloadLen + 2 + nameLen + 12 + (square * 8) + 4 + 16000;
  1965. BYTE* data = new BYTE[allocMem];
  1966. for (int i = 0; i < asdf.length(); i += 2)
  1967. {
  1968. char x = ch2n(asdf[i]);
  1969. x = x << 4;
  1970. x += ch2n(asdf[i + 1]);
  1971. memcpy(data + (i / 2), &x, 1);
  1972. }
  1973. int zero = 0;
  1974. __int16 item = 0;
  1975. int smth = 0;
  1976. for (int i = 0; i < square * 8; i += 4) memcpy(data + payloadLen + i + 14 + nameLen, &zero, 4);
  1977. for (int i = 0; i < square * 8; i += 8) memcpy(data + payloadLen + i + 14 + nameLen, &item, 2);
  1978. memcpy(data + payloadLen, &nameLen, 2);
  1979. memcpy(data + payloadLen + 2, worldName.c_str(), nameLen);
  1980. memcpy(data + payloadLen + 2 + nameLen, &xSize, 4);
  1981. memcpy(data + payloadLen + 6 + nameLen, &ySize, 4);
  1982. memcpy(data + payloadLen + 10 + nameLen, &square, 4);
  1983. BYTE * blockPtr = data + payloadLen + 14 + nameLen;
  1984. for (int i = 0; i < square; i++) {
  1985. if ((worldInfo->items[i].foreground == 0) || (worldInfo->items[i].foreground == 2) || (worldInfo->items[i].foreground == 8) || (worldInfo->items[i].foreground == 100)/* || (worldInfo->items[i].foreground%2)*/)
  1986. {
  1987. memcpy(blockPtr, &worldInfo->items[i].foreground, 2);
  1988. int type = 0x00000000;
  1989. // type 1 = locked
  1990. if (worldInfo->items[i].water)
  1991. type |= 0x04000000;
  1992. if (worldInfo->items[i].glue)
  1993. type |= 0x08000000;
  1994. if (worldInfo->items[i].fire)
  1995. type |= 0x10000000;
  1996. if (worldInfo->items[i].red)
  1997. type |= 0x20000000;
  1998. if (worldInfo->items[i].green)
  1999. type |= 0x40000000;
  2000. if (worldInfo->items[i].blue)
  2001. type |= 0x80000000;
  2002.  
  2003. // int type = 0x04000000; = water
  2004. // int type = 0x08000000 = glue
  2005. // int type = 0x10000000; = fire
  2006. // int type = 0x20000000; = red color
  2007. // int type = 0x40000000; = green color
  2008. // int type = 0x80000000; = blue color
  2009. memcpy(blockPtr + 4, &type, 4);
  2010. /*if (worldInfo->items[i].foreground % 2)
  2011. {
  2012. blockPtr += 6;
  2013. }*/
  2014. }
  2015. else
  2016. {
  2017. memcpy(blockPtr, &zero, 2);
  2018. }
  2019. memcpy(blockPtr + 2, &worldInfo->items[i].background, 2);
  2020. blockPtr += 8;
  2021. /*if (blockPtr - data < allocMem - 2000) // realloc
  2022. {
  2023. int wLen = blockPtr - data;
  2024. BYTE* oldData = data;
  2025.  
  2026. data = new BYTE[allocMem + 16000];
  2027. memcpy(data, oldData, allocMem);
  2028. allocMem += 16000;
  2029. delete oldData;
  2030. blockPtr = data + wLen;
  2031.  
  2032. }*/
  2033. }
  2034. memcpy(data + dataLen - 4, &smth, 4);
  2035. ENetPacket* packet2 = enet_packet_create(data,
  2036. dataLen,
  2037. ENET_PACKET_FLAG_RELIABLE);
  2038. enet_peer_send(peer, 0, packet2);
  2039. //enet_host_flush(server);
  2040. for (int i = 0; i < square; i++) {
  2041. if ((worldInfo->items[i].foreground == 0) || (worldInfo->items[i].foreground == 2) || (worldInfo->items[i].foreground == 8) || (worldInfo->items[i].foreground == 100))
  2042. ; // nothing
  2043. else
  2044. {
  2045. PlayerMoving data;
  2046. //data.packetType = 0x14;
  2047. data.packetType = 0x3;
  2048.  
  2049. //data.characterState = 0x924; // animation
  2050. data.characterState = 0x0; // animation
  2051. data.x = i % worldInfo->width;
  2052. data.y = i / worldInfo->height;
  2053. data.punchX = i % worldInfo->width;
  2054. data.punchY = i / worldInfo->width;
  2055. data.XSpeed = 0;
  2056. data.YSpeed = 0;
  2057. data.netID = -1;
  2058. data.plantingTree = worldInfo->items[i].foreground;
  2059. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  2060. }
  2061. }
  2062. ((PlayerInfo*)(peer->data))->currentWorld = worldInfo->name;
  2063. delete data;
  2064.  
  2065. }
  2066.  
  2067. void sendAction(ENetPeer * peer, int netID, string action)
  2068. {
  2069. ENetPeer* currentPeer;
  2070. string name = "";
  2071. GamePacket p2 = packetEnd(appendString(appendString(createPacket(), "OnAction"), action));
  2072. for (currentPeer = server->peers;
  2073. currentPeer < &server->peers[server->peerCount];
  2074. ++currentPeer)
  2075. {
  2076. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2077. continue;
  2078. if (isHere(peer, currentPeer)) {
  2079.  
  2080. memcpy(p2.data + 8, &netID, 4);
  2081. ENetPacket* packet2 = enet_packet_create(p2.data,
  2082. p2.len,
  2083. ENET_PACKET_FLAG_RELIABLE);
  2084.  
  2085. enet_peer_send(currentPeer, 0, packet2);
  2086.  
  2087. //enet_host_flush(server);
  2088. }
  2089. }
  2090. delete p2.data;
  2091. }
  2092.  
  2093.  
  2094. // droping items WorldObjectMap::HandlePacket
  2095. void sendDrop(ENetPeer * peer, int netID, int x, int y, int item, int count, BYTE specialEffect)
  2096. {
  2097. if (item >= 7068) return;
  2098. if (item < 0) return;
  2099. ENetPeer * currentPeer;
  2100. string name = "";
  2101. for (currentPeer = server->peers;
  2102. currentPeer < &server->peers[server->peerCount];
  2103. ++currentPeer)
  2104. {
  2105. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2106. continue;
  2107. if (isHere(peer, currentPeer)) {
  2108. PlayerMoving data;
  2109. data.packetType = 14;
  2110. data.x = x;
  2111. data.y = y;
  2112. data.netID = netID;
  2113. data.plantingTree = item;
  2114. float val = count; // item count
  2115. BYTE val2 = specialEffect;
  2116.  
  2117. BYTE* raw = packPlayerMoving(&data);
  2118. memcpy(raw + 16, &val, 4);
  2119. memcpy(raw + 1, &val2, 1);
  2120.  
  2121. SendPacketRaw(4, raw, 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  2122. }
  2123. }
  2124. }
  2125.  
  2126. void sendState(ENetPeer * peer) {
  2127. //return; // TODO
  2128. PlayerInfo* info = ((PlayerInfo*)(peer->data));
  2129. int netID = info->netID;
  2130. ENetPeer* currentPeer;
  2131. int state = getState(info);
  2132. for (currentPeer = server->peers;
  2133. currentPeer < &server->peers[server->peerCount];
  2134. ++currentPeer)
  2135. {
  2136. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2137. continue;
  2138. if (isHere(peer, currentPeer)) {
  2139. PlayerMoving data;
  2140. data.packetType = 0x14;
  2141. data.characterState = 0; // animation
  2142. data.x = 1000;
  2143. data.y = 100;
  2144. data.punchX = 0;
  2145. data.punchY = 0;
  2146. data.XSpeed = 300;
  2147. data.YSpeed = 600;
  2148. data.netID = netID;
  2149. data.plantingTree = state;
  2150. BYTE* raw = packPlayerMoving(&data);
  2151. int var = 0x808000; // placing and breking
  2152. memcpy(raw + 1, &var, 3);
  2153. SendPacketRaw(4, raw, 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  2154. }
  2155. }
  2156. // TODO
  2157. }
  2158.  
  2159.  
  2160.  
  2161. void sendWorldOffers(ENetPeer * peer)
  2162. {
  2163. if (!((PlayerInfo*)(peer->data))->isIn) return;
  2164. vector<WorldInfo> worlds = worldDB.getRandomWorlds();
  2165. string worldOffers = "default|";
  2166. if (worlds.size() > 0) {
  2167. worldOffers += worlds[0].name;
  2168. }
  2169.  
  2170. worldOffers += "\nadd_button|Showing: `wWorlds``|_catselect_|0.6|3529161471|\n";
  2171. for (int i = 0; i < worlds.size(); i++) {
  2172. worldOffers += "add_floater|" + worlds[i].name + "|" + std::to_string(getPlayersCountInWorld(worlds[i].name)) + "|0.55|3529161471\n";
  2173. }
  2174. //GamePacket p3 = packetEnd(appendString(appendString(createPacket(), "OnRequestWorldSelectMenu"), "default|GO FOR IT\nadd_button|Showing: `wFake Worlds``|_catselect_|0.6|3529161471|\nadd_floater|Subscribe|5|0.55|3529161471\nadd_floater|Growtopia|4|0.52|4278190335\nadd_floater|Noobs|150|0.49|3529161471\nadd_floater|...|3|0.49|3529161471\nadd_floater|`6:O :O :O``|2|0.46|3529161471\nadd_floater|SEEMS TO WORK|2|0.46|3529161471\nadd_floater|?????|1|0.43|3529161471\nadd_floater|KEKEKEKEK|13|0.7|3417414143\n"));
  2175. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  2176. GamePacket p3 = packetEnd(appendString(appendString(createPacket(), "OnRequestWorldSelectMenu"), worldOffers));
  2177. ENetPacket* packet3 = enet_packet_create(p3.data,
  2178. p3.len,
  2179. ENET_PACKET_FLAG_RELIABLE);
  2180. enet_peer_send(peer, 0, packet3);
  2181. delete p3.data;
  2182. //enet_host_flush(server);
  2183. }
  2184.  
  2185.  
  2186.  
  2187.  
  2188.  
  2189. BOOL WINAPI HandlerRoutine(DWORD dwCtrlType)
  2190. {
  2191. saveAllWorlds();
  2192. return FALSE;
  2193. }
  2194.  
  2195. /*
  2196. action|log
  2197. msg|`4UPDATE REQUIRED!`` : The `$V2.981`` update is now available for your device. Go get it! You'll need to install it before you can play online.
  2198. [DBG] Some text is here: action|set_url
  2199. url|http://ubistatic-a.akamaihd.net/0098/20180909/GrowtopiaInstaller.exe
  2200. label|Download Latest Version
  2201. */
  2202. int _tmain(int argc, _TCHAR * argv[])
  2203. {
  2204. cout << "Growtopia private server (c) Growtopia Noobs" << endl;
  2205. enet_initialize();
  2206. if (atexit(saveAllWorlds)) {
  2207. cout << "Worlds won't be saved for this session..." << endl;
  2208. }
  2209. /*if (RegisterApplicationRestart(L" -restarted", 0) == S_OK)
  2210. {
  2211. cout << "Autorestart is ready" << endl;
  2212. }
  2213. else {
  2214. cout << "Binding autorestart failed!" << endl;
  2215. }
  2216. Sleep(65000);
  2217. int* p = NULL;
  2218. *p = 5;*/
  2219. SetConsoleCtrlHandler(HandlerRoutine, true);
  2220. addAdmin("Snapch0t", "lukajecar1", 999);
  2221. addAdmin("yaoyao", "yaoyao08", 9999);
  2222. addAdmin("mrbfgs", "ieathatdog", 2);
  2223. addAdmin("mavrick", "ieathatdog", 3);
  2224. addAdmin("mavrick", "ieathatdog", 4);
  2225. addAdmin("mavrick", "ieathatdog", 5);
  2226. addAdmin("fake", "itsfake08", 1);
  2227. addAdmin("octo", "gedebop1122", 2);
  2228. addAdmin("noob", "ageng12345", 5);
  2229. // load items.dat
  2230. {
  2231. std::ifstream file("items.dat", std::ios::binary | std::ios::ate);
  2232. itemsDatSize = file.tellg();
  2233.  
  2234.  
  2235. itemsDat = new BYTE[60 + itemsDatSize];
  2236. string asdf = "0400000010000000FFFFFFFF000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000";
  2237. for (int i = 0; i < asdf.length(); i += 2)
  2238. {
  2239. char x = ch2n(asdf[i]);
  2240. x = x << 4;
  2241. x += ch2n(asdf[i + 1]);
  2242. memcpy(itemsDat + (i / 2), &x, 1);
  2243. if (asdf.length() > 60 * 2) throw 0;
  2244. }
  2245. memcpy(itemsDat + 56, &itemsDatSize, 4);
  2246. file.seekg(0, std::ios::beg);
  2247.  
  2248. if (file.read((char*)(itemsDat + 60), itemsDatSize))
  2249. {
  2250. cout << "Updating item data success!" << endl;
  2251.  
  2252. }
  2253. else {
  2254. cout << "Updating item data failed!" << endl;
  2255. }
  2256. }
  2257.  
  2258.  
  2259. //world = generateWorld();
  2260. worldDB.get("TEST");
  2261. worldDB.get("MAIN");
  2262. worldDB.get("NEW");
  2263. worldDB.get("ADMIN");
  2264. ENetAddress address;
  2265. /* Bind the server to the default localhost. */
  2266. /* A specific host address can be specified by */
  2267. enet_address_set_host(&address, "0.0.0.0");
  2268. //address.host = ENET_HOST_ANY;
  2269. /* Bind the server to port 1234. */
  2270. address.port = 17091;
  2271. server = enet_host_create(&address /* the address to bind the server host to */,
  2272. 1024 /* allow up to 32 clients and/or outgoing connections */,
  2273. 10 /* allow up to 2 channels to be used, 0 and 1 */,
  2274. 0 /* assume any amount of incoming bandwidth */,
  2275. 0 /* assume any amount of outgoing bandwidth */);
  2276. if (server == NULL)
  2277. {
  2278. fprintf(stderr,
  2279. "An error occurred while trying to create an ENet server host.\n");
  2280. while (1);
  2281. exit(EXIT_FAILURE);
  2282. }
  2283. server->checksum = enet_crc32;
  2284. enet_host_compress_with_range_coder(server);
  2285.  
  2286. cout << "Building items database..." << endl;
  2287. buildItemsDatabase();
  2288. cout << "Database is built!" << endl;
  2289.  
  2290. ENetEvent event;
  2291. /* Wait up to 1000 milliseconds for an event. */
  2292. while (true)
  2293. while (enet_host_service(server, &event, 1000) > 0)
  2294. {
  2295. ENetPeer* peer = event.peer;
  2296. switch (event.type)
  2297. {
  2298. case ENET_EVENT_TYPE_CONNECT:
  2299. {
  2300. #ifdef TOTAL_LOG
  2301. printf("A new client connected.\n");
  2302. #endif
  2303. /* Store any relevant client information here. */
  2304. //event.peer->data = "Client information";
  2305. ENetPeer* currentPeer;
  2306. int count = 0;
  2307. for (currentPeer = server->peers;
  2308. currentPeer < &server->peers[server->peerCount];
  2309. ++currentPeer)
  2310. {
  2311. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2312. continue;
  2313. if (currentPeer->address.host == peer->address.host)
  2314. count++;
  2315. }
  2316.  
  2317. event.peer->data = new PlayerInfo;
  2318. if (count > 3)
  2319. {
  2320. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rToo many accounts are logged on from this IP. Log off one account before playing please.``"));
  2321. ENetPacket* packet = enet_packet_create(p.data,
  2322. p.len,
  2323. ENET_PACKET_FLAG_RELIABLE);
  2324. enet_peer_send(peer, 0, packet);
  2325. delete p.data;
  2326. //enet_host_flush(server);
  2327. enet_peer_disconnect_later(peer, 0);
  2328. }
  2329. else {
  2330. sendData(peer, 1, 0, 0);
  2331. }
  2332.  
  2333.  
  2334. continue;
  2335. }
  2336. case ENET_EVENT_TYPE_RECEIVE:
  2337. {
  2338. if (((PlayerInfo*)(peer->data))->isUpdating)
  2339. {
  2340. cout << "packet drop" << endl;
  2341. continue;
  2342. }
  2343. /*printf("A packet of length %u containing %s was received from %s on channel %u.\n",
  2344. event.packet->dataLength,
  2345. event.packet->data,
  2346. event.peer->data,
  2347. event.channelID);
  2348. cout << (int)*event.packet->data << endl;*/
  2349. //cout << text_encode(getPacketData((char*)event.packet->data));
  2350. /*for (int i = 0; i < event.packet->dataLength; i++)
  2351. {
  2352. cout << event.packet->data[i];
  2353. }
  2354. sendData(7, 0, 0);
  2355. string x = "eventType|0\neventName|102_PLAYER.AUTHENTICATION\nAuthenticated|0\nAuthentication_error|6\nDevice_Id|^^\nGrow_Id|0\nName|^^Elektronik\nWordlock_balance|0\n";
  2356. //string x = "eventType | 0\neventName | 102_PLAYER.AUTHENTICATION\nAuthenticated | 0\nAuthentication_error | 6\nDevice_Id | ^^\nGrow_Id | 0\nName | ^^Elektronik\nWorldlock_balance | 0\n";
  2357. sendData(6, (char*)x.c_str(), x.length());
  2358. string y = "action|quit\n";
  2359. sendData(3, (char*)y.c_str(), y.length());
  2360. cout << endl;
  2361. string asdf = "0400000001000000FFFFFFFF0000000008000000000000000000000000000000000000000000000000000000000000000000000000000000400000000600020E0000004F6E53656E64546F5365727665720109ED4200000209834CED00030910887F0104020D0000003230392E35392E3139302E347C05090100000000C";
  2362. //asdf = "0400000001000000FFFFFFFF000000000800000000000000000000000000000000000000000000000000000000000000000000000000000040000000060002220000004F6E53757065724D61696E53746172744163636570744C6F676F6E464232313131330109ED4200000209834CED00030910887F0104020D0000003230392E35392E3139302E347C05090100000000C";
  2363. ENetPacket * packet = enet_packet_create(0,
  2364. asdf.length()/2,
  2365. ENET_PACKET_FLAG_RELIABLE);
  2366. for (int i = 0; i < asdf.length(); i += 2)
  2367. {
  2368. char x = ch2n(asdf[i]);
  2369. x = x << 4;
  2370. x += ch2n(asdf[i + 1]);
  2371. memcpy(packet->data + (i / 2), &x, 1);
  2372. }
  2373. enet_peer_send(peer, 0, packet);
  2374. enet_host_flush(server);
  2375. /* Clean up the packet now that we're done using it. */
  2376. //enet_packet_destroy(event.packet);
  2377. //sendData(7, 0, 0);
  2378. int messageType = GetMessageTypeFromPacket(event.packet);
  2379. //cout << "Packet type is " << messageType << endl;
  2380. //cout << (event->packet->data+4) << endl;
  2381. WorldInfo* world = getPlyersWorld(peer);
  2382. switch (messageType) {
  2383. case 2:
  2384. {
  2385. //cout << GetTextPointerFromPacket(event.packet) << endl;
  2386. string cch = GetTextPointerFromPacket(event.packet);
  2387. string str = cch.substr(cch.find("text|") + 5, cch.length() - cch.find("text|") - 1);
  2388. if (cch.find("action|wrench") == 0) {
  2389. vector<string> ex = explode("|", cch);
  2390. int id = stoi(ex[3]);
  2391.  
  2392. ENetPeer* currentPeer;
  2393. for (currentPeer = server->peers;
  2394. currentPeer < &server->peers[server->peerCount];
  2395. ++currentPeer)
  2396. {
  2397. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2398. continue;
  2399.  
  2400. if (isHere(peer, currentPeer)) {
  2401. if (((PlayerInfo*)(currentPeer->data))->netID == id) {
  2402. string name = ((PlayerInfo*)(currentPeer->data))->displayName;
  2403. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\nadd_label_with_icon|big|" + name + "|left|18|\nadd_spacer|small|\nadd_button||`2SOON|20|\nadd_spacer|small|\nadd_button|chc0|Close|noflags|0|0|\n\nadd_quick_exit|\nnend_dialog|gazette||OK|"));
  2404. ENetPacket * packet = enet_packet_create(p.data,
  2405. p.len,
  2406. ENET_PACKET_FLAG_RELIABLE);
  2407. enet_peer_send(peer, 0, packet);
  2408. delete p.data;
  2409. }
  2410.  
  2411. }
  2412.  
  2413. }
  2414. }
  2415. if (cch.find("action|respawn") == 0)
  2416. {
  2417. int x = 3040;
  2418. int y = 736;
  2419.  
  2420. if (!world) continue;
  2421.  
  2422. for (int i = 0; i < world->width * world->height; i++)
  2423. {
  2424. if (world->items[i].foreground == 6) {
  2425. x = (i % world->width) * 32;
  2426. y = (i / world->width) * 32;
  2427. }
  2428. }
  2429. {
  2430. PlayerMoving data;
  2431. data.packetType = 0x0;
  2432. data.characterState = 0x924; // animation
  2433. data.x = x;
  2434. data.y = y;
  2435. data.punchX = -1;
  2436. data.punchY = -1;
  2437. data.XSpeed = 0;
  2438. data.YSpeed = 0;
  2439. data.netID = ((PlayerInfo*)(peer->data))->netID;
  2440. data.plantingTree = 0x0;
  2441. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  2442. }
  2443.  
  2444. {
  2445. int x = 3040;
  2446. int y = 736;
  2447.  
  2448. for (int i = 0; i < world->width * world->height; i++)
  2449. {
  2450. if (world->items[i].foreground == 6) {
  2451. x = (i % world->width) * 32;
  2452. y = (i / world->width) * 32;
  2453. }
  2454. }
  2455. GamePacket p2 = packetEnd(appendFloat(appendString(createPacket(), "OnSetPos"), x, y));
  2456. memcpy(p2.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4);
  2457. ENetPacket* packet2 = enet_packet_create(p2.data,
  2458. p2.len,
  2459. ENET_PACKET_FLAG_RELIABLE);
  2460.  
  2461. enet_peer_send(peer, 0, packet2);
  2462. delete p2.data;
  2463. //enet_host_flush(server);
  2464. }
  2465. {
  2466. int x = 3040;
  2467. int y = 736;
  2468.  
  2469. for (int i = 0; i < world->width * world->height; i++)
  2470. {
  2471. if (world->items[i].foreground == 6) {
  2472. x = (i % world->width) * 32;
  2473. y = (i / world->width) * 32;
  2474. }
  2475. }
  2476. GamePacket p2 = packetEnd(appendIntx(appendString(createPacket(), "OnSetFreezeState"), 0));
  2477. memcpy(p2.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4);
  2478. ENetPacket* packet2 = enet_packet_create(p2.data,
  2479. p2.len,
  2480. ENET_PACKET_FLAG_RELIABLE);
  2481.  
  2482. enet_peer_send(peer, 0, packet2);
  2483. delete p2.data;
  2484. //enet_host_flush(server);
  2485. }
  2486. #ifdef TOTAL_LOG
  2487. cout << "Respawning... " << endl;
  2488. #endif
  2489. }
  2490. if (cch.find("action|growid") == 0)
  2491. {
  2492. #ifndef REGISTRATION
  2493. {
  2494. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Registration is not supported yet!"));
  2495. ENetPacket* packet = enet_packet_create(p.data,
  2496. p.len,
  2497. ENET_PACKET_FLAG_RELIABLE);
  2498. enet_peer_send(peer, 0, packet);
  2499. delete p.data;
  2500. //enet_host_flush(server);
  2501. }
  2502. #endif
  2503. #ifdef REGISTRATION
  2504. //GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`w" + itemDefs.at(id).name + "``|left|" + std::to_string(id) + "|\n\nadd_spacer|small|\nadd_textbox|" + itemDefs.at(id).description + "|left|\nadd_spacer|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  2505. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`wGet a GrowID``|left|206|\n\nadd_spacer|small|\nadd_textbox|A `wGrowID `wmeans `oyou can use a name and password to logon from any device.|\nadd_spacer|small|\nadd_textbox|This `wname `owill be reserved for you and `wshown to other players`o, so choose carefully!|\nadd_text_input|username|GrowID||30|\nadd_text_input|password|Password||100|\nadd_text_input|passwordverify|Password Verify||100|\nadd_textbox|Your `wemail address `owill only be used for account verification purposes and won't be spammed or shared. If you use a fake email, you'll never be able to recover or change your password.|\nadd_text_input|email|Email||100|\nadd_textbox|Your `wDiscord ID `owill be used for secondary verification if you lost access to your `wemail address`o! Please enter in such format: `wdiscordname#tag`o. Your `wDiscord Tag `ocan be found in your `wDiscord account settings`o.|\nadd_text_input|discord|Discord||100|\nend_dialog|register|Cancel|Get My GrowID!|\n"));
  2506. ENetPacket* packet = enet_packet_create(p.data,
  2507. p.len,
  2508. ENET_PACKET_FLAG_RELIABLE);
  2509. enet_peer_send(peer, 0, packet);
  2510. delete p.data;
  2511. #endif
  2512. }
  2513. if (cch.find("action|info") == 0)
  2514. {
  2515. std::stringstream ss(cch);
  2516. std::string to;
  2517. int id = -1;
  2518. int count = -1;
  2519. while (std::getline(ss, to, '\n')) {
  2520. vector<string> infoDat = explode("|", to);
  2521. if (infoDat.size() == 3) {
  2522. if (infoDat[1] == "itemID") id = atoi(infoDat[2].c_str());
  2523. if (infoDat[1] == "count") count = atoi(infoDat[2].c_str());
  2524. }
  2525. }
  2526. if (id == -1 || count == -1) continue;
  2527. if (itemDefs.size() < id || id < 0) continue;
  2528. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`w" + itemDefs.at(id).name + "``|left|" + std::to_string(id) + "|\n\nadd_spacer|small|\nadd_textbox|" + itemDefs.at(id).description + "|left|\nadd_spacer|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  2529. ENetPacket * packet = enet_packet_create(p.data,
  2530. p.len,
  2531. ENET_PACKET_FLAG_RELIABLE);
  2532. enet_peer_send(peer, 0, packet);
  2533.  
  2534. //enet_host_flush(server);
  2535. delete p.data;
  2536. }
  2537. if (cch.find("action|dialog_return") == 0)
  2538. {
  2539. std::stringstream ss(cch);
  2540. std::string to;
  2541. string btn = "";
  2542. bool isRegisterDialog = false;
  2543. string username = "";
  2544. string password = "";
  2545. string passwordverify = "";
  2546. string email = "";
  2547. string discord = "";
  2548. while (std::getline(ss, to, '\n')) {
  2549. vector<string> infoDat = explode("|", to);
  2550. if (infoDat.size() == 2) {
  2551. if (infoDat[0] == "buttonClicked") btn = infoDat[1];
  2552. if (infoDat[0] == "dialog_name" && infoDat[1] == "register")
  2553. {
  2554. isRegisterDialog = true;
  2555. }
  2556. if (isRegisterDialog) {
  2557. if (infoDat[0] == "username") username = infoDat[1];
  2558. if (infoDat[0] == "password") password = infoDat[1];
  2559. if (infoDat[0] == "passwordverify") passwordverify = infoDat[1];
  2560. if (infoDat[0] == "email") email = infoDat[1];
  2561. if (infoDat[0] == "discord") discord = infoDat[1];
  2562. }
  2563. }
  2564. }
  2565. if (btn == "worldPublic") if (((PlayerInfo*)(peer->data))->rawName == getPlyersWorld(peer)->owner) getPlyersWorld(peer)->isPublic = true;
  2566. if (btn == "worldPrivate") if (((PlayerInfo*)(peer->data))->rawName == getPlyersWorld(peer)->owner) getPlyersWorld(peer)->isPublic = false;
  2567. #ifdef REGISTRATION
  2568. if (isRegisterDialog) {
  2569.  
  2570. int regState = PlayerDB::playerRegister(username, password, passwordverify, email, discord);
  2571. if (regState == 1) {
  2572. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rYour account has been created!``"));
  2573. ENetPacket* packet = enet_packet_create(p.data,
  2574. p.len,
  2575. ENET_PACKET_FLAG_RELIABLE);
  2576. enet_peer_send(peer, 0, packet);
  2577. delete p.data;
  2578. GamePacket p2 = packetEnd(appendString(appendString(appendInt(appendString(createPacket(), "SetHasGrowID"), 1), username), password));
  2579. ENetPacket* packet2 = enet_packet_create(p2.data,
  2580. p2.len,
  2581. ENET_PACKET_FLAG_RELIABLE);
  2582. enet_peer_send(peer, 0, packet2);
  2583.  
  2584. //enet_host_flush(server);
  2585. delete p2.data;
  2586. enet_peer_disconnect_later(peer, 0);
  2587. }
  2588. else if (regState == -1) {
  2589. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rAccount creation has failed, because it already exists!``"));
  2590. ENetPacket* packet = enet_packet_create(p.data,
  2591. p.len,
  2592. ENET_PACKET_FLAG_RELIABLE);
  2593. enet_peer_send(peer, 0, packet);
  2594. delete p.data;
  2595. }
  2596. else if (regState == -2) {
  2597. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rAccount creation has failed, because the name is too short!``"));
  2598. ENetPacket* packet = enet_packet_create(p.data,
  2599. p.len,
  2600. ENET_PACKET_FLAG_RELIABLE);
  2601. enet_peer_send(peer, 0, packet);
  2602. delete p.data;
  2603. }
  2604. else if (regState == -3) {
  2605. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Passwords mismatch!``"));
  2606. ENetPacket* packet = enet_packet_create(p.data,
  2607. p.len,
  2608. ENET_PACKET_FLAG_RELIABLE);
  2609. enet_peer_send(peer, 0, packet);
  2610. delete p.data;
  2611. }
  2612. else if (regState == -4) {
  2613. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Account creation has failed, because email address is invalid!``"));
  2614. ENetPacket* packet = enet_packet_create(p.data,
  2615. p.len,
  2616. ENET_PACKET_FLAG_RELIABLE);
  2617. enet_peer_send(peer, 0, packet);
  2618. delete p.data;
  2619. }
  2620. else if (regState == -5) {
  2621. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Account creation has failed, because Discord ID is invalid!``"));
  2622. ENetPacket* packet = enet_packet_create(p.data,
  2623. p.len,
  2624. ENET_PACKET_FLAG_RELIABLE);
  2625. enet_peer_send(peer, 0, packet);
  2626. delete p.data;
  2627. }
  2628. }
  2629. #endif
  2630. }
  2631. if (cch.find("text|") != std::string::npos) {
  2632. PlayerInfo* pData = ((PlayerInfo*)(peer->data));
  2633. if (str == "/mod")
  2634. {
  2635. ((PlayerInfo*)(peer->data))->canWalkInBlocks = true;
  2636. sendState(peer);
  2637. /*PlayerMoving data;
  2638. data.packetType = 0x14;
  2639. data.characterState = 0x0; // animation
  2640. data.x = 1000;
  2641. data.y = 1;
  2642. data.punchX = 0;
  2643. data.punchY = 0;
  2644. data.XSpeed = 300;
  2645. data.YSpeed = 600;
  2646. data.netID = ((PlayerInfo*)(peer->data))->netID;
  2647. data.plantingTree = 0xFF;
  2648. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);*/
  2649. }
  2650. else if (str.substr(0, 7) == "/state ")
  2651. {
  2652. PlayerMoving data;
  2653. data.packetType = 0x14;
  2654. data.characterState = 0x0; // animation
  2655. data.x = 1000;
  2656. data.y = 0;
  2657. data.punchX = 0;
  2658. data.punchY = 0;
  2659. data.XSpeed = 300;
  2660. data.YSpeed = 600;
  2661. data.netID = ((PlayerInfo*)(peer->data))->netID;
  2662. data.plantingTree = atoi(str.substr(7, cch.length() - 7 - 1).c_str());
  2663. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  2664. }
  2665. else if (str.substr(0, 6) == "/find ")
  2666. {
  2667. ItemDefinition def;
  2668. bool found = false;
  2669. string itemname = str.substr(6, cch.length() - 6 - 1);
  2670. for (int o = 0; o < itemDefs.size(); o++)
  2671. {
  2672. def = getItemDef(o);
  2673. if (def.name == itemname)
  2674. {
  2675. GamePacket p344 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rItem ID of " + def.name + ": " + std::to_string(def.id)));
  2676. ENetPacket * packet344 = enet_packet_create(p344.data,
  2677. p344.len,
  2678. ENET_PACKET_FLAG_RELIABLE);
  2679. enet_peer_send(peer, 0, packet344);
  2680. delete p344.data;
  2681. found = true;
  2682. }
  2683. }
  2684. if (found == false)
  2685. {
  2686. GamePacket p3344 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Could not find the following item. Please use uppercase at the beggining, ( for example: Legendary Wings, not legendary wings )."));
  2687. ENetPacket* packet3344 = enet_packet_create(p3344.data,
  2688. p3344.len,
  2689. ENET_PACKET_FLAG_RELIABLE);
  2690. enet_peer_send(peer, 0, packet3344);
  2691. delete p3344.data;
  2692. }
  2693. found = false;
  2694. }
  2695. else if (str == "/ranks") {
  2696. string x;
  2697.  
  2698. ENetPeer* currentPeer;
  2699.  
  2700. for (currentPeer = server->peers;
  2701. currentPeer < &server->peers[server->peerCount];
  2702. ++currentPeer)
  2703. {
  2704. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2705. continue;
  2706.  
  2707. if (getAdminLevel(((PlayerInfo*)(currentPeer->data))->rawName, ((PlayerInfo*)(currentPeer->data))->tankIDPass) > 0) {
  2708. x.append("`o" + ((PlayerInfo*)(currentPeer->data))->rawName + "``, ");
  2709. }
  2710.  
  2711. }
  2712. x = x.substr(0, x.length() - 2);
  2713.  
  2714. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "``Ranks online: " + x));
  2715. ENetPacket * packet = enet_packet_create(p.data,
  2716. p.len,
  2717. ENET_PACKET_FLAG_RELIABLE);
  2718. enet_peer_send(peer, 0, packet);
  2719. }
  2720. else if (str.substr(0, 10) == "/ducttape ") {
  2721. if (isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass) > 0) {
  2722. string name = str.substr(10, str.length());
  2723.  
  2724. ENetPeer* currentPeer;
  2725.  
  2726. bool found = false;
  2727.  
  2728. for (currentPeer = server->peers;
  2729. currentPeer < &server->peers[server->peerCount];
  2730. ++currentPeer)
  2731. {
  2732. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2733. continue;
  2734.  
  2735. if (((PlayerInfo*)(currentPeer->data))->rawName == name) {
  2736. found = true;
  2737. if (((PlayerInfo*)(currentPeer->data))->taped) {
  2738. ((PlayerInfo*)(currentPeer->data))->taped = false;
  2739. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2You are no longer duct-taped!"));
  2740. ENetPacket* packet = enet_packet_create(p.data,
  2741. p.len,
  2742. ENET_PACKET_FLAG_RELIABLE);
  2743. enet_peer_send(currentPeer, 0, packet);
  2744. delete p.data;
  2745. {
  2746. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2You have un duct-taped the player!"));
  2747. ENetPacket* packet = enet_packet_create(p.data,
  2748. p.len,
  2749. ENET_PACKET_FLAG_RELIABLE);
  2750. enet_peer_send(peer, 0, packet);
  2751. }
  2752. }
  2753. else {
  2754. ((PlayerInfo*)(currentPeer->data))->taped = true;
  2755. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4You have been duct-taped!"));
  2756. ENetPacket* packet = enet_packet_create(p.data,
  2757. p.len,
  2758. ENET_PACKET_FLAG_RELIABLE);
  2759. enet_peer_send(currentPeer, 0, packet);
  2760. {
  2761. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2You have duct-taped the player!"));
  2762. ENetPacket* packet = enet_packet_create(p.data,
  2763. p.len,
  2764. ENET_PACKET_FLAG_RELIABLE);
  2765. enet_peer_send(peer, 0, packet);
  2766. }
  2767. }
  2768. }
  2769. }
  2770. if (!found) {
  2771. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Player not found!"));
  2772. ENetPacket* packet = enet_packet_create(p.data,
  2773. p.len,
  2774. ENET_PACKET_FLAG_RELIABLE);
  2775. enet_peer_send(peer, 0, packet);
  2776. }
  2777. }
  2778. else {
  2779. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4You need to have a higher admin-level to do that!"));
  2780. ENetPacket* packet = enet_packet_create(p.data,
  2781. p.len,
  2782. ENET_PACKET_FLAG_RELIABLE);
  2783. enet_peer_send(peer, 0, packet);
  2784. }
  2785. }
  2786. else if (str.substr(0, 10) == "/particle ")
  2787. { //NiteSpicy
  2788. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2789. ENetPeer* currentPeer;
  2790.  
  2791. for (currentPeer = server->peers;
  2792. currentPeer < &server->peers[server->peerCount];
  2793. ++currentPeer)
  2794. {
  2795. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2796. continue;
  2797. GamePacket p3 = packetEnd(appendFloat(appendIntx(appendString(createPacket(), "OnParticleEffect"), atoi(str.substr(10).c_str())), ((PlayerInfo*)peer->data)->x + 10, ((PlayerInfo*)peer->data)->y + 15));
  2798. ENetPacket * packet3 = enet_packet_create(p3.data,
  2799. p3.len,
  2800. ENET_PACKET_FLAG_RELIABLE);
  2801. enet_peer_send(currentPeer, 0, packet3);
  2802. delete p3.data;
  2803. }
  2804. }
  2805. else if (str.substr(0, 6) == "/kick ")
  2806. {
  2807. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2808. string imie = str.substr(6, cch.length() - 6 - 1);
  2809. ENetPeer * currentPeer;
  2810. string dupa;
  2811. GamePacket plong = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`#**`oThe Ancient Ones have `4KICKED`o " + imie + "`o out of the server!`#**"));
  2812. ENetPacket * packetlong = enet_packet_create(plong.data,
  2813. plong.len,
  2814. ENET_PACKET_FLAG_RELIABLE);
  2815. for (currentPeer = server->peers;
  2816. currentPeer < &server->peers[server->peerCount];
  2817. ++currentPeer)
  2818. {
  2819. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2820. continue;
  2821. enet_peer_send(currentPeer, 0, packetlong);
  2822. }
  2823. delete plong.data;
  2824. for (currentPeer = server->peers;
  2825. currentPeer < &server->peers[server->peerCount];
  2826. ++currentPeer)
  2827. {
  2828. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  2829. continue;
  2830. if (((PlayerInfo*)(currentPeer->data))->rawName == imie or ((PlayerInfo*)(currentPeer->data))->displayName == imie)
  2831. {
  2832. string username1;
  2833. int cloth_hair1, cloth_shirt1, cloth_pants1, cloth_feet1, cloth_face1, cloth_hand1, cloth_back1, cloth_mask1, gems1;
  2834. dupa = ((PlayerInfo*)(currentPeer->data))->rawName;
  2835. username1 = ((PlayerInfo*)(currentPeer->data))->rawName;
  2836. sendState(peer);
  2837. cloth_hair1 = ((PlayerInfo*)(currentPeer->data))->cloth_hair;
  2838. sendState(peer);
  2839. cloth_shirt1 = ((PlayerInfo*)(currentPeer->data))->cloth_shirt;
  2840. sendState(peer);
  2841. cloth_pants1 = ((PlayerInfo*)(currentPeer->data))->cloth_pants;
  2842. sendState(peer);
  2843. cloth_feet1 = ((PlayerInfo*)(currentPeer->data))->cloth_feet;
  2844. sendState(peer);
  2845. cloth_face1 = ((PlayerInfo*)(currentPeer->data))->cloth_face;
  2846. sendState(peer);
  2847. cloth_hand1 = ((PlayerInfo*)(currentPeer->data))->cloth_hand;
  2848. sendState(peer);
  2849. cloth_back1 = ((PlayerInfo*)(currentPeer->data))->cloth_back;
  2850. sendState(peer);
  2851. cloth_mask1 = ((PlayerInfo*)(currentPeer->data))->cloth_mask;
  2852. sendState(peer);
  2853. sendPlayerLeave(currentPeer, (PlayerInfo*)(currentPeer->data));
  2854. GamePacket p = packetEnd(appendInt(appendString(appendString(appendString(appendString(createPacket(), "OnAddNotification"), "interface/atomic_button.rttex"), "Warning from `4System`w: You've been `4KICKED `wfrom `2GrowtopiaOG`w."), "audio/hub_open.wav"), 0));
  2855. ENetPacket* packet = enet_packet_create(p.data,
  2856. p.len,
  2857. ENET_PACKET_FLAG_RELIABLE);
  2858. enet_peer_send(currentPeer, 0, packet);
  2859. delete p.data;
  2860. enet_peer_disconnect_later(currentPeer, 0);
  2861. if (!isHelper(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  2862. }
  2863. }
  2864.  
  2865. }
  2866. else if (str.substr(0, 6) == "/nick ") {
  2867. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2868. cout << ((PlayerInfo*)(peer->data))->displayName << "nicked into " << str.substr(6, cch.length() - 6 - 1) << endl;
  2869. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2870. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2871. sendWorldOffers(peer);
  2872.  
  2873. ((PlayerInfo*)(peer->data))->displayName = str.substr(6, cch.length() - 6 - 1);
  2874.  
  2875. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your nickname has been `2changed!"));
  2876. ENetPacket * packet = enet_packet_create(ps.data,
  2877. ps.len,
  2878. ENET_PACKET_FLAG_RELIABLE);
  2879.  
  2880. enet_peer_send(peer, 0, packet);
  2881. delete ps.data;
  2882. //enet_host_flush(server);
  2883. }
  2884. else if (str.substr(0, 6) == "/ihelp") {
  2885. if (!isHelper(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2886. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2887. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2888. sendWorldOffers(peer);
  2889.  
  2890. string name = ((PlayerInfo*)(peer->data))->displayName;
  2891. ((PlayerInfo*)(peer->data))->displayName = "`w(`2HELPER`w)`2 " + name + "";
  2892.  
  2893. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`2HELPER`w)`o beside your name!"));
  2894. ENetPacket* packet = enet_packet_create(ps.data,
  2895. ps.len,
  2896. ENET_PACKET_FLAG_RELIABLE);
  2897.  
  2898. enet_peer_send(peer, 0, packet);
  2899. delete ps.data;
  2900. //enet_host_flush(server);
  2901. }
  2902. else if (str.substr(0, 6) == "/vip") {
  2903. if (!isVIP(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2904. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2905. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2906. sendWorldOffers(peer);
  2907.  
  2908. string name = ((PlayerInfo*)(peer->data))->displayName;
  2909. ((PlayerInfo*)(peer->data))->displayName = "`w(`1VIP`w)`1 " + name + "";
  2910.  
  2911. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`1VIP`w)`o beside your name!"));
  2912. ENetPacket* packet = enet_packet_create(ps.data,
  2913. ps.len,
  2914. ENET_PACKET_FLAG_RELIABLE);
  2915.  
  2916. enet_peer_send(peer, 0, packet);
  2917. delete ps.data;
  2918. //enet_host_flush(server);
  2919. }
  2920. else if (str.substr(0, 6) == "/imod") {
  2921. if (!isMod(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2922. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2923. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2924. sendWorldOffers(peer);
  2925.  
  2926. string name = ((PlayerInfo*)(peer->data))->displayName;
  2927. ((PlayerInfo*)(peer->data))->displayName = "`w(`^MOD`w)`^ " + name + "";
  2928.  
  2929. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`^MOD`w)`o beside your name!"));
  2930. ENetPacket* packet = enet_packet_create(ps.data,
  2931. ps.len,
  2932. ENET_PACKET_FLAG_RELIABLE);
  2933.  
  2934. enet_peer_send(peer, 0, packet);
  2935. delete ps.data;
  2936. //enet_host_flush(server);
  2937. }
  2938. else if (str.substr(0, 6) == "/admin") {
  2939. if (!isAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2940. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2941. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2942. sendWorldOffers(peer);
  2943.  
  2944. string name = ((PlayerInfo*)(peer->data))->displayName;
  2945. ((PlayerInfo*)(peer->data))->displayName = "`w(`bADMIN`w)`b " + name + "";
  2946.  
  2947. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`bADMIN`w)`o beside your name!"));
  2948. ENetPacket* packet = enet_packet_create(ps.data,
  2949. ps.len,
  2950. ENET_PACKET_FLAG_RELIABLE);
  2951.  
  2952. enet_peer_send(peer, 0, packet);
  2953. delete ps.data;
  2954. //enet_host_flush(server);
  2955. }
  2956. else if (str.substr(0, 6) == "/cre") {
  2957. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2958. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2959. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2960. sendWorldOffers(peer);
  2961.  
  2962. string name = ((PlayerInfo*)(peer->data))->displayName;
  2963. ((PlayerInfo*)(peer->data))->displayName = "`w(`4CREATOR`w)`4 " + name + "";
  2964.  
  2965. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`4CREATOR`w)`o beside your name!"));
  2966. ENetPacket* packet = enet_packet_create(ps.data,
  2967. ps.len,
  2968. ENET_PACKET_FLAG_RELIABLE);
  2969.  
  2970. enet_peer_send(peer, 0, packet);
  2971. delete ps.data;
  2972. //enet_host_flush(server);
  2973. }
  2974. else if (str.substr(0, 6) == "/own") {
  2975. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  2976. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  2977. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  2978. sendWorldOffers(peer);
  2979.  
  2980. string name = ((PlayerInfo*)(peer->data))->displayName;
  2981. ((PlayerInfo*)(peer->data))->displayName = "`w(`9OWNER`w)`9 " + name + "";
  2982.  
  2983. GamePacket ps = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2Successfully`o added `w(`9OWNER`w)`o beside your name!"));
  2984. ENetPacket* packet = enet_packet_create(ps.data,
  2985. ps.len,
  2986. ENET_PACKET_FLAG_RELIABLE);
  2987.  
  2988. enet_peer_send(peer, 0, packet);
  2989. delete ps.data;
  2990. //enet_host_flush(server);
  2991. }
  2992. else if (str.substr(0, 6) == "/pull ")
  2993. {
  2994. WorldInfo* world = getPlyersWorld(peer);
  2995. if (((PlayerInfo*)(peer->data))->rawName == world->owner)
  2996. {
  2997. ENetPeer* currentPeer;
  2998. string imie = str.substr(6, cch.length() - 6 - 1);
  2999. int x = ((PlayerInfo*)(peer->data))->x;
  3000. int y = ((PlayerInfo*)(peer->data))->y;
  3001. string dupa;
  3002. GamePacket pmsg = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`o" + ((PlayerInfo*)(peer->data))->displayName + " `3pulls `o" + imie));
  3003. for (currentPeer = server->peers;
  3004. currentPeer < &server->peers[server->peerCount];
  3005. ++currentPeer)
  3006. {
  3007. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3008. continue;
  3009. if (isHere(peer, currentPeer))
  3010. {
  3011. if (((PlayerInfo*)(currentPeer->data))->rawName == imie or ((PlayerInfo*)(currentPeer->data))->displayName == imie)
  3012. {
  3013. dupa = ((PlayerInfo*)(currentPeer->data))->rawName;
  3014. PlayerMoving data;
  3015. data.packetType = 0x0;
  3016. data.characterState = 0x924; // animation
  3017. data.x = x;
  3018. data.y = y;
  3019. data.punchX = -1;
  3020. data.punchY = -1;
  3021. data.XSpeed = 0;
  3022. data.YSpeed = 0;
  3023. data.netID = ((PlayerInfo*)(currentPeer->data))->netID;
  3024. data.plantingTree = 0x0;
  3025. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  3026. GamePacket p2 = packetEnd(appendFloat(appendString(createPacket(), "OnSetPos"), x, y));
  3027. memcpy(p2.data + 8, &(((PlayerInfo*)(currentPeer->data))->netID), 4);
  3028. ENetPacket* packet2 = enet_packet_create(p2.data,
  3029. p2.len,
  3030. ENET_PACKET_FLAG_RELIABLE);
  3031. enet_peer_send(currentPeer, 0, packet2);
  3032. delete p2.data;
  3033. }
  3034. }
  3035. }
  3036. ENetPacket* packetmsg = enet_packet_create(pmsg.data,
  3037. pmsg.len,
  3038. ENET_PACKET_FLAG_RELIABLE);
  3039. for (currentPeer = server->peers;
  3040. currentPeer < &server->peers[server->peerCount];
  3041. ++currentPeer)
  3042. {
  3043. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3044. continue;
  3045. if (isHere(peer, currentPeer))
  3046. {
  3047. enet_peer_send(currentPeer, 0, packetmsg);
  3048. }
  3049. }
  3050. delete pmsg.data;
  3051. }
  3052. else
  3053. {
  3054. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You need to be world owner to use that command."));
  3055. ENetPacket* packet = enet_packet_create(p.data,
  3056. p.len,
  3057. ENET_PACKET_FLAG_RELIABLE);
  3058. enet_peer_send(peer, 0, packet);
  3059. delete p.data;
  3060. }
  3061. }
  3062. else if (str.substr(0, 5) == "/ban ")
  3063. {
  3064. WorldInfo* world = getPlyersWorld(peer);
  3065. if (((PlayerInfo*)(peer->data))->rawName == world->owner)
  3066. {
  3067. string imie = str.substr(5, cch.length() - 5 - 1);
  3068. string dupa;
  3069. GamePacket ban = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`2World-Owner `#" + ((PlayerInfo*)(peer->data))->rawName + " `ohas `4BANNED`o player " + imie + " `ofrom world `2" + ((PlayerInfo*)(peer->data))->currentWorld));
  3070. ENetPeer * currentPeer;
  3071. ENetPacket * packetba = enet_packet_create(ban.data,
  3072. ban.len,
  3073. ENET_PACKET_FLAG_RELIABLE);
  3074. for (currentPeer = server->peers;
  3075. currentPeer < &server->peers[server->peerCount];
  3076. ++currentPeer)
  3077. {
  3078. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3079. continue;
  3080. if (isHere(peer, currentPeer))
  3081. {
  3082. enet_peer_send(currentPeer, 0, packetba);
  3083. }
  3084. }
  3085. delete ban.data;
  3086. for (currentPeer = server->peers;
  3087. currentPeer < &server->peers[server->peerCount];
  3088. ++currentPeer)
  3089. {
  3090. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3091. continue;
  3092. if (isHere(peer, currentPeer))
  3093. {
  3094. if (((PlayerInfo*)(currentPeer->data))->rawName == imie or ((PlayerInfo*)(currentPeer->data))->displayName == imie)
  3095. {
  3096. dupa = ((PlayerInfo*)(currentPeer->data))->rawName;
  3097. sendPlayerLeave(currentPeer, (PlayerInfo*)(currentPeer->data));
  3098. ((PlayerInfo*)(currentPeer->data))->currentWorld = "EXIT";
  3099. sendWorldOffers(currentPeer);
  3100. }
  3101. }
  3102. }
  3103. }
  3104. //enet_host_flush(server);
  3105. else
  3106. {
  3107. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You need to be world owner to use that command."));
  3108. ENetPacket* packet = enet_packet_create(p.data,
  3109. p.len,
  3110. ENET_PACKET_FLAG_RELIABLE);
  3111. enet_peer_send(peer, 0, packet);
  3112. delete p.data;
  3113. }
  3114. continue;
  3115. }
  3116. else if (str.substr(0, 12) == "/changeflag ")
  3117. {
  3118. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3119. string a = str.substr(12, cch.length() - 12 - 1);
  3120. int id = stoi(a);
  3121. GamePacket p2 = packetEnd(appendIntx(appendIntx(appendIntx(appendIntx(appendString(createPacket(), "OnGuildDataChanged"), 1), 2), id), 3));
  3122. memcpy(p2.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4);
  3123. ENetPacket * packet2 = enet_packet_create(p2.data, p2.len, ENET_PACKET_FLAG_RELIABLE);
  3124. enet_peer_send(peer, 0, packet2);
  3125. delete p2.data;
  3126. }
  3127. else if (str == "/help") {
  3128. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Supported commands are: /news, /mods, /ducttape, /help, /mod, /unmod, /inventory, /item id, /team id, /color number, /who, /state number, /count, /sb message, /alt, /radio, /gem, /jsb, /pull, /ban, /find, /invite, /effect, /owners, /rules, /shop."));
  3129. ENetPacket* packet = enet_packet_create(p.data,
  3130. p.len,
  3131. ENET_PACKET_FLAG_RELIABLE);
  3132. enet_peer_send(peer, 0, packet);
  3133. delete p.data;
  3134. //enet_host_flush(server);
  3135. }
  3136. else if (str.substr(0, 8) == "/effect ")
  3137. {
  3138. int effect = atoi(str.substr(8).c_str());
  3139. if (effect != 40)
  3140. {
  3141. PlayerInfo* info = ((PlayerInfo*)(peer->data));
  3142. int netID = info->netID;
  3143. ENetPeer* currentPeer;
  3144. int state = getState(info);
  3145. info->effect = atoi(str.substr(8).c_str());
  3146. for (currentPeer = server->peers;
  3147. currentPeer < &server->peers[server->peerCount];
  3148. ++currentPeer)
  3149. {
  3150. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3151. continue;
  3152. if (isHere(peer, currentPeer)) {
  3153. PlayerMoving data;
  3154. data.packetType = 0x14;
  3155. data.characterState = 0; // animation
  3156. data.x = 1000;
  3157. data.y = 100;
  3158. data.x = 1000;
  3159. data.y = 1000;
  3160. data.punchX = 0;
  3161. data.punchY = 0;
  3162. data.XSpeed = 300;
  3163. data.YSpeed = 600;
  3164. data.netID = netID;
  3165. data.plantingTree = state;
  3166. BYTE* raw = packPlayerMoving(&data);
  3167. int var = effect; // placing and breking
  3168. memcpy(raw + 1, &var, 3);
  3169. SendPacketRaw(4, raw, 56, 0, currentPeer, ENET_PACKET_FLAG_RELIABLE);
  3170. GamePacket p2 = packetEnd(appendInt(appendString(createPacket(), "OnParticleEffect"), effect));
  3171. ENetPacket* packet2 = enet_packet_create(p2.data,
  3172. p2.len,
  3173. ENET_PACKET_FLAG_RELIABLE);
  3174. enet_peer_send(currentPeer, 0, packet2);
  3175. delete p2.data;
  3176. GamePacket p = packetEnd(appendInt(appendString(createPacket(), "OnParticleEffectV2"), effect));
  3177. ENetPacket* packet = enet_packet_create(p.data,
  3178. p.len,
  3179. ENET_PACKET_FLAG_RELIABLE);
  3180. enet_peer_send(currentPeer, 0, packet);
  3181. delete p.data;
  3182. }
  3183. }
  3184. }
  3185. }
  3186. else if (str.substr(0, 8) == "/invite ")
  3187. {
  3188. GamePacket p2 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Invite has been sent."));
  3189. ENetPacket* packet2 = enet_packet_create(p2.data,
  3190. p2.len,
  3191. ENET_PACKET_FLAG_RELIABLE);
  3192. enet_peer_send(peer, 0, packet2);
  3193. GamePacket p3 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You got an invite from player `2" + ((PlayerInfo*)(peer->data))->displayName + "`o, to world `2" + ((PlayerInfo*)(peer->data))->currentWorld));
  3194. ENetPacket * packet3 = enet_packet_create(p3.data,
  3195. p3.len,
  3196. ENET_PACKET_FLAG_RELIABLE);
  3197. string imie = str.substr(8, cch.length() - 8 - 1);
  3198. ENetPeer * currentPeer;
  3199. string dupa;
  3200. for (currentPeer = server->peers;
  3201. currentPeer < &server->peers[server->peerCount];
  3202. ++currentPeer)
  3203. {
  3204. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3205. continue;
  3206. if (((PlayerInfo*)(currentPeer->data))->rawName == imie or ((PlayerInfo*)(currentPeer->data))->displayName == imie)
  3207. {
  3208. dupa = ((PlayerInfo*)(currentPeer->data))->rawName;
  3209. enet_peer_send(currentPeer, 0, packet3);
  3210. }
  3211. }
  3212. delete p2.data;
  3213. delete p3.data;
  3214. continue;
  3215. }
  3216. else if (str.substr(0, 5) == "/osb ") {
  3217. using namespace std::chrono;
  3218. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3219. string name = ((PlayerInfo*)(peer->data))->displayName;
  3220. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `9Owner-Broadcast`` from `$`2" + name + "`w (in `4HIDDEN``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3221. string text = "action|play_sfx\nfile|audio/double_chance.wav\ndelayMS|0\n";
  3222. BYTE * data = new BYTE[5 + text.length()];
  3223. BYTE zero = 0;
  3224. int type = 3;
  3225. memcpy(data, &type, 4);
  3226. memcpy(data + 4, text.c_str(), text.length());
  3227. memcpy(data + 4 + text.length(), &zero, 1);
  3228. ENetPeer * currentPeer;
  3229.  
  3230. for (currentPeer = server->peers;
  3231. currentPeer < &server->peers[server->peerCount];
  3232. ++currentPeer)
  3233. {
  3234. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3235. continue;
  3236. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3237. continue;
  3238. ENetPacket * packet = enet_packet_create(p.data,
  3239. p.len,
  3240. ENET_PACKET_FLAG_RELIABLE);
  3241.  
  3242. enet_peer_send(currentPeer, 0, packet);
  3243.  
  3244.  
  3245.  
  3246.  
  3247. ENetPacket * packet2 = enet_packet_create(data,
  3248. 5 + text.length(),
  3249. ENET_PACKET_FLAG_RELIABLE);
  3250.  
  3251. enet_peer_send(currentPeer, 0, packet2);
  3252.  
  3253. //enet_host_flush(server);
  3254. }
  3255. delete data;
  3256. delete p.data;
  3257. }
  3258. else if (str.substr(0, 5) == "/csb ") {
  3259. using namespace std::chrono;
  3260. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3261. string name = ((PlayerInfo*)(peer->data))->displayName;
  3262. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `4Creator-SB`` from `$`2" + name + "`w (in `4HIDDEN``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3263. string text = "action|play_sfx\nfile|audio/gong.wav\ndelayMS|0\n";
  3264. BYTE * data = new BYTE[5 + text.length()];
  3265. BYTE zero = 0;
  3266. int type = 3;
  3267. memcpy(data, &type, 4);
  3268. memcpy(data + 4, text.c_str(), text.length());
  3269. memcpy(data + 4 + text.length(), &zero, 1);
  3270. ENetPeer * currentPeer;
  3271.  
  3272. for (currentPeer = server->peers;
  3273. currentPeer < &server->peers[server->peerCount];
  3274. ++currentPeer)
  3275. {
  3276. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3277. continue;
  3278. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3279. continue;
  3280. ENetPacket * packet = enet_packet_create(p.data,
  3281. p.len,
  3282. ENET_PACKET_FLAG_RELIABLE);
  3283.  
  3284. enet_peer_send(currentPeer, 0, packet);
  3285.  
  3286.  
  3287.  
  3288.  
  3289. ENetPacket * packet2 = enet_packet_create(data,
  3290. 5 + text.length(),
  3291. ENET_PACKET_FLAG_RELIABLE);
  3292.  
  3293. enet_peer_send(currentPeer, 0, packet2);
  3294.  
  3295. //enet_host_flush(server);
  3296. }
  3297. delete data;
  3298. delete p.data;
  3299. }
  3300. else if (str.substr(0, 5) == "/msb ") {
  3301. using namespace std::chrono;
  3302. if (!isMod(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3303. string name = ((PlayerInfo*)(peer->data))->displayName;
  3304. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `#Mod-SB`` from `$`2" + name + "`w (in `4HIDDEN``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3305. string text = "action|play_sfx\nfile|audio/beep.wav\ndelayMS|0\n";
  3306. BYTE * data = new BYTE[5 + text.length()];
  3307. BYTE zero = 0;
  3308. int type = 3;
  3309. memcpy(data, &type, 4);
  3310. memcpy(data + 4, text.c_str(), text.length());
  3311. memcpy(data + 4 + text.length(), &zero, 1);
  3312. ENetPeer * currentPeer;
  3313.  
  3314. for (currentPeer = server->peers;
  3315. currentPeer < &server->peers[server->peerCount];
  3316. ++currentPeer)
  3317. {
  3318. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3319. continue;
  3320. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3321. continue;
  3322. ENetPacket * packet = enet_packet_create(p.data,
  3323. p.len,
  3324. ENET_PACKET_FLAG_RELIABLE);
  3325.  
  3326. enet_peer_send(currentPeer, 0, packet);
  3327.  
  3328.  
  3329.  
  3330.  
  3331. ENetPacket * packet2 = enet_packet_create(data,
  3332. 5 + text.length(),
  3333. ENET_PACKET_FLAG_RELIABLE);
  3334.  
  3335. enet_peer_send(currentPeer, 0, packet2);
  3336.  
  3337. //enet_host_flush(server);
  3338. }
  3339. delete data;
  3340. delete p.data;
  3341. }
  3342. else if (str.substr(0, 5) == "/ssb ") {
  3343. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3344. cout << "ASB from " << ((PlayerInfo*)(peer->data))->rawName << " in world " << ((PlayerInfo*)(peer->data))->currentWorld << "with IP " << std::hex << peer->address.host << std::dec << " with message " << str.substr(5, cch.length() - 5 - 1) << endl;
  3345. GamePacket p = packetEnd(appendInt(appendString(appendString(appendString(appendString(createPacket(), "OnAddNotification"), "interface/atomic_button.rttex"), str.substr(4, cch.length() - 4 - 1).c_str()), "audio/hub_open.wav"), 0));
  3346. ENetPacket * packet = enet_packet_create(p.data,
  3347. p.len,
  3348. ENET_PACKET_FLAG_RELIABLE);
  3349. ENetPeer * currentPeer;
  3350. for (currentPeer = server->peers;
  3351. currentPeer < &server->peers[server->peerCount];
  3352. ++currentPeer)
  3353. {
  3354. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3355. continue;
  3356. enet_peer_send(currentPeer, 0, packet);
  3357. }
  3358.  
  3359. //enet_host_flush(server);
  3360. delete p.data;
  3361. }
  3362. else if (str == "/rules") {
  3363. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`4Growtopia OG Rules``|left|5016|\n\nadd_spacer|small|\nadd_label_with_icon|small|Do not insult other players.|left|1432|\nadd_label_with_icon|small|Do not be toxic to other players.|left|1432|\nadd_label_with_icon|small|Do not create drama with other players.|left|1432|\nadd_label_with_icon|small|Please be respectful to everyone.|left|1432|\nadd_label_with_icon|small|Scamming is NOT strictly against the rule.|left|1432|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|If you were caught breaking any rules, we will not hesitate to punish you.|left|20|\nadd_label_with_icon|small|~ Grace|left|6746|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  3364. ENetPacket* packet = enet_packet_create(p.data,
  3365. p.len,
  3366. ENET_PACKET_FLAG_RELIABLE);
  3367. enet_peer_send(peer, 0, packet);
  3368. //enet_host_flush(server);
  3369. delete p.data;
  3370. }
  3371. else if (str == "/shop") {
  3372. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`2Growtopia OG Store``|left|212|\n\nadd_spacer|small|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`4Creator Rank`o - `220`1 Diamond Locks|left|278|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`bAdministrator Rank`o - `210`1 Diamond Locks|left|32|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`^Moderator Rank`o - `25`1 Diamond Locks|left|408|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`1VIP Rank`o - `21`1 Diamond Lock|left|1486|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`wLevel`o - `21`o `9World Lock`o each|left|1488|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`wGems`o - 1000 gems per `9World Lock|left|112|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small||\n\nadd_url_button|``Discord: `1Join our discord server!``|`1Discord Server|https://discord.gg/s9y3YVF|Open link?|0|0|\nadd_url_button|||small|\nadd_textbox| |small||small|\nadd_textbox|If you would wish to purchase any ranks/assets please message Grace<3 (Atwood)#1795 on discord. For more details of the ranks please join our discord server.|small| |left|6746|\nadd_label_with_icon|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  3373. ENetPacket* packet = enet_packet_create(p.data,
  3374. p.len,
  3375.  
  3376. ENET_PACKET_FLAG_RELIABLE);
  3377. enet_peer_send(peer, 0, packet);
  3378. //enet_host_flush(server);
  3379. delete p.data;
  3380. }
  3381. else if (str == "/wizard")
  3382. {
  3383. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3384. ((PlayerInfo*)(peer->data))->cloth_back = 1790;
  3385. sendState(peer);
  3386. ((PlayerInfo*)(peer->data))->noEyes = true;
  3387. sendState(peer);
  3388. ((PlayerInfo*)(peer->data))->noBody = true;
  3389. sendState(peer);
  3390. ((PlayerInfo*)(peer->data))->noHands = true;
  3391. sendState(peer);
  3392. ((PlayerInfo*)(peer->data))->isInvisible = true;
  3393. sendState(peer);
  3394. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You are a diamond lock now! Re-enter world!"));
  3395. ENetPacket* packet = enet_packet_create(p.data,
  3396. p.len,
  3397. ENET_PACKET_FLAG_RELIABLE);
  3398. enet_peer_send(peer, 0, packet);
  3399. delete p.data;
  3400. GamePacket p3 = packetEnd(appendFloat(appendIntx(appendFloat(appendFloat(appendFloat(appendString(createPacket(), "OnSetClothing"), ((PlayerInfo*)(peer->data))->cloth_hair, ((PlayerInfo*)(peer->data))->cloth_shirt, ((PlayerInfo*)(peer->data))->cloth_pants), ((PlayerInfo*)(peer->data))->cloth_feet, ((PlayerInfo*)(peer->data))->cloth_face, ((PlayerInfo*)(peer->data))->cloth_hand), ((PlayerInfo*)(peer->data))->cloth_back, ((PlayerInfo*)(peer->data))->cloth_mask, ((PlayerInfo*)(peer->data))->cloth_necklace), ((PlayerInfo*)(peer->data))->skinColor), 0.0f, 0.0f, 0.0f));
  3401. memcpy(p3.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4); // ffloor
  3402. ENetPacket* packet3 = enet_packet_create(p3.data,
  3403. p3.len,
  3404. ENET_PACKET_FLAG_RELIABLE);
  3405. ENetPeer* currentPeer;
  3406. for (currentPeer = server->peers;
  3407. currentPeer < &server->peers[server->peerCount];
  3408. ++currentPeer)
  3409. {
  3410. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3411. continue;
  3412. if (isHere(peer, currentPeer))
  3413. {
  3414. enet_peer_send(currentPeer, 0, packet3);
  3415. }
  3416. }
  3417. delete p3.data;
  3418. }
  3419. else if (str == "/unwizard")
  3420. {
  3421. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3422. ((PlayerInfo*)(peer->data))->cloth_back = 0;
  3423. sendState(peer);
  3424. ((PlayerInfo*)(peer->data))->cloth_face = 0;
  3425. sendState(peer);
  3426. ((PlayerInfo*)(peer->data))->cloth_feet = 0;
  3427. sendState(peer);
  3428. ((PlayerInfo*)(peer->data))->cloth_hair = 0;
  3429. sendState(peer);
  3430. ((PlayerInfo*)(peer->data))->cloth_hand = 0;
  3431. sendState(peer);
  3432. ((PlayerInfo*)(peer->data))->cloth_mask = 0;
  3433. sendState(peer);
  3434. ((PlayerInfo*)(peer->data))->cloth_pants = 0;
  3435. sendState(peer);
  3436. ((PlayerInfo*)(peer->data))->cloth_shirt = 0;
  3437. sendState(peer);
  3438. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Diamond set removed! Re-enter world!"));
  3439. ENetPacket* packet = enet_packet_create(p.data,
  3440. p.len,
  3441. ENET_PACKET_FLAG_RELIABLE);
  3442. enet_peer_send(peer, 0, packet);
  3443. delete p.data;
  3444. GamePacket p3 = packetEnd(appendFloat(appendIntx(appendFloat(appendFloat(appendFloat(appendString(createPacket(), "OnSetClothing"), ((PlayerInfo*)(peer->data))->cloth_hair, ((PlayerInfo*)(peer->data))->cloth_shirt, ((PlayerInfo*)(peer->data))->cloth_pants), ((PlayerInfo*)(peer->data))->cloth_feet, ((PlayerInfo*)(peer->data))->cloth_face, ((PlayerInfo*)(peer->data))->cloth_hand), ((PlayerInfo*)(peer->data))->cloth_back, ((PlayerInfo*)(peer->data))->cloth_mask, ((PlayerInfo*)(peer->data))->cloth_necklace), ((PlayerInfo*)(peer->data))->skinColor), 0.0f, 0.0f, 0.0f));
  3445. memcpy(p3.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4); // ffloor
  3446. ENetPacket* packet3 = enet_packet_create(p3.data,
  3447. p3.len,
  3448. ENET_PACKET_FLAG_RELIABLE);
  3449. ENetPeer* currentPeer;
  3450. for (currentPeer = server->peers;
  3451. currentPeer < &server->peers[server->peerCount];
  3452. ++currentPeer)
  3453. {
  3454. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3455. continue;
  3456. if (isHere(peer, currentPeer))
  3457. {
  3458. enet_peer_send(currentPeer, 0, packet3);
  3459. }
  3460. }
  3461. delete p3.data;
  3462. }
  3463. else if (str == "/owners") {
  3464. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`2Growtopia OG Owners``|left|5016|\n\nadd_spacer|small|\nadd_label_with_icon|small|`9Grace`o : `9Server Owner|left|212|\nadd_label_with_icon|small`o : `9Server Co-Owner|left|1438|\nadd_label_with_icon|small|`YaoYao`o : `6Server Manager|left|3138|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small||\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  3465. ENetPacket* packet = enet_packet_create(p.data,
  3466. p.len,
  3467. ENET_PACKET_FLAG_RELIABLE);
  3468. enet_peer_send(peer, 0, packet);
  3469. //enet_host_flush(server);
  3470. delete p.data;
  3471. }
  3472. else if (str.substr(0, 5) == "/asb ") {
  3473. using namespace std::chrono;
  3474. if (!isAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3475. string name = ((PlayerInfo*)(peer->data))->displayName;
  3476. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `bAdmin-SB`` from `$`2" + name + "`w (in `4HIDDEN``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3477. string text = "action|play_sfx\nfile|audio/success.wav\ndelayMS|0\n";
  3478. BYTE * data = new BYTE[5 + text.length()];
  3479. BYTE zero = 0;
  3480. int type = 3;
  3481. memcpy(data, &type, 4);
  3482. memcpy(data + 4, text.c_str(), text.length());
  3483. memcpy(data + 4 + text.length(), &zero, 1);
  3484. ENetPeer * currentPeer;
  3485.  
  3486. for (currentPeer = server->peers;
  3487. currentPeer < &server->peers[server->peerCount];
  3488. ++currentPeer)
  3489. {
  3490. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3491. continue;
  3492. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3493. continue;
  3494. ENetPacket * packet = enet_packet_create(p.data,
  3495. p.len,
  3496. ENET_PACKET_FLAG_RELIABLE);
  3497.  
  3498. enet_peer_send(currentPeer, 0, packet);
  3499.  
  3500.  
  3501.  
  3502.  
  3503. ENetPacket * packet2 = enet_packet_create(data,
  3504. 5 + text.length(),
  3505. ENET_PACKET_FLAG_RELIABLE);
  3506.  
  3507. enet_peer_send(currentPeer, 0, packet2);
  3508.  
  3509. //enet_host_flush(server);
  3510. }
  3511. delete data;
  3512. delete p.data;
  3513. }
  3514. else if (str.substr(0, 5) == "/vsb ") {
  3515. using namespace std::chrono;
  3516. if (!isVIP(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3517. string name = ((PlayerInfo*)(peer->data))->displayName;
  3518. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `1VIP-SB`` from `$`2" + name + "`w (in `$" + ((PlayerInfo*)(peer->data))->currentWorld + "``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3519. string text = "action|play_sfx\nfile|audio/beep.wav\ndelayMS|0\n";
  3520. BYTE * data = new BYTE[5 + text.length()];
  3521. BYTE zero = 0;
  3522. int type = 3;
  3523. memcpy(data, &type, 4);
  3524. memcpy(data + 4, text.c_str(), text.length());
  3525. memcpy(data + 4 + text.length(), &zero, 1);
  3526. ENetPeer * currentPeer;
  3527.  
  3528. for (currentPeer = server->peers;
  3529. currentPeer < &server->peers[server->peerCount];
  3530. ++currentPeer)
  3531. {
  3532. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3533. continue;
  3534. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3535. continue;
  3536. ENetPacket * packet = enet_packet_create(p.data,
  3537. p.len,
  3538. ENET_PACKET_FLAG_RELIABLE);
  3539.  
  3540. enet_peer_send(currentPeer, 0, packet);
  3541.  
  3542.  
  3543.  
  3544.  
  3545. ENetPacket * packet2 = enet_packet_create(data,
  3546. 5 + text.length(),
  3547. ENET_PACKET_FLAG_RELIABLE);
  3548.  
  3549. enet_peer_send(currentPeer, 0, packet2);
  3550.  
  3551. //enet_host_flush(server);
  3552. }
  3553. delete data;
  3554. delete p.data;
  3555. }
  3556. else if (str == "/unowner")
  3557. {
  3558. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3559. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3560. ((PlayerInfo*)(peer->data))->displayName = xd;
  3561. sendState(peer);
  3562. ((PlayerInfo*)(peer->data))->namechange = false;
  3563. sendState(peer);
  3564. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3565. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3566. sendWorldOffers(peer);
  3567. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3568. ENetPacket* packet = enet_packet_create(p.data,
  3569. p.len,
  3570. ENET_PACKET_FLAG_RELIABLE);
  3571. enet_peer_send(peer, 0, packet);
  3572. delete p.data;
  3573. }
  3574. else if (str == "/uncreator")
  3575. {
  3576. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3577. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3578. ((PlayerInfo*)(peer->data))->displayName = xd;
  3579. sendState(peer);
  3580. ((PlayerInfo*)(peer->data))->namechange = false;
  3581. sendState(peer);
  3582. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3583. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3584. sendWorldOffers(peer);
  3585. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3586. ENetPacket* packet = enet_packet_create(p.data,
  3587. p.len,
  3588. ENET_PACKET_FLAG_RELIABLE);
  3589. enet_peer_send(peer, 0, packet);
  3590. delete p.data;
  3591. }
  3592. else if (str == "/unadmin")
  3593. {
  3594. if (!isAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3595. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3596. ((PlayerInfo*)(peer->data))->displayName = xd;
  3597. sendState(peer);
  3598. ((PlayerInfo*)(peer->data))->namechange = false;
  3599. sendState(peer);
  3600. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3601. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3602. sendWorldOffers(peer);
  3603. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3604. ENetPacket* packet = enet_packet_create(p.data,
  3605. p.len,
  3606. ENET_PACKET_FLAG_RELIABLE);
  3607. enet_peer_send(peer, 0, packet);
  3608. delete p.data;
  3609. }
  3610. else if (str == "/unimod")
  3611. {
  3612. if (!isMod(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3613. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3614. ((PlayerInfo*)(peer->data))->displayName = xd;
  3615. sendState(peer);
  3616. ((PlayerInfo*)(peer->data))->namechange = false;
  3617. sendState(peer);
  3618. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3619. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3620. sendWorldOffers(peer);
  3621. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3622. ENetPacket* packet = enet_packet_create(p.data,
  3623. p.len,
  3624. ENET_PACKET_FLAG_RELIABLE);
  3625. enet_peer_send(peer, 0, packet);
  3626. delete p.data;
  3627. }
  3628. else if (str == "/unvip")
  3629. {
  3630. if (!isVIP(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3631. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3632. ((PlayerInfo*)(peer->data))->displayName = xd;
  3633. sendState(peer);
  3634. ((PlayerInfo*)(peer->data))->namechange = false;
  3635. sendState(peer);
  3636. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3637. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3638. sendWorldOffers(peer);
  3639. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3640. ENetPacket* packet = enet_packet_create(p.data,
  3641. p.len,
  3642. ENET_PACKET_FLAG_RELIABLE);
  3643. enet_peer_send(peer, 0, packet);
  3644. delete p.data;
  3645. }
  3646. else if (str == "/unihelp")
  3647. {
  3648. if (!isHelper(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  3649. string xd = ((PlayerInfo*)(peer->data))->rank + ((PlayerInfo*)(peer->data))->rawName;
  3650. ((PlayerInfo*)(peer->data))->displayName = xd;
  3651. sendState(peer);
  3652. ((PlayerInfo*)(peer->data))->namechange = false;
  3653. sendState(peer);
  3654. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  3655. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  3656. sendWorldOffers(peer);
  3657. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your current name role has `2Successfully `4removed`o!"));
  3658. ENetPacket* packet = enet_packet_create(p.data,
  3659. p.len,
  3660. ENET_PACKET_FLAG_RELIABLE);
  3661. enet_peer_send(peer, 0, packet);
  3662. delete p.data;
  3663. }
  3664. else if (str.substr(0, 5) == "/hsb ") {
  3665. using namespace std::chrono;
  3666. if (!isHelper(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3667. string name = ((PlayerInfo*)(peer->data))->displayName;
  3668. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `2Helper-SB`` from `$`2" + name + "`w (in `$" + ((PlayerInfo*)(peer->data))->currentWorld + "``) ** :`#" + str.substr(4, cch.length() - 4 - 1)));
  3669. string text = "action|play_sfx\nfile|audio/achievement.wav\ndelayMS|0\n";
  3670. BYTE * data = new BYTE[5 + text.length()];
  3671. BYTE zero = 0;
  3672. int type = 3;
  3673. memcpy(data, &type, 4);
  3674. memcpy(data + 4, text.c_str(), text.length());
  3675. memcpy(data + 4 + text.length(), &zero, 1);
  3676. ENetPeer * currentPeer;
  3677.  
  3678. for (currentPeer = server->peers;
  3679. currentPeer < &server->peers[server->peerCount];
  3680. ++currentPeer)
  3681. {
  3682. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3683. continue;
  3684. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3685. continue;
  3686. ENetPacket * packet = enet_packet_create(p.data,
  3687. p.len,
  3688. ENET_PACKET_FLAG_RELIABLE);
  3689.  
  3690. enet_peer_send(currentPeer, 0, packet);
  3691.  
  3692.  
  3693.  
  3694.  
  3695. ENetPacket * packet2 = enet_packet_create(data,
  3696. 5 + text.length(),
  3697. ENET_PACKET_FLAG_RELIABLE);
  3698.  
  3699. enet_peer_send(currentPeer, 0, packet2);
  3700.  
  3701. //enet_host_flush(server);
  3702. }
  3703. delete data;
  3704. delete p.data;
  3705. }
  3706. else if (str.substr(0, 6) == "/drop ")
  3707. {
  3708. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3709. //rl
  3710. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 1 : -1)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3711. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 2 : -2)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3712. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 3 : -3)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3713. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -1 : 1)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3714. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -2 : 2)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3715. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -3 : 3)), ((PlayerInfo*)(peer->data))->y, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3716.  
  3717. //up lr
  3718. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 1 : -1)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3719. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 2 : -2)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3720. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 3 : -3)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3721. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -1 : 1)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3722. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -2 : 2)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3723. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -3 : 3)), ((PlayerInfo*)(peer->data))->y - 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3724.  
  3725. //down lr
  3726.  
  3727. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 1 : -1)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3728. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 2 : -2)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3729. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? 3 : -3)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3730. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -1 : 1)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3731. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -2 : 2)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3732. sendDrop(peer, -1, ((PlayerInfo*)(peer->data))->x + (32 * (((PlayerInfo*)(peer->data))->isRotatedLeft ? -3 : 3)), ((PlayerInfo*)(peer->data))->y + 32, atoi(str.substr(6, cch.length() - 6 - 1).c_str()), 1, 0);
  3733. if (!isCreator(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  3734. }
  3735. else if (str == "/news") {
  3736. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`2Growtopia OG``|left|212|\n\nadd_spacer|small|\nadd_label_with_icon|small|`2SERVER`o: Growtopia `2OG`o is owned by `9YaoYao (Co-Owner)`o and `9Grace`o!|left|5016|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2GEMS`o: This is Growtopia OG Version 0.4 Which covers the `2GEM SYSTEM`o that when you break blocks you will have gems but this will not be saved.|left|112|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2UPDATE`o: Added /shop to see what ranks or other things we sell on this server!|left|658|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2UPDATE`o: Added /rules to see what are the rules that are need to be followed,and added /owners to check who are the owners of GTOG.|left|658|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`4REMINDER`o: Worlds and Accounts may be deleted at anytime we are doing our best to prevent on deleting it.|left|1432|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2WOTD`o: The World of The Day goes to `2Noob`o owner of `2HANGOUT`o!|left|242|\nadd_label_with_icon|small||\n\nadd_url_button|``Discord: `1Join our discord server!``|`1Discord Server|https://discord.gg/s9y3YVF|Open link?|0|0|\nadd_url_button|||small|\nadd_textbox| |small||small|\nadd_textbox|~`2Growtopia OG Team|small||small|\nadd_textbox|Growtopia OG Version 0.4(Early)|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  3737. ENetPacket* packet = enet_packet_create(p.data,
  3738. p.len,
  3739. ENET_PACKET_FLAG_RELIABLE);
  3740. enet_peer_send(peer, 0, packet);
  3741. //enet_host_flush(server);
  3742. delete p.data;
  3743. }
  3744. else if (str.substr(0, 5) == "/gem ") //gem if u want flex with ur gems!
  3745. {
  3746. GamePacket p = packetEnd(appendInt(appendString(createPacket(), "OnSetBux"), atoi(str.substr(5).c_str())));
  3747. ENetPacket* packet = enet_packet_create(p.data,
  3748. p.len,
  3749. ENET_PACKET_FLAG_RELIABLE);
  3750.  
  3751. enet_peer_send(peer, 0, packet);
  3752. delete p.data;
  3753. continue;
  3754.  
  3755.  
  3756. }
  3757. else if (str.substr(0, 9) == "/weather ") {
  3758. if (world->name != "ADMIN") {
  3759. if (world->owner != "") {
  3760. if (((PlayerInfo*)(peer->data))->rawName == world->owner || isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass))
  3761.  
  3762. {
  3763. ENetPeer* currentPeer;
  3764.  
  3765. for (currentPeer = server->peers;
  3766. currentPeer < &server->peers[server->peerCount];
  3767. ++currentPeer)
  3768. {
  3769. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3770. continue;
  3771. if (isHere(peer, currentPeer))
  3772. {
  3773. GamePacket p1 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`oPlayer `2" + ((PlayerInfo*)(peer->data))->displayName + "`o has just changed the world's weather!"));
  3774. ENetPacket * packet1 = enet_packet_create(p1.data,
  3775. p1.len,
  3776. ENET_PACKET_FLAG_RELIABLE);
  3777.  
  3778. enet_peer_send(currentPeer, 0, packet1);
  3779. delete p1.data;
  3780.  
  3781. GamePacket p2 = packetEnd(appendInt(appendString(createPacket(), "OnSetCurrentWeather"), atoi(str.substr(9).c_str())));
  3782. ENetPacket * packet2 = enet_packet_create(p2.data,
  3783. p2.len,
  3784. ENET_PACKET_FLAG_RELIABLE);
  3785.  
  3786. enet_peer_send(currentPeer, 0, packet2);
  3787. delete p2.data;
  3788. continue; /*CODE UPDATE /WEATHER FOR EVERYONE!*/
  3789. }
  3790. }
  3791. }
  3792. }
  3793. }
  3794. }
  3795. /*else if (str == "/saveset") {
  3796. string username1;
  3797. int cloth_hair1, cloth_shirt1, cloth_pants1, cloth_feet1, cloth_face1, cloth_hand1, cloth_back1, cloth_mask1;
  3798. username1 = ((PlayerInfo*)(peer->data))->rawName;
  3799. sendState(peer);
  3800. cloth_hair1 = ((PlayerInfo*)(peer->data))->cloth_hair;
  3801. sendState(peer);
  3802. cloth_shirt1 = ((PlayerInfo*)(peer->data))->cloth_shirt;
  3803. sendState(peer);
  3804. cloth_pants1 = ((PlayerInfo*)(peer->data))->cloth_pants;
  3805. sendState(peer);
  3806. cloth_feet1 = ((PlayerInfo*)(peer->data))->cloth_feet;
  3807. sendState(peer);
  3808. cloth_face1 = ((PlayerInfo*)(peer->data))->cloth_face;
  3809. sendState(peer);
  3810. cloth_hand1 = ((PlayerInfo*)(peer->data))->cloth_hand;
  3811. sendState(peer);
  3812. cloth_back1 = ((PlayerInfo*)(peer->data))->cloth_back;
  3813. sendState(peer);
  3814. cloth_mask1 = ((PlayerInfo*)(peer->data))->cloth_mask;
  3815. sendState(peer);
  3816. PlayerDB::saveset(username1, cloth_hair1, cloth_shirt1, cloth_pants1, cloth_feet1, cloth_face1, cloth_hand1, cloth_back1, cloth_mask1);
  3817. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your set has been saved to database! It will be loaded automatic from now."));
  3818. ENetPacket * packet = enet_packet_create(p.data,
  3819. p.len,
  3820. ENET_PACKET_FLAG_RELIABLE);
  3821. enet_peer_send(peer, 0, packet);
  3822. delete p.data;
  3823. }*/
  3824. /*else if (str == "/loadset"){
  3825. string username = ((PlayerInfo*)(peer->data))->rawName;
  3826. sendState(peer);
  3827. std::ifstream ifs("sets/" + username + ".json");
  3828. if (ifs.is_open()) {
  3829. json j;
  3830. ifs >> j;
  3831. int cloth_hair = j["cloth_hair"];
  3832. int cloth_shirt = j["cloth_shirt"];
  3833. int cloth_pants = j["cloth_pants"];
  3834. int cloth_feet = j["cloth_feet"];
  3835. int cloth_face = j["cloth_face"];
  3836. int cloth_hand = j["cloth_hand"];
  3837. int cloth_back = j["cloth_back"];
  3838. int cloth_mask = j["cloth_mask"];
  3839. ((PlayerInfo*)(peer->data))->cloth_hair = cloth_hair;
  3840. sendState(peer);
  3841. ((PlayerInfo*)(peer->data))->cloth_shirt = cloth_shirt;
  3842. sendState(peer);
  3843. ((PlayerInfo*)(peer->data))->cloth_pants = cloth_pants;
  3844. sendState(peer);
  3845. ((PlayerInfo*)(peer->data))->cloth_feet = cloth_feet;
  3846. sendState(peer);
  3847. ((PlayerInfo*)(peer->data))->cloth_face = cloth_face;
  3848. sendState(peer);
  3849. ((PlayerInfo*)(peer->data))->cloth_hand = cloth_hand;
  3850. sendState(peer);
  3851. ((PlayerInfo*)(peer->data))->cloth_back = cloth_back;
  3852. sendState(peer);
  3853. ((PlayerInfo*)(peer->data))->cloth_mask = cloth_mask;
  3854. sendState(peer);
  3855. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Your set has been loaded! Re-enter world! If you want to save your new set to the database use /saveset!"));
  3856. ENetPacket * packet = enet_packet_create(p.data,
  3857. p.len,
  3858. ENET_PACKET_FLAG_RELIABLE);
  3859. enet_peer_send(peer, 0, packet);
  3860. delete p.data;
  3861. }
  3862. else
  3863. {
  3864. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You didn't create your set yet! Create your set and save it using /saveset!"));
  3865. ENetPacket * packet = enet_packet_create(p.data,
  3866. p.len,
  3867. ENET_PACKET_FLAG_RELIABLE);
  3868. enet_peer_send(peer, 0, packet);
  3869. delete p.data;
  3870. }
  3871. }*/
  3872. else if (str == "/count") {
  3873. int count = 0;
  3874. ENetPeer* currentPeer;
  3875. string name = "";
  3876. for (currentPeer = server->peers;
  3877. currentPeer < &server->peers[server->peerCount];
  3878. ++currentPeer)
  3879. {
  3880. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3881. continue;
  3882. count++;
  3883. }
  3884. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`oThere are`2 " + std::to_string(count) + "`o people currently online!"));
  3885. ENetPacket * packet = enet_packet_create(p.data,
  3886. p.len,
  3887. ENET_PACKET_FLAG_RELIABLE);
  3888. enet_peer_send(peer, 0, packet);
  3889. delete p.data;
  3890. //enet_host_flush(server);
  3891. }
  3892. else if (str == "/invis") {
  3893. sendConsoleMsg(peer, "`6" + str);
  3894. if (!pData->isGhost) {
  3895. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass))
  3896. sendConsoleMsg(peer, "`oYour atoms are suddenly aware of quantum tunneling. (Ghost in the shell mod added)");
  3897.  
  3898. GamePacket p2 = packetEnd(appendFloat(appendString(createPacket(), "OnSetPos"), pData->x, pData->y));
  3899. memcpy(p2.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4);
  3900. ENetPacket* packet2 = enet_packet_create(p2.data,
  3901. p2.len,
  3902. ENET_PACKET_FLAG_RELIABLE);
  3903.  
  3904. enet_peer_send(peer, 0, packet2);
  3905. delete p2.data;
  3906.  
  3907. sendState(peer);
  3908. sendClothes(peer);
  3909. pData->isGhost = true;
  3910. }
  3911. else {
  3912. sendConsoleMsg(peer, "`oYour body stops shimmering and returns to normal. (Ghost in the shell mod removed)");
  3913.  
  3914. GamePacket p2 = packetEnd(appendFloat(appendString(createPacket(), "OnSetPos"), pData->x1, pData->y1));
  3915. memcpy(p2.data + 8, &(((PlayerInfo*)(peer->data))->netID), 4);
  3916. ENetPacket* packet2 = enet_packet_create(p2.data,
  3917. p2.len,
  3918. ENET_PACKET_FLAG_RELIABLE);
  3919.  
  3920. enet_peer_send(peer, 0, packet2);
  3921. delete p2.data;
  3922. ((PlayerInfo*)(peer->data))->isInvisible = false;
  3923. sendState(peer);
  3924. sendClothes(peer);
  3925. pData->isGhost = false;
  3926. }
  3927. }
  3928.  
  3929. else if (str.substr(0, 4) == "/sb ") {
  3930. using namespace std::chrono;
  3931. if (((PlayerInfo*)(peer->data))->lastSB + 45000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count())
  3932. {
  3933. ((PlayerInfo*)(peer->data))->lastSB = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count();
  3934. }
  3935. else {
  3936. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Wait a minute before using the SB command again!"));
  3937. ENetPacket* packet = enet_packet_create(p.data,
  3938. p.len,
  3939. ENET_PACKET_FLAG_RELIABLE);
  3940.  
  3941. enet_peer_send(peer, 0, packet);
  3942. delete p.data;
  3943. //enet_host_flush(server);
  3944. continue;
  3945. }
  3946.  
  3947. string name = ((PlayerInfo*)(peer->data))->displayName;
  3948. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `5Super-Broadcast`` from `$`2" + name + "`w (in `$" + ((PlayerInfo*)(peer->data))->currentWorld + "``) ** :`# " + str.substr(4, cch.length() - 4 - 1)));
  3949. string text = "action|play_sfx\nfile|audio/beep.wav\ndelayMS|0\n";
  3950. BYTE * data = new BYTE[5 + text.length()];
  3951. BYTE zero = 0;
  3952. int type = 3;
  3953. memcpy(data, &type, 4);
  3954. memcpy(data + 4, text.c_str(), text.length());
  3955. memcpy(data + 4 + text.length(), &zero, 1);
  3956. ENetPeer * currentPeer;
  3957.  
  3958. for (currentPeer = server->peers;
  3959. currentPeer < &server->peers[server->peerCount];
  3960. ++currentPeer)
  3961. {
  3962. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  3963. continue;
  3964. if (!((PlayerInfo*)(currentPeer->data))->radio)
  3965. continue;
  3966. ENetPacket * packet = enet_packet_create(p.data,
  3967. p.len,
  3968. ENET_PACKET_FLAG_RELIABLE);
  3969.  
  3970. enet_peer_send(currentPeer, 0, packet);
  3971.  
  3972.  
  3973.  
  3974.  
  3975. ENetPacket * packet2 = enet_packet_create(data,
  3976. 5 + text.length(),
  3977. ENET_PACKET_FLAG_RELIABLE);
  3978.  
  3979. enet_peer_send(currentPeer, 0, packet2);
  3980.  
  3981. //enet_host_flush(server);
  3982. }
  3983. delete data;
  3984. delete p.data;
  3985. }
  3986. else if (str.substr(0, 4) == "/jsb ") {
  3987. using namespace std::chrono;
  3988. if (((PlayerInfo*)(peer->data))->lastSB + 45000 < (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count())
  3989. {
  3990. ((PlayerInfo*)(peer->data))->lastSB = (duration_cast<milliseconds>(system_clock::now().time_since_epoch())).count();
  3991. }
  3992. else {
  3993. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Wait a minute before using the SB command again!"));
  3994. ENetPacket* packet = enet_packet_create(p.data,
  3995. p.len,
  3996. ENET_PACKET_FLAG_RELIABLE);
  3997.  
  3998. enet_peer_send(peer, 0, packet);
  3999. delete p.data;
  4000. //enet_host_flush(server);
  4001. continue;
  4002. }
  4003.  
  4004. string name = ((PlayerInfo*)(peer->data))->displayName;
  4005. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`w** `5Super-Broadcast`` from `$`2" + name + "```` (in `4JAMMED``) ** :`` `# " + str.substr(4, cch.length() - 4 - 1)));
  4006. string text = "action|play_sfx\nfile|audio/beep.wav\ndelayMS|0\n";
  4007. BYTE * data = new BYTE[5 + text.length()];
  4008. BYTE zero = 0;
  4009. int type = 3;
  4010. memcpy(data, &type, 4);
  4011. memcpy(data + 4, text.c_str(), text.length());
  4012. memcpy(data + 4 + text.length(), &zero, 1);
  4013. ENetPeer * currentPeer;
  4014.  
  4015. for (currentPeer = server->peers;
  4016. currentPeer < &server->peers[server->peerCount];
  4017. ++currentPeer)
  4018. {
  4019. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4020. continue;
  4021. if (!((PlayerInfo*)(currentPeer->data))->radio)
  4022. continue;
  4023. ENetPacket * packet = enet_packet_create(p.data,
  4024. p.len,
  4025. ENET_PACKET_FLAG_RELIABLE);
  4026.  
  4027. enet_peer_send(currentPeer, 0, packet);
  4028.  
  4029.  
  4030.  
  4031.  
  4032. ENetPacket * packet2 = enet_packet_create(data,
  4033. 5 + text.length(),
  4034. ENET_PACKET_FLAG_RELIABLE);
  4035.  
  4036. enet_peer_send(currentPeer, 0, packet2);
  4037.  
  4038. //enet_host_flush(server);
  4039. }
  4040. delete data;
  4041. delete p.data;
  4042. }
  4043.  
  4044.  
  4045. else if (str.substr(0, 6) == "/radio") {
  4046. GamePacket p;
  4047. if (((PlayerInfo*)(peer->data))->radio) {
  4048. p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You won't see broadcasts anymore."));
  4049. ((PlayerInfo*)(peer->data))->radio = false;
  4050. }
  4051. else {
  4052. p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You will now see broadcasts again."));
  4053. ((PlayerInfo*)(peer->data))->radio = true;
  4054. }
  4055.  
  4056. ENetPacket* packet = enet_packet_create(p.data,
  4057. p.len,
  4058. ENET_PACKET_FLAG_RELIABLE);
  4059.  
  4060. enet_peer_send(peer, 0, packet);
  4061. delete p.data;
  4062. //enet_host_flush(server);
  4063. }
  4064. else if (str.substr(0, 6) == "/music") {
  4065. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  4066. GamePacket p = packetEnd(appendInt(appendString(appendString(appendString(appendString(createPacket(), "OnAddNotification"), "interface/atomic_button.rttex"), "Everyone `4DANCE`w!"), "audio/mp3/disco.ogg"), 0));
  4067. ENetPacket* packet = enet_packet_create(p.data,
  4068. p.len,
  4069. ENET_PACKET_FLAG_RELIABLE);
  4070. ENetPeer* currentPeer;
  4071. for (currentPeer = server->peers;
  4072. currentPeer < &server->peers[server->peerCount];
  4073. ++currentPeer)
  4074. {
  4075. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4076. continue;
  4077. enet_peer_send(currentPeer, 0, packet);
  4078. }
  4079. delete p.data;
  4080. //enet_host_flush(server);
  4081. }
  4082. else if (str.substr(0, 6) == "/reset") {
  4083. if (!isSuperAdmin(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) break;
  4084. GamePacket p = packetEnd(appendInt(appendString(appendString(appendString(appendString(createPacket(), "OnAddNotification"), "interface/atomic_button.rttex"), "Restarting soon!"), "audio/mp3/suspended.mp3"), 0));
  4085. ENetPacket* packet = enet_packet_create(p.data,
  4086. p.len,
  4087. ENET_PACKET_FLAG_RELIABLE);
  4088. ENetPeer* currentPeer;
  4089. for (currentPeer = server->peers;
  4090. currentPeer < &server->peers[server->peerCount];
  4091. ++currentPeer)
  4092. {
  4093. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4094. continue;
  4095. enet_peer_send(currentPeer, 0, packet);
  4096. }
  4097. delete p.data;
  4098. //enet_host_flush(server);
  4099. }
  4100.  
  4101. /*else if (str.substr(0, 7) == "/clear "){
  4102. if (!canClear(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  4103. cout << "World cleared by " << ((PlayerInfo*)(peer->data))->tankIDName << endl;
  4104. WorldInfo* wrld = getPlyersWorld(peer);
  4105. string wName = str.substr(4, cch.length() - 4 - 1);
  4106. for (auto & c : wName) c = toupper(c);
  4107. for (int i = 0; i < worlds.size(); i++)
  4108. {
  4109. if (wrld == NULL) continue;
  4110. if (wName == wrld->name)
  4111. {
  4112. worlds.at(i) = generateWorld(wrld->name, wrld->width, wrld->height);
  4113. ENetPeer * currentPeer;
  4114. for (currentPeer = server->peers;
  4115. currentPeer < &server->peers[server->peerCount];
  4116. ++currentPeer)
  4117. {
  4118. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4119. continue;
  4120. if (((PlayerInfo*)(currentPeer->data))->currentWorld == wrld->name)
  4121. {
  4122. sendWorld(currentPeer, &worlds.at(i));
  4123.  
  4124. int x = 3040;
  4125. int y = 736;
  4126.  
  4127. for (int j = 0; j < worlds.at(i).width*worlds.at(i).height; j++)
  4128. {
  4129. if (worlds.at(i).items[j].foreground == 6) {
  4130. x = (j%worlds.at(i).width) * 32;
  4131. y = (j / worlds.at(i).width) * 32;
  4132. }
  4133. }
  4134. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnSpawn"), "spawn|avatar\nnetID|" + std::to_string(cId) + "\nuserID|" + std::to_string(cId) + "\ncolrect|0|0|20|30\nposXY|" + std::to_string(x) + "|" + std::to_string(y) + "\nname|``" + ((PlayerInfo*)(currentPeer->data))->tankIDName + "``\ncountry|" + ((PlayerInfo*)(currentPeer->data))->country + "\ninvis|0\nmstate|0\nsmstate|0\ntype|local\n"));
  4135. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4136. ENetPacket * packet = enet_packet_create(p.data,
  4137. p.len,
  4138. ENET_PACKET_FLAG_RELIABLE);
  4139. enet_peer_send(currentPeer, 0, packet);
  4140.  
  4141. enet_host_flush(server);
  4142. delete p.data;
  4143. ((PlayerInfo*)(currentPeer->data))->netID = cId;
  4144. onPeerConnect(currentPeer);
  4145. cId++;
  4146.  
  4147. sendInventory(((PlayerInfo*)(event.peer->data))->inventory);
  4148. }
  4149.  
  4150. }
  4151. enet_host_flush(server);
  4152. }
  4153. }
  4154. }
  4155. else if (str.substr(0, 6) == "/clear"){
  4156. if (!canClear(((PlayerInfo*)(peer->data))->rawName, ((PlayerInfo*)(peer->data))->tankIDPass)) continue;
  4157. cout << "World cleared by " << ((PlayerInfo*)(peer->data))->tankIDName << endl;
  4158. WorldInfo* wrld = getPlyersWorld(peer);
  4159. for (int i = 0; i < worlds.size(); i++)
  4160. {
  4161. if (wrld == NULL) continue;
  4162. if (&worlds.at(i) == wrld)
  4163. {
  4164. worlds.at(i) = generateWorld(wrld->name, wrld->width, wrld->height);
  4165. ENetPeer * currentPeer;
  4166. for (currentPeer = server->peers;
  4167. currentPeer < &server->peers[server->peerCount];
  4168. ++currentPeer)
  4169. {
  4170. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4171. continue;
  4172. if (((PlayerInfo*)(currentPeer->data))->currentWorld == wrld->name)
  4173. {
  4174. sendWorld(currentPeer, &worlds.at(i));
  4175.  
  4176. int x = 3040;
  4177. int y = 736;
  4178.  
  4179. for (int j = 0; j < worlds.at(i).width*worlds.at(i).height; j++)
  4180. {
  4181. if (worlds.at(i).items[j].foreground == 6) {
  4182. x = (j%worlds.at(i).width) * 32;
  4183. y = (j / worlds.at(i).width) * 32;
  4184. }
  4185. }
  4186. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnSpawn"), "spawn|avatar\nnetID|" + std::to_string(cId) + "\nuserID|" + std::to_string(cId) + "\ncolrect|0|0|20|30\nposXY|" + std::to_string(x) + "|" + std::to_string(y) + "\nname|``" + ((PlayerInfo*)(currentPeer->data))->tankIDName + "``\ncountry|" + ((PlayerInfo*)(currentPeer->data))->country + "\ninvis|0\nmstate|0\nsmstate|0\ntype|local\n"));
  4187. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4188. ENetPacket * packet = enet_packet_create(p.data,
  4189. p.len,
  4190. ENET_PACKET_FLAG_RELIABLE);
  4191. enet_peer_send(currentPeer, 0, packet);
  4192.  
  4193. enet_host_flush(server);
  4194. delete p.data;
  4195. ((PlayerInfo*)(currentPeer->data))->netID = cId;
  4196. onPeerConnect(currentPeer);
  4197. cId++;
  4198.  
  4199. sendInventory(((PlayerInfo*)(event.peer->data))->inventory);
  4200. }
  4201.  
  4202. }
  4203. enet_host_flush(server);
  4204. }
  4205. }
  4206. }*/
  4207. else if (str == "/unmod")
  4208. {
  4209. ((PlayerInfo*)(peer->data))->canWalkInBlocks = false;
  4210. sendState(peer);
  4211. /*PlayerMoving data;
  4212. data.packetType = 0x14;
  4213. data.characterState = 0x0; // animation
  4214. data.x = 1000;
  4215. data.y = 1;
  4216. data.punchX = 0;
  4217. data.punchY = 0;
  4218. data.XSpeed = 300;
  4219. data.YSpeed = 600;
  4220. data.netID = ((PlayerInfo*)(peer->data))->netID;
  4221. data.plantingTree = 0x0;
  4222. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);*/
  4223. }
  4224. else if (str == "/alt") {
  4225. GamePacket p2 = packetEnd(appendInt(appendString(createPacket(), "OnSetBetaMode"), 1));
  4226. ENetPacket* packet2 = enet_packet_create(p2.data,
  4227. p2.len,
  4228. ENET_PACKET_FLAG_RELIABLE);
  4229. enet_peer_send(peer, 0, packet2);
  4230. delete p2.data;
  4231. //enet_host_flush(server);
  4232. }
  4233. else
  4234. if (str == "/inventory")
  4235. {
  4236. sendInventory(peer, ((PlayerInfo*)(peer->data))->inventory);
  4237. }
  4238. else
  4239. if (str.substr(0, 6) == "/item ")
  4240. {
  4241. PlayerInventory inventory;
  4242. InventoryItem item;
  4243. item.itemID = atoi(str.substr(6, cch.length() - 6 - 1).c_str());
  4244. item.itemCount = 200;
  4245. inventory.items.push_back(item);
  4246. item.itemCount = 1;
  4247. item.itemID = 18;
  4248. inventory.items.push_back(item);
  4249. item.itemID = 32;
  4250. inventory.items.push_back(item);
  4251. sendInventory(peer, inventory);
  4252. }
  4253. else
  4254. if (str.substr(0, 6) == "/team ")
  4255. {
  4256. int val = 0;
  4257. val = atoi(str.substr(6, cch.length() - 6 - 1).c_str());
  4258. PlayerMoving data;
  4259. //data.packetType = 0x14;
  4260. data.packetType = 0x1B;
  4261. //data.characterState = 0x924; // animation
  4262. data.characterState = 0x0; // animation
  4263. data.x = 0;
  4264. data.y = 0;
  4265. data.punchX = val;
  4266. data.punchY = 0;
  4267. data.XSpeed = 0;
  4268. data.YSpeed = 0;
  4269. data.netID = ((PlayerInfo*)(peer->data))->netID;
  4270. data.plantingTree = 0;
  4271. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  4272.  
  4273. }
  4274. else
  4275. if (str.substr(0, 7) == "/color ")
  4276. {
  4277. ((PlayerInfo*)(peer->data))->skinColor = atoi(str.substr(6, cch.length() - 6 - 1).c_str());
  4278. sendClothes(peer);
  4279. }
  4280. if (str.substr(0, 4) == "/who")
  4281. {
  4282. sendWho(peer);
  4283.  
  4284. }
  4285. if (str.length() && str[0] == '/')
  4286. {
  4287. sendAction(peer, ((PlayerInfo*)(peer->data))->netID, str);
  4288. }
  4289. else if (str.length() > 0)
  4290. {
  4291. if (((PlayerInfo*)(peer->data))->taped == false) {
  4292. sendChatMessage(peer, ((PlayerInfo*)(peer->data))->netID, str);
  4293. }
  4294. else {
  4295. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`4Can't talk while youre duct-taped!"));
  4296. ENetPacket* packet = enet_packet_create(p.data,
  4297. p.len,
  4298. ENET_PACKET_FLAG_RELIABLE);
  4299. enet_peer_send(peer, 0, packet);
  4300. delete p.data;
  4301. }
  4302. }
  4303.  
  4304. }
  4305. if (!((PlayerInfo*)(event.peer->data))->isIn)
  4306. {
  4307. GamePacket p1 = packetEnd(appendString(appendString(appendString(appendString(appendInt(appendString(createPacket(), "OnSuperMainStartAcceptLogonHrdxs47254722215a"), -703607114), "ubistatic-a.akamaihd.net"), "0098/CDNContent3/cache/"), "cc.cz.madkite.freedom org.aqua.gg idv.aqua.bulldog com.cih.gamecih2 com.cih.gamecih com.cih.game_cih cn.maocai.gamekiller com.gmd.speedtime org.dax.attack com.x0.strai.frep com.x0.strai.free org.cheatengine.cegui org.sbtools.gamehack com.skgames.traffikrider org.sbtoods.gamehaca com.skype.ralder org.cheatengine.cegui.xx.multi1458919170111 com.prohiro.macro me.autotouch.autotouch com.cygery.repetitouch.free com.cygery.repetitouch.pro com.proziro.zacro com.slash.gamebuster"), "proto=42|choosemusic=audio/mp3/about_theme.mp3|active_holiday=0|"));
  4308. GamePacket p = packetEnd(appendString(appendString(appendString(appendString(appendInt(appendString(createPacket(), "OnSuperMainStartAcceptLogonHrdxs47254722215a"), 1109100565), "ubistatic-a.akamaihd.net"), "0098/CDNContent3/cache/"), "cc.cz.madkite.freedom org.aqua.gg idv.aqua.bulldog com.cih.gamecih2 com.cih.gamecih com.cih.game_cih cn.maocai.gamekiller com.gmd.speedtime org.dax.attack com.x0.strai.frep com.x0.strai.free org.cheatengine.cegui org.sbtools.gamehack com.skgames.traffikrider org.sbtoods.gamehaca com.skype.ralder org.cheatengine.cegui.xx.multi1458919170111 com.prohiro.macro me.autotouch.autotouch com.cygery.repetitouch.free com.cygery.repetitouch.pro com.proziro.zacro com.slash.gamebuster"), "proto=42|choosemusic=audio/mp3/about_theme.mp3|active_holiday=0|"));
  4309. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4310. ENetPacket * packet = enet_packet_create(p.data,
  4311. p.len,
  4312. ENET_PACKET_FLAG_RELIABLE);
  4313. enet_peer_send(peer, 0, packet);
  4314.  
  4315. //enet_host_flush(server);
  4316. delete p.data;
  4317. std::stringstream ss(GetTextPointerFromPacket(event.packet));
  4318. std::string to;
  4319. while (std::getline(ss, to, '\n')) {
  4320. string id = to.substr(0, to.find("|"));
  4321. string act = to.substr(to.find("|") + 1, to.length() - to.find("|") - 1);
  4322. if (id == "tankIDName")
  4323. {
  4324. ((PlayerInfo*)(event.peer->data))->tankIDName = act;
  4325. ((PlayerInfo*)(event.peer->data))->haveGrowId = true;
  4326. }
  4327. else if (id == "tankIDPass")
  4328. {
  4329. ((PlayerInfo*)(event.peer->data))->tankIDPass = act;
  4330. }
  4331. else if (id == "requestedName")
  4332. {
  4333. ((PlayerInfo*)(event.peer->data))->requestedName = act;
  4334. }
  4335. else if (id == "country")
  4336. {
  4337. ((PlayerInfo*)(event.peer->data))->country = act;
  4338. }
  4339. }
  4340. if (!((PlayerInfo*)(event.peer->data))->haveGrowId)
  4341. {
  4342. ((PlayerInfo*)(event.peer->data))->rawName = "";
  4343. ((PlayerInfo*)(event.peer->data))->displayName = "`w[`4GUEST`w]`w " + PlayerDB::fixColors(((PlayerInfo*)(event.peer->data))->requestedName.substr(0, ((PlayerInfo*)(event.peer->data))->requestedName.length() > 15 ? 15 : ((PlayerInfo*)(event.peer->data))->requestedName.length()));
  4344. }
  4345. else {
  4346. ((PlayerInfo*)(event.peer->data))->rawName = PlayerDB::getProperName(((PlayerInfo*)(event.peer->data))->tankIDName);
  4347. #ifdef REGISTRATION
  4348. int logStatus = PlayerDB::playerLogin(peer, ((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass);
  4349. if (logStatus == 1) {
  4350. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rYou have successfully logged into your account!``"));
  4351. ENetPacket* packet = enet_packet_create(p.data,
  4352. p.len,
  4353. ENET_PACKET_FLAG_RELIABLE);
  4354. enet_peer_send(peer, 0, packet);
  4355. delete p.data;
  4356. ((PlayerInfo*)(event.peer->data))->displayName = ((PlayerInfo*)(event.peer->data))->tankIDName;
  4357. }
  4358. else {
  4359. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`rWrong username or password!``"));
  4360. ENetPacket* packet = enet_packet_create(p.data,
  4361. p.len,
  4362. ENET_PACKET_FLAG_RELIABLE);
  4363. enet_peer_send(peer, 0, packet);
  4364. delete p.data;
  4365. enet_peer_disconnect_later(peer, 0);
  4366. }
  4367. #else
  4368.  
  4369. ((PlayerInfo*)(event.peer->data))->displayName = PlayerDB::fixColors(((PlayerInfo*)(event.peer->data))->tankIDName.substr(0, ((PlayerInfo*)(event.peer->data))->tankIDName.length() > 18 ? 18 : ((PlayerInfo*)(event.peer->data))->tankIDName.length()));
  4370. if (((PlayerInfo*)(event.peer->data))->displayName.length() < 3) ((PlayerInfo*)(event.peer->data))->displayName = "Person that doesn't know how the name looks!";
  4371. #endif
  4372. }
  4373. for (char c : ((PlayerInfo*)(event.peer->data))->displayName) if (c < 0x20 || c>0x7A) ((PlayerInfo*)(event.peer->data))->displayName = "Bad characters in name, remove them!";
  4374.  
  4375. if (((PlayerInfo*)(event.peer->data))->country.length() > 4)
  4376. {
  4377. ((PlayerInfo*)(event.peer->data))->country = "us";
  4378. }
  4379. if (isVIP(((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass) > 0)
  4380. {
  4381. ((PlayerInfo*)(event.peer->data))->country = "../token_icon_overlay";
  4382. }
  4383. if (isMod(((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass) > 0)
  4384. {
  4385. ((PlayerInfo*)(event.peer->data))->country = "../cash_icon_overlay";
  4386. }
  4387. if (isAdmin(((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass) > 0)
  4388. {
  4389. ((PlayerInfo*)(event.peer->data))->country = "../particle/star";
  4390. }
  4391. if (isCreator(((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass) > 0)
  4392. {
  4393. ((PlayerInfo*)(event.peer->data))->country = "../science_button";
  4394. }
  4395. if (isSuperAdmin(((PlayerInfo*)(event.peer->data))->rawName, ((PlayerInfo*)(event.peer->data))->tankIDPass) > 0)
  4396. {
  4397. ((PlayerInfo*)(event.peer->data))->country = "../rtsoft_logo";
  4398. }
  4399. /*GamePacket p3= packetEnd(appendString(appendString(createPacket(), "OnRequestWorldSelectMenu"), "default|GO FOR IT\nadd_button|Showing: `wFake Worlds``|_catselect_|0.6|3529161471|\nadd_floater|Subscribe|5|0.55|3529161471\nadd_floater|Growtopia|4|0.52|4278190335\nadd_floater|Noobs|150|0.49|3529161471\nadd_floater|...|3|0.49|3529161471\nadd_floater|`6:O :O :O``|2|0.46|3529161471\nadd_floater|SEEMS TO WORK|2|0.46|3529161471\nadd_floater|?????|1|0.43|3529161471\nadd_floater|KEKEKEKEK|13|0.7|3417414143\n"));
  4400. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4401. ENetPacket * packet3 = enet_packet_create(p3.data,
  4402. p3.len,
  4403. ENET_PACKET_FLAG_RELIABLE);
  4404. enet_peer_send(peer, 0, packet3);
  4405. enet_host_flush(server);*/
  4406.  
  4407. GamePacket p2 = packetEnd(appendString(appendString(appendInt(appendString(createPacket(), "SetHasGrowID"), ((PlayerInfo*)(event.peer->data))->haveGrowId), ((PlayerInfo*)(peer->data))->tankIDName), ((PlayerInfo*)(peer->data))->tankIDPass));
  4408. ENetPacket* packet2 = enet_packet_create(p2.data,
  4409. p2.len,
  4410. ENET_PACKET_FLAG_RELIABLE);
  4411. enet_peer_send(peer, 0, packet2);
  4412. delete p2.data;
  4413.  
  4414.  
  4415. }
  4416. string pStr = GetTextPointerFromPacket(event.packet);
  4417. //if (strcmp(GetTextPointerFromPacket(event.packet), "action|enter_game\n") == 0 && !((PlayerInfo*)(event.peer->data))->isIn)
  4418. if (pStr.substr(0, 17) == "action|enter_game" && !((PlayerInfo*)(event.peer->data))->isIn)
  4419. {
  4420. #ifdef TOTAL_LOG
  4421. cout << "And we are in!" << endl;
  4422. #endif
  4423. ENetPeer* currentPeer;
  4424. ((PlayerInfo*)(event.peer->data))->isIn = true;
  4425. /*for (currentPeer = server->peers;
  4426. currentPeer < &server->peers[server->peerCount];
  4427. ++currentPeer)
  4428. {
  4429. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4430. continue;
  4431.  
  4432. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Player `o" + ((PlayerInfo*)(event.peer->data))->tankIDName + "`o just entered the game..."));
  4433. ENetPacket * packet = enet_packet_create(p.data,
  4434. p.len,
  4435. ENET_PACKET_FLAG_RELIABLE);
  4436. enet_peer_send(currentPeer, 0, packet);
  4437.  
  4438. enet_host_flush(server);
  4439. delete p.data;
  4440. }*/
  4441. sendWorldOffers(peer);
  4442. int counts = 0;
  4443.  
  4444. for (currentPeer = server->peers;
  4445. currentPeer < &server->peers[server->peerCount];
  4446. ++currentPeer)
  4447. {
  4448. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4449. continue;
  4450. counts++;
  4451. }
  4452. string name = ((PlayerInfo*)(peer->data))->displayName;
  4453. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Welcome back `2" + name + "`o! `2" + std::to_string(counts) + " `oplayers are online!"));
  4454. ENetPacket * packet = enet_packet_create(p.data,
  4455. p.len,
  4456. ENET_PACKET_FLAG_RELIABLE);
  4457. enet_peer_send(peer, 0, packet);
  4458. delete p.data;
  4459. cout << ((PlayerInfo*)(peer->data))->displayName << " joined the server. " << counts << " people are online." << endl;
  4460. counts = 0;
  4461. GamePacket p25 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Server made by `9Mavrick#4307 & `9Ocean#0165"));
  4462. ENetPacket * packet25 = enet_packet_create(p25.data,
  4463. p25.len,
  4464. ENET_PACKET_FLAG_RELIABLE);
  4465. enet_peer_send(peer, 0, packet25);
  4466.  
  4467. //enet_host_flush(server);
  4468. delete p25.data;
  4469. GamePacket p1 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`oWorld of The Day`o : `2HANGOUT`o Owned by `2Noob`o!"));
  4470. ENetPacket * packet1 = enet_packet_create(p1.data,
  4471. p1.len,
  4472. ENET_PACKET_FLAG_RELIABLE);
  4473. enet_peer_send(peer, 0, packet1);
  4474. delete p1.data;
  4475. PlayerInventory inventory;
  4476. for (int i = 0; i < 200; i++)
  4477. {
  4478. InventoryItem it;
  4479. it.itemID = (i * 2) + 2;
  4480. it.itemCount = 200;
  4481. inventory.items.push_back(it);
  4482. }
  4483. ((PlayerInfo*)(event.peer->data))->inventory = inventory;
  4484.  
  4485. {
  4486. //GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`wThe Growtopia Gazette``|left|5016|\n\nadd_spacer|small|\n\nadd_image_button|banner|interface/large/news_banner.rttex|noflags|||\n\nadd_spacer|small|\n\nadd_textbox|`wSeptember 10:`` `5Surgery Stars end!``|left|\n\nadd_spacer|small|\n\n\n\nadd_textbox|Hello Growtopians,|left|\n\nadd_spacer|small|\n\n\n\nadd_textbox|Surgery Stars is over! We hope you enjoyed it and claimed all your well-earned Summer Tokens!|left|\n\nadd_spacer|small|\n\nadd_spacer|small|\n\nadd_textbox|As we announced earlier, this month we are releasing the feature update a bit later, as we're working on something really cool for the monthly update and we're convinced that the wait will be worth it!|left|\n\nadd_spacer|small|\n\nadd_textbox|Check the Forum here for more information!|left|\n\nadd_spacer|small|\n\nadd_url_button|comment|`wSeptember Updates Delay``|noflags|https://www.growtopiagame.com/forums/showthread.php?510657-September-Update-Delay&p=3747656|Open September Update Delay Announcement?|0|0|\n\nadd_spacer|small|\n\nadd_spacer|small|\n\nadd_textbox|Also, we're glad to invite you to take part in our official Growtopia survey!|left|\n\nadd_spacer|small|\n\nadd_url_button|comment|`wTake Survey!``|noflags|https://ubisoft.ca1.qualtrics.com/jfe/form/SV_1UrCEhjMO7TKXpr?GID=26674|Open the browser to take the survey?|0|0|\n\nadd_spacer|small|\n\nadd_textbox|Click on the button above and complete the survey to contribute your opinion to the game and make Growtopia even better! Thanks in advance for taking the time, we're looking forward to reading your feedback!|left|\n\nadd_spacer|small|\n\nadd_spacer|small|\n\nadd_textbox|And for those who missed PAW, we made a special video sneak peek from the latest PAW fashion show, check it out on our official YouTube channel! Yay!|left|\n\nadd_spacer|small|\n\nadd_url_button|comment|`wPAW 2018 Fashion Show``|noflags|https://www.youtube.com/watch?v=5i0IcqwD3MI&feature=youtu.be|Open the Growtopia YouTube channel for videos and tutorials?|0|0|\n\nadd_spacer|small|\n\nadd_textbox|Lastly, check out other September updates:|left|\n\nadd_spacer|small|\n\nadd_label_with_icon|small|IOTM: The Sorcerer's Tunic of Mystery|left|24|\n\nadd_label_with_icon|small|New Legendary Summer Clash Branch|left|24|\n\nadd_spacer|small|\n\nadd_textbox|`$- The Growtopia Team``|left|\n\nadd_spacer|small|\n\nadd_spacer|small|\n\n\n\n\n\nadd_url_button|comment|`wOfficial YouTube Channel``|noflags|https://www.youtube.com/c/GrowtopiaOfficial|Open the Growtopia YouTube channel for videos and tutorials?|0|0|\n\nadd_url_button|comment|`wSeptember's IOTM: `8Sorcerer's Tunic of Mystery!````|noflags|https://www.growtopiagame.com/forums/showthread.php?450065-Item-of-the-Month&p=3392991&viewfull=1#post3392991|Open the Growtopia website to see item of the month info?|0|0|\n\nadd_spacer|small|\n\nadd_label_with_icon|small|`4WARNING:`` `5Drop games/trust tests`` and betting games (like `5Casinos``) are not allowed and will result in a ban!|left|24|\n\nadd_label_with_icon|small|`4WARNING:`` Using any kind of `5hacked client``, `5spamming/text pasting``, or `5bots`` (even with an alt) will likely result in losing `5ALL`` your accounts. Seriously.|left|24|\n\nadd_label_with_icon|small|`4WARNING:`` `5NEVER enter your GT password on a website (fake moderator apps, free gemz, etc) - it doesn't work and you'll lose all your stuff!|left|24|\n\nadd_spacer|small|\n\nadd_url_button|comment|`wGrowtopia on Facebook``|noflags|http://growtopiagame.com/facebook|Open the Growtopia Facebook page in your browser?|0|0|\n\nadd_spacer|small|\n\nadd_button|rules|`wHelp - Rules - Privacy Policy``|noflags|0|0|\n\n\nadd_quick_exit|\n\nadd_spacer|small|\nadd_url_button|comment|`wVisit Growtopia Forums``|noflags|http://www.growtopiagame.com/forums|Visit the Growtopia forums?|0|0|\nadd_spacer|small|\nadd_url_button||`wWOTD: `1THELOSTGOLD`` by `#iWasToD````|NOFLAGS|OPENWORLD|THELOSTGOLD|0|0|\nadd_spacer|small|\nadd_url_button||`wVOTW: `1Yodeling Kid - Growtopia Animation``|NOFLAGS|https://www.youtube.com/watch?v=UMoGmnFvc58|Watch 'Yodeling Kid - Growtopia Animation' by HyerS on YouTube?|0|0|\nend_dialog|gazette||OK|"));
  4487. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnDialogRequest"), "set_default_color|`o\n\nadd_label_with_icon|big|`2Growtopia OG``|left|212|\n\nadd_spacer|small|\nadd_label_with_icon|small|`2SERVER`o: Growtopia `2OG`o is owned by `9Grace`o and `9YaoYao`o!|eft|5016|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2GEMS`o: This is Growtopia OG Version 0.4 Which covers the `2GEM SYSTEM`o that when you break blocks you will have gems but this will not be saved.|left|112|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2UPDATE`o: Added /shop to see what ranks or other things we sell on this server!|left|658|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2UPDATE`o: Added /rules to see what are the rules that are need to be followed,and added /owners to check who are the owners of GTOG.|left|658|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`4REMINDER`o: Worlds and Accounts may be deleted at anytime we are doing our best to prevent on deleting it.|left|1432|\nadd_label_with_icon|small| |left|6746|\nadd_label_with_icon|small|`2WOTD`o: The World of The Day goes to `2Noob`o owner of `2HANGOUT`o!|left|242|\nadd_label_with_icon|small||\n\nadd_url_button|``Discord: `1Join our discord server!``|`1Discord Server|https://discord.gg/s9y3YVF|Open link?|0|0|\nadd_url_button|||small|\nadd_textbox| |small||small|\nadd_textbox|~`2Growtopia OG Team|small||small|\nadd_textbox|Growtopia OG Version 0.4(Early)|small|\nadd_quick_exit|\nadd_button|chc0|Close|noflags|0|0|\nnend_dialog|gazette||OK|"));
  4488. ENetPacket* packet = enet_packet_create(p.data,
  4489. p.len,
  4490. ENET_PACKET_FLAG_RELIABLE);
  4491. enet_peer_send(peer, 0, packet);
  4492.  
  4493. //enet_host_flush(server);
  4494. delete p.data;
  4495. }
  4496. }
  4497. if (strcmp(GetTextPointerFromPacket(event.packet), "action|refresh_item_data\n") == 0)
  4498. {
  4499. if (itemsDat != NULL) {
  4500. ENetPacket* packet = enet_packet_create(itemsDat,
  4501. itemsDatSize + 60,
  4502. ENET_PACKET_FLAG_RELIABLE);
  4503. enet_peer_send(peer, 0, packet);
  4504. ((PlayerInfo*)(peer->data))->isUpdating = true;
  4505. enet_peer_disconnect_later(peer, 0);
  4506. //enet_host_flush(server);
  4507. }
  4508. // TODO FIX refresh_item_data ^^^^^^^^^^^^^^
  4509. }
  4510. break;
  4511. }
  4512. default:
  4513. cout << "Unknown packet type " << messageType << endl;
  4514. break;
  4515. case 3:
  4516. {
  4517. //cout << GetTextPointerFromPacket(event.packet) << endl;
  4518. std::stringstream ss(GetTextPointerFromPacket(event.packet));
  4519. std::string to;
  4520. bool isJoinReq = false;
  4521. while (std::getline(ss, to, '\n')) {
  4522. string id = to.substr(0, to.find("|"));
  4523. string act = to.substr(to.find("|") + 1, to.length() - to.find("|") - 1);
  4524. if (id == "name" && isJoinReq)
  4525. {
  4526. #ifdef TOTAL_LOG
  4527. cout << "Entering some world..." << endl;
  4528. #endif
  4529. try {
  4530. WorldInfo info = worldDB.get(act);
  4531. sendWorld(peer, &info);
  4532. /*string asdf = "0400000004A7379237BB2509E8E0EC04F8720B050000000000000000FBBB0000010000007D920100FDFDFDFD04000000040000000000000000000000070000000000"; // 0400000004A7379237BB2509E8E0EC04F8720B050000000000000000FBBB0000010000007D920100FDFDFDFD04000000040000000000000000000000080000000000000000000000000000000000000000000000000000000000000048133A0500000000BEBB0000070000000000
  4533. string worldName = "TEST";
  4534. int xSize=100;
  4535. int ySize=60;
  4536. int square = xSize*ySize;
  4537. __int16 nameLen = worldName.length();
  4538. int payloadLen = asdf.length() / 2;
  4539. int dataLen = payloadLen + 2 + nameLen + 12 + (square * 8)+4;
  4540. BYTE* data = new BYTE[dataLen];
  4541. for (int i = 0; i < asdf.length(); i += 2)
  4542. {
  4543. char x = ch2n(asdf[i]);
  4544. x = x << 4;
  4545. x += ch2n(asdf[i + 1]);
  4546. memcpy(data + (i / 2), &x, 1);
  4547. }
  4548. int zero = 0;
  4549. __int16 item = 0;
  4550. int smth = 0;
  4551. for (int i = 0; i < square * 8; i += 4) memcpy(data + payloadLen + i + 14 + nameLen, &zero, 4);
  4552. for (int i = 0; i < square * 8; i += 8) memcpy(data + payloadLen + i + 14 + nameLen, &item, 2);
  4553. memcpy(data + payloadLen, &nameLen, 2);
  4554. memcpy(data + payloadLen + 2, worldName.c_str(), nameLen);
  4555. memcpy(data + payloadLen + 2 + nameLen, &xSize, 4);
  4556. memcpy(data + payloadLen + 6 + nameLen, &ySize, 4);
  4557. memcpy(data + payloadLen + 10 + nameLen, &square, 4);
  4558. for (int i = 0; i < 1700; i++) {
  4559. __int16 bed = 100;
  4560. memcpy(data + payloadLen + (i * 8) + 14 + nameLen + (8 * 100 * 37), &bed, 2);
  4561. }
  4562. for (int i = 0; i < 600; i++) {
  4563. __int16 bed = 8;
  4564. memcpy(data + payloadLen + (i*8) + 14 + nameLen + (8*100*54), &bed, 2);
  4565. }
  4566. memcpy(data + dataLen-4, &smth, 4);
  4567. ENetPacket * packet2 = enet_packet_create(data,
  4568. dataLen,
  4569. ENET_PACKET_FLAG_RELIABLE);
  4570. enet_peer_send(peer, 0, packet2);
  4571. enet_host_flush(server);*/
  4572.  
  4573. int x = 3040;
  4574. int y = 736;
  4575.  
  4576. for (int j = 0; j < info.width * info.height; j++)
  4577. {
  4578. if (info.items[j].foreground == 6) {
  4579. x = (j % info.width) * 32;
  4580. y = (j / info.width) * 32;
  4581. }
  4582. }
  4583. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnSpawn"), "spawn|avatar\nnetID|" + std::to_string(cId) + "\nuserID|" + std::to_string(cId) + "\ncolrect|0|0|20|30\nposXY|" + std::to_string(x) + "|" + std::to_string(y) + "\nname|``" + ((PlayerInfo*)(event.peer->data))->displayName + "``\ncountry|" + ((PlayerInfo*)(event.peer->data))->country + "\ninvis|0\nmstate|0\nsmstate|0\ntype|local\n"));
  4584. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4585. ENetPacket * packet = enet_packet_create(p.data,
  4586. p.len,
  4587. ENET_PACKET_FLAG_RELIABLE);
  4588. enet_peer_send(peer, 0, packet);
  4589. //enet_host_flush(server);
  4590. delete p.data;
  4591. ((PlayerInfo*)(event.peer->data))->netID = cId;
  4592. onPeerConnect(peer);
  4593. cId++;
  4594.  
  4595. sendInventory(peer, ((PlayerInfo*)(event.peer->data))->inventory);
  4596. WorldInfo * world = getPlyersWorld(peer);
  4597. string nameworld = world->name;
  4598. string ownerworld = world->owner;
  4599. int count = 0;
  4600. string name = "";
  4601. sendPlayerEnter(peer, (PlayerInfo*)(event.peer->data));
  4602. if (ownerworld != "") {
  4603. GamePacket p3 = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "`#[`o" + nameworld + " `oWorld Locked by " + ownerworld + "`#]"));
  4604. ENetPacket * packet3 = enet_packet_create(p3.data,
  4605. p3.len,
  4606. ENET_PACKET_FLAG_RELIABLE);
  4607. enet_peer_send(peer, 0, packet3);
  4608. delete p3.data;
  4609. }
  4610.  
  4611.  
  4612. /*int resx = 95;
  4613. int resy = 23;*/
  4614.  
  4615. /*for (int i = 0; i < world.width*world.height; i++)
  4616. {
  4617. if (world.items[i].foreground == 6) {
  4618. resx = i%world.width;
  4619. resy = i / world.width;
  4620. }
  4621. }
  4622.  
  4623. GamePacket p2 = packetEnd(appendInt(appendString(createPacket(), "SetRespawnPos"), resx + (world.width*resy)));
  4624. memcpy(p2.data + 8, &(((PlayerInfo*)(event.peer->data))->netID), 4);
  4625. ENetPacket * packet2 = enet_packet_create(p2.data,
  4626. p2.len,
  4627. ENET_PACKET_FLAG_RELIABLE);
  4628. enet_peer_send(peer, 0, packet);
  4629. enet_host_flush(server);*/
  4630. }
  4631. catch (int e) {
  4632. if (e == 1) {
  4633. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  4634. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You have exited the world."));
  4635. ENetPacket* packet = enet_packet_create(p.data,
  4636. p.len,
  4637. ENET_PACKET_FLAG_RELIABLE);
  4638. enet_peer_send(peer, 0, packet);
  4639. delete p.data;
  4640. //enet_host_flush(server);
  4641. }
  4642. else if (e == 2) {
  4643. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  4644. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "You have entered bad characters in the world name!"));
  4645. ENetPacket* packet = enet_packet_create(p.data,
  4646. p.len,
  4647. ENET_PACKET_FLAG_RELIABLE);
  4648. enet_peer_send(peer, 0, packet);
  4649. delete p.data;
  4650. //enet_host_flush(server);
  4651. }
  4652. else if (e == 3) {
  4653. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  4654. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Exit from what? Click back if you're done playing."));
  4655. ENetPacket* packet = enet_packet_create(p.data,
  4656. p.len,
  4657. ENET_PACKET_FLAG_RELIABLE);
  4658. enet_peer_send(peer, 0, packet);
  4659. delete p.data;
  4660. //enet_host_flush(server);
  4661. }
  4662. else {
  4663. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  4664. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "I know this menu is magical and all, but it has its limitations! You can't visit this world!"));
  4665. ENetPacket* packet = enet_packet_create(p.data,
  4666. p.len,
  4667. ENET_PACKET_FLAG_RELIABLE);
  4668. enet_peer_send(peer, 0, packet);
  4669. delete p.data;
  4670. //enet_host_flush(server);
  4671. }
  4672. }
  4673. }
  4674. if (id == "action")
  4675. {
  4676.  
  4677. if (act == "join_request")
  4678. {
  4679. isJoinReq = true;
  4680. }
  4681. if (act == "quit_to_exit")
  4682. {
  4683. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  4684. ((PlayerInfo*)(peer->data))->currentWorld = "EXIT";
  4685. sendWorldOffers(peer);
  4686.  
  4687. }
  4688. if (act == "quit")
  4689. {
  4690. enet_peer_disconnect_later(peer, 0);
  4691. }
  4692. }
  4693. }
  4694. break;
  4695. }
  4696. case 4:
  4697. {
  4698. {
  4699. BYTE* tankUpdatePacket = GetStructPointerFromTankPacket(event.packet);
  4700.  
  4701. if (tankUpdatePacket)
  4702. {
  4703. PlayerMoving* pMov = unpackPlayerMoving(tankUpdatePacket);
  4704. if (((PlayerInfo*)(event.peer->data))->isGhost) {
  4705. ((PlayerInfo*)(event.peer->data))->isInvisible = true;
  4706. ((PlayerInfo*)(event.peer->data))->x1 = pMov->x;
  4707. ((PlayerInfo*)(event.peer->data))->y1 = pMov->y;
  4708. pMov->x = -1000000;
  4709. pMov->y = -1000000;
  4710. }
  4711.  
  4712. switch (pMov->packetType)
  4713. {
  4714. case 0:
  4715. ((PlayerInfo*)(event.peer->data))->x = pMov->x;
  4716. ((PlayerInfo*)(event.peer->data))->y = pMov->y;
  4717. ((PlayerInfo*)(event.peer->data))->isRotatedLeft = pMov->characterState & 0x10;
  4718. sendPData(peer, pMov);
  4719. if (!((PlayerInfo*)(peer->data))->joinClothesUpdated)
  4720. {
  4721. ((PlayerInfo*)(peer->data))->joinClothesUpdated = true;
  4722. updateAllClothes(peer);
  4723. }
  4724. break;
  4725.  
  4726. default:
  4727. break;
  4728. }
  4729. PlayerMoving* data2 = unpackPlayerMoving(tankUpdatePacket);
  4730. //cout << data2->packetType << endl;
  4731. if (data2->packetType == 11)
  4732. {
  4733. //cout << pMov->x << ";" << pMov->y << ";" << pMov->plantingTree << ";" << pMov->punchX << endl;
  4734. //sendDrop(((PlayerInfo*)(event.peer->data))->netID, ((PlayerInfo*)(event.peer->data))->x, ((PlayerInfo*)(event.peer->data))->y, pMov->punchX, 1, 0);
  4735. // lets take item
  4736. }
  4737. if (data2->packetType == 7)
  4738. {
  4739. //cout << pMov->x << ";" << pMov->y << ";" << pMov->plantingTree << ";" << pMov->punchX << endl;
  4740. /*GamePacket p3 = packetEnd(appendString(appendString(createPacket(), "OnRequestWorldSelectMenu"), "default|GO FOR IT\nadd_button|Showing: `wFake Worlds``|_catselect_|0.6|3529161471|\nadd_floater|Subscribe|5|0.55|3529161471\nadd_floater|Growtopia|4|0.52|4278190335\nadd_floater|Noobs|150|0.49|3529161471\nadd_floater|...|3|0.49|3529161471\nadd_floater|`6:O :O :O``|2|0.46|3529161471\nadd_floater|SEEMS TO WORK|2|0.46|3529161471\nadd_floater|?????|1|0.43|3529161471\nadd_floater|KEKEKEKEK|13|0.7|3417414143\n"));
  4741. //for (int i = 0; i < p.len; i++) cout << (int)*(p.data + i) << " ";
  4742. ENetPacket * packet3 = enet_packet_create(p3.data,
  4743. p3.len,
  4744. ENET_PACKET_FLAG_RELIABLE);
  4745. enet_peer_send(peer, 0, packet3);
  4746. enet_host_flush(server);*/
  4747. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  4748. sendWorldOffers(peer);
  4749. // lets take item
  4750. }
  4751. if (data2->packetType == 10)
  4752. {
  4753. //cout << pMov->x << ";" << pMov->y << ";" << pMov->plantingTree << ";" << pMov->punchX << ";" << pMov->punchY << ";" << pMov->characterState << endl;
  4754. ItemDefinition def;
  4755. try {
  4756. def = getItemDef(pMov->plantingTree);
  4757. }
  4758. catch (int e) {
  4759. goto END_CLOTHSETTER_FORCE;
  4760. }
  4761.  
  4762. switch (def.clothType) {
  4763. case 0:
  4764. if (((PlayerInfo*)(event.peer->data))->cloth0 == pMov->plantingTree)
  4765. {
  4766. ((PlayerInfo*)(event.peer->data))->cloth0 = 0;
  4767. break;
  4768. }
  4769. ((PlayerInfo*)(event.peer->data))->cloth0 = pMov->plantingTree;
  4770. break;
  4771. case 1:
  4772. if (((PlayerInfo*)(event.peer->data))->cloth1 == pMov->plantingTree)
  4773. {
  4774. ((PlayerInfo*)(event.peer->data))->cloth1 = 0;
  4775. break;
  4776. }
  4777. ((PlayerInfo*)(event.peer->data))->cloth1 = pMov->plantingTree;
  4778. break;
  4779. case 2:
  4780. if (((PlayerInfo*)(event.peer->data))->cloth2 == pMov->plantingTree)
  4781. {
  4782. ((PlayerInfo*)(event.peer->data))->cloth2 = 0;
  4783. break;
  4784. }
  4785. ((PlayerInfo*)(event.peer->data))->cloth2 = pMov->plantingTree;
  4786. break;
  4787. case 3:
  4788. if (((PlayerInfo*)(event.peer->data))->cloth3 == pMov->plantingTree)
  4789. {
  4790. ((PlayerInfo*)(event.peer->data))->cloth3 = 0;
  4791. break;
  4792. }
  4793. ((PlayerInfo*)(event.peer->data))->cloth3 = pMov->plantingTree;
  4794. break;
  4795. case 4:
  4796. if (((PlayerInfo*)(event.peer->data))->cloth4 == pMov->plantingTree)
  4797. {
  4798. ((PlayerInfo*)(event.peer->data))->cloth4 = 0;
  4799. break;
  4800. }
  4801. ((PlayerInfo*)(event.peer->data))->cloth4 = pMov->plantingTree;
  4802. break;
  4803. case 5:
  4804. if (((PlayerInfo*)(event.peer->data))->cloth5 == pMov->plantingTree)
  4805. {
  4806. ((PlayerInfo*)(event.peer->data))->cloth5 = 0;
  4807. break;
  4808. }
  4809. ((PlayerInfo*)(event.peer->data))->cloth5 = pMov->plantingTree;
  4810. break;
  4811. case 6:
  4812. if (((PlayerInfo*)(event.peer->data))->cloth6 == pMov->plantingTree)
  4813. {
  4814. ((PlayerInfo*)(event.peer->data))->cloth6 = 0;
  4815. ((PlayerInfo*)(event.peer->data))->canDoubleJump = false;
  4816. sendState(peer);
  4817. break;
  4818. }
  4819. {
  4820. ((PlayerInfo*)(event.peer->data))->cloth6 = pMov->plantingTree;
  4821. int item = pMov->plantingTree;
  4822. if (item == 156 || item == 362 || item == 678 || item == 736 || item == 818 || item == 1206 || item == 1460 || item == 1550 || item == 1574 || item == 1668 || item == 1672 || item == 1674 || item == 1784 || item == 1824 || item == 1936 || item == 1938 || item == 1970 || item == 2254 || item == 2256 || item == 2258 || item == 2260 || item == 2262 || item == 2264 || item == 2390 || item == 2392 || item == 3120 || item == 3308 || item == 3512 || item == 4534 || item == 4986 || item == 5754 || item == 6144 || item == 6334 || item == 6694 || item == 6818 || item == 6842 || item == 1934 || item == 3134 || item == 6004 || item == 1780 || item == 2158 || item == 2160 || item == 2162 || item == 2164 || item == 2166 || item == 2168 || item == 2438 || item == 2538 || item == 2778 || item == 3858 || item == 350 || item == 998 || item == 1738 || item == 2642 || item == 2982 || item == 3104 || item == 3144 || item == 5738 || item == 3112 || item == 2722 || item == 3114 || item == 4970 || item == 4972 || item == 5020 || item == 6284 || item == 4184 || item == 4628 || item == 5322 || item == 4112 || item == 4114 || item == 3442) {
  4823. ((PlayerInfo*)(event.peer->data))->canDoubleJump = true;
  4824. }
  4825. else {
  4826. ((PlayerInfo*)(event.peer->data))->canDoubleJump = false;
  4827. }
  4828. // ^^^^ wings
  4829. sendStr);
  4830. }
  4831. breakate(pee;
  4832. case 7:
  4833. if (((PlayerInfo*)(event.peer->data))->cloth7 == pMov->plantingTree)
  4834. {
  4835. ((PlayerInfo*)(event.peer->data))->cloth7 = 0;
  4836. break;
  4837. }
  4838. ((PlayerInfo*)(event.peer->data))->cloth7 = pMov->plantingTree;
  4839. break;
  4840. case 8:
  4841. if (((PlayerInfo*)(event.peer->data))->cloth8 == pMov->plantingTree)
  4842. {
  4843. ((PlayerInfo*)(event.peer->data))->cloth8 = 0;
  4844. break;
  4845. }
  4846. ((PlayerInfo*)(event.peer->data))->cloth8 = pMov->plantingTree;
  4847. break;
  4848. default:
  4849. #ifdef TOTAL_LOG
  4850. cout << "Invalid item activated: " << pMov->plantingTree << " by " << ((PlayerInfo*)(event.peer->data))->displayName << endl;
  4851. #endif
  4852. break;
  4853. }
  4854. sendClothes(peer);
  4855. // activate item
  4856. END_CLOTHSETTER_FORCE:;
  4857. }
  4858. if (data2->packetType == 18)
  4859. {
  4860. sendPData(peer, pMov);
  4861. // add talk buble
  4862. }
  4863. if (data2->punchX != -1 && data2->punchY != -1) {
  4864. //cout << data2->packetType << endl;
  4865. if (data2->packetType == 3)
  4866. {
  4867. sendTileUpdate(data2->punchX, data2->punchY, data2->plantingTree, ((PlayerInfo*)(event.peer->data))->netID, peer);
  4868. }
  4869. else {
  4870.  
  4871. }
  4872. /*PlayerMoving data;
  4873. //data.packetType = 0x14;
  4874. data.packetType = 0x3;
  4875. //data.characterState = 0x924; // animation
  4876. data.characterState = 0x0; // animation
  4877. data.x = data2->punchX;
  4878. data.y = data2->punchY;
  4879. data.punchX = data2->punchX;
  4880. data.punchY = data2->punchY;
  4881. data.XSpeed = 0;
  4882. data.YSpeed = 0;
  4883. data.netID = ((PlayerInfo*)(event.peer->data))->netID;
  4884. data.plantingTree = data2->plantingTree;
  4885. SendPacketRaw(4, packPlayerMoving(&data), 56, 0, peer, ENET_PACKET_FLAG_RELIABLE);
  4886. cout << "Tile update at: " << data2->punchX << "x" << data2->punchY << endl;*/
  4887.  
  4888. }
  4889. delete data2;
  4890. delete pMov;
  4891. }
  4892.  
  4893. else {
  4894. cout << "Got bad tank packet";
  4895. }
  4896. /*char buffer[2048];
  4897. for (int i = 0; i < event->packet->dataLength; i++)
  4898. {
  4899. sprintf(&buffer[2 * i], "%02X", event->packet->data[i]);
  4900. }
  4901. cout << buffer;*/
  4902. }
  4903. }
  4904. break;
  4905. case 5:
  4906. break;
  4907. case 6:
  4908. //cout << GetTextPointerFromPacket(event.packet) << endl;
  4909. break;
  4910. }
  4911. enet_packet_destroy(event.packet);
  4912. break;
  4913. }
  4914. case ENET_EVENT_TYPE_DISCONNECT:
  4915. #ifdef TOTAL_LOG
  4916. printf("Peer disconnected.\n");
  4917. #endif
  4918. /* Reset the peer's client information. */
  4919. /*ENetPeer* currentPeer;
  4920. for (currentPeer = server->peers;
  4921. currentPeer < &server->peers[server->peerCount];
  4922. ++currentPeer)
  4923. {
  4924. if (currentPeer->state != ENET_PEER_STATE_CONNECTED)
  4925. continue;
  4926.  
  4927. GamePacket p = packetEnd(appendString(appendString(createPacket(), "OnConsoleMessage"), "Player `o" + ((PlayerInfo*)(event.peer->data))->tankIDName + "`o just left the game..."));
  4928. ENetPacket * packet = enet_packet_create(p.data,
  4929. p.len,
  4930. ENET_PACKET_FLAG_RELIABLE);
  4931. enet_peer_send(currentPeer, 0, packet);
  4932. enet_host_flush(server);
  4933. }*/
  4934. sendPlayerLeave(peer, (PlayerInfo*)(event.peer->data));
  4935. ((PlayerInfo*)(event.peer->data))->inventory.items.clear();
  4936. delete event.peer->data;
  4937. event.peer->data = NULL;
  4938. }
  4939. }
  4940. cout << "Program ended??? Huh?" << endl;
  4941. while (1);
  4942. return 0;
  4943. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement