Advertisement
Guest User

Untitled

a guest
Sep 26th, 2017
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 16.27 KB | None | 0 0
  1. package net.com.codeusa.net.codec;
  2.  
  3. import net.com.codeusa.Server;
  4. import net.com.codeusa.Engine;
  5. import net.com.codeusa.model.Player;
  6. import net.com.codeusa.util.Misc;
  7.  
  8. public class RS2LoginProtocol {
  9. /**
  10. * Validate a connection.
  11. * <p>To prevent milliseconds waiting for bytes, everytime a new byte is needed to be read
  12. * it is in a new stage which takes over 50 milliseconds before moving on to.
  13. * This allows the bytes to reach the server before trying to read them so that
  14. * read() returns instantly.
  15. * @param p The Player which the frame should be created for.
  16. */
  17. public void login(Player p) {
  18. if (p == null || p.stream == null) {
  19. return;
  20. }
  21. long serverSessionKey = ((long) (Math.random() * 99999999D) << 32) + (long) (Math.random() * 99999999D);
  22. long clientSessionKey = 0;
  23. int returnCode = 2;
  24. if (p.loginStage < -1) {
  25. updateServer(p);
  26. } else if (p.loginStage == 0) {
  27. try {
  28. if (!fillStream(p, 2))
  29. return;
  30. } catch (Exception e) {
  31. return;
  32. }
  33. int connectionType = p.stream.readUnsignedByte();
  34. if (connectionType == 15) {
  35. updateServer(p);
  36. p.loginStage = -5;
  37. return;
  38. }
  39. if (connectionType != 14) {
  40. p.loginStage = -1;
  41. return;
  42. }
  43. int longPlayerName = p.stream.readUnsignedByte();
  44. p.stream.writeByte(0);
  45. p.stream.writeQWord(serverSessionKey);
  46. directFlushStream(p);
  47. p.loginStage++;
  48. } else if (p.loginStage == 1) {
  49. try {
  50. if (!fillStream(p, 3))
  51. return;
  52. } catch (Exception e) {
  53. return;
  54. }
  55. int loginType = p.stream.readUnsignedByte();
  56. if (loginType != 16 && loginType != 18 && loginType != 14) {
  57. p.loginStage = -1;
  58. return;
  59. }
  60. p.loginStage++;
  61. } else if (p.loginStage == 2) {
  62. int loginPacketSize = p.stream.readUnsignedWord();
  63. int loginEncryptPacketSize = loginPacketSize - (36 + 1 + 1 + 2);
  64. if (loginEncryptPacketSize <= 0) {
  65. p.loginStage = -1;
  66. return;
  67. }
  68. try {
  69. if (!fillStream(p, loginPacketSize))
  70. return;
  71. } catch (Exception e) {
  72. return;
  73. }
  74. int clientVersion = p.stream.readDWord();
  75. if (clientVersion != 508) {
  76. p.loginStage = -1;
  77. return;
  78. }
  79. p.stream.readUnsignedByte();
  80. p.stream.readUnsignedWord();
  81. p.stream.readUnsignedWord();
  82. for (int i = 0; i < 24; i++) {
  83. int cacheIDX = p.stream.readUnsignedByte();
  84. }
  85. String junk = p.stream.readString();
  86. for (int i = 0; i < 29; i++) {
  87. int junk2 = p.stream.readDWord();
  88. }
  89. loginEncryptPacketSize--;
  90. int junk29 = p.stream.readUnsignedByte();
  91. int encryption = p.stream.readUnsignedByte();
  92. if (encryption != 10 && encryption != 64) {
  93. p.loginStage = -1;
  94. return;
  95. }
  96. clientSessionKey = p.stream.readQWord();
  97. serverSessionKey = p.stream.readQWord();
  98. p.username = Misc.longToString(p.stream.readQWord()).toLowerCase().replaceAll("_", " ").trim();
  99. if (p.username == null) {
  100. p.loginStage = -1;
  101. p.username = "";
  102. return;
  103. }
  104. for (int i = 0; i < p.username.length(); i++) {
  105. Character c = new Character(p.username.charAt(i));
  106. if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
  107. p.loginStage = -1;
  108. p.username = "";
  109. return;
  110. }
  111. }
  112. if (playerOnline(p.username, p)) {
  113. returnCode = 5;
  114. }
  115. if (checkBannedUsers(p.username)) {
  116. returnCode = 4;
  117. }
  118. String password = p.stream.readString();
  119. if (password == null) {
  120. p.loginStage = -1;
  121. return;
  122. }
  123. for (int i = 0; i < password.length(); i++) {
  124. Character c = new Character(password.charAt(i));
  125. if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
  126. p.loginStage = -1;
  127. return;
  128. }
  129. }
  130. Engine.fileManager.loadCharacter(p);
  131. if (password != null && p.password != null && p.password != "" && !p.password.equals(password)) {
  132. returnCode = 3;
  133. } else {
  134. p.password = password;
  135. }
  136.  
  137. int ipconnections = 0;
  138. for (int i = 0; i < Engine.players.length; i++) {
  139. Player PC = Engine.players[i];
  140. if (PC != null) {
  141. if (PC.socket.socket.getInetAddress().getHostAddress().equals(
  142. p.socket.socket.getInetAddress().getHostAddress())) {
  143. // MATCHED IP
  144. ipconnections += 1;
  145. }
  146. }
  147. }
  148. if (ipconnections >= 4) {
  149. // More than 3 connections
  150. returnCode = 9;
  151. }
  152.  
  153. p.stream.writeByte(returnCode);
  154. p.stream.writeByte(p.rights);
  155. p.stream.writeByte(0);
  156. p.stream.writeByte(0);
  157. p.stream.writeByte(0);
  158. p.stream.writeByte(1);
  159. p.stream.writeByte(0);
  160. p.stream.writeByte(p.playerId);
  161. p.stream.writeByte(0);
  162. directFlushStream(p);
  163. if (p.teleportToX == -1 && p.teleportToY == -1)
  164. p.setCoords(3495, 3489, 0);
  165. Engine.playerMovement.getNextPlayerMovement(p);
  166. if (p.inJadCave()) {
  167. if (p.heightLevel > 0)
  168. p.heightLevel = 0;
  169. }
  170. p.getActionSender().setMapRegion(p);
  171. if (p.inJadCave())
  172. p.setCoords(3123, 9997, 0);
  173. if (p.inClan())
  174. p.setCoords(p.absX, p.absY, 0);
  175. p.getActionSender().setWindowPane(p, 548);
  176. if (p.username.equalsIgnoreCase("goudont")){
  177. for (Player pl : Server.engine.players) {
  178. if (pl != null) {
  179. pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525, Goudont, has logged in.");
  180. p.requestGFX(1555, 0);
  181. }
  182. }
  183. }
  184. if (p.username.equalsIgnoreCase("danny")){
  185. for (Player pl : Server.engine.players) {
  186. if (pl != null) {
  187. pl.getActionSender().sendMessage(pl, "<col=ff555>The Co-Owner and Legend, Danny, is here.");
  188. p.requestGFX(1555, 0);
  189. }
  190. }
  191. }
  192. if (p.username.equalsIgnoreCase("jackson")){
  193. for (Player pl : Server.engine.players) {
  194. if (pl != null) {
  195. pl.getActionSender().sendMessage(pl, "The V.I.P of Goudont 525, Jackson, has returned.");
  196. p.requestGFX(1555, 0);
  197. }
  198. }
  199. }
  200. if (p.username.equalsIgnoreCase("Emilios")){
  201. for (Player pl : Server.engine.players) {
  202. if (pl != null) {
  203. pl.getActionSender().sendMessage(pl, "Head of all Administrators, Emilios rolls up.");
  204. p.requestGFX(1555, 0);
  205. }
  206. }
  207. }
  208. if (p.username.equalsIgnoreCase("jumper")){
  209. for (Player pl : Server.engine.players) {
  210. if (pl != null) {
  211. pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525 Jumper has logged in.");
  212. p.requestGFX(1555, 0);
  213. }
  214. }
  215. }
  216. if (p.username.equalsIgnoreCase("kesen")){
  217. for (Player pl : Server.engine.players) {
  218. if (pl != null) {
  219. pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525 Jumper has logged in.");
  220. p.requestGFX(1555, 0);
  221. }
  222. }
  223. }
  224. if (p.username.equalsIgnoreCase("admin1")){
  225. for (Player pl : Server.engine.players) {
  226. if (pl != null) {
  227. pl.getActionSender().sendMessage(pl, ".");
  228. p.requestGFX(1555, 0);
  229. }
  230. }
  231. }
  232. if (p.username.equalsIgnoreCase("headmod")){
  233. for (Player pl : Server.engine.players) {
  234. if (pl != null) {
  235. pl.getActionSender().sendMessage(pl, ".");
  236. p.requestGFX(1555, 0);
  237. }
  238. }
  239. }
  240. if (p.username.equalsIgnoreCase("mod1")){
  241. for (Player pl : Server.engine.players) {
  242. if (pl != null) {
  243. pl.getActionSender().sendMessage(pl, ".");
  244. p.requestGFX(1555, 0);
  245. }
  246. }
  247. }
  248. if (p.username.equalsIgnoreCase("mod2")){
  249. for (Player pl : Server.engine.players) {
  250. if (pl != null) {
  251. pl.getActionSender().sendMessage(pl, ".");
  252. p.requestGFX(1555, 0);
  253. }
  254. }
  255. }
  256.  
  257. if (p.starter == 0) {
  258. p.getActionSender().setConfig(p, 1249, p.bankX);
  259. p.getActionSender().connecttofserver(p);
  260. p.friendsLoggedIn();
  261. p.playerWeapon.setWeapon();
  262. p.getActionSender().sendMessage(p, "Welcome to Goudont 525, " + p.username.substring(0, 1).toUpperCase()+p.username.substring(1));
  263. p.getActionSender().sendMessage(p, "<col=336600>Update on source: added ::starter, new hoster: Danny.");
  264. p.getActionSender().sendMessage(p, "<col=336600>Type ::starter if you haven't already.");
  265. p.getActionSender().sendMessage(p, "<col=FF0000>Skiller and main are legit account types.");
  266. p.getActionSender().sendMessage(p, "<col=336600>Shops are spread around ::home.");
  267. p.getActionSender().sendMessage(p, "<col=336600>Click the door leading to the shop.");
  268. p.getActionSender().sendMessage(p, "<col=336600>The shops are in each of the buildings.");
  269. p.getActionSender().sendMessage(p, "<col=FF0000>If your not a bot, go ::home.");
  270. //p.getActionSender().sendMessage(p, "<col=FF0000>Its Double Experience Days!");
  271. Engine.playerItems.addItem(p, 11169, 1);
  272. p.serverpoints += 10;
  273. p.starter = 1;
  274. }
  275. else if (p.starter == 1) {
  276. p.getActionSender().setConfig(p, 1249, p.bankX);
  277. p.getActionSender().connecttofserver(p);
  278. p.friendsLoggedIn();
  279. p.playerWeapon.setWeapon();
  280. p.getActionSender().sendMessage(p, "<col=ff5678>Welcome Back To Goudont 525, " + p.username.substring(0, 1).toUpperCase()+p.username.substring(1));
  281. p.getActionSender().sendMessage(p, "<col=336600>Your Status: Server Ranking: "+p.serverpoints+".");
  282. p.getActionSender().sendMessage(p, "<col=336600>Time Played: "+p.day+" Days "+p.hr+" Hours "+p.min+" Minutes "+p.sec+" Seconds.");
  283. p.getActionSender().sendMessage(p, "<col=336600>Shops are spread around homes, in each of the houses.");
  284. p.getActionSender().sendMessage(p, "<col=336600>Type ::starter if you haven't already.");
  285. p.getActionSender().sendMessage(p, "<col=ff1231>Type ::ticket to convert 1B into a cheque.");
  286. //p.getActionSender().sendMessage(p, "<col=FF0000>Its Double Experience Days!");
  287. p.puzzle *= 0;
  288.  
  289. }
  290. p.getActionSender().setInterfaceConfig(p, 745, 0, false);
  291. if (p.skillLvl[3] == 0){
  292. p.appendDeath();
  293. }
  294. if (p.equipment[3] == 7449 && p.rights < 2) {
  295. p.getActionSender().removeEquipment(p, 7449, 3);
  296. return;
  297. }
  298. if (p.bountyArea() && (p.InBounty == 0)) {
  299. p.heightLevel = 4;
  300. }
  301. if (p.bountyArea() && (p.InBounty == 1)) {
  302. p.InBounty = 1;
  303. p.heightLevel = 0;
  304. p.isSkulled = true;
  305. p.getActionSender().setOverlay(p, 653);
  306. p.getActionSender().setInterfaceConfig(p, 653, 12, true);
  307. p.getActionSender().setInterfaceConfig(p, 653, 9, false);
  308. Engine.BountyHunter.enter(p, 0);
  309. Engine.bountyhunter.getBountyHeadIcon(p);
  310. p.appearanceUpdateReq = true;
  311. p.updateReq = true;
  312. }
  313. if (p.clanWarsFightArea())
  314. p.setCoords(3267 + Misc.random(2), 3684 + Misc.random(2), 0);
  315. directFlushStream(p);
  316. if (returnCode != 2) {
  317. Engine.fileManager.appendData("characters/ips/" + p.username + ".txt", "failed login: " + Server.socketListener.getAddress(p.socket.socket) + "");
  318. return;
  319. }
  320. Server.engine.fileManager.appendData("characters/ips/" + p.username + ".txt", "successful login: " + Server.socketListener.getAddress(p.socket.socket) + "");
  321. p.getActionSender().setInterfaces(p);
  322. for (int i = 0; i < p.skillLvl.length; i++) {
  323. p.getActionSender().setSkillLvl(p, i);
  324. }
  325. p.thievingArray[0] = p.thievingArray[1] = -1;
  326. p.getWorldLoader().addPlayerFeatures();
  327. if (p.wildernessZone(p.absX, p.absY)) {
  328. p.getActionSender().setString(p, "Level: " + p.getWildernessLevel(), 380, 1);
  329. //p.getActionSender().setOverlay(p, 380);
  330. }
  331. p.runEnergyUpdateReq = true;
  332. p.getActionSender().connecttofserver(p);
  333. p.friendsLoggedIn();
  334. }
  335. }
  336.  
  337. /**
  338. * If the connection is the client's update server than send the keys.
  339. * @param p The Player which the frame should be created for.
  340. */
  341. private void updateServer(Player p) {
  342. if (p == null) {
  343. return;
  344. }
  345. try {
  346. if (p.loginStage == 0) {
  347. if (!fillStream(p, 3))
  348. return;
  349. p.stream.writeByte(0);
  350. directFlushStream(p);
  351. } else if (p.loginStage == -5) {
  352. if (!fillStream(p, 8))
  353. return;
  354. for (int i = 0; i < Misc.uKeys.length; i++) {
  355. p.stream.writeByte(Misc.uKeys[i]);
  356. }
  357. directFlushStream(p);
  358. p.loginStage = -1;
  359. }
  360. } catch (Exception exception) {
  361. }
  362. }
  363.  
  364. /**
  365. * Make sure the player isn't already online.
  366. * @param name The name to compare with.
  367. * @param _p The Player which the frame should be created for.
  368. */
  369. private boolean playerOnline(String name, Player _p) {
  370. for (Player p : Engine.players) {
  371. if (p != null && _p.playerId != p.playerId) {
  372. if (p.username.equalsIgnoreCase(name)) {
  373. return true;
  374. }
  375. }
  376. }
  377. return false;
  378. }
  379.  
  380. /**
  381. * Checks if a user is banned.
  382. * @param username The name to check.
  383. * @return Returns if the name was found.
  384. */
  385. public boolean checkBannedUsers(String username) {
  386. if (username == null) {
  387. return true;
  388. }
  389. for (int i = 0; i < Server.bannedUsers.length; i++) {
  390. if (Server.bannedUsers[i] != null && username.equalsIgnoreCase(Server.bannedUsers[i])) {
  391. return true;
  392. }
  393. }
  394. return false;
  395. }
  396.  
  397. /**
  398. * Check and read any incoming bytes.
  399. * @param p The Player which the frame should be created for.
  400. * @param forceRead How many bytes to read from the buffer.
  401. */
  402. private boolean fillStream(Player p, int forceRead) throws Exception {
  403. if (p == null) {
  404. return false;
  405. }
  406. if (forceRead >= 500) {
  407. return false;
  408. }
  409. if (p.socket.avail() < forceRead) {
  410. return false;
  411. }
  412. p.stream.inOffset = 0;
  413. p.socket.read(forceRead);
  414. return true;
  415. }
  416.  
  417. /**
  418. * Send the bytes in the stream's outBuffer directly to the client.
  419. * @param p The Player which the frame should be created for.
  420. */
  421. private void directFlushStream(Player p) {
  422. if (p == null) {
  423. return;
  424. }
  425. try {
  426. p.socket.write(p.stream.outBuffer, 0, p.stream.outOffset);
  427. p.stream.outOffset = 0;
  428. } catch (Exception exception) {
  429. exception.printStackTrace();
  430. }
  431. }
  432. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement