Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package net.com.codeusa.net.codec;
- import net.com.codeusa.Server;
- import net.com.codeusa.Engine;
- import net.com.codeusa.model.Player;
- import net.com.codeusa.util.Misc;
- public class RS2LoginProtocol {
- /**
- * Validate a connection.
- * <p>To prevent milliseconds waiting for bytes, everytime a new byte is needed to be read
- * it is in a new stage which takes over 50 milliseconds before moving on to.
- * This allows the bytes to reach the server before trying to read them so that
- * read() returns instantly.
- * @param p The Player which the frame should be created for.
- */
- public void login(Player p) {
- if (p == null || p.stream == null) {
- return;
- }
- long serverSessionKey = ((long) (Math.random() * 99999999D) << 32) + (long) (Math.random() * 99999999D);
- long clientSessionKey = 0;
- int returnCode = 2;
- if (p.loginStage < -1) {
- updateServer(p);
- } else if (p.loginStage == 0) {
- try {
- if (!fillStream(p, 2))
- return;
- } catch (Exception e) {
- return;
- }
- int connectionType = p.stream.readUnsignedByte();
- if (connectionType == 15) {
- updateServer(p);
- p.loginStage = -5;
- return;
- }
- if (connectionType != 14) {
- p.loginStage = -1;
- return;
- }
- int longPlayerName = p.stream.readUnsignedByte();
- p.stream.writeByte(0);
- p.stream.writeQWord(serverSessionKey);
- directFlushStream(p);
- p.loginStage++;
- } else if (p.loginStage == 1) {
- try {
- if (!fillStream(p, 3))
- return;
- } catch (Exception e) {
- return;
- }
- int loginType = p.stream.readUnsignedByte();
- if (loginType != 16 && loginType != 18 && loginType != 14) {
- p.loginStage = -1;
- return;
- }
- p.loginStage++;
- } else if (p.loginStage == 2) {
- int loginPacketSize = p.stream.readUnsignedWord();
- int loginEncryptPacketSize = loginPacketSize - (36 + 1 + 1 + 2);
- if (loginEncryptPacketSize <= 0) {
- p.loginStage = -1;
- return;
- }
- try {
- if (!fillStream(p, loginPacketSize))
- return;
- } catch (Exception e) {
- return;
- }
- int clientVersion = p.stream.readDWord();
- if (clientVersion != 508) {
- p.loginStage = -1;
- return;
- }
- p.stream.readUnsignedByte();
- p.stream.readUnsignedWord();
- p.stream.readUnsignedWord();
- for (int i = 0; i < 24; i++) {
- int cacheIDX = p.stream.readUnsignedByte();
- }
- String junk = p.stream.readString();
- for (int i = 0; i < 29; i++) {
- int junk2 = p.stream.readDWord();
- }
- loginEncryptPacketSize--;
- int junk29 = p.stream.readUnsignedByte();
- int encryption = p.stream.readUnsignedByte();
- if (encryption != 10 && encryption != 64) {
- p.loginStage = -1;
- return;
- }
- clientSessionKey = p.stream.readQWord();
- serverSessionKey = p.stream.readQWord();
- p.username = Misc.longToString(p.stream.readQWord()).toLowerCase().replaceAll("_", " ").trim();
- if (p.username == null) {
- p.loginStage = -1;
- p.username = "";
- return;
- }
- for (int i = 0; i < p.username.length(); i++) {
- Character c = new Character(p.username.charAt(i));
- if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
- p.loginStage = -1;
- p.username = "";
- return;
- }
- }
- if (playerOnline(p.username, p)) {
- returnCode = 5;
- }
- if (checkBannedUsers(p.username)) {
- returnCode = 4;
- }
- String password = p.stream.readString();
- if (password == null) {
- p.loginStage = -1;
- return;
- }
- for (int i = 0; i < password.length(); i++) {
- Character c = new Character(password.charAt(i));
- if (!Character.isLetterOrDigit(c) && !Character.isSpaceChar(c)) {
- p.loginStage = -1;
- return;
- }
- }
- Engine.fileManager.loadCharacter(p);
- if (password != null && p.password != null && p.password != "" && !p.password.equals(password)) {
- returnCode = 3;
- } else {
- p.password = password;
- }
- int ipconnections = 0;
- for (int i = 0; i < Engine.players.length; i++) {
- Player PC = Engine.players[i];
- if (PC != null) {
- if (PC.socket.socket.getInetAddress().getHostAddress().equals(
- p.socket.socket.getInetAddress().getHostAddress())) {
- // MATCHED IP
- ipconnections += 1;
- }
- }
- }
- if (ipconnections >= 4) {
- // More than 3 connections
- returnCode = 9;
- }
- p.stream.writeByte(returnCode);
- p.stream.writeByte(p.rights);
- p.stream.writeByte(0);
- p.stream.writeByte(0);
- p.stream.writeByte(0);
- p.stream.writeByte(1);
- p.stream.writeByte(0);
- p.stream.writeByte(p.playerId);
- p.stream.writeByte(0);
- directFlushStream(p);
- if (p.teleportToX == -1 && p.teleportToY == -1)
- p.setCoords(3495, 3489, 0);
- Engine.playerMovement.getNextPlayerMovement(p);
- if (p.inJadCave()) {
- if (p.heightLevel > 0)
- p.heightLevel = 0;
- }
- p.getActionSender().setMapRegion(p);
- if (p.inJadCave())
- p.setCoords(3123, 9997, 0);
- if (p.inClan())
- p.setCoords(p.absX, p.absY, 0);
- p.getActionSender().setWindowPane(p, 548);
- if (p.username.equalsIgnoreCase("goudont")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525, Goudont, has logged in.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("danny")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "<col=ff555>The Co-Owner and Legend, Danny, is here.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("jackson")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "The V.I.P of Goudont 525, Jackson, has returned.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("Emilios")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "Head of all Administrators, Emilios rolls up.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("jumper")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525 Jumper has logged in.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("kesen")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, "<col=ff1231>The Coder/Owner of Goudont 525 Jumper has logged in.");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("admin1")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, ".");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("headmod")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, ".");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("mod1")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, ".");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.username.equalsIgnoreCase("mod2")){
- for (Player pl : Server.engine.players) {
- if (pl != null) {
- pl.getActionSender().sendMessage(pl, ".");
- p.requestGFX(1555, 0);
- }
- }
- }
- if (p.starter == 0) {
- p.getActionSender().setConfig(p, 1249, p.bankX);
- p.getActionSender().connecttofserver(p);
- p.friendsLoggedIn();
- p.playerWeapon.setWeapon();
- p.getActionSender().sendMessage(p, "Welcome to Goudont 525, " + p.username.substring(0, 1).toUpperCase()+p.username.substring(1));
- p.getActionSender().sendMessage(p, "<col=336600>Update on source: added ::starter, new hoster: Danny.");
- p.getActionSender().sendMessage(p, "<col=336600>Type ::starter if you haven't already.");
- p.getActionSender().sendMessage(p, "<col=FF0000>Skiller and main are legit account types.");
- p.getActionSender().sendMessage(p, "<col=336600>Shops are spread around ::home.");
- p.getActionSender().sendMessage(p, "<col=336600>Click the door leading to the shop.");
- p.getActionSender().sendMessage(p, "<col=336600>The shops are in each of the buildings.");
- p.getActionSender().sendMessage(p, "<col=FF0000>If your not a bot, go ::home.");
- //p.getActionSender().sendMessage(p, "<col=FF0000>Its Double Experience Days!");
- Engine.playerItems.addItem(p, 11169, 1);
- p.serverpoints += 10;
- p.starter = 1;
- }
- else if (p.starter == 1) {
- p.getActionSender().setConfig(p, 1249, p.bankX);
- p.getActionSender().connecttofserver(p);
- p.friendsLoggedIn();
- p.playerWeapon.setWeapon();
- p.getActionSender().sendMessage(p, "<col=ff5678>Welcome Back To Goudont 525, " + p.username.substring(0, 1).toUpperCase()+p.username.substring(1));
- p.getActionSender().sendMessage(p, "<col=336600>Your Status: Server Ranking: "+p.serverpoints+".");
- p.getActionSender().sendMessage(p, "<col=336600>Time Played: "+p.day+" Days "+p.hr+" Hours "+p.min+" Minutes "+p.sec+" Seconds.");
- p.getActionSender().sendMessage(p, "<col=336600>Shops are spread around homes, in each of the houses.");
- p.getActionSender().sendMessage(p, "<col=336600>Type ::starter if you haven't already.");
- p.getActionSender().sendMessage(p, "<col=ff1231>Type ::ticket to convert 1B into a cheque.");
- //p.getActionSender().sendMessage(p, "<col=FF0000>Its Double Experience Days!");
- p.puzzle *= 0;
- }
- p.getActionSender().setInterfaceConfig(p, 745, 0, false);
- if (p.skillLvl[3] == 0){
- p.appendDeath();
- }
- if (p.equipment[3] == 7449 && p.rights < 2) {
- p.getActionSender().removeEquipment(p, 7449, 3);
- return;
- }
- if (p.bountyArea() && (p.InBounty == 0)) {
- p.heightLevel = 4;
- }
- if (p.bountyArea() && (p.InBounty == 1)) {
- p.InBounty = 1;
- p.heightLevel = 0;
- p.isSkulled = true;
- p.getActionSender().setOverlay(p, 653);
- p.getActionSender().setInterfaceConfig(p, 653, 12, true);
- p.getActionSender().setInterfaceConfig(p, 653, 9, false);
- Engine.BountyHunter.enter(p, 0);
- Engine.bountyhunter.getBountyHeadIcon(p);
- p.appearanceUpdateReq = true;
- p.updateReq = true;
- }
- if (p.clanWarsFightArea())
- p.setCoords(3267 + Misc.random(2), 3684 + Misc.random(2), 0);
- directFlushStream(p);
- if (returnCode != 2) {
- Engine.fileManager.appendData("characters/ips/" + p.username + ".txt", "failed login: " + Server.socketListener.getAddress(p.socket.socket) + "");
- return;
- }
- Server.engine.fileManager.appendData("characters/ips/" + p.username + ".txt", "successful login: " + Server.socketListener.getAddress(p.socket.socket) + "");
- p.getActionSender().setInterfaces(p);
- for (int i = 0; i < p.skillLvl.length; i++) {
- p.getActionSender().setSkillLvl(p, i);
- }
- p.thievingArray[0] = p.thievingArray[1] = -1;
- p.getWorldLoader().addPlayerFeatures();
- if (p.wildernessZone(p.absX, p.absY)) {
- p.getActionSender().setString(p, "Level: " + p.getWildernessLevel(), 380, 1);
- //p.getActionSender().setOverlay(p, 380);
- }
- p.runEnergyUpdateReq = true;
- p.getActionSender().connecttofserver(p);
- p.friendsLoggedIn();
- }
- }
- /**
- * If the connection is the client's update server than send the keys.
- * @param p The Player which the frame should be created for.
- */
- private void updateServer(Player p) {
- if (p == null) {
- return;
- }
- try {
- if (p.loginStage == 0) {
- if (!fillStream(p, 3))
- return;
- p.stream.writeByte(0);
- directFlushStream(p);
- } else if (p.loginStage == -5) {
- if (!fillStream(p, 8))
- return;
- for (int i = 0; i < Misc.uKeys.length; i++) {
- p.stream.writeByte(Misc.uKeys[i]);
- }
- directFlushStream(p);
- p.loginStage = -1;
- }
- } catch (Exception exception) {
- }
- }
- /**
- * Make sure the player isn't already online.
- * @param name The name to compare with.
- * @param _p The Player which the frame should be created for.
- */
- private boolean playerOnline(String name, Player _p) {
- for (Player p : Engine.players) {
- if (p != null && _p.playerId != p.playerId) {
- if (p.username.equalsIgnoreCase(name)) {
- return true;
- }
- }
- }
- return false;
- }
- /**
- * Checks if a user is banned.
- * @param username The name to check.
- * @return Returns if the name was found.
- */
- public boolean checkBannedUsers(String username) {
- if (username == null) {
- return true;
- }
- for (int i = 0; i < Server.bannedUsers.length; i++) {
- if (Server.bannedUsers[i] != null && username.equalsIgnoreCase(Server.bannedUsers[i])) {
- return true;
- }
- }
- return false;
- }
- /**
- * Check and read any incoming bytes.
- * @param p The Player which the frame should be created for.
- * @param forceRead How many bytes to read from the buffer.
- */
- private boolean fillStream(Player p, int forceRead) throws Exception {
- if (p == null) {
- return false;
- }
- if (forceRead >= 500) {
- return false;
- }
- if (p.socket.avail() < forceRead) {
- return false;
- }
- p.stream.inOffset = 0;
- p.socket.read(forceRead);
- return true;
- }
- /**
- * Send the bytes in the stream's outBuffer directly to the client.
- * @param p The Player which the frame should be created for.
- */
- private void directFlushStream(Player p) {
- if (p == null) {
- return;
- }
- try {
- p.socket.write(p.stream.outBuffer, 0, p.stream.outOffset);
- p.stream.outOffset = 0;
- } catch (Exception exception) {
- exception.printStackTrace();
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement