Advertisement
Guest User

Untitled

a guest
Dec 31st, 2016
99
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 63.96 KB | None | 0 0
  1. I got everything up and running but I cannot connect to the server itself..
  2.  
  3. Client just loads then times out.
  4.  
  5. GAME: 192.168.10.221
  6. Login server: 192.168.10.221
  7. QUERY: 192.168.10.110
  8.  
  9. config.lua
  10. [spoiler]
  11. serverName = "Forgotten"
  12.  
  13. -- Connection Config
  14. ip = "192.168.10.221"
  15. bindOnlyGlobalAddress = false
  16. port = 7171
  17. statusProtocolPort = 7171
  18. statusTimeout = 5000
  19. maxPacketsPerSecond = 25
  20.  
  21. --motd
  22. motd = "Welcome to RealOts"
  23. motdNum = 0
  24.  
  25. --version
  26. clientVersionMin = 770
  27. clientVersionMax = 770
  28. clientVersionStr = "7.70"
  29.  
  30. --amounts
  31. maxPlayers = 0
  32. monsterCount = 0
  33. npcCount = 0
  34.  
  35. -- Map
  36. mapName = "forgotten"
  37. mapAuthor = "Komic"
  38. mapWidth = 0
  39. mapHeight = 0
  40.  
  41. -- Status server information
  42. ownerName = ""
  43. ownerEmail = ""
  44. url = "https://otland.net/"
  45. location = "Sweden"
  46.  
  47. --rates
  48. rateExp = 5
  49. rateSkill = 3
  50. rateLoot = 2
  51. rateMagic = 3
  52. rateSpawn = 1
  53.  
  54. -- MySQL
  55. mysqlHost = "192.168.10.110"
  56. mysqlUser = "otserv"
  57. mysqlPass = "Cz7u89dmyPzHDNEL"
  58. mysqlDatabase = "otserv"
  59. mysqlPort = 3306
  60. mysqlSock = ""
  61.  
  62. -- Misc.
  63. freePremium = false
  64.  
  65. -- Startup
  66. -- NOTE: defaultPriority only works on Windows and sets process
  67. -- priority, valid values are: "normal", "above-normal", "high"
  68. defaultPriority = "high"
  69. startupDatabaseOptimization = true
  70. [/spoiler]
  71.  
  72. gameservers.xml
  73. [spoiler]
  74. <?xml version="1.0" encoding="UTF-8"?>
  75. <servers>
  76. <!--multi server support has been removed but can be easily added-->
  77. <server id="0" name="RealOts" ip="192.168.1.221" port="7172" />
  78. </servers>
  79.  
  80. [/spoiler]
  81.  
  82. main.cpp
  83. [spoiler]
  84. /*
  85. * OTServ QueryManager, (c) 2011 Satan Claus Limited
  86. */
  87.  
  88. #include "networkmessage.h"
  89. #include "definitions.h"
  90.  
  91. #include <string>
  92. #include <stdio.h>
  93. #include <stdlib.h>
  94. #include <pthread.h>
  95. #include <sstream>
  96. #include <fstream>
  97. #include <iomanip>
  98. #include <mysql/mysql.h>
  99. #include "database.h"
  100. #include "query.h"
  101. #include <sys/socket.h>
  102. #include <unistd.h>
  103. #include <fcntl.h>
  104. #include <string.h>
  105. #include <sys/ioctl.h>
  106. #include <ctime> // For time()
  107. #include <cstdlib> // For srand() and rand()
  108.  
  109. #include <iostream>
  110. using namespace std;
  111.  
  112. void log (std::string foo) {
  113. ofstream myfile;
  114. myfile.open ("debug.txt");
  115. myfile << foo << std::endl;
  116. myfile.close();
  117. }
  118.  
  119. std::string int2str(int i)
  120. {
  121. std::stringstream sstream;
  122. sstream << i;
  123. std::string str;
  124. sstream >> str;
  125. return(str);
  126. }
  127. std::string str2str(std::string i)
  128. {
  129. std::stringstream sstream;
  130. sstream << i;
  131. std::string str;
  132. sstream >> str;
  133. return(str);
  134. }
  135.  
  136. THREAD_RETURN ConnectionHandler(void* dat);
  137.  
  138. /* Database Connection */
  139.  
  140. #define host "localhost"
  141. #define username "otserv"
  142. #define dbpass "Cz7u89dmyPzHDNEL"
  143. #define database "otserv"
  144.  
  145. /* Configuration section */
  146.  
  147. std::string q_world = "otserv";
  148. unsigned short portNumber = 17778;
  149. unsigned short servPort = 7172;
  150. unsigned short rebootTime = 6;
  151.  
  152. void connect_to_db() {
  153. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  154. Query q(db);
  155. }
  156.  
  157.  
  158. int main(int argc, char *argv[])
  159. {
  160. std::cout << "--------------------" << std::endl;
  161. std::cout << "OTServ QueryManager" << std::endl;
  162. std::cout << "--------------------" << std::endl;
  163. std::cout << ":: Connecting to the MySQL database...";
  164. std::cout << "[done]" << std::endl;
  165. std::cout << ":: Starting OTServ QueryManager..." << std::endl;
  166.  
  167. // start the server listen...
  168. while(true){
  169. sockaddr_in local_adress;
  170. memset(&local_adress, 0, sizeof(sockaddr_in)); // zero the struct
  171.  
  172. local_adress.sin_family = AF_INET;
  173. local_adress.sin_port = htons(portNumber);
  174. local_adress.sin_addr.s_addr = inet_addr("192.168.10.110");
  175.  
  176. // first we create a new socket
  177. SOCKET listen_socket = socket(AF_INET, SOCK_STREAM, 0);
  178.  
  179. if(listen_socket <= 0){
  180. return -1;
  181. }
  182.  
  183. int yes = 1;
  184. // lose the pesky "Address already in use" error message
  185. if(setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof (int)) == -1){
  186. std::cout << "Unable to set socket options!" << std::endl;
  187. return -1;
  188. }
  189. //fcntl (listen_socket, F_SETFL, O_NONBLOCK);
  190. // bind socket on port
  191. if(bind(listen_socket, (struct sockaddr*)&local_adress, sizeof(struct sockaddr_in)) < 0){
  192. std::cout << "Unable to create server socket (2)!" << std::endl;
  193. return -1;
  194. }
  195.  
  196. // now we start listen on the new socket
  197. if(listen(listen_socket, 10) == SOCKET_ERROR){
  198. std::cout << "Listen on server socket not possible!" << std::endl;
  199. return -1;
  200. }
  201.  
  202. std::cout << "[done]" << std::endl;
  203. while(true){
  204. fd_set listen_set;
  205. timeval tv;
  206. FD_ZERO(&listen_set);
  207. FD_SET(listen_socket, &listen_set);
  208. tv.tv_sec = 2;
  209. tv.tv_usec = 0;
  210.  
  211. int ret = select(listen_socket + 1, &listen_set, NULL, NULL, &tv);
  212.  
  213. if(ret == SOCKET_ERROR){
  214. int errnum;
  215. errnum = errno;
  216. if(errnum != ERROR_EINTR){
  217. std::cout << "WARNING: select() function returned an error." << std::endl;
  218. break;
  219. }
  220. }
  221. else if(ret == 0){
  222. continue;
  223. }
  224.  
  225. SOCKET s = accept(listen_socket, NULL, NULL); // accept a new connection
  226. SLEEP(100);
  227.  
  228. if(s > 0){
  229. CREATE_THREAD(ConnectionHandler, (void*)&s);
  230. }
  231. else{
  232. std::cout << "WARNING: Not a valid socket from accept() function." << std::endl;
  233. }
  234. }
  235.  
  236. closesocket(listen_socket);
  237. }
  238. }
  239.  
  240. void parseDebug(NetworkMessage& msg)
  241. {
  242. int dataLength = msg.getMessageLength() - 1;
  243. if(dataLength != 0){
  244. std::cout << "data: ";
  245. int data = msg.InspectByte();
  246. for(int i = 1; i < dataLength; ++i){
  247. std::cout << "0x" << std::setw(2) << std::setfill('0') << std::hex << (int)data << " ";
  248. data = msg.InspectByte(i);
  249. }
  250.  
  251. std::cout << std::endl;
  252. }
  253. }
  254.  
  255. THREAD_RETURN ConnectionHandler(void* dat)
  256. {
  257.  
  258. /* Variables */
  259.  
  260. int result;
  261. long accId;
  262. long randomAcc;
  263. long premDays;
  264. long trialDays;
  265. int userlevel;
  266. bool is_banished;
  267. int gender;
  268. int guild_id;
  269. int rank;
  270. int active;
  271. int buddys;
  272. long accountID;
  273. long accountNR;
  274. long progression;
  275. int initiatingId;
  276. int bandays;
  277. int loginError;
  278. int multiclient;
  279. std::string guild_name;
  280. std::string guild_title;
  281. std::string player_title;
  282.  
  283. SOCKET socket = *(SOCKET*)dat;
  284.  
  285. NetworkMessage msg;
  286. while(msg.ReadFromSocket(socket)){
  287. unsigned char packetId = msg.getByte();
  288.  
  289. /* Authentication */
  290. std::cout << std::endl/* << "Packet Type: " << (int) packetId << std::endl*/;
  291. //parseDebug(msg);
  292. if(packetId == 0x00){
  293. std::cout << "Authentication packet (0x00)" << std::endl;
  294.  
  295. unsigned char unknown = msg.getByte(); //0x01
  296. std::string password = msg.getString(); //a6glaf0c
  297. std::string worldname = msg.getString();
  298.  
  299. /*std::cout << "unknown: " << (int) unknown << std::endl;
  300. std::cout << "password: " << password << std::endl;
  301. std::cout << "worldname: " << worldname << std::endl;*/
  302.  
  303. NetworkMessage writeMsg;
  304. writeMsg.addByte(0x00);
  305. writeMsg.WriteToSocket(socket);
  306. }
  307. else if(packetId == 0x14){
  308. //connect_to_db();
  309. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  310. Query q(db);
  311. std::cout << "Received playerLogin packet (0x14)" << std::endl;
  312. NetworkMessage writeMsg;
  313. unsigned int accountNumber = msg.getU32();
  314. std::string charName = msg.getString();
  315. std::string charPass = msg.getString();
  316. std::string charIP = msg.getString();
  317.  
  318. std::cout << "accountNumber: " << dec << accountNumber << std::endl;
  319. std::cout << "charName : " << charName << std::endl;
  320. std::cout << "charPass : " << charPass << std::endl;
  321. std::cout << "charIP : " << charIP << std::endl;
  322. std::cout << ":: Authenticating against database" << std::endl;
  323.  
  324. // Init some vars
  325. bool banned = false;
  326. unsigned int banTime = 0;
  327. bool banDelete = false;
  328. accId = 0;
  329. gender = 0;
  330.  
  331. q.get_result("SELECT users.banished, users.banished_until, users.bandelete, players.account_id, players.gender FROM users,players WHERE users.login='" + int2str(accountNumber) + "' AND players.charname='" + Database::escapeString(charName.c_str()) + "' AND users.passwd = '" + Database::escapeString(str2str(charPass)) + "' AND users.login=players.account_nr");
  332. if (q.fetch_row()) {
  333. banned = q.getval();
  334. banTime = q.getval();
  335. banDelete = q.getval();
  336. accId = q.getval();
  337. gender = q.getval();
  338. q.free_result();
  339. }
  340.  
  341. /*
  342. * Perform some basic checks
  343. */
  344.  
  345. loginError = 0;
  346.  
  347. if(banned && banTime <= time(NULL)) {
  348. q.execute("UPDATE users SET banished='0' WHERE login='" + int2str(accountNumber) + "'");
  349. q.free_result();
  350. std::cout << "Banishment of account " + int2str(accountNumber) + " has expired " << (time(NULL) - banTime) << " seconds ago, removing." << std::endl;
  351. banned = false;
  352. }
  353.  
  354. if (!accId || accId == 0)
  355. loginError = 0x06;
  356. else if(banDelete || banned)
  357. loginError = 0x0A;
  358. else {
  359. q.get_result("SELECT 1 FROM players WHERE account_nr = '" + int2str(accountNumber) + "' AND online='1' AND account_id<>'"+int2str(accId)+" LIMIT 1'");
  360. if (q.fetch_row())
  361. loginError = 0x0D;
  362.  
  363. q.free_result();
  364. }
  365.  
  366. /*
  367. 0x01 = doesnt exist
  368. 0x02 = doesnt exist
  369. 0x03 = doesnt live on this world
  370. 0x04 = Private
  371. 0x05 = ???
  372. 0x06 = Accountnumber or password incorrect
  373. 0x07 = Account disabled for 5 minutes
  374. 0x08 = 0x06
  375. 0x09 = IP Address blocked for 30 minutes
  376. 0x0A = Banished
  377. 0x0B = Banished for name
  378. 0x0C = IP Banned
  379. 0x0D = MCing
  380. 0x0E = May only login with GM acc
  381. 0x0F = Login failure due to corrupted data
  382. */
  383.  
  384. if (loginError > 0 && loginError != 13) {
  385. std::cout << ":: LOGIN FAILURE " << dec << loginError << " for " << dec << accId << std::endl;
  386. writeMsg.addByte(0x01);
  387. writeMsg.addByte(loginError); // Significant byte (0x02 is not exist, 0x03 not on this world)
  388. writeMsg.WriteToSocket(socket);
  389. }
  390. else if (accId) {
  391. // Begin of login block
  392. std::cout << ":: Login succes from accountId " << dec << accId << std::endl;
  393. writeMsg.addByte(0x00);
  394. writeMsg.addU32(accId);
  395. writeMsg.addString(charName.c_str()) ;
  396. writeMsg.addByte(gender == 1 ? 0x01 : 0x02);
  397.  
  398. guild_id = 0;
  399. rank = 0;
  400. guild_name = "";
  401. guild_title = "0";
  402. player_title = "0";
  403. active = 0;
  404.  
  405. q.execute("UPDATE players SET online='1', charIP='"+Database::escapeString(charIP)+"' WHERE account_id=" + int2str(accId));
  406. q.free_result();
  407. q.get_result("SELECT guild_id,rank,player_title FROM guild_members WHERE invitation='0' AND account_id = '" + int2str(accId) + "'" );
  408. if (q.fetch_row()) {
  409. guild_id = q.getval();
  410. rank = q.getval();
  411. //guild_title = q.getstr();
  412. player_title = q.getstr();
  413. }
  414. q.free_result();
  415. if (rank > 0) {
  416. q.get_result("SELECT rank_" + int2str(rank) + " FROM guilds WHERE guild_id = '" + int2str(guild_id) + "'" );
  417. if (q.fetch_row()) {
  418. guild_title = q.getstr();
  419. }
  420. q.free_result();
  421. }
  422. q.get_result("SELECT COUNT(*) FROM guild_members WHERE invitation='0' AND guild_id = '" + int2str(guild_id) + "'");
  423. int active = 0;
  424. if(q.fetch_row())
  425. active = q.getval();
  426. q.free_result();
  427.  
  428. if(active)
  429. std::cout << "Active members in the guild: " << dec << active << std::endl;
  430.  
  431. bool none = true;
  432. if (active > 2) {
  433. q.get_result("SELECT guild_name FROM guilds WHERE guild_id = " + int2str(guild_id));
  434. if(q.fetch_row()) {
  435. guild_name = q.getstr();
  436. writeMsg.addString(guild_name.c_str()); // Guild
  437. writeMsg.addString(guild_title.c_str()); // Guild Title
  438. writeMsg.addString(player_title.c_str()); // Player Title
  439. none = false;
  440. }
  441. q.free_result();
  442. }
  443. if(none) {
  444. writeMsg.addString(""); // Guild
  445. writeMsg.addString("0"); // Guild Title
  446. writeMsg.addString("0"); // Player Title
  447. }
  448.  
  449. /* Get buddies */
  450. q.get_result("SELECT buddy_id,buddy_string FROM buddy WHERE account_nr = " + int2str(accountNumber) + " LIMIT 100");
  451. buddys = q.num_rows();
  452.  
  453. writeMsg.addByte(buddys);
  454. if(buddys) {
  455. std::cout << "About to load " << dec << buddys << " buddys." << std::endl;
  456. int i = 0;
  457. while(q.fetch_row()) {
  458. int buddyID = q.getval();
  459. std::string buddyName = q.getstr();
  460. writeMsg.addU32(buddyID);
  461. writeMsg.addString(buddyName.c_str());
  462. i++;
  463. //std::cout << "(" << i << "/" << buddys << ") Added buddy " << buddyName << " (" << buddyID << ")" << std::endl;
  464. }
  465. }
  466. q.free_result();
  467.  
  468. q.get_result("SELECT COUNT(*) FROM testserv.privs WHERE days>0 AND priv_id = " + int2str(accountNumber));
  469.  
  470. // Read the amount of privileges to load from the DB
  471. int privs = 0;
  472. if(q.fetch_row())
  473. {
  474. privs = q.getval();
  475. }
  476. q.free_result();
  477.  
  478. q.get_result("SELECT premium_days, trial_premium_days, userlevel FROM users WHERE login = '" + int2str(accountNumber) + "'");
  479. if(q.fetch_row()) {
  480. premDays = q.getval();
  481. trialDays = q.getval();
  482. premDays += trialDays;
  483.  
  484. userlevel = q.getval();
  485. if (userlevel == 255) {
  486. privs += 109; // GOD Privs
  487. std::cout << ":: ALL BOW BEFORE GOD ::" << std::endl;
  488. }
  489. else if (userlevel == 100) {
  490. privs += 63;
  491. std::cout << ":: GAMEMASTER LOGIN ::" << std::endl;
  492. }
  493. else if (userlevel == 50) {
  494. privs += 11; // Tutor priv
  495. if (premDays > 0)
  496. privs++;
  497. std::cout << ":: TUTOR LOGIN ::" << std::endl;
  498. }
  499. else if (premDays > 0)
  500. privs++; // Add a privilege for PREMIUM_ACCOUNT
  501.  
  502. q.free_result();
  503. } else {
  504. premDays = 0;
  505. trialDays = 0;
  506. userlevel = 0;
  507. }
  508.  
  509. std::cout << "PremDays: " << dec << premDays - trialDays << std::endl;
  510. std::cout << "trialDays: " << dec << trialDays << std::endl;
  511. std::cout << "privs: " << dec << privs << std::endl;
  512.  
  513. writeMsg.addByte((unsigned char) privs);
  514.  
  515. if (userlevel == 50) {
  516. writeMsg.addString("HIGHLIGHT_HELP_CHANNEL");
  517. if (premDays > 0)
  518. writeMsg.addString("PREMIUM_ACCOUNT");
  519. writeMsg.addString("READ_TUTOR_CHANNEL");
  520. writeMsg.addString("SEND_BUGREPORTS");
  521.  
  522. writeMsg.addString("STATEMENT_ADVERT_MONEY");
  523. writeMsg.addString("STATEMENT_ADVERT_OFFTOPIC");
  524. writeMsg.addString("STATEMENT_CHANNEL_OFFTOPIC");
  525. writeMsg.addString("STATEMENT_INSULTING");
  526. writeMsg.addString("STATEMENT_NON_ENGLISH");
  527. writeMsg.addString("STATEMENT_REPORT");
  528. writeMsg.addString("STATEMENT_SPAMMING");
  529. writeMsg.addString("STATEMENT_VIOLATION_INCITING");
  530. }
  531. else if (userlevel == 100) {
  532. writeMsg.addString("ALLOW_MULTICLIENT");
  533. writeMsg.addString("BANISHMENT");
  534. writeMsg.addString("CHEATING_ACCOUNT_SHARING");
  535. writeMsg.addString("CHEATING_ACCOUNT_TRADING");
  536. writeMsg.addString("CHEATING_BUG_ABUSE");
  537. writeMsg.addString("CHEATING_GAME_WEAKNESS");
  538. writeMsg.addString("CHEATING_HACKING");
  539. writeMsg.addString("CHEATING_MACRO_USE");
  540. writeMsg.addString("CHEATING_MODIFIED_CLIENT");
  541. writeMsg.addString("CHEATING_MULTI_CLIENT");
  542. writeMsg.addString("CLEANUP_FIELDS");
  543. writeMsg.addString("CREATECHAR_GAMEMASTER");
  544. writeMsg.addString("DESTRUCTIVE_BEHAVIOUR");
  545. writeMsg.addString("FINAL_WARNING");
  546. writeMsg.addString("GAMEMASTER_BROADCAST");
  547. writeMsg.addString("GAMEMASTER_FALSE_REPORTS");
  548. writeMsg.addString("GAMEMASTER_INFLUENCE");
  549. writeMsg.addString("GAMEMASTER_PRETENDING");
  550. writeMsg.addString("GAMEMASTER_THREATENING");
  551. writeMsg.addString("GAMEMASTER_OUTFIT");
  552. writeMsg.addString("HIGHLIGHT_HELP_CHANNEL");
  553. writeMsg.addString("HOME_TELEPORT");
  554. writeMsg.addString("IGNORED_BY_MONSTERS");
  555. writeMsg.addString("ILLUMINATE");
  556. writeMsg.addString("INVALID_PAYMENT");
  557. writeMsg.addString("INVULNERABLE");
  558. writeMsg.addString("IP_BANISHMENT");
  559. writeMsg.addString("KEEP_ACCOUNT");
  560. writeMsg.addString("KEEP_CHARACTER");
  561. writeMsg.addString("KEEP_INVENTORY");
  562. writeMsg.addString("MODIFY_GOSTRENGTH");
  563. writeMsg.addString("NAMELOCK");
  564. writeMsg.addString("NAME_BADLY_FORMATTED");
  565. writeMsg.addString("NAME_CELEBRITY");
  566. writeMsg.addString("NAME_COUNTRY");
  567. writeMsg.addString("NAME_FAKE_IDENTITY");
  568. writeMsg.addString("NAME_FAKE_POSITION");
  569. writeMsg.addString("NAME_INSULTING");
  570. writeMsg.addString("NAME_NONSENSICAL_LETTERS");
  571. writeMsg.addString("NAME_NO_PERSON");
  572. writeMsg.addString("NAME_SENTENCE");
  573. writeMsg.addString("NO_ATTACK");
  574. writeMsg.addString("NOTATION");
  575. writeMsg.addString("NO_BANISHMENT");
  576. writeMsg.addString("NO_LOGOUT_BLOCK");
  577. writeMsg.addString("NO_RUNES");
  578. writeMsg.addString("NO_STATISTICS");
  579. writeMsg.addString("READ_GAMEMASTER_CHANNEL");
  580. writeMsg.addString("READ_TUTOR_CHANNEL");
  581. writeMsg.addString("SEND_BUGREPORTS");
  582. writeMsg.addString("STATEMENT_ADVERT_MONEY");
  583. writeMsg.addString("STATEMENT_ADVERT_OFFTOPIC");
  584. writeMsg.addString("STATEMENT_CHANNEL_OFFTOPIC");
  585. writeMsg.addString("STATEMENT_INSULTING");
  586. writeMsg.addString("STATEMENT_NON_ENGLISH");
  587. writeMsg.addString("STATEMENT_REPORT");
  588. writeMsg.addString("STATEMENT_SPAMMING");
  589. writeMsg.addString("STATEMENT_VIOLATION_INCITING");
  590. writeMsg.addString("TELEPORT_TO_CHARACTER");
  591. writeMsg.addString("TELEPORT_TO_MARK");
  592. writeMsg.addString("TELEPORT_VERTICAL");
  593. writeMsg.addString("VIEW_CRIMINAL_RECORD");
  594. writeMsg.addString("ZERO_CAPACITY");
  595. }
  596. else if (userlevel == 255) {
  597. // Write God Privs
  598. writeMsg.addString("ALLOW_MULTICLIENT");
  599. writeMsg.addString("ALL_SPELLS");
  600. writeMsg.addString("ANONYMOUS_BROADCAST");
  601. writeMsg.addString("APPOINT_CIP");
  602. writeMsg.addString("APPOINT_JGM");
  603. writeMsg.addString("APPOINT_SENATOR");
  604. writeMsg.addString("APPOINT_SGM");
  605. writeMsg.addString("ATTACK_EVERYWHERE");
  606. writeMsg.addString("BANISHMENT");
  607. writeMsg.addString("BOARD_ANONYMOUS_EDIT");
  608. writeMsg.addString("BOARD_MODERATION");
  609. writeMsg.addString("BOARD_PRECONFIRMED");
  610. writeMsg.addString("BOARD_REPORT");
  611. writeMsg.addString("CHANGE_PROFESSION");
  612. writeMsg.addString("CHANGE_SKILLS");
  613. writeMsg.addString("CHEATING_ACCOUNT_SHARING");
  614. writeMsg.addString("CHEATING_ACCOUNT_TRADING");
  615. writeMsg.addString("CHEATING_BUG_ABUSE");
  616. writeMsg.addString("CHEATING_GAME_WEAKNESS");
  617. writeMsg.addString("CHEATING_HACKING");
  618. writeMsg.addString("CHEATING_MACRO_USE");
  619. writeMsg.addString("CHEATING_MODIFIED_CLIENT");
  620. writeMsg.addString("CHEATING_MULTI_CLIENT");
  621. writeMsg.addString("CREATE_OBJECTS");
  622. writeMsg.addString("CIPWATCH_ADMIN");
  623. writeMsg.addString("CIPWATCH_USER");
  624. writeMsg.addString("CLEANUP_FIELDS");
  625. writeMsg.addString("CLEAR_CHARACTER_INFO");
  626. writeMsg.addString("CLEAR_GUILDS");
  627. writeMsg.addString("CREATECHAR_GAMEMASTER");
  628. writeMsg.addString("CREATECHAR_GOD");
  629. writeMsg.addString("CREATECHAR_TEST");
  630. writeMsg.addString("CREATE_MONEY");
  631. writeMsg.addString("CREATE_MONSTERS");
  632. writeMsg.addString("DELETE_GUILDS");
  633. writeMsg.addString("DESTRUCTIVE_BEHAVIOUR");
  634. writeMsg.addString("ENTER_HOUSES");
  635. writeMsg.addString("EXTRA_CHARACTER");
  636. writeMsg.addString("FINAL_WARNING");
  637. writeMsg.addString("GAMEMASTER_BROADCAST");
  638. writeMsg.addString("GAMEMASTER_FALSE_REPORTS");
  639. writeMsg.addString("GAMEMASTER_INFLUENCE");
  640. writeMsg.addString("GAMEMASTER_PRETENDING");
  641. writeMsg.addString("GAMEMASTER_THREATENING");
  642. writeMsg.addString("GAMEMASTER_OUTFIT");
  643. writeMsg.addString("HIGHLIGHT_HELP_CHANNEL");
  644. writeMsg.addString("HOME_TELEPORT");
  645. writeMsg.addString("IGNORED_BY_MONSTERS");
  646. writeMsg.addString("ILLUMINATE");
  647. writeMsg.addString("INVALID_PAYMENT");
  648. writeMsg.addString("INVITED");
  649. writeMsg.addString("INVULNERABLE");
  650. writeMsg.addString("IP_BANISHMENT");
  651. writeMsg.addString("KEEP_ACCOUNT");
  652. writeMsg.addString("KEEP_CHARACTER");
  653. writeMsg.addString("KEEP_INVENTORY");
  654. writeMsg.addString("KICK");
  655. writeMsg.addString("KILLING_EXCESSIVE_UNJUSTIFIED");
  656. writeMsg.addString("LEVITATE");
  657. writeMsg.addString("LOG_COMMUNICATION");
  658. writeMsg.addString("MODIFY_BANISHMENT");
  659. writeMsg.addString("MODIFY_GOSTRENGTH");
  660. writeMsg.addString("NAMELOCK");
  661. writeMsg.addString("NAME_BADLY_FORMATTED");
  662. writeMsg.addString("NAME_CELEBRITY");
  663. writeMsg.addString("NAME_COUNTRY");
  664. writeMsg.addString("NAME_FAKE_IDENTITY");
  665. writeMsg.addString("NAME_FAKE_POSITION");
  666. writeMsg.addString("NAME_INSULTING");
  667. writeMsg.addString("NAME_NONSENSICAL_LETTERS");
  668. writeMsg.addString("NAME_NO_PERSON");
  669. writeMsg.addString("NAME_SENTENCE");
  670. writeMsg.addString("NOTATION");
  671. writeMsg.addString("NO_BANISHMENT");
  672. writeMsg.addString("NO_LOGOUT_BLOCK");
  673. writeMsg.addString("NO_STATISTICS");
  674. writeMsg.addString("OPEN_NAMEDDOORS");
  675. writeMsg.addString("PREMIUM_ACCOUNT");
  676. writeMsg.addString("READ_GAMEMASTER_CHANNEL");
  677. writeMsg.addString("READ_TUTOR_CHANNEL");
  678. writeMsg.addString("RETRIEVE");
  679. writeMsg.addString("SEND_BUGREPORTS");
  680. writeMsg.addString("SET_ACCOUNTGROUP_RIGHTS");
  681. writeMsg.addString("SET_ACCOUNT_RIGHTS");
  682. writeMsg.addString("SET_CHARACTERGROUP_RIGHTS");
  683. writeMsg.addString("SET_CHARACTER_RIGHTS");
  684. writeMsg.addString("SHOW_COORDINATE");
  685. writeMsg.addString("SHOW_KEYHOLE_NUMBERS");
  686. writeMsg.addString("SPECIAL_MOVEUSE");
  687. writeMsg.addString("SPOILING_AUCTION");
  688. writeMsg.addString("STATEMENT_ADVERT_MONEY");
  689. writeMsg.addString("STATEMENT_ADVERT_OFFTOPIC");
  690. writeMsg.addString("STATEMENT_CHANNEL_OFFTOPIC");
  691. writeMsg.addString("STATEMENT_INSULTING");
  692. writeMsg.addString("STATEMENT_NON_ENGLISH");
  693. writeMsg.addString("STATEMENT_REPORT");
  694. writeMsg.addString("STATEMENT_SPAMMING");
  695. writeMsg.addString("STATEMENT_VIOLATION_INCITING");
  696. writeMsg.addString("TELEPORT_TO_CHARACTER");
  697. writeMsg.addString("TELEPORT_TO_COORDINATE");
  698. writeMsg.addString("TELEPORT_TO_MARK");
  699. writeMsg.addString("TELEPORT_VERTICAL");
  700. writeMsg.addString("UNLIMITED_CAPACITY");
  701. writeMsg.addString("UNLIMITED_MANA");
  702. writeMsg.addString("VIEW_ACCOUNT");
  703. writeMsg.addString("VIEW_CRIMINAL_RECORD");
  704. writeMsg.addString("VIEW_GAMEMASTER_RECORD");
  705. writeMsg.addString("VIEW_LOG_FILES");
  706. writeMsg.addString("ZERO_CAPACITY");
  707. }
  708. else if (premDays>0) {
  709. std::cout << ":: Added Privileges PREMIUM_ACCOUNT" << std::endl;
  710. writeMsg.addString("PREMIUM_ACCOUNT");
  711. }
  712.  
  713.  
  714. q.get_result("SELECT priv_string FROM testserv.privs WHERE days>0 AND priv_id = '" + int2str(accountNumber) + "'");
  715. while(q.fetch_row())
  716. {
  717. std::string priv_string = q.getstr();
  718. writeMsg.addString(priv_string.c_str());
  719. std::cout << ":: Added Privileges " << priv_string << std::endl;
  720. }
  721. q.free_result();
  722. writeMsg.addByte(0x00); // Lets you know your premmy account is activated.
  723. writeMsg.WriteToSocket(socket);
  724. // End of login block
  725. } else {
  726. std::cout << ":: Login failed!" << (int) accId << std::endl;
  727. writeMsg.addByte(0xFF);
  728. writeMsg.WriteToSocket(socket);
  729. }
  730. }
  731. else if(packetId == 0x15) {
  732. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  733. Query q(db);
  734. std::cout << "Received playerLogout packet (0x15)" << std::endl;
  735. //parseDebug(msg);
  736. unsigned int logoutID = msg.getU32();
  737. unsigned short level = msg.getU16();
  738. std::string vocation = msg.getString();
  739. std::string residence = msg.getString();
  740. unsigned int lastlogin = msg.getU32();
  741. std::cout << "AccID=" << dec << logoutID << " Lvl=" << dec << level << " Voc=" << vocation << " Town=" << residence << " Lastlogin=" << dec << lastlogin << std::endl;
  742. q.execute("UPDATE players SET lastlogin="+int2str(lastlogin)+", online='0', vocation='"+Database::escapeString(vocation)+"', level="+int2str(level)+", residence='"+Database::escapeString(residence)+"' WHERE account_id='" + int2str(logoutID) + "'");
  743. q.free_result();
  744. NetworkMessage writeMsg;
  745. writeMsg.addByte(0x00); // ErrorCode
  746. writeMsg.WriteToSocket(socket);
  747. }
  748. else if(packetId == 0x17) {
  749. std::cout << "Received Namelock Packet (0x17)" << std::endl;
  750. parseDebug(msg);
  751. NetworkMessage writeMsg;
  752. writeMsg.addByte(0x00); // ErrorCode
  753. writeMsg.WriteToSocket(socket);
  754. }
  755. else if(packetId == 0x19) {
  756. accountID=0;
  757. accountNR=0;
  758. progression=0;
  759. bandays=0;
  760.  
  761. std::cout << "Received Banishment Packet (0x19)" << std::endl;
  762. parseDebug(msg);
  763.  
  764. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  765. Query q(db);
  766.  
  767. unsigned int gmID = msg.getU32();
  768. std::string bannedStr = msg.getString();
  769. std::string ip = msg.getString();
  770. std::string reasonStr = msg.getString();
  771. std::string commentStr = msg.getString();
  772. //std::cout << ":: Gamemaster ID: " << (int) gmID << " string: " << bannedStr << " violation: " << reasonStr << " comment: " << commentStr << std::endl;
  773. std::cout << "gmID=" << dec << gmID << std::endl;
  774. std::cout << "bannedStr=" << bannedStr.length() << std::endl;
  775. std::cout << "ip=" << ip << std::endl;
  776. std::cout << "reasonStr=" << reasonStr.length() << std::endl;
  777. std::cout << "commentStr=" << commentStr.length() << std::endl;
  778.  
  779. q.get_result("SELECT account_nr,account_id FROM players WHERE charname = '" + Database::escapeString(bannedStr) + "'");
  780. if(q.fetch_row()) {
  781. accountNR = q.getval();
  782. accountID = q.getval();
  783. }
  784. q.free_result();
  785.  
  786. // Banishment progression logic
  787. q.get_result("SELECT banished_until-timestamp AS total FROM banishments WHERE timestamp > UNIX_TIMESTAMP()-(86400*180) AND account_nr='"+int2str(accountNR)+"' AND punishment_type='1'");
  788. if (q.fetch_row()) {
  789. progression = q.getval();
  790. if (progression < 700000)
  791. bandays = 15;
  792. else if (progression < 1400000)
  793. bandays = 30;
  794. else
  795. bandays = 255;
  796. }
  797. else
  798. bandays = 7;
  799.  
  800. q.free_result();
  801.  
  802. q.execute("INSERT INTO banishments (account_nr,account_id,ip,violation,comment,timestamp,banished_until,gm_id) VALUES ('"+int2str(accountNR)+"','"+int2str(accountID)+"','"+Database::escapeString(ip)+"','"+Database::escapeString(reasonStr)+"','"+Database::escapeString(commentStr)+"',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+(86400*"+int2str(bandays)+"),'"+int2str(gmID)+"')");
  803. q.free_result();
  804.  
  805. q.execute("UPDATE users SET banished='1',banished_until=UNIX_TIMESTAMP()+(86400*" + int2str(bandays) + ") WHERE login='"+int2str(accountNR)+"'");
  806. q.free_result();
  807.  
  808. // Infinity is deletion
  809. if (bandays == 255) {
  810. q.execute("UPDATE users SET bandelete='1' WHERE login='"+int2str(accountNR)+"'");
  811. q.free_result();
  812. }
  813.  
  814. NetworkMessage writeMsg;
  815. writeMsg.addByte(0x00); // ErrorCode
  816. writeMsg.addByte(bandays); // Number of days
  817. writeMsg.addU32(time(NULL) + (86400 * bandays));
  818. writeMsg.addByte(0x00);
  819.  
  820. writeMsg.WriteToSocket(socket);
  821. }
  822. else if(packetId == 0x1a) {
  823. std::cout << "Received Notation packet (0x1a)" << std::endl;
  824. parseDebug(msg);
  825.  
  826. accountID=0;
  827. accountNR=0;
  828.  
  829. unsigned int gmID = msg.getU32();
  830. std::string bannedStr = msg.getString();
  831. std::string ip = msg.getString();
  832. std::string reasonStr = msg.getString();
  833. std::string commentStr = msg.getString();
  834.  
  835. std::cout << ":: Gamemaster ID: " << dec << gmID << " string: " << bannedStr << " ip: " << ip << " << violation: " << reasonStr << " comment: " << commentStr << std::endl;
  836.  
  837. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  838. Query q(db);
  839.  
  840. q.get_result("SELECT account_nr,account_id FROM players WHERE charname = '" + Database::escapeString(bannedStr) + "'");
  841. while(q.fetch_row()) {
  842. accountNR = q.getval();
  843. accountID = q.getval();
  844. }
  845. q.free_result();
  846.  
  847. q.execute("INSERT INTO banishments (account_nr,account_id,id,violation,comment,timestamp,banished_until,gm_id,punishment_type) VALUES ('"+int2str(accountNR)+"','"+int2str(accountID)+"','"+Database::escapeString(ip)+"','"+Database::escapeString(reasonStr)+"','"+Database::escapeString(commentStr)+"',UNIX_TIMESTAMP(),UNIX_TIMESTAMP(),'"+int2str(gmID)+"',2)");
  848. q.free_result();
  849.  
  850. NetworkMessage writeMsg;
  851. writeMsg.addByte(0x00); // ErrorCode
  852. writeMsg.addU32(gmID);
  853. writeMsg.WriteToSocket(socket);
  854. }
  855. else if(packetId == 0x1b) {
  856. std::cout << "Received reportStatement packet (0x1b)" << std::endl;
  857. parseDebug(msg);
  858.  
  859. unsigned int gmID = msg.getU32();
  860. std::string bannedStr = msg.getString();
  861. std::string reasonStr = msg.getString();
  862. std::string commentStr = msg.getString();
  863.  
  864. unsigned int unk = msg.getU32();
  865. unsigned int statementID = msg.getU32();
  866. unsigned short count = msg.getU16();
  867.  
  868. std::cout << "Gamemaster ID: " << dec << gmID << endl;
  869. std::cout << "string: " << bannedStr << endl;
  870. std::cout << "violation: " << reasonStr << endl;
  871. std::cout << "comment: " << commentStr << endl;
  872.  
  873. std::cout << "unknown: " << dec << unk << endl;
  874. std::cout << "statement ID: " << dec << statementID << endl;
  875. std::cout << "count: " << dec << count << endl;
  876.  
  877. for(unsigned short i = 0; i < count; i++) {
  878. std::cout << "Message #" << i << ": " << endl;
  879.  
  880. unsigned int statement = msg.getU32();
  881. unsigned int time = msg.getU32();
  882. unsigned int playerid = msg.getU32();
  883. std::string channel = msg.getString();
  884. std::string message = msg.getString();
  885.  
  886. std::cout << "statement: " << dec << statement << endl;
  887. std::cout << "timestamp: " << dec << time << endl;
  888. std::cout << "playerid: " << dec << playerid << endl;
  889. std::cout << "channel: " << channel << endl;
  890. std::cout << "message: " << message << endl;
  891. }
  892.  
  893. NetworkMessage writeMsg;
  894. writeMsg.addByte(0x00); // ErrorCode
  895. writeMsg.WriteToSocket(socket);
  896. }
  897. else if (packetId == 0x1d) {
  898. std::cout << "Received logCharacterDeath packet (0x1d)" << std::endl;
  899. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  900. Query q(db);
  901. NetworkMessage writeMsg;
  902. //parseDebug(msg);
  903. unsigned int victimID = msg.getU32();
  904. unsigned int victimLevel = msg.getU16();
  905. unsigned int peekayID = msg.getU32();
  906. if (peekayID == 0) {
  907. // The character died by a creature.
  908. std::string peekayName = msg.getString();
  909. unsigned int dummy = msg.getByte();
  910. unsigned int victimTS = msg.getU32();
  911. std::cout << ":: PlayerID " << dec << victimID << " was killed by " << peekayName << " at level " << dec << victimLevel << " at timestamp " << dec << victimTS << std::endl;
  912. q.execute("INSERT INTO deaths (player_id,level,by_peekay,peekay_id,creature_string,timestamp) VALUES ('" + int2str(victimID) + "','" + int2str(victimLevel) + "','0','0','" + peekayName.c_str() + "','" + int2str(victimTS) + "')");
  913. q.free_result();
  914. } else {
  915. // The character has been peekayed.
  916. std::string peekayName = msg.getString();
  917. unsigned int unjust = msg.getByte();
  918. unsigned int victimTS = msg.getU32();
  919. std::cout << ":: PlayerID " << dec << victimID << " was peekayed by PlayerID " << peekayID << " at level " << dec << victimLevel << " at timestamp " << dec << victimTS << " unjust: " << dec << unjust << std::endl;
  920. q.execute("INSERT INTO deaths (player_id,level,by_peekay,peekay_id,creature_string,unjust,timestamp) VALUES ('" + int2str(victimID) + "','" + int2str(victimLevel) + "','1','" + int2str(peekayID) + "','" + peekayName.c_str() + "','" + int2str(unjust) + "','" + int2str(victimTS) + "')");
  921. q.free_result();
  922. }
  923. writeMsg.addByte(0x00); // ErrorCode
  924. writeMsg.WriteToSocket(socket);
  925. }
  926. else if(packetId == 0x20) {
  927. std::cout << "Received CreatePlayer? packet (0x20)" << std::endl;
  928. //parseDebug(msg);
  929. unsigned int ACCID = msg.getU32();
  930. unsigned int unknown = msg.getByte();
  931. std::cout << "AccID=" << ACCID << " Unknown=" << unknown << std::endl;
  932.  
  933. NetworkMessage writeMsg;
  934. writeMsg.addByte(0x00); // ErrorCode
  935. writeMsg.WriteToSocket(socket);
  936. }
  937. else if(packetId == 0x21){
  938. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  939. Query q(db);
  940. // Finish auctions.
  941. std::cout << "Received FinishAuctions packet (0x21)" << std::endl;
  942. parseDebug(msg);
  943.  
  944. NetworkMessage writeMsg;
  945. writeMsg.addByte(0x00);
  946.  
  947. q.get_result("SELECT house_id,player_id,owner_string,gold FROM houses WHERE virgin='1'");
  948. int total = q.num_rows();
  949. writeMsg.addU16(total);
  950.  
  951. if(total) {
  952. while(q.fetch_row())
  953. {
  954. std::cout << ":: Retrieving house..." << std::endl;
  955. unsigned short house_id = q.getval();
  956. unsigned int player_id = q.getval();
  957. std::string owner_name = q.getstr();
  958. unsigned int gold = q.getval();
  959.  
  960. std::cout << ":: HouseID " << dec << house_id << std::endl;
  961. std::cout << ":: PlayerID " << dec << player_id << std::endl;
  962. std::cout << ":: Name " << owner_name << std::endl;
  963. std::cout << ":: Gold " << dec << gold << std::endl;
  964.  
  965. writeMsg.addU16(house_id);
  966. writeMsg.addU32(player_id);
  967. writeMsg.addString(owner_name.c_str());
  968. writeMsg.addU32(gold);
  969. }
  970. }
  971. q.free_result();
  972.  
  973. q.execute("UPDATE houses SET virgin='0'");
  974. q.free_result();
  975.  
  976. writeMsg.WriteToSocket(socket);
  977. }
  978. else if(packetId == 0x23){
  979. // transferHouses (voluntary)
  980. std::cout << "Received transferHouses packet (0x23)" << std::endl;
  981. parseDebug(msg);
  982. //has no data
  983.  
  984. //our reply:
  985.  
  986. NetworkMessage writeMsg;
  987. writeMsg.addByte(0x00);
  988.  
  989. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  990. Query q(db);
  991. q.get_result("SELECT id, house_id, transfer_to, gold FROM `house_transfer` WHERE done = 0");
  992. int total = q.num_rows();
  993.  
  994. writeMsg.addU16(total);
  995. if(total) {
  996. std::cout << ":: There are " << dec << total << " houses for transferring." << std::endl;
  997. while(q.fetch_row())
  998. {
  999. unsigned int trans_id = q.getval();
  1000. unsigned short house_id = q.getval();
  1001. unsigned int player_id = q.getval();
  1002. unsigned int gold = q.getval();
  1003. std::cout << ":: Retrieving house " << dec << house_id << " with transfer to player ID " << dec << player_id << " for " << dec << gold << " gold" << std::endl;
  1004. writeMsg.addU16(house_id);
  1005. writeMsg.addU32(player_id);
  1006. writeMsg.addU32(gold);
  1007. writeMsg.addU32(0);
  1008. q.execute("UPDATE house_transfer SET done = 1 WHERE id=" + int2str(trans_id));
  1009. q.execute("DELETE FROM houses WHERE house_id=" + int2str(house_id));
  1010. q.free_result();
  1011. }
  1012. }
  1013. q.free_result();
  1014. writeMsg.WriteToSocket(socket);
  1015. /*
  1016. NetworkMessage writeMsg;
  1017. writeMsg.addByte(0x00);
  1018. //writeMsg.addU16(0);
  1019. q.get_result("SELECT house_id,player_id,owner_string FROM houses WHERE virgin='1'");
  1020. int houses_total = 0;
  1021. while(q.fetch_row())
  1022. {
  1023. houses_total++;
  1024. }
  1025. q.free_result();
  1026. writeMsg.addU16(houses_total+0);
  1027. q.get_result("SELECT house_id,player_id,owner_string FROM houses WHERE virgin='1'");
  1028. while(q.fetch_row())
  1029. {
  1030. std::cout << ":: Retrieving house..." << std::endl;
  1031. long house_id = q.getval();
  1032. long player_id = q.getval();
  1033. std::string owner_name = q.getstr();
  1034. writeMsg.addU16(house_id);
  1035. writeMsg.addU32(player_id);
  1036. writeMsg.addString(owner_name.c_str());
  1037. }
  1038. q.free_result();
  1039. //q.execute("UPDATE houses SET virgin='0'");
  1040. //q.free_result();
  1041. // writeMsg.addU16(0);
  1042. // writeMsg.addU32(0); //playerId?
  1043. // writeMsg.addString("New owner?");
  1044. // writeMsg.addU32(0); //new owner?
  1045. writeMsg.WriteToSocket(socket);
  1046.  
  1047. /*
  1048. */
  1049. }
  1050. else if(packetId == 0x24){
  1051. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1052. Query q(db);
  1053. // FACC eviction
  1054. std::cout << "Received evictFreeAccounts packet (0x24)" << std::endl;
  1055. parseDebug(msg);
  1056.  
  1057. NetworkMessage writeMsg;
  1058. writeMsg.addByte(0x00);
  1059.  
  1060. q.get_result("SELECT houses.house_id, houses.player_id FROM `houses` LEFT JOIN players ON players.account_id=houses.player_id LEFT JOIN users ON users.login=players.account_nr WHERE users.premium='0'");
  1061. int total = q.num_rows();
  1062.  
  1063. writeMsg.addU16(total);
  1064. if(total) {
  1065. std::cout << ":: There are " << dec << total << " free accounts with house ownership." << std::endl;
  1066. while(q.fetch_row())
  1067. {
  1068. unsigned short house_id = q.getval();
  1069. unsigned int player_id = q.getval();
  1070. std::cout << ":: Retrieving house " << dec << house_id << " with owner " << dec << player_id << std::endl;
  1071. writeMsg.addU16(house_id);
  1072. writeMsg.addU32(player_id);
  1073. }
  1074. }
  1075. q.free_result();
  1076. writeMsg.WriteToSocket(socket);
  1077. }
  1078. else if(packetId == 0x25){
  1079. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1080. Query q(db);
  1081. // Deleted char eviction
  1082. std::cout << "Received evictDeletedCharacters packet (0x25)" << std::endl;
  1083. parseDebug(msg);
  1084.  
  1085. //has no data
  1086.  
  1087. //our reply:
  1088. NetworkMessage writeMsg;
  1089. writeMsg.addByte(0x00);
  1090. q.get_result("SELECT houses.house_id, houses.player_id FROM `houses` LEFT JOIN players ON players.account_id=houses.player_id WHERE players.account_id IS NULL UNION SELECT houses.house_id, houses.player_id FROM `houses` LEFT JOIN players ON players.account_id = houses.player_id LEFT JOIN users ON users.login = players.account_nr WHERE users.bandelete='1'");
  1091. int total = q.num_rows();
  1092.  
  1093. writeMsg.addU16(total);
  1094. if(total) {
  1095. std::cout << ":: There are " << dec << total << " deleted characters with house ownership." << std::endl;
  1096. while(q.fetch_row())
  1097. {
  1098. unsigned short house_id = q.getval();
  1099. unsigned int player_id = q.getval();
  1100. std::cout << ":: Retrieving house " << dec << house_id << " with owner " << dec << player_id << std::endl;
  1101. writeMsg.addU16(house_id);
  1102. writeMsg.addU32(player_id);
  1103. }
  1104. }
  1105. q.free_result();
  1106. writeMsg.WriteToSocket(socket);
  1107.  
  1108. }
  1109. else if(packetId == 0x26) {
  1110. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1111. Query q(db);
  1112.  
  1113. std::cout << "Received evictExGuildLeaders packet (0x26)" << std::endl;
  1114. parseDebug(msg);
  1115.  
  1116. unsigned short Count = msg.getU16();
  1117. std::cout << "Count: " << dec << Count << std::endl;
  1118. for(unsigned short i = 0; i < Count; i++) {
  1119. unsigned short house_id = msg.getU16();
  1120. unsigned int player_id = msg.getU32();
  1121. std::cout << "Retrieving guildhouse " << dec << house_id << " with owner " << dec << player_id << std::endl;
  1122. }
  1123.  
  1124. NetworkMessage writeMsg;
  1125. writeMsg.addByte(0x00);
  1126. writeMsg.addU16(0);
  1127. writeMsg.WriteToSocket(socket);
  1128. }
  1129. else if(packetId == 0x2A){
  1130. // getHouseOwners
  1131.  
  1132. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1133. Query q(db);
  1134. std::cout << "Received getHouseOwners packet (0x2A)" << std::endl;
  1135.  
  1136. NetworkMessage writeMsg;
  1137. writeMsg.addByte(0x00); // Error code
  1138.  
  1139. q.get_result("SELECT house_id,player_id,owner_string FROM houses");
  1140. int total = q.num_rows();
  1141. writeMsg.addU16(total);
  1142.  
  1143. if(total) {
  1144. std::cout << ":: About to load " << dec << total << " houses." << std::endl;
  1145. while(q.fetch_row())
  1146. {
  1147. std::cout << ":: Retrieving house..." << std::endl;
  1148. unsigned short house_id = q.getval();
  1149. unsigned int player_id = q.getval();
  1150. std::string owner_name = q.getstr();
  1151. std::cout << ":: HouseID " << dec << house_id << std::endl;
  1152. std::cout << ":: PlayerID " << dec << player_id << std::endl;
  1153. writeMsg.addU16(house_id);
  1154. writeMsg.addU32(player_id);
  1155. writeMsg.addString(owner_name.c_str());
  1156. writeMsg.addU32(player_id);
  1157. std::cout << ":: Owner " << owner_name << std::endl;
  1158. }
  1159. }
  1160. q.free_result();
  1161. writeMsg.WriteToSocket(socket);
  1162. }
  1163. else if(packetId == 0x27) {
  1164. std::cout << "Received insertHouseOwner packet (0x27)" << std::endl;
  1165. parseDebug(msg);
  1166.  
  1167. unsigned short houseID = msg.getU16();
  1168. unsigned int owner = msg.getU32();
  1169. unsigned int paid = msg.getU32();
  1170. unsigned char unknown = msg.getByte();
  1171. std::cout << "HouseID: " << dec << houseID << endl;
  1172. std::cout << "OwnerID: " << dec << owner << endl;
  1173. std::cout << "Paiduntil: " << dec << paid << endl;
  1174. std::cout << "Unknown: " << dec << unknown << endl;
  1175.  
  1176. NetworkMessage writeMsg;
  1177. writeMsg.addByte(0x00); // ErrorCode
  1178. writeMsg.WriteToSocket(socket);
  1179. }
  1180. else if(packetId == 0x28) {
  1181. std::cout << "Received updateHouseOwner packet (0x28)" << std::endl;
  1182.  
  1183. unsigned short houseID = msg.getU16();
  1184. unsigned int owner = msg.getU32();
  1185. unsigned int paid = msg.getU32();
  1186. unsigned char unknown = msg.getByte();
  1187. std::cout << "HouseID: " << dec << houseID << endl;
  1188. std::cout << "OwnerID: " << dec << owner << endl;
  1189. std::cout << "Paiduntil: " << dec << paid << endl;
  1190. std::cout << "Unknown: " << dec << unknown << endl;
  1191.  
  1192. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1193. Query q(db);
  1194. q.get_result("SELECT player_id, paid_until FROM houses WHERE house_id = " + int2str(houseID));
  1195. if(q.fetch_row()) {
  1196. unsigned int owner_old = q.getval();
  1197. unsigned int paid_old = q.getval();
  1198. q.free_result();
  1199. if(owner == owner_old) {
  1200. if(paid != paid_old) {
  1201. std::cout << "Updating paid_until for house " << dec << houseID << " to " << dec << paid << std::endl;
  1202. q.execute("UPDATE houses SET paid_until = " + int2str(paid) + " WHERE house_id = " + int2str(houseID));
  1203. q.free_result();
  1204. }
  1205. }
  1206. else if(owner == 0) {
  1207. std::cout << "Removing house owner " << dec << owner_old << " for house " << dec << dec << houseID << std::endl;
  1208. q.execute("DELETE FROM houses WHERE house_id = " + int2str(houseID));
  1209. q.free_result();
  1210. q.execute("UPDATE house SET auctioned='1', auction_days=0, bid=0, bidder_id=0, bidlimit=0 WHERE house_id = " + int2str(houseID));
  1211. q.free_result();
  1212. }
  1213. else {
  1214. q.get_result("SELECT charname FROM players WHERE account_id = " + int2str(owner));
  1215. if(q.fetch_row()) {
  1216. std::string name = q.getstr();
  1217. q.free_result();
  1218. q.execute("UPDATE houses SET player_id = " + int2str(owner) + ", owner_string = '" + Database::escapeString(name) + "', paid_until = " + int2str(paid) + " WHERE house_id = " + int2str(houseID));
  1219. q.free_result();
  1220. q.execute("UPDATE house SET auctioned='0' WHERE house_id = " + int2str(houseID));
  1221. q.free_result();
  1222. std::cout << "House owner set to " << name << " (" << dec << owner << ") for house " << dec << dec << houseID << std::endl;
  1223. }
  1224. else {
  1225. std::cout << "Player " << owner << " not found in database." << std::endl;
  1226. q.free_result();
  1227. }
  1228. }
  1229. }
  1230. else if(!owner) {
  1231. std::cout << "House owner " << owner << " for house " << houseID << " missing (paid=" << paid << ")" << std::endl;
  1232. }
  1233.  
  1234. NetworkMessage writeMsg;
  1235. writeMsg.addByte(0x00); // ErrorCode
  1236. writeMsg.WriteToSocket(socket);
  1237. }
  1238. else if(packetId == 0x29) {
  1239. std::cout << "Received deleteHouseOwner packet (0x29)" << std::endl;
  1240. parseDebug(msg);
  1241.  
  1242. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1243. Query q(db);
  1244. unsigned short houseID = msg.getU16();
  1245. unsigned char unknown = msg.getByte(); // Might be type of eviction
  1246. std::cout << "House ID: " << dec << houseID << endl;
  1247. std::cout << "Unknown: " << dec << unknown << endl;
  1248.  
  1249. NetworkMessage writeMsg;
  1250. writeMsg.addByte(0x00); // ErrorCode
  1251. writeMsg.WriteToSocket(socket);
  1252. }
  1253. else if(packetId == 0x1c) {
  1254. accountID=0;
  1255. accountNR=0;
  1256.  
  1257. std::cout << "Received banishIPAddress Packet (0x1c)" << std::endl;
  1258. parseDebug(msg);
  1259.  
  1260. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1261. Query q(db);
  1262.  
  1263. unsigned int gmID = msg.getU32();
  1264. std::string bannedStr = msg.getString();
  1265. std::string ip = msg.getString();
  1266. std::string reasonStr = msg.getString();
  1267. std::string commentStr = msg.getString();
  1268.  
  1269. std::cout << "gmID=" << dec << gmID << std::endl;
  1270. std::cout << "bannedStr=" << bannedStr.length() << std::endl;
  1271. std::cout << "ip=" << ip << std::endl;
  1272. std::cout << "reasonStr=" << reasonStr.length() << std::endl;
  1273. std::cout << "commentStr=" << commentStr.length() << std::endl;
  1274.  
  1275. q.get_result("SELECT account_nr,account_id FROM players WHERE charname = '" + Database::escapeString(bannedStr) + "'");
  1276. if(q.fetch_row()) {
  1277. accountNR = q.getval();
  1278. accountID = q.getval();
  1279. }
  1280. q.free_result();
  1281.  
  1282. unsigned int session_ip = 0;
  1283. q.get_result("SELECT session_ip FROM users WHERE login = " + accountNR);
  1284. if(q.fetch_row()) {
  1285. session_ip = q.getval();
  1286. }
  1287. q.free_result();
  1288.  
  1289. q.execute("INSERT INTO banishments (account_nr,account_id,ip,violation,comment,timestamp,banished_until,gm_id,punishment_type) VALUES ('"+int2str(accountNR)+"','"+int2str(accountID)+"','"+int2str(session_ip)+"','"+Database::escapeString(reasonStr)+"','"+Database::escapeString(commentStr)+"',UNIX_TIMESTAMP(),UNIX_TIMESTAMP()+86400,'"+int2str(gmID)+"',3)");
  1290. q.free_result();
  1291.  
  1292. NetworkMessage writeMsg;
  1293. writeMsg.addByte(0x00); // ErrorCode
  1294.  
  1295. writeMsg.WriteToSocket(socket);
  1296. }
  1297. else if(packetId == 0x1e) {
  1298. std::cout << "Received addBuddy packet (0x1e)" << std::endl;
  1299. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1300. Query q(db);
  1301. unsigned int accountNumber = msg.getU32();
  1302. unsigned int buddyID = msg.getU32();
  1303. std::cout << "Adding buddy " << dec << buddyID << " to " << dec << accountNumber << std::endl;
  1304. initiatingId = 0;
  1305. q.get_result("SELECT account_id FROM players WHERE online='1' AND account_nr = '" + int2str(accountNumber) + "'");
  1306. if (q.fetch_row()) {
  1307. initiatingId = q.getval();
  1308. q.free_result();
  1309. }
  1310. q.get_result("SELECT charname FROM players WHERE account_id = " + int2str(buddyID));
  1311. if(q.fetch_row()) {
  1312. std::string buddyName = q.getstr();
  1313. q.free_result();
  1314. q.execute("INSERT INTO buddy (account_nr,buddy_id,buddy_string,timestamp,initiating_id) VALUES ('" + int2str(accountNumber) + "','" + int2str(buddyID) + "','" + Database::escapeString(buddyName.c_str()) + "',UNIX_TIMESTAMP(),'" + int2str(initiatingId) + "')");
  1315. q.free_result();
  1316. NetworkMessage writeMsg;
  1317. writeMsg.addByte(0x00); // ErrorCode
  1318. writeMsg.WriteToSocket(socket);
  1319. } else {
  1320. NetworkMessage writeMsg;
  1321. writeMsg.addByte(0x01); // ErrorCode
  1322. writeMsg.WriteToSocket(socket);
  1323. }
  1324. }
  1325. else if(packetId == 0x1f) {
  1326. std::cout << "Received removeBuddy packet (0x1f)" << std::endl;
  1327. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1328. Query q(db);
  1329. unsigned int accountNumber = msg.getU32();
  1330. unsigned int buddyID = msg.getU32();
  1331. std::cout << "Removing buddy " << dec << buddyID << " for " << dec << accountNumber << std::endl;
  1332. q.execute("DELETE FROM buddy WHERE account_nr = '" + int2str(accountNumber) + "' AND buddy_id = '" + int2str(buddyID) + "'");
  1333. q.free_result();
  1334. NetworkMessage writeMsg;
  1335. //parseDebug(msg);
  1336. writeMsg.addByte(0x00); // ErrorCode
  1337. writeMsg.WriteToSocket(socket);
  1338. }
  1339. else if(packetId == 0x2B){
  1340. // End of auctions
  1341. std::cout << "Received getAuctions packet (0x2B)" << std::endl;
  1342. parseDebug(msg);
  1343.  
  1344. //not updated yet // Simone
  1345.  
  1346. NetworkMessage writeMsg;
  1347. unsigned char type = msg.getByte();
  1348. writeMsg.addByte(0x00);
  1349. writeMsg.addU16(0);
  1350. /*writeMsg.addByte(0x01);
  1351. writeMsg.addByte(0x00);
  1352. writeMsg.addByte(0x11); // WORD of house ID. 0x2711 = 10001.
  1353. writeMsg.addByte(0x27);*/
  1354. writeMsg.WriteToSocket(socket);
  1355. }
  1356. else if(packetId == 0x2C){
  1357. // startAuction
  1358. //std::cout << "Received startAuction packet (0x2C)" << std::endl;
  1359. int houseID = msg.getU16();
  1360. std::cout << "StartAuction houseID: " << int2str((int) houseID) << std::endl;
  1361.  
  1362. //our reply:
  1363. //gameworld seems not be wanting a reply
  1364.  
  1365. NetworkMessage writeMsg;
  1366. unsigned char type = msg.getByte();
  1367. writeMsg.addByte(0x00);
  1368. writeMsg.WriteToSocket(socket);
  1369. }
  1370. else if(packetId == 0x2D){
  1371. // insertHouses
  1372. std::cout << "Received insertHouses packet (0x2D)" << std::endl;
  1373. parseDebug(msg);
  1374.  
  1375. unsigned short count = msg.getU16(); //1 (counter?)
  1376. unsigned short houseId = msg.getU16(); //10001
  1377. std::string houseName = msg.getString(); //Spiritkeep
  1378. unsigned int rent = msg.getU32(); //19210 (rent?)
  1379. std::string houseDesc = msg.getString(); //This guildhall has twenty-three beds.
  1380. unsigned short tiles = msg.getU16(); //378 (total tiles?)
  1381.  
  1382. unsigned short posx = msg.getU16(); //32264
  1383. unsigned short posy = msg.getU16(); //32314
  1384. unsigned char posz = msg.getByte(); //7
  1385.  
  1386. std::string townName = msg.getString(); //Thais
  1387. unsigned char guildhouse = msg.getByte(); //guildhouse 1 = yes, 0 = no?
  1388.  
  1389. std::cout << "count: " << dec << count << std::endl;
  1390. std::cout << "houseId: " << dec << houseId << std::endl;
  1391. std::cout << "houseName: " << houseName << std::endl;
  1392. std::cout << "rent (rent?): " << dec << rent << std::endl;
  1393. std::cout << "houseDesc: " << houseDesc << std::endl;
  1394. std::cout << "tiles?: " << dec << tiles << std::endl;
  1395. std::cout << "x: " << dec << posx << ", y: " << dec << posy << ", z: " << dec << posz << std::endl;
  1396. std::cout << "Town: " << townName << std::endl;
  1397. std::cout << "guildhouse: " << dec << guildhouse << std::endl;
  1398.  
  1399. NetworkMessage writeMsg;
  1400. writeMsg.addByte(0x00);
  1401. writeMsg.WriteToSocket(socket);
  1402. }
  1403. else if(packetId == 0x2E){
  1404. // clearIsOnline
  1405. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1406. Query q(db);
  1407. std::cout << "Received clearIsOnline packet (0x2E)" << std::endl;
  1408. parseDebug(msg);
  1409. q.execute("UPDATE players SET online='0'");
  1410. q.free_result();
  1411. unsigned char unknown = msg.getByte();
  1412. std::cout << "unknown :" << (int) unknown << std::endl;
  1413.  
  1414. NetworkMessage writeMsg;
  1415. writeMsg.addByte(0x00);
  1416. writeMsg.addU16(0);
  1417. writeMsg.WriteToSocket(socket);
  1418. }
  1419. else if(packetId == 0x2F){
  1420. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1421. Query q(db);
  1422. // createPlayerlist
  1423. std::cout << "Received createPlayerlist packet (0x2F)" << std::endl;
  1424.  
  1425. unsigned short players_online = msg.getU16();
  1426. if (players_online != 65535) {
  1427. q.execute("TRUNCATE TABLE online");
  1428. q.free_result();
  1429. for(unsigned short i = 0; i < players_online; i++) {
  1430. std::string name = msg.getString();
  1431. unsigned short level = msg.getU16();
  1432. std::string voc = msg.getString();
  1433. q.execute("INSERT INTO online VALUES('" + Database::escapeString(name) + "', " + int2str(level) + ", '" + Database::escapeString(voc) + "')");
  1434. q.free_result();
  1435. }
  1436. q.execute("UPDATE stats SET players_online = '" + int2str(players_online) + "'");
  1437. q.free_result();
  1438. std::cout << "Online: " << dec << players_online << std::endl;
  1439. q.get_result("SELECT record_online FROM stats");
  1440. unsigned short my_record = 1;
  1441. if(q.fetch_row()) {
  1442. my_record = q.getval();
  1443. }
  1444. q.free_result();
  1445. if (players_online > my_record) {
  1446. NetworkMessage writeMsg;
  1447. writeMsg.addByte(0x00); // Error code
  1448. writeMsg.addByte(0xFF); // Indicate if this is a record or not.
  1449. writeMsg.WriteToSocket(socket);
  1450. q.execute("UPDATE stats SET record_online = '" + int2str(players_online) + "'");
  1451. q.free_result();
  1452. } else {
  1453. NetworkMessage writeMsg;
  1454. writeMsg.addByte(0x00); // Error code
  1455. writeMsg.addByte(0x00); // Indicate if this is a record or not.
  1456. writeMsg.WriteToSocket(socket);
  1457. }
  1458. } else {
  1459. std::cout << "Closing listen socket, status: " << players_online << std::endl;
  1460. NetworkMessage writeMsg;
  1461. writeMsg.addByte(0x00); // Error code
  1462. writeMsg.addByte(0x00); // Indicate if this is a record or not.
  1463. writeMsg.WriteToSocket(socket);
  1464. closesocket(socket);
  1465. socket = 0;
  1466. }
  1467. }
  1468. else if(packetId == 0x30){
  1469. std::cout << "Received logKilledCreatures packet (0x30)" << std::endl;
  1470.  
  1471. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1472. Query q(db);
  1473.  
  1474. // Num of creatures (2 bytes), length string (2b) string of creature, long killed by, long killed
  1475. unsigned short Count = msg.getU16();
  1476. std::cout << "Count: " << dec << Count << std::endl;
  1477. for(unsigned short i = 0; i < Count; i++) {
  1478. std::string name = msg.getString();
  1479. unsigned int killedby = msg.getU32();
  1480. unsigned int killed = msg.getU32();
  1481. q.execute("INSERT INTO creature_stats VALUES('" + Database::escapeString(name) + "', " + int2str(killedby) + ", " + int2str(killed) + ", UNIX_TIMESTAMP())");
  1482. q.free_result();
  1483. }
  1484. NetworkMessage writeMsg;
  1485. writeMsg.addByte(0x00);
  1486. writeMsg.WriteToSocket(socket);
  1487. }
  1488. else if(packetId == 0x32){
  1489. // loadPlayers
  1490. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1491. Query q(db);
  1492. std::cout << "Received loadPlayers packet (0x32)" << std::endl;
  1493.  
  1494. unsigned int unknown = msg.getU32();
  1495. std::cout << "unknown: " << unknown << std::endl;
  1496.  
  1497. std::cout << ":: Preloading players... " << std::endl;
  1498. q.get_result("SELECT account_id,charname FROM players WHERE lastlogin > UNIX_TIMESTAMP()-2678400");
  1499. unsigned int total = q.num_rows();
  1500.  
  1501. NetworkMessage writeMsg;
  1502. writeMsg.addByte(0x00); // Error code
  1503. writeMsg.addU32(total); // Players
  1504. if(total) {
  1505. while(q.fetch_row())
  1506. {
  1507. unsigned int accId = q.getval();
  1508. std::string character_name = q.getstr();
  1509. writeMsg.addString(character_name.c_str());
  1510. writeMsg.addU32(accId);
  1511. std::cout << "++ Added player " << character_name << std::endl;
  1512. }
  1513. }
  1514. q.free_result();
  1515. writeMsg.WriteToSocket(socket);
  1516. }
  1517. else if(packetId == 0x33) {
  1518. std::cout << "Received excludeFromAuctions packet (0x33)" << std::endl;
  1519. parseDebug(msg);
  1520. NetworkMessage writeMsg;
  1521.  
  1522. unsigned int bidder = msg.getU32();
  1523. unsigned char unknown = msg.getByte();
  1524. unsigned char unknown2 = msg.getByte();
  1525. std::cout << "Bidder: " << dec << bidder << endl;
  1526. std::cout << "Unknown1: " << dec << unknown << endl;
  1527. std::cout << "Unknown2: " << dec << unknown2 << endl;
  1528.  
  1529. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1530. Query q(db);
  1531. q.get_result("SELECT house_id FROM house WHERE bidder_id = " + int2str(bidder));
  1532. if(q.fetch_row()) {
  1533. unsigned int house = q.getval();
  1534. q.free_result();
  1535. q.execute("UPDATE house SET auctioned='1', auction_days=0, bid=0, bidder_id=0, bidlimit=0 WHERE house_id = " + int2str(house));
  1536. q.free_result();
  1537. std::cout << "House ID " << dec << house << " is now on auction." << endl;
  1538. }
  1539.  
  1540. writeMsg.addByte(0x00);
  1541. writeMsg.WriteToSocket(socket);
  1542. }
  1543. else if(packetId == 0x35){
  1544. std::cout << "Received loadWorldConfig packet (0x35)" << std::endl;
  1545.  
  1546. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1547. Query q(db);
  1548. std::cout << "Determining WorldType" << std::endl;
  1549. NetworkMessage writeMsg;
  1550. writeMsg.addByte(0x00); // Error code
  1551. writeMsg.addByte(0); // World Type (0 = normal pvp, 1 = non-pvp, 2 = pvp enforced)
  1552. writeMsg.addByte(rebootTime); // Reboot time (0x09 = 09:00)
  1553.  
  1554. /* IP Address to bind, consider using inet_aton */
  1555. writeMsg.addByte(192);
  1556. writeMsg.addByte(168);
  1557. writeMsg.addByte(10);
  1558. writeMsg.addByte(221);
  1559. /* Port we listen to */
  1560. writeMsg.addU16(servPort);
  1561.  
  1562. /* Some free account / premmy player buffers, not a clue which are which */
  1563. // Reboot + Port + PremBuffer + MaxN00bs + PremN00bs
  1564. writeMsg.addU16(1500); // Maxplayers
  1565. writeMsg.addU16(900); // PremBuffer
  1566. writeMsg.addU16(500); // MaxNewbies
  1567. writeMsg.addU16(250); // Reserved for Premn00bs
  1568. writeMsg.WriteToSocket(socket);
  1569.  
  1570. // We should probably close the socket after this request.
  1571. }
  1572. else if (packetId == 0xcb){
  1573. std::cout << "Received highscore packet (0xCB)" << std::endl;
  1574. //parseDebug(msg);
  1575. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1576. Query q(db);
  1577. unsigned char unknown2 = msg.getByte();
  1578. unsigned int unknown3 = msg.getU32();
  1579. /*std::cout << "Unknown2: " << unknown2 << std::endl;
  1580. std::cout << "Unknown3: " << (int) unknown3 << std::endl;*/
  1581. NetworkMessage writeMsg;
  1582. writeMsg.addByte(0x00); // Error code
  1583.  
  1584. writeMsg.addU32(0x01);
  1585. writeMsg.addU32(19482226);
  1586. writeMsg.addU32(0x01);
  1587. writeMsg.addU32(19482226);
  1588.  
  1589. /*
  1590. q.get_result("SELECT account_id FROM players");
  1591. int my_players = 0;
  1592. while(q.fetch_row())
  1593. {
  1594. my_players++;
  1595. }
  1596. q.free_result();
  1597. writeMsg.addU32(my_players); // Amount of players?
  1598.  
  1599. q.get_result("SELECT account_id FROM players");
  1600. accId=0;
  1601. while(q.fetch_row())
  1602. {
  1603. accId = q.getval();
  1604. writeMsg.addU32(accId);
  1605. }
  1606. q.free_result();
  1607. */
  1608. writeMsg.WriteToSocket(socket);
  1609. }
  1610. else if (packetId == 0xcc){
  1611. std::cout << "Received createHighscores packet (0xCC)" << std::endl;
  1612. //parseDebug(msg);
  1613. Database db("localhost","otserv","Cz7u89dmyPzHDNEL","otserv");
  1614. Query q(db);
  1615.  
  1616. q.execute("DELETE FROM highscores");
  1617. q.free_result();
  1618.  
  1619. unsigned int Count = msg.getU32();
  1620. if(Count > 0) {
  1621. q.execute("START TRANSACTION");
  1622. q.free_result();
  1623. std::cout << "Count: " << dec << Count << std::endl;
  1624. for(unsigned int i = 0; i < Count; i++) {
  1625. unsigned int ACCID = msg.getU32();
  1626. unsigned int EXP = msg.getU32();
  1627. unsigned short LVL = msg.getU16();
  1628. unsigned short S0 = msg.getU16();
  1629. unsigned short S1 = msg.getU16();
  1630. unsigned short S2 = msg.getU16();
  1631. unsigned short S3 = msg.getU16();
  1632. unsigned short S4 = msg.getU16();
  1633. unsigned short S5 = msg.getU16();
  1634. unsigned short ML = msg.getU16();
  1635. unsigned short S6 = msg.getU16();
  1636. q.get_result("SELECT players.charname, players.vocation FROM players, users WHERE players.account_id = " + int2str(ACCID) + " AND players.account_nr=users.login AND users.userlevel=0 LIMIT 1");
  1637. if(q.fetch_row()) {
  1638. std::string name = q.getstr();
  1639. std::string voc = q.getstr();
  1640. q.free_result();
  1641.  
  1642. q.execute("INSERT INTO highscores (account_id, charname, vocation, level, exp, mlvl, skill_fist, skill_club, skill_axe, skill_sword, skill_dist, skill_shield, skill_fish) VALUES (" + int2str(ACCID) + ", '" + Database::escapeString(name) + "','" + Database::escapeString(voc) + "'," + int2str(LVL) + "," + int2str(EXP) + "," + int2str(ML) + "," + int2str(S0) + "," + int2str(S1) + "," + int2str(S2) + "," + int2str(S3) + "," + int2str(S4) + "," + int2str(S5) + "," + int2str(S6) + ")");
  1643. q.free_result();
  1644. } else {
  1645. q.free_result();
  1646. }
  1647. }
  1648. q.execute("UPDATE pg LEFT JOIN highscores ON highscores.account_id = pg.account_id SET exp_1 = exp_1 + highscores.exp - pg.exp, pg.exp = highscores.exp");
  1649. q.free_result();
  1650. q.execute("COMMIT");
  1651. q.free_result();
  1652. }
  1653.  
  1654. NetworkMessage writeMsg;
  1655. writeMsg.addByte(0x00); // Error code
  1656.  
  1657. writeMsg.WriteToSocket(socket);
  1658. }
  1659. else{
  1660. std::cout << "Unknown packet type: " << (int) packetId << std::endl;
  1661. parseDebug(msg);
  1662. }
  1663. }
  1664.  
  1665. if(socket){
  1666. closesocket(socket);
  1667. }
  1668.  
  1669. return 0;
  1670. }
  1671.  
  1672. [/spoiler]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement