public void sendItems(int interfaceId, int childId, int type, Item[] inventory) { PacketBuilder pb = new PacketBuilder().setId(105).setSize(Packet.Size.VariableShort); pb.addInt((interfaceId << 16) + childId); pb.addUShort(type); pb.addUShort(inventory.Length); for (int i = 0; i < inventory.Length; i++) { Item item = inventory[i]; int id = -1, amount = 0; if (inventory[i] != null) { id = item.getItemId(); amount = item.getItemAmount(); } if (amount > 254) { pb.addByteS(255); pb.addInt(amount); } else { pb.addByteS(amount); } pb.addUShort(id + 1); } connection.SendPacket(pb.toPacket()); }
public void sendFriend(long name, int world) { Clan c = Server.getClanManager().getClanByOwner(player.getLoginDetails().getUsername()); Clan.ClanRank clanRank = Clan.ClanRank.FRIEND; if (c != null) { clanRank = c.getUserRank(misc.longToPlayerName(name)); } PacketBuilder pb = new PacketBuilder().setId(62).setSize(Packet.Size.VariableByte) .addLong(name) .addUShort(world) .addByte((byte)clanRank); if (world != 0) { if (world == player.getWorld()) { pb.addString("Online"); } else { pb.addString("Server " + world); } } connection.SendPacket(pb.toPacket()); }
public void sendClientScript(int id, object[] parameters, string types) { if (parameters.Length != types.Length) { misc.WriteError("params size should be the same as types length"); return; } PacketBuilder packet = new PacketBuilder().setId(115).setSize(Packet.Size.VariableShort) .addUShort(count++) .addString(types); int idx = 0; for (int i = types.Length - 1; i >= 0; i--) { if (types[i] == 's') { packet.addString((string)parameters[idx]); } else { packet.addInt((int)parameters[idx]); } idx++; } packet.addInt(id); connection.SendPacket(packet.toPacket()); }
public void sendIgnores(long[] names) { PacketBuilder pb = new PacketBuilder().setId(126).setSize(Packet.Size.VariableShort); foreach (long name in names) { pb.addLong(name); } connection.SendPacket(pb.toPacket()); }
public void sendMapRegion() { player.getUpdateFlags().setLastRegion((Location)player.getLocation().Clone()); if (player.getLocation().getX() >= 19000) { sendFightCaveMapdata(); return; } PacketBuilder pb = new PacketBuilder().setId(162).setSize(Packet.Size.VariableShort); bool forceSend = true; if (((((player.getLocation().getRegionX() / 8) == 48) || ((player.getLocation().getRegionX() / 8) == 49)) && ((player.getLocation().getRegionY() / 8) == 48)) || (((player.getLocation().getRegionX() / 8) == 48) && ((player.getLocation().getRegionY() / 8) == 148))) { forceSend = false; } pb.addShortA(player.getLocation().getLocalX()); for (int xCalc = (player.getLocation().getRegionX() - 6) / 8; xCalc <= ((player.getLocation().getRegionX() + 6) / 8); xCalc++) { for (int yCalc = (player.getLocation().getRegionY() - 6) / 8; yCalc <= ((player.getLocation().getRegionY() + 6) / 8); yCalc++) { int region = yCalc + (xCalc << 8); if (forceSend || ((yCalc != 49) && (yCalc != 149) && (yCalc != 147) && (xCalc != 50) && ((xCalc != 49) || (yCalc != 47)))) { int[] mapData = MapData.getData(region); if (mapData == null) { pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); } else { pb.addInt2(mapData[0]); pb.addInt2(mapData[1]); pb.addInt2(mapData[2]); pb.addInt2(mapData[3]); } } } } pb.addByteS(player.getLocation().getZ()); pb.addUShort(player.getLocation().getRegionX()); pb.addShortA(player.getLocation().getRegionY()); pb.addShortA(player.getLocation().getLocalY()); connection.SendPacket(pb.toPacket()); Server.getGroundItems().refreshGlobalItems(player); Server.getGlobalObjects().refreshGlobalObjects(player); }
public void setArrowOnEntity(int type, int id) { PacketBuilder pb = new PacketBuilder().setId(217); int offset = pb.curLength; pb.addByte((byte)type); // 10 player, 1 npc pb.addByte((byte)((id < 32768) ? 0 : 1)); // arrowtype pb.addUShort(id); pb.curLength += 3; pb.addUShort(65535); for (int i = (pb.curLength - offset); i < 9; i++) { pb.addByte((byte)0); } connection.SendPacket(pb.toPacket()); }
public void setArrowOnPosition(int x, int y, int height) { PacketBuilder pb = new PacketBuilder().setId(217); int offset = pb.curLength; pb.addByte((byte)2); pb.addByte((byte)0); pb.addUShort(x); pb.addUShort(y); pb.addByte((byte)height); pb.addUShort(65535); for (int i = (pb.curLength - offset); i < 9; i++) { pb.addByte((byte)0); } connection.SendPacket(pb.toPacket()); }
public void newClanMessage(Clan c, ChatMessage chatMessage) { PacketBuilder pb = new PacketBuilder(); pb.setId(54).setSize(Packet.Size.VariableByte); pb.addLong(chatMessage.getPlayer().getLoginDetails().getLongName()); pb.addByte((byte)1); // dummy pb.addLong(misc.playerNameToLong(c.getClanName())); pb.addUShort(0); // some message counter bs string message = chatMessage.getChatText(); int messageCounter = player.getFriends().getNextUniqueId(); pb.addThreeBytes(messageCounter); pb.addByte((byte)chatMessage.getPlayer().getRights()); pb.addBytes(chatMessage.getPacked()); connection.SendPacket(pb.toPacket()); }
public void updateClan(Clan c) { PacketBuilder pb = new PacketBuilder(); pb.setId(55).setSize(Packet.Size.VariableShort); pb.addLong(misc.playerNameToLong(c.getClanOwner())); pb.addLong(misc.playerNameToLong(c.getClanName())); pb.addByte((byte)c.getKickRights()); pb.addByte((byte)c.getUserList().Count); foreach (ClanUser list in c.getUserList()) { Player p = list.getClanMember(); pb.addLong(p.getLoginDetails().getLongName()); pb.addUShort(p.getWorld()); int rights = Convert.ToInt32(list.getClanRights()); pb.addByte((byte)rights); pb.addString("Server " + p.getWorld()); } connection.SendPacket(pb.toPacket()); }
private static void appendAppearanceUpdate(Player p, PacketBuilder updateBlock) { PacketBuilder playerProps = new PacketBuilder().setSize(Packet.Size.Bare); Appearance app = p.getAppearance(); playerProps.addByte((byte)(app.getGender() & 0xFF)); if ((app.getGender() & 0x2) == 2) { playerProps.addByte((byte)0); playerProps.addByte((byte)0); } playerProps.addByte((byte)p.getPrayers().getPkIcon()); playerProps.addByte((byte)p.getPrayers().getHeadIcon()); if (!app.isInvisible()) { if (!app.isNpc()) { for (int i = 0; i < 4; i++) { if (p.getEquipment().getItemInSlot((ItemData.EQUIP)i) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot((ItemData.EQUIP)i).getDefinition().getEquipId()); } else { playerProps.addByte((byte)0); } } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.CHEST) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.CHEST).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.AMULET)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.SHIELD) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.SHIELD).getDefinition().getEquipId()); } else { playerProps.addByte((byte)0); } Item chest = p.getEquipment().getSlot(ItemData.EQUIP.CHEST); if (chest != null && chest.getDefinition() != null) { if (!ItemData.isFullBody(chest.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.WEAPON)); } else { playerProps.addByte((byte)0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.WEAPON)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.LEGS) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.LEGS).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.SHIELD)); } Item hat = p.getEquipment().getSlot(ItemData.EQUIP.HAT); if (hat != null && hat.getDefinition() != null) { if (!ItemData.isFullHat(hat.getDefinition()) && !ItemData.isFullMask(hat.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.HAT)); } else { playerProps.addByte((byte)0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.HAT)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.HANDS) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.HANDS).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CHEST)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.FEET) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.FEET).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(6)); } if (hat != null && hat.getDefinition() != null) { if (!ItemData.isFullMask(hat.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CAPE)); } else { playerProps.addByte((byte)0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CAPE)); } } else { playerProps.addUShort(-1); playerProps.addUShort(app.getNpcId()); playerProps.addByte((byte)255); } } else { for (int i = 0; i < 12; i++) { playerProps.addByte((byte)0); } } foreach (int colour in app.getColoursArray()) { playerProps.addByte((byte)colour); } playerProps.addUShort(p.getEquipment().getStandWalkAnimation()); playerProps.addLong(p.getLoginDetails().getLongName()); playerProps.addByte((byte)p.getSkills().getCombatLevel()); playerProps.addUShort(0); playerProps.addByte((byte)0); updateBlock.addByteA((byte)(playerProps.getLength() & 0xFF)); updateBlock.addBytes(playerProps.toPacket().getData(), 0, playerProps.getLength()); }
public void sendFightCaveMapdata() { lastX = lastX == 0 ? 2413 : (player.getLocation().getX() - (20000 + (200 * player.getIndex()))); lastY = lastY == 0 ? 5116 : (player.getLocation().getY() - 20000); PacketBuilder pb = new PacketBuilder().setId(214).setSize(Packet.Size.VariableShort); pb.addUShortA(player.getLocation().getLocalX()); pb.addUShortA(player.getLocation().getRegionX()); pb.addByteS(player.getLocation().getZ()); pb.addUShortA(player.getLocation().getLocalY()); pb.initBitAccess(); for (int height = 0; height < 4; height++) { for (int xCalc = ((lastX >> 3) - 6); xCalc <= ((lastX >> 3) + 6); xCalc++) { for (int yCalc = ((lastY >> 3) - 6); yCalc <= ((lastY >> 3) + 6); yCalc++) { int region = yCalc / 8 + (xCalc / 8 << 8); if (height == player.getLocation().getZ() && region == 9551) { pb.addBits(1, 1); pb.addBits(26, (xCalc << 14) | (yCalc << 3) | (0 << 1) | (0 << 24)); } else { pb.addBits(1, 0); } } } } pb.finishBitAccess(); int[] sent = new int[4 * 13 * 13]; int sentIndex = 0; for (int xCalc = (((lastX >> 3) - 6) / 8); xCalc <= (((lastX >> 3) + 6) / 8); xCalc++) { outer: for (int yCalc = (((lastY >> 3) - 6) / 8); yCalc <= (((lastY >> 3) + 6) / 8); yCalc++) { int region = yCalc + (xCalc << 8); if (region != 9551) { continue; } for (int i = 0; i < sentIndex; i++) { if (sent[i] == region) { goto outer; } } sent[sentIndex] = region; sentIndex++; int[] mapData = MapData.getData(region); if (mapData == null) { pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); } else { pb.addInt2(mapData[0]); pb.addInt2(mapData[1]); pb.addInt2(mapData[2]); pb.addInt2(mapData[3]); } } } pb.addUShort(player.getLocation().getRegionY()); connection.SendPacket(pb.toPacket()); }
/** * Update the specified player's Npcs. * @param p */ public static void update(Player player) { //Creates a list of new players in area. [This only happens once.. no rebuilding like all runescape 2 servers.] player.getLocalEnvironment().updateNpcsInArea(); //Attempt to skip a pointless update if possible. //Any current npcs on screen got a update for me, if no we just return this whole method. bool hasAppearanceUpdate = player.getLocalEnvironment().getSeenNpcs().Exists(new Predicate<Npc>(delegate(Npc n) { return n.getUpdateFlags().isUpdateRequired(); })); //No new pending npcs and no npcs pending to get removed from screen. bool hasAddRemoveUpdate = (player.getLocalEnvironment().getNewNpcs().Count > 0 || player.getLocalEnvironment().getRemovedNpcs().Count > 0); //no updates.. exit. if (!hasAppearanceUpdate && !hasAddRemoveUpdate) return; PacketBuilder mainPacket = new PacketBuilder().setId(32).setSize(Packet.Size.VariableShort).initBitAccess(); PacketBuilder updateBlock = new PacketBuilder().setSize(Packet.Size.Bare); mainPacket.addBits(8, player.getLocalEnvironment().getSeenNpcs().Count); //Send information of all the npcs in our own location. foreach (Npc n in player.getLocalEnvironment().getSeenNpcs()) { if (player.getLocalEnvironment().getRemovedNpcs().Contains(n)) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 3); //delete npc. continue; } else { if (n.getSprites().getPrimarySprite() == -1) { if (n.getUpdateFlags().isUpdateRequired()) { mainPacket.addBits(1, 1); mainPacket.addBits(2, 0); } else { mainPacket.addBits(1, 0); } } else if (n.getSprites().getSecondarySprite() == -1) { mainPacket.addBits(1, 1); mainPacket.addBits(2, 1); mainPacket.addBits(3, XLATE_DIRECTION_TO_CLIENT[n.getSprites().getPrimarySprite()]); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else { mainPacket.addBits(1, 1); mainPacket.addBits(2, 2); mainPacket.addBits(3, n.getSprites().getPrimarySprite()); mainPacket.addBits(3, n.getSprites().getSecondarySprite()); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); } if (n.getUpdateFlags().isUpdateRequired()) appendUpdateBlock(n, updateBlock); } } //Send information of all the new npcs in our own location. foreach (Npc n in player.getLocalEnvironment().getNewNpcs()) { int yPos = n.getLocation().getY() - player.getLocation().getY(); int xPos = n.getLocation().getX() - player.getLocation().getX(); mainPacket.addBits(15, n.getIndex()); mainPacket.addBits(1, 1); mainPacket.addBits(3, n.getFaceDirection()); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); mainPacket.addBits(5, yPos < 0 ? yPos + 32 : yPos); mainPacket.addBits(14, n.getId()); mainPacket.addBits(5, xPos < 0 ? xPos + 32 : xPos); if (n.getUpdateFlags().isUpdateRequired()) appendUpdateBlock(n, updateBlock); } if(updateBlock.getLength() >= 3) { mainPacket.addBits(15, 32767); } mainPacket.finishBitAccess(); mainPacket.addBytes(updateBlock.toPacket().getData()); player.getConnection().SendPacket(mainPacket.toPacket()); /** * Done with with all our updates.. time to refine our environment lists. * Remove npcs who either moved away from our location or hidden / dead etc.. * Mix new npcs with old npcs into one npclist. * Clear new npc list, for more new npcs again */ player.getLocalEnvironment().organizeNpcs(); }
private static void appendAppearanceUpdate(Player p, PacketBuilder updateBlock) { PacketBuilder playerProps = new PacketBuilder().setSize(Packet.Size.Bare); Appearance app = p.getAppearance(); playerProps.addByte((byte) (app.getGender() & 0xFF)); if((app.getGender() & 0x2) == 2) { playerProps.addByte((byte) 0); playerProps.addByte((byte) 0); } playerProps.addByte((byte) p.getPrayers().getPkIcon()); playerProps.addByte((byte) p.getPrayers().getHeadIcon()); if (!app.isInvisible()) { if(!app.isNpc()) { for(int i = 0; i < 4; i++) { if(p.getEquipment().getItemInSlot((ItemData.EQUIP)i) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot((ItemData.EQUIP)i).getDefinition().getEquipId()); } else { playerProps.addByte((byte) 0); } } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.CHEST) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.CHEST).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.AMULET)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.SHIELD) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.SHIELD).getDefinition().getEquipId()); } else { playerProps.addByte((byte) 0); } Item chest = p.getEquipment().getSlot(ItemData.EQUIP.CHEST); if (chest != null && chest.getDefinition() != null) { if(!ItemData.isFullBody(chest.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.WEAPON)); } else { playerProps.addByte((byte) 0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.WEAPON)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.LEGS) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.LEGS).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.SHIELD)); } Item hat = p.getEquipment().getSlot(ItemData.EQUIP.HAT); if (hat != null && hat.getDefinition() != null) { if(!ItemData.isFullHat(hat.getDefinition()) && !ItemData.isFullMask(hat.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.HAT)); } else { playerProps.addByte((byte) 0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.HAT)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.HANDS) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.HANDS).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CHEST)); } if (p.getEquipment().getItemInSlot(ItemData.EQUIP.FEET) != -1) { playerProps.addUShort(32768 + p.getEquipment().getSlot(ItemData.EQUIP.FEET).getDefinition().getEquipId()); } else { playerProps.addUShort(0x100 + app.getLook(6)); } if (hat != null && hat.getDefinition() != null) { if(!ItemData.isFullMask(hat.getDefinition())) { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CAPE)); } else { playerProps.addByte((byte) 0); } } else { playerProps.addUShort(0x100 + app.getLook(ItemData.EQUIP.CAPE)); } } else { playerProps.addUShort(-1); playerProps.addUShort(app.getNpcId()); playerProps.addByte((byte) 255); } } else { for (int i = 0; i < 12; i++) { playerProps.addByte((byte) 0); } } foreach(int colour in app.getColoursArray()) { playerProps.addByte((byte) colour); } playerProps.addUShort(p.getEquipment().getStandWalkAnimation()); playerProps.addLong(p.getLoginDetails().getLongName()); playerProps.addByte((byte) p.getSkills().getCombatLevel()); playerProps.addUShort(0); playerProps.addByte((byte) 0); updateBlock.addByteA((byte) (playerProps.getLength() & 0xFF)); updateBlock.addBytes(playerProps.toPacket().getData(), 0, playerProps.getLength()); }
public void loadSaveThread() { while (true) { try { Thread.Sleep(30); } catch (ThreadInterruptedException) { forceSaveAllPlayers(); break; } lock(playersToLoad) { if(playersToLoad.Count > 0) { Connection connection = null; while(playersToLoad.Count > 0) { connection = playersToLoad.Dequeue(); if (connection != null) { ReturnCode returnCode = loadPlayer(connection); PacketBuilder pb = new PacketBuilder().setSize(Packet.Size.Bare); int slot = -1; if (returnCode == ReturnCode.LOGIN_OK) { slot = Server.register(connection); if(slot == -1) { returnCode = ReturnCode.WORLD_FULL; } } pb.addByte((byte) returnCode); if (returnCode == ReturnCode.LOGIN_OK) { pb.addByte((byte)connection.getPlayer().getRights()); // rights pb.addByte((byte)0); //1 pb.addByte((byte)0);//Flagged, will genrate mouse packets pb.addByte((byte)0); //3 pb.addByte((byte)0); //4 pb.addByte((byte)0); //5 pb.addByte((byte)0); // Generates packets pb.addUShort(slot);//PlayerID pb.addByte((byte)1); // membership flag #1?..this one enables all GE boxes pb.addByte((byte)1); // membership flag #2? connection.SendPacket(pb.toPacket()); connection.getPlayer().getPackets().sendMapRegion(); connection.getPlayer().setActive(true); Console.WriteLine("Loaded " + connection.getPlayer().getLoginDetails().getUsername() + "'s game: returncode = " + returnCode + "."); } else { connection.SendPacket(pb.toPacket()); } } } } } lock(playersToSave) { if(playersToSave.Count > 0) { Player p = null; while(playersToSave.Count > 0) { p = playersToSave.Dequeue(); if(p != null) { if(savePlayer(p)) { Console.WriteLine("Saved " + p.getLoginDetails().getUsername() + "'s game."); } else { Console.WriteLine("Could not save " + p.getLoginDetails().getUsername() + "'s game."); } } } } } } }
/** * Update the specified player's Npcs. * @param p */ public static void update(Player player) { //Creates a list of new players in area. [This only happens once.. no rebuilding like all runescape 2 servers.] player.getLocalEnvironment().updateNpcsInArea(); //Attempt to skip a pointless update if possible. //Any current npcs on screen got a update for me, if no we just return this whole method. bool hasAppearanceUpdate = player.getLocalEnvironment().getSeenNpcs().Exists(new Predicate <Npc>(delegate(Npc n) { return(n.getUpdateFlags().isUpdateRequired()); })); //No new pending npcs and no npcs pending to get removed from screen. bool hasAddRemoveUpdate = (player.getLocalEnvironment().getNewNpcs().Count > 0 || player.getLocalEnvironment().getRemovedNpcs().Count > 0); //no updates.. exit. if (!hasAppearanceUpdate && !hasAddRemoveUpdate) { return; } PacketBuilder mainPacket = new PacketBuilder().setId(32).setSize(Packet.Size.VariableShort).initBitAccess(); PacketBuilder updateBlock = new PacketBuilder().setSize(Packet.Size.Bare); mainPacket.addBits(8, player.getLocalEnvironment().getSeenNpcs().Count); //Send information of all the npcs in our own location. foreach (Npc n in player.getLocalEnvironment().getSeenNpcs()) { if (player.getLocalEnvironment().getRemovedNpcs().Contains(n)) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 3); //delete npc. continue; } else { if (n.getSprites().getPrimarySprite() == -1) { if (n.getUpdateFlags().isUpdateRequired()) { mainPacket.addBits(1, 1); mainPacket.addBits(2, 0); } else { mainPacket.addBits(1, 0); } } else if (n.getSprites().getSecondarySprite() == -1) { mainPacket.addBits(1, 1); mainPacket.addBits(2, 1); mainPacket.addBits(3, XLATE_DIRECTION_TO_CLIENT[n.getSprites().getPrimarySprite()]); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else { mainPacket.addBits(1, 1); mainPacket.addBits(2, 2); mainPacket.addBits(3, n.getSprites().getPrimarySprite()); mainPacket.addBits(3, n.getSprites().getSecondarySprite()); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); } if (n.getUpdateFlags().isUpdateRequired()) { appendUpdateBlock(n, updateBlock); } } } //Send information of all the new npcs in our own location. foreach (Npc n in player.getLocalEnvironment().getNewNpcs()) { int yPos = n.getLocation().getY() - player.getLocation().getY(); int xPos = n.getLocation().getX() - player.getLocation().getX(); mainPacket.addBits(15, n.getIndex()); mainPacket.addBits(1, 1); mainPacket.addBits(3, n.getFaceDirection()); mainPacket.addBits(1, n.getUpdateFlags().isUpdateRequired() ? 1 : 0); mainPacket.addBits(5, yPos < 0 ? yPos + 32 : yPos); mainPacket.addBits(14, n.getId()); mainPacket.addBits(5, xPos < 0 ? xPos + 32 : xPos); if (n.getUpdateFlags().isUpdateRequired()) { appendUpdateBlock(n, updateBlock); } } if (updateBlock.getLength() >= 3) { mainPacket.addBits(15, 32767); } mainPacket.finishBitAccess(); mainPacket.addBytes(updateBlock.toPacket().getData()); player.getConnection().SendPacket(mainPacket.toPacket()); /** * Done with with all our updates.. time to refine our environment lists. * Remove npcs who either moved away from our location or hidden / dead etc.. * Mix new npcs with old npcs into one npclist. * Clear new npc list, for more new npcs again */ player.getLocalEnvironment().organizeNpcs(); }
public void sendIgnores(long[] names) { PacketBuilder pb = new PacketBuilder().setId(126).setSize(Packet.Size.VariableShort); foreach(long name in names) { pb.addLong(name); } connection.SendPacket(pb.toPacket()); }
public void sendFriend(long name, int world) { Clan c = Server.getClanManager().getClanByOwner(player.getLoginDetails().getUsername()); Clan.ClanRank clanRank = Clan.ClanRank.FRIEND; if (c != null) clanRank = c.getUserRank(misc.longToPlayerName(name)); PacketBuilder pb = new PacketBuilder().setId(62).setSize(Packet.Size.VariableByte) .addLong(name) .addUShort(world) .addByte((byte)clanRank); if (world != 0) { if (world == player.getWorld()) pb.addString("Online"); else pb.addString("Server " + world); } connection.SendPacket(pb.toPacket()); }
/** * Update the specified player. * @param p */ public static void update(Player player) { //Creates a list of new players in area. [This only happens once.. no rebuilding like all runescape 2 servers.] player.getLocalEnvironment().updatePlayersInArea(); //Attempt to skip a pointless update if possible. //Any current users on screen got a update for me. bool hasAppearanceUpdate = player.getLocalEnvironment().getSeenPlayers().Exists(new Predicate <Player>(delegate(Player p) { return(p.getUpdateFlags().hasAnyUpdate()); })); //No new pending players and no players pending to get removed from screen. bool hasAddRemoveUpdate = (player.getLocalEnvironment().getNewPlayers().Count > 0 || player.getLocalEnvironment().getRemovedPlayers().Count > 0); //no updates.. exit. if (!hasAppearanceUpdate && !hasAddRemoveUpdate && !player.getUpdateFlags().hasAnyUpdate() && !player.getUpdateFlags().didMapRegionChange() && player.getConnection().getPingCount() < 7) { return; } player.getConnection().resetPingCount(); if (player.getUpdateFlags().didMapRegionChange()) { player.getPackets().sendMapRegion(); } PacketBuilder mainPacket = new PacketBuilder().setId(225).setSize(Packet.Size.VariableShort).initBitAccess(); PacketBuilder updateBlock = new PacketBuilder().setSize(Packet.Size.Bare); if (player.getUpdateFlags().isTeleporting()) //teleport { mainPacket.addBits(1, 1); mainPacket.addBits(2, 3); mainPacket.addBits(7, player.getLocation().getLocalY(player.getUpdateFlags().getLastRegion())); //currentX mainPacket.addBits(1, 1); mainPacket.addBits(2, player.getLocation().getZ()); //heightLevel mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); mainPacket.addBits(7, player.getLocation().getLocalX(player.getUpdateFlags().getLastRegion())); //currentY } else { if (player.getSprites().getPrimarySprite() == -1) //no movement { mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); if (player.getUpdateFlags().isUpdateRequired()) { mainPacket.addBits(2, 0); } } else //movement. { mainPacket.addBits(1, 1); if (player.getSprites().getSecondarySprite() == -1) //not running { mainPacket.addBits(2, 1); mainPacket.addBits(3, player.getSprites().getPrimarySprite()); //walk mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else { mainPacket.addBits(2, 2); mainPacket.addBits(1, 1); mainPacket.addBits(3, player.getSprites().getPrimarySprite()); //walk mainPacket.addBits(3, player.getSprites().getSecondarySprite()); //run mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); } } } if (player.getUpdateFlags().isUpdateRequired()) { appendUpdateBlock(player, updateBlock, false); //update my own updates. } mainPacket.addBits(8, player.getLocalEnvironment().getSeenPlayers().Count); //All players I've seen already (not new players) //Send information of all the players in our own location. foreach (Player p in player.getLocalEnvironment().getSeenPlayers()) { if (player.getLocalEnvironment().getRemovedPlayers().Contains(p)) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 3); //delete player. continue; } else if (p.getSprites().getPrimarySprite() == -1) { if (p.getUpdateFlags().isUpdateRequired()) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 0); //finish } else { mainPacket.addBits(1, 0); //no update required, either region changed or no movement change. } } else if (p.getSprites().getPrimarySprite() != -1 && p.getSprites().getSecondarySprite() == -1) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 1); //update just walk direction sprite mainPacket.addBits(3, p.getSprites().getPrimarySprite()); mainPacket.addBits(1, p.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else if (p.getSprites().getPrimarySprite() != -1 && p.getSprites().getSecondarySprite() != -1) //Bit 2 = 2, updates both sprites. { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 2); //update both walk & run sprites. mainPacket.addBits(1, 1); mainPacket.addBits(3, p.getSprites().getPrimarySprite()); mainPacket.addBits(3, p.getSprites().getSecondarySprite()); mainPacket.addBits(1, p.getUpdateFlags().isUpdateRequired() ? 1 : 0); } if (p.getUpdateFlags().isUpdateRequired()) { appendUpdateBlock(p, updateBlock, false); } } //Send information of all the new players in our own location. foreach (Player p in player.getLocalEnvironment().getNewPlayers()) { int yPos = p.getLocation().getY() - player.getLocation().getY(); int xPos = p.getLocation().getX() - player.getLocation().getX(); mainPacket.addBits(11, p.getIndex()); //playerId of new player. mainPacket.addBits(1, 1); mainPacket.addBits(5, xPos < 0 ? xPos + 32 : xPos); mainPacket.addBits(3, p.getWalkingQueue().getLastDirection()); mainPacket.addBits(1, 1); mainPacket.addBits(5, yPos < 0 ? yPos + 32 : yPos); appendUpdateBlock(p, updateBlock, true); //force appearance update. } if (updateBlock.getLength() > 0) { mainPacket.addBits(11, 2047); //2047 max players in server,area. } mainPacket.finishBitAccess(); if (updateBlock.getLength() > 0) { mainPacket.addBytes(updateBlock.toPacket().getData()); } if (player.getConnection() != null) { player.getConnection().SendPacket(mainPacket.toPacket()); } /** * Done with with all our updates.. fine to refine our environment lists. * Remove players who either moved away from our location or plain old disconnected. * Mix new players with old players into one playerlist. * Clear new players list, for more new players again */ player.getLocalEnvironment().organizePlayers(); }
/** * 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 Packet fillStream(Connection connection, int forceRead) { if (connection == null) return null; if (connection.chuckedRawPackets.Count() < forceRead) return null; PacketBuilder pckt = new PacketBuilder(); pckt.setSize(Packet.Size.Bare).addBytes(connection.chuckedRawPackets.GetRange(0, forceRead).ToArray(), 0, forceRead); connection.chuckedRawPackets.RemoveRange(0, forceRead); //delete read data. return pckt.toPacket(); }
private void updateServer(Connection connection) { if (connection == null) return; try { if (connection.loginStage == 1) { Packet fill_3 = fillStream(connection, 3); if (fill_3 == null) //really is 5, but we guess first 2 could be login server and not updateServer. return; PacketBuilder u1Response = new PacketBuilder(); u1Response.setSize(Packet.Size.Bare).addByte((byte)0); connection.SendPacket(u1Response.toPacket()); connection.loginStage = 3; updateServer(connection); } else if (connection.loginStage == 3) { Packet fill_8 = fillStream(connection, 8); if (fill_8 == null) return; PacketBuilder ukeys = new PacketBuilder(); ukeys.setSize(Packet.Size.Bare).addBytes(misc.UPDATE_KEYS); connection.SendPacket(ukeys.toPacket()); connection.loginStage = 5; updateServer(connection); } else if (connection.loginStage == 5) { Packet fill_1 = fillStream(connection, 1); if (fill_1 == null) return; //this is some unknown/not useful packet sent by client useful for quick disconnection. connection.loginStage = 255; } } catch (Exception exception) { misc.WriteError(exception.Message); } }
/** * Update the specified player. * @param p */ public static void update(Player player) { //Creates a list of new players in area. [This only happens once.. no rebuilding like all runescape 2 servers.] player.getLocalEnvironment().updatePlayersInArea(); //Attempt to skip a pointless update if possible. //Any current users on screen got a update for me. bool hasAppearanceUpdate = player.getLocalEnvironment().getSeenPlayers().Exists(new Predicate<Player>(delegate(Player p) { return p.getUpdateFlags().hasAnyUpdate(); })); //No new pending players and no players pending to get removed from screen. bool hasAddRemoveUpdate = (player.getLocalEnvironment().getNewPlayers().Count > 0 || player.getLocalEnvironment().getRemovedPlayers().Count > 0); //no updates.. exit. if (!hasAppearanceUpdate && !hasAddRemoveUpdate && !player.getUpdateFlags().hasAnyUpdate() && !player.getUpdateFlags().didMapRegionChange() && player.getConnection().getPingCount() < 7) return; player.getConnection().resetPingCount(); if(player.getUpdateFlags().didMapRegionChange()) player.getPackets().sendMapRegion(); PacketBuilder mainPacket = new PacketBuilder().setId(225).setSize(Packet.Size.VariableShort).initBitAccess(); PacketBuilder updateBlock = new PacketBuilder().setSize(Packet.Size.Bare); if (player.getUpdateFlags().isTeleporting()) { //teleport mainPacket.addBits(1, 1); mainPacket.addBits(2, 3); mainPacket.addBits(7, player.getLocation().getLocalY(player.getUpdateFlags().getLastRegion())); //currentX mainPacket.addBits(1, 1); mainPacket.addBits(2, player.getLocation().getZ()); //heightLevel mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); mainPacket.addBits(7, player.getLocation().getLocalX(player.getUpdateFlags().getLastRegion())); //currentY } else { if (player.getSprites().getPrimarySprite() == -1) { //no movement mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); if (player.getUpdateFlags().isUpdateRequired()) mainPacket.addBits(2, 0); } else { //movement. mainPacket.addBits(1, 1); if (player.getSprites().getSecondarySprite() == -1) { //not running mainPacket.addBits(2, 1); mainPacket.addBits(3, player.getSprites().getPrimarySprite()); //walk mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else { mainPacket.addBits(2, 2); mainPacket.addBits(1, 1); mainPacket.addBits(3, player.getSprites().getPrimarySprite()); //walk mainPacket.addBits(3, player.getSprites().getSecondarySprite()); //run mainPacket.addBits(1, player.getUpdateFlags().isUpdateRequired() ? 1 : 0); } } } if(player.getUpdateFlags().isUpdateRequired()) appendUpdateBlock(player, updateBlock, false); //update my own updates. mainPacket.addBits(8, player.getLocalEnvironment().getSeenPlayers().Count); //All players I've seen already (not new players) //Send information of all the players in our own location. foreach (Player p in player.getLocalEnvironment().getSeenPlayers()) { if (player.getLocalEnvironment().getRemovedPlayers().Contains(p)) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 3); //delete player. continue; } else if (p.getSprites().getPrimarySprite() == -1) { if(p.getUpdateFlags().isUpdateRequired()) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 0); //finish } else { mainPacket.addBits(1, 0); //no update required, either region changed or no movement change. } } else if (p.getSprites().getPrimarySprite() != -1 && p.getSprites().getSecondarySprite() == -1) { mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 1); //update just walk direction sprite mainPacket.addBits(3, p.getSprites().getPrimarySprite()); mainPacket.addBits(1, p.getUpdateFlags().isUpdateRequired() ? 1 : 0); } else if (p.getSprites().getPrimarySprite() != -1 && p.getSprites().getSecondarySprite() != -1) { //Bit 2 = 2, updates both sprites. mainPacket.addBits(1, 1); //update required. mainPacket.addBits(2, 2); //update both walk & run sprites. mainPacket.addBits(1, 1); mainPacket.addBits(3, p.getSprites().getPrimarySprite()); mainPacket.addBits(3, p.getSprites().getSecondarySprite()); mainPacket.addBits(1, p.getUpdateFlags().isUpdateRequired() ? 1 : 0); } if (p.getUpdateFlags().isUpdateRequired()) appendUpdateBlock(p, updateBlock, false); } //Send information of all the new players in our own location. foreach (Player p in player.getLocalEnvironment().getNewPlayers()) { int yPos = p.getLocation().getY() - player.getLocation().getY(); int xPos = p.getLocation().getX() - player.getLocation().getX(); mainPacket.addBits(11, p.getIndex()); //playerId of new player. mainPacket.addBits(1, 1); mainPacket.addBits(5, xPos < 0 ? xPos + 32 : xPos); mainPacket.addBits(3, p.getWalkingQueue().getLastDirection()); mainPacket.addBits(1, 1); mainPacket.addBits(5, yPos < 0 ? yPos + 32 : yPos); appendUpdateBlock(p, updateBlock, true); //force appearance update. } if (updateBlock.getLength() > 0) mainPacket.addBits(11, 2047); //2047 max players in server,area. mainPacket.finishBitAccess(); if (updateBlock.getLength() > 0) mainPacket.addBytes(updateBlock.toPacket().getData()); if (player.getConnection() != null) player.getConnection().SendPacket(mainPacket.toPacket()); /** * Done with with all our updates.. fine to refine our environment lists. * Remove players who either moved away from our location or plain old disconnected. * Mix new players with old players into one playerlist. * Clear new players list, for more new players again */ player.getLocalEnvironment().organizePlayers(); }
public void sendFightCaveMapdata() { lastX = lastX == 0 ? 2413 : (player.getLocation().getX() - (20000 + (200 * player.getIndex()))); lastY = lastY == 0 ? 5116 : (player.getLocation().getY() - 20000); PacketBuilder pb = new PacketBuilder().setId(214).setSize(Packet.Size.VariableShort); pb.addUShortA(player.getLocation().getLocalX()); pb.addUShortA(player.getLocation().getRegionX()); pb.addByteS(player.getLocation().getZ()); pb.addUShortA(player.getLocation().getLocalY()); pb.initBitAccess(); for(int height = 0; height < 4; height++) { for(int xCalc = ((lastX >> 3) - 6); xCalc <= ((lastX >> 3) + 6); xCalc++) { for(int yCalc = ((lastY >> 3) - 6); yCalc <= ((lastY >> 3) + 6); yCalc++) { int region = yCalc / 8 + (xCalc / 8 << 8); if (height == player.getLocation().getZ() && region == 9551) { pb.addBits(1, 1); pb.addBits(26, (xCalc << 14) | (yCalc << 3) | (0 << 1) | (0 << 24)); } else { pb.addBits(1, 0); } } } } pb.finishBitAccess(); int[] sent = new int[4 * 13 * 13]; int sentIndex = 0; for(int xCalc = (((lastX >> 3) - 6) / 8); xCalc <= (((lastX>> 3) + 6) / 8); xCalc++) { outer: for(int yCalc = (((lastY >> 3) - 6) / 8); yCalc <= (((lastY>> 3) + 6) / 8); yCalc++) { int region = yCalc + (xCalc << 8); if (region != 9551) { continue; } for(int i = 0; i < sentIndex; i++) { if(sent[i] == region) { goto outer; } } sent[sentIndex] = region; sentIndex++; int[] mapData = MapData.getData(region); if (mapData == null) { pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); pb.addInt2(0); } else { pb.addInt2(mapData[0]); pb.addInt2(mapData[1]); pb.addInt2(mapData[2]); pb.addInt2(mapData[3]); } } } pb.addUShort(player.getLocation().getRegionY()); connection.SendPacket(pb.toPacket()); }
public void sendClientScript(int id, object[] parameters, string types) { if (parameters.Length != types.Length) { misc.WriteError("params size should be the same as types length"); return; } PacketBuilder packet = new PacketBuilder().setId(115).setSize(Packet.Size.VariableShort) .addUShort(count++) .addString(types); int idx = 0; for (int i = types.Length - 1;i >= 0;i--) { if (types[i] == 's') packet.addString((string)parameters[idx]); else packet.addInt((int)parameters[idx]); idx++; } packet.addInt(id); connection.SendPacket(packet.toPacket()); }
private void attemptPlayerLogin(Connection connection) { if (connection == null) return; if (connection.loginStage == 0) //Attempt login or update server. { Packet fill_2 = fillStream(connection, 2); if (fill_2 == null) return; int connectionType = fill_2.readByte(); if (connectionType == 15) { //it's update server connection.loginStage = 1; updateServer(connection); return; } else if (connectionType == 255) { connection.SendPacket(new PacketBuilder() .setSize(Packet.Size.Bare) .addBytes(misc.WORLD_LIST_DATA).toPacket()); connection.loginStage = 5; updateServer(connection); return; } else if (connectionType != 14) { connection.loginStage = 255; //255 is used as fail. return; } Random random = new Random(); long serverSessionKey = ((long)(random.NextDouble() * 99999999D) << 32) + (long)(random.NextDouble() * 99999999D); int longPlayerName = fill_2.readByte(); PacketBuilder s1Response = new PacketBuilder(); s1Response.setSize(Packet.Size.Bare).addByte((byte)0).addLong(serverSessionKey); connection.SendPacket(s1Response.toPacket()); connection.loginStage = 2; attemptPlayerLogin(connection); } else if (connection.loginStage == 2) { Packet fill_1 = fillStream(connection, 1); if (fill_1 == null) return; int loginType = fill_1.readByte(); if (loginType != 16 && loginType != 18 && loginType != 14) { connection.loginStage = 255; //255 is used as fail. return; } connection.loginStage = 4; attemptPlayerLogin(connection); } else if (connection.loginStage == 4) { Packet fill_2 = fillStream(connection, 2); if (fill_2 == null) return; int loginPacketSize = fill_2.readUShort(); int loginEncryptPacketSize = loginPacketSize - (36 + 1 + 1 + 2); if (loginEncryptPacketSize <= 0) { connection.loginStage = 255; return; } Packet fill_loginPacketSize = fillStream(connection, loginPacketSize); if (fill_loginPacketSize == null) return; int clientVersion = fill_loginPacketSize.readInt(); if (clientVersion != 530) { connection.loginStage = 255; return; } byte junk1 = fill_loginPacketSize.readByte(); byte lowMem = fill_loginPacketSize.readByte(); //0 is this still low mem ver? byte zero = fill_loginPacketSize.readByte(); byte b1 = fill_loginPacketSize.readByte(); ushort s1 = fill_loginPacketSize.readUShort(); ushort s2 = fill_loginPacketSize.readUShort(); byte b2 = fill_loginPacketSize.readByte(); for (int i = 0; i < 24; i++) { int cacheIDX = fill_loginPacketSize.readByte(); } string appletSettings = fill_loginPacketSize.readRS2String(); //EkKmok3kJqOeN6D3mDdihco3oPeYN2KFy6W5--vZUbNA int someInt1 = fill_loginPacketSize.readInt(); int someInt2 = fill_loginPacketSize.readInt(); ushort short1 = fill_loginPacketSize.readUShort(); for (int i = 0; i < 28; i++) { int crcOfClientClasses = fill_loginPacketSize.readInt(); } int junk2 = fill_loginPacketSize.readByte(); int encryption = fill_loginPacketSize.readByte(); if (encryption != 10 && encryption != 64) { connection.loginStage = 255; return; } long clientSessionKey = fill_loginPacketSize.readLong(); long serverSessionKey = fill_loginPacketSize.readLong(); LoginDetails loginDetails = new LoginDetails(); loginDetails.setLongName(fill_loginPacketSize.readLong()); //must start a 225. loginDetails.setUsername(misc.longToPlayerName(loginDetails.getLongName()).ToLower().Replace("_", " ").Trim()); loginDetails.setPassword(fill_loginPacketSize.readRS2String()); Console.WriteLine("Attempting to login with Username: "******" Password: " + loginDetails.getPassword()); connection.setLoginDetails(loginDetails); //start attempting to login the account. lock (playersToLoad) { playersToLoad.Enqueue(connection); } connection.loginStage = 6; } }