Beispiel #1
0
        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());
        }
Beispiel #2
0
        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());
        }
Beispiel #3
0
        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());
        }
Beispiel #4
0
        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());
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
        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());
        }
Beispiel #7
0
        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());
        }
Beispiel #8
0
        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());
        }
Beispiel #9
0
        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());
        }
Beispiel #11
0
        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 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 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.");
						        }
                            }
					    }
				    }
			    }
            }
        }
Beispiel #16
0
        /**
         * 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 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 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());
 }
        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 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); 
            }
        }
        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);
        }
        /**
         * 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 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 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;
            }

        }