Advertisement
Guest User

Untitled

a guest
Jul 1st, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 11.69 KB | None | 0 0
  1. void CLoginServer::pakUserLogin( CLoginClient* thisclient, CPacket* pak )
  2. {
  3. CPacket pakout;
  4.  
  5. pak->GetString_x( 6, thisclient->username, 20 );
  6. pak->GetString_x( 26, thisclient->password, 20 );
  7.  
  8. Log( MSG_INFO, "Username: %s Password: %s ", thisclient->username, thisclient->password );
  9.  
  10. MYSQL_RES *result;
  11. MYSQL_ROW row;
  12. rwmMySQL.acquireWriteLock( );
  13. DoSQL("SELECT id,username,password,accesslevel,verified,banned FROM accounts WHERE username='%s'", thisclient->username);
  14. rwmMySQL.releaseWriteLock( );
  15. result = mysql_store_result(mysql);
  16. // check if User exists
  17. if(mysql_num_rows(result) <= 0)
  18. {
  19. //09 00 0C 00 00 00 00 00 01
  20. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  21. pakout.AddWord( LOGIN_REQUEST );
  22. for( int i=0; i<4; i++ )
  23. pakout.AddByte( 0 );
  24. pakout.AddByte( AcountNotExist );
  25. SendPacket( thisclient, &pakout );
  26. return;
  27. }
  28. row = mysql_fetch_row(result);
  29. // check if password is correct
  30. if(strcmp(thisclient->password, row[2]) != 0)
  31. {
  32. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  33. pakout.AddWord( LOGIN_REQUEST );
  34. for( int i=0; i<4; i++ )
  35. pakout.AddByte( 0 );
  36. pakout.AddByte( WrongPassword );
  37. SendPacket( thisclient, &pakout );
  38. return;
  39. }
  40. thisclient->userid = atoi(row[0]);
  41. thisclient->accesslevels = atoi(row[3]);
  42. int banned = atoi(row[5]);
  43.  
  44. // check if banned
  45. if( banned == AL_BANNED )
  46. {
  47. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  48. pakout.AddWord( LOGIN_REQUEST );
  49. for( int i=0; i<4; i++ )
  50. pakout.AddByte( 0 );
  51. pakout.AddByte( Suspended );
  52. SendPacket( thisclient, &pakout );
  53. return;
  54. }
  55. else
  56. {
  57. if (_atoi64(row[5]) <= time(NULL))
  58. {
  59. rwmMySQL.acquireReadLock( );
  60. DoSQL("UPDATE accounts SET banned = %d WHERE id = %d", AL_NORMAL, atoi(row[0]));
  61. banned = AL_NORMAL;
  62. rwmMySQL.releaseReadLock( );
  63. }
  64.  
  65. }
  66. //check if already logged in
  67. for(unsigned i = 0; i < ClientList.size(); i++)
  68. {
  69. CLoginClient* otherclient = (CLoginClient*)ClientList[i];
  70. if((thisclient != otherclient) && (strcmp(thisclient->username, otherclient->username) == 0))
  71. {
  72. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  73. pakout.AddWord( LOGIN_REQUEST );
  74. for( int i=0; i<4; i++ )
  75. pakout.AddByte( 0 );
  76. pakout.AddByte( DuplicateConnection );
  77. SendPacket( thisclient, &pakout );
  78. return;
  79. }
  80. }
  81. // send the username information
  82. rwmMySQL.acquireReadLock( );
  83. DoSQL( "UPDATE accounts SET last_ip='%s' WHERE id='%d'", thisclient->ip, thisclient->userid );
  84. rwmMySQL.releaseReadLock( );
  85.  
  86. pakChannelList( thisclient, pak );
  87.  
  88. }
  89. void CLoginServer::pakChannelList( CLoginClient* thisclient, CPacket* pak )
  90. {
  91. CPacket pakout;
  92.  
  93. pakout.StartPacket( LOGIN_CHANNEL_HEADER );
  94. pakout.AddWord( LOGIN_REQUEST );
  95. for( int i=0; i<4; i++ )
  96. pakout.AddByte( 0 );
  97. pakout.AddByte( OK );
  98. pakout.AddByte( 1 );
  99. pakout.AddByte( 1 );
  100. pakout.AddWord( max_channel ); // channel ammount
  101. for ( int i = 0; i < max_server; i++)
  102. {
  103. for ( int j = 0; j < 1; j++)
  104. {
  105. pakout.AddWord( i ); // sever ammount
  106. pakout.AddWord( j ); // channel 1 - 10
  107. pakout.AddByte( 1 ); // exellent mabye...
  108. }
  109. }
  110. SendPacket( thisclient, &pakout );
  111.  
  112. }
  113. void CLoginServer::pakChannelSelect( CLoginClient* thisclient, CPacket* pak )
  114. {
  115. unsigned server = pak->GetWord( 0x06 );
  116. unsigned channel = pak->GetWord( 0x08 );
  117.  
  118. Log( MSG_INFO, "Username: %s has selected Server: %d and Channel: %d ", thisclient->username, server, channel );
  119.  
  120.  
  121. CPacket pakout;
  122.  
  123. pakout.StartPacket( CHANNEL_SELECT_HEADER );
  124. pakout.AddWord( LOGIN_CHANNEL );
  125. for( int i=0; i<4; i++ )
  126. pakout.AddByte( 0 );
  127. pakout.AddByte( OK );
  128. pakout.AddString( thisclient->ip );
  129. for(unsigned c=0; c<16-(unsigned)strlen(thisclient->ip); c++)
  130. pakout.AddByte( 0 );
  131. pakout.AddWord( wport );
  132. pakout.AddByte( 0 );
  133. SendPacket( thisclient, &pakout );
  134. }
  135. void CLoginServer::pakCheckAvailability( CLoginClient* thisclient, CPacket* pak )
  136. {
  137. CPacket pakout;
  138. pak->GetString_x( 6, thisclient->checkcharname, 20 );
  139.  
  140. Log( MSG_INFO, "Username: %s is checking if CharName: %s exists ", thisclient->username, thisclient->checkcharname );
  141.  
  142. MYSQL_RES *result;
  143. rwmMySQL.acquireWriteLock( );
  144. DoSQL("SELECT name FROM characters WHERE name='%s'", thisclient->checkcharname );
  145. rwmMySQL.releaseWriteLock( );
  146. result = mysql_store_result(mysql);
  147. // check if charname exists
  148. if( mysql_num_rows( result ) != 0 )
  149. {
  150. //09 00 0e 00 00 00 00 00 01
  151. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  152. pakout.AddWord( LOGIN_CHECK_CHAR );
  153. for( int i=0; i<4; i++ )
  154. pakout.AddByte( 0 );
  155. pakout.AddByte( 1 );// charname exists
  156. SendPacket( thisclient, &pakout );
  157. return;
  158. }
  159.  
  160. pakout.StartPacket( LOGIN_REQUEST_HEADER );
  161. pakout.AddWord( LOGIN_CHECK_CHAR );
  162. for( int i=0; i<4; i++ )
  163. pakout.AddByte( 0 );
  164. pakout.AddByte( OK );// charname OK
  165. SendPacket( thisclient, &pakout );
  166.  
  167. }
  168. void CLoginServer::pakCharcCreate( CLoginClient* thisclient, CPacket* pak )
  169. {
  170. pak->GetString_x( 10 , thisclient->charname, 20);
  171. unsigned int slot = pak->GetByte( 6 );
  172. unsigned int job = pak->GetByte( 30 );
  173. unsigned int sex = pak->GetByte( 31 );
  174. unsigned int hair = pak->GetByte( 32 );
  175. unsigned int eyes = pak->GetByte( 33 );
  176. unsigned int shirt = pak->GetByte( 34 );
  177. unsigned int pants = pak->GetByte( 35 );
  178.  
  179. Log( MSG_INFO,"charname='%s', slot=%d, job=%d, sex=%d, hair=%d, eyes=%d, shirt=%d, pants=%d", thisclient->charname, slot, job, sex, hair, eyes, shirt, pants );
  180.  
  181. MYSQL_RES *result;
  182. rwmMySQL.acquireWriteLock( );
  183. DoSQL( "SELECT name FROM characters WHERE name='%s'", thisclient->charname );
  184. rwmMySQL.releaseWriteLock( );
  185. result = mysql_store_result( mysql );
  186. if( mysql_num_rows( result ) != 0 )
  187. {
  188.  
  189. // makeing sure the charname exists
  190. Log( MSG_WARNING, "[Username: %s] is hacking charc create packet", thisclient->username );
  191. DisconnectClient( thisclient );
  192.  
  193. return;
  194. }
  195. if( job == 1 )// Swordsman
  196. {
  197. /* Insert the data to MySQL */
  198. rwmMySQL.acquireWriteLock( );
  199. DoSQL( "INSERT INTO characters (owner,slot,name,gender,job,hair,eyes,shirt,pants,hp,mp,maxhp,maxmp,str,dex,intellect,luck,vit,wis ) \
  200. VALUES (%i,%i,'%s',%i,%i,%i,%i,%i,%i,97,20,97,20,13,9,3,5,17,5 )", thisclient->userid, slot, thisclient->charname, sex, job, hair, eyes, shirt, pants );
  201. rwmMySQL.releaseWriteLock( );
  202. }
  203. if( job == 2 )// Mage
  204. {
  205. rwmMySQL.acquireWriteLock( );
  206. DoSQL( "INSERT INTO characters (owner,slot,name,gender,job,hair,eyes,shirt,pants,hp,mp,maxhp,maxmp,str,dex,intellect,luck,vit,wis ) \
  207. VALUES (%i,%i,'%s',%i,%i,%i,%i,%i,%i,55,39,55,39,6,6,14,3,16,11 )", thisclient->userid, slot, thisclient->charname, sex, job, hair, eyes, shirt, pants );
  208. rwmMySQL.releaseWriteLock( );
  209. }
  210. if( job == 3 )// Thief
  211. {
  212. rwmMySQL.acquireWriteLock( );
  213. DoSQL( "INSERT INTO characters (owner,slot,name,gender,job,hair,eyes,shirt,pants,hp,mp,maxhp,maxmp,str,dex,intellect,luck,vit,wis ) \
  214. VALUES (%i,%i,'%s',%i,%i,%i,%i,%i,%i,68,20,68,20,7,11,5,9,15,6 )", thisclient->userid, slot, thisclient->charname, sex, job, hair, eyes, shirt, pants );
  215. rwmMySQL.releaseWriteLock( );
  216. }
  217. if( job == 4 )// Scout
  218. {
  219. rwmMySQL.acquireWriteLock( );
  220. DoSQL( "INSERT INTO characters (owner,slot,name,gender,job,hair,eyes,shirt,pants,hp,mp,maxhp,maxmp,str,dex,intellect,luck,vit,wis ) \
  221. VALUES (%i,%i,'%s',%i,%i,%i,%i,%i,%i,68,24,68,24,6,13,8,5,8,7 )", thisclient->userid, slot, thisclient->charname, sex, job, hair, eyes, shirt, pants );
  222. rwmMySQL.releaseWriteLock( );
  223. }
  224.  
  225. pakSendCharCreate( thisclient, pak );
  226.  
  227.  
  228. }
  229. void CLoginServer::pakSendCharCreate( CLoginClient* thisclient, CPacket* pak )
  230. {
  231. MYSQL_RES* result;
  232. MYSQL_ROW row;
  233.  
  234. rwmMySQL.acquireWriteLock( );
  235. DoSQL( "SELECT owner,slot,name,job,gender,level,str,dex,intellect,vit,luck,wis,hp,maxhp,mp,maxmp,shirt,pants,hair,eyes FROM characters WHERE owner=%i ", thisclient->userid );
  236. rwmMySQL.releaseWriteLock( );
  237. result = mysql_store_result( mysql );
  238. if( mysql_num_rows( result ) <= 0 )
  239. {
  240.  
  241. // some sort of selecting the charc not to sure.....
  242. Log( MSG_WARNING, "[Username: %s] is hacking charc send list", thisclient->username );
  243. DisconnectClient( thisclient );
  244.  
  245. return;
  246. }
  247. row = mysql_fetch_row(result);
  248.  
  249. CPacket pakout;
  250. pakout.StartPacket( 141 );
  251. pakout.AddWord( LOGIN_CHARC_CREATE );
  252. for( int i=0; i<4; i++ )
  253. pakout.AddByte( 0 );
  254.  
  255. pakout.AddByte( OK );
  256. pakout.AddByte( atoi( row[1] ) ); //slot
  257. pakout.AddByte( 0 ); //??
  258. pakout.AddByte( 0 ); //??
  259. pakout.AddByte( 0 ); //??
  260. pakout.AddString( row[2] ); // charname
  261. for(unsigned c=0; c<20-(unsigned)strlen(row[2]); c++)
  262. pakout.AddByte( 0 );
  263. pakout.AddByte( atoi( row[3] ) ); // job1
  264. pakout.AddByte( 0 );// job2
  265. pakout.AddByte( 0 );// job3
  266. pakout.AddByte( 0 );// job4
  267. pakout.AddByte( atoi( row[4] ) ); // ?? 1 or 2 gender mabye
  268. pakout.AddWord( atoi( row[5] ) ); // lvl
  269.  
  270. pakout.AddByte( 0 ); // exp
  271.  
  272. pakout.AddWord( atoi( row[6] ) ); // str
  273. pakout.AddWord( atoi( row[7] ) ); // dex
  274. pakout.AddWord( atoi( row[8] ) ); // int
  275. pakout.AddWord( atoi( row[9] ) ); // vit
  276. pakout.AddWord( atoi( row[10] ) ); // luck
  277. pakout.AddWord( atoi( row[11] ) ); // wis
  278.  
  279. pakout.AddWord( atoi( row[12] ) ); // hp
  280. pakout.AddWord( atoi( row[13] ) ); // maxhp
  281. pakout.AddWord( atoi( row[14] ) ); // mp
  282. pakout.AddWord( atoi( row[15] ) ); // maxmp
  283.  
  284. pakout.AddByte( 0 ); // ??
  285. pakout.AddByte( 0 ); // ??
  286. pakout.AddByte( 0 ); // ??
  287. pakout.AddByte( 0 ); // ??
  288.  
  289. pakout.AddByte( atoi( row[16] ) ); //?? 33 32 34 - shirt
  290. pakout.AddByte( 0 ); // ??
  291. pakout.AddByte( 0xDA ); // weapon ID 43 item id 218
  292. pakout.AddByte( 0 ); //??
  293. pakout.AddWord( 0 );
  294. pakout.AddByte( atoi( row[17] ) ); //?? 3b 3c - paints
  295. for( int i=0; i<13; i++ )
  296. pakout.AddByte( 0 );
  297. pakout.AddByte( atoi( row[18] ) ); //?? 0e 0f 10 - hair mabye
  298. pakout.AddByte( 0 ); //??
  299. pakout.AddByte( atoi( row[19] ) ); //?? 28 27 26 - eyes
  300. for( int i=0; i<53; i++ )
  301. pakout.AddByte( 0x00 );
  302. SendPacket( thisclient, &pakout );
  303.  
  304. //34 00 2B 01 00 00 37 00 00 00 00 00 00 00 00 00
  305. //00 00 00 00 16 00 2E 00 00 00 00 00 00 00 00 00
  306. //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  307. //00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
  308. //00 00 00 00 00 00 00 00 00 00 00 00
  309. }
  310. void CLoginServer::pakSendInGame( CLoginClient* thisclient, CPacket* pak )
  311. {
  312. pak->GetString_x( 7 , thisclient->ingamecharname, 20);
  313.  
  314. Log( MSG_INFO, "Charname: %s is entering game ", thisclient->ingamecharname );
  315.  
  316. MYSQL_RES* result;
  317. MYSQL_RES* result2;
  318. MYSQL_ROW row2;
  319.  
  320. rwmMySQL.acquireWriteLock( );
  321. DoSQL( "SELECT name FROM characters WHERE name='%s'", thisclient->ingamecharname );
  322. rwmMySQL.releaseWriteLock( );
  323. result = mysql_store_result( mysql );
  324. if( mysql_num_rows( result ) <= 0 )
  325. {
  326.  
  327. // makeing sure the charname exists
  328. Log( MSG_WARNING, "[Username: %s] is hacking charc send ingame packet", thisclient->username );
  329. DisconnectClient( thisclient );
  330.  
  331. return;
  332. }
  333.  
  334. rwmMySQL.acquireWriteLock( );
  335. DoSQL( "SELECT password FROM accounts WHERE id=%i", thisclient->userid );
  336. rwmMySQL.releaseWriteLock( );
  337. result2 = mysql_store_result( mysql );
  338. if( mysql_num_rows( result2 ) <= 0 )
  339. {
  340.  
  341. // makeing sure the charname exists
  342. Log( MSG_WARNING, "[Username: %s] is hacking or unable to find password", thisclient->username );
  343. DisconnectClient( thisclient );
  344.  
  345. return;
  346. }
  347. row2 = mysql_fetch_row(result2);
  348.  
  349. CPacket pakout;
  350. pakout.StartPacket( 42 );
  351. pakout.AddWord( LOGIN_CHARC_SELECT );
  352. for( int i=0; i<4; i++ )
  353. pakout.AddByte( 0 );
  354. pakout.AddByte( OK );
  355. pakout.AddString( row2[0] ); // password
  356. for(unsigned c=0; c<32-(unsigned)strlen(row2[0]); c++)
  357. pakout.AddByte( 0 );
  358. pakout.AddByte( 0 );
  359. SendPacket( thisclient, &pakout );
  360.  
  361. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement