@Override public void handle(Player player, Packet packet) { final int id = packet.getShort() & 0xFFFF; final int slot = packet.getShortA() & 0xFFFF; final int interfaceId = packet.getShortA() & 0xFFFF; switch (interfaceId) { case Inventory.INTERFACE: if (slot >= 0 && slot < Inventory.SIZE) { final Item item = player.getInventory().get(slot); if (item != null && item.getId() == id) { final EquipmentType type = Equipment.getType(item); Item oldEquip = null; final boolean stackable = false; if (player.getEquipment().isSlotUsed(type.getSlot()) && !stackable) { oldEquip = player.getEquipment().get(type.getSlot()); player.getEquipment().set(type.getSlot(), null); } player.getInventory().set(slot, null); if (oldEquip != null) { player.getInventory().add(oldEquip); } if (!stackable) { player.getEquipment().set(type.getSlot(), item); } else { player.getEquipment().add(item); } } } break; } }
/** * Appends an appearance update. * * @param packet The packet. * @param otherPlayer The player. */ private void appendPlayerAppearanceUpdate(PacketBuilder packet, Player otherPlayer) { Appearance app = otherPlayer.getAppearance(); Container eq = otherPlayer.getEquipment(); PacketBuilder playerProps = new PacketBuilder(); playerProps.put((byte) app.getGender()); // gender if ((app.getGender() & 0x2) == 2) { playerProps.put((byte) 0); playerProps.put((byte) 0); } playerProps.put((byte) -1); // skull icon playerProps.put((byte) -1); // prayer icon if (!otherPlayer.getAppearance().isNpc()) { for (int i = 0; i < 4; i++) { if (eq.isSlotUsed(i)) { playerProps.putShort((short) 32768 + eq.get(i).getDefinition().getEquipId()); } else { playerProps.put((byte) 0); } } if (eq.isSlotUsed(Equipment.SLOT_CHEST)) { playerProps.putShort( (short) 32768 + eq.get(Equipment.SLOT_CHEST).getDefinition().getEquipId()); } else { playerProps.putShort((short) 0x100 + app.getChest()); // chest } if (eq.isSlotUsed(Equipment.SLOT_SHIELD)) { playerProps.putShort( (short) 32768 + eq.get(Equipment.SLOT_SHIELD).getDefinition().getEquipId()); } else { playerProps.put((byte) 0); } final Item chest = eq.get(Equipment.SLOT_CHEST); if (chest != null) { if (!Equipment.is(EquipmentType.PLATEBODY, chest)) { playerProps.putShort((short) 0x100 + app.getArms()); } else { playerProps.putShort((short) 32768 + chest.getDefinition().getEquipId()); } } else { playerProps.putShort((short) 0x100 + app.getArms()); } if (eq.isSlotUsed(Equipment.SLOT_BOTTOMS)) { playerProps.putShort( (short) 32768 + eq.get(Equipment.SLOT_BOTTOMS).getDefinition().getEquipId()); } else { playerProps.putShort((short) 0x100 + app.getLegs()); } final Item helm = eq.get(Equipment.SLOT_HELM); if (helm != null) { if (!Equipment.is(EquipmentType.FULL_HELM, helm) && !Equipment.is(EquipmentType.FULL_MASK, helm)) { playerProps.putShort((short) 0x100 + app.getHead()); } else { playerProps.put((byte) 0); } } else { playerProps.putShort((short) 0x100 + app.getHead()); } if (eq.isSlotUsed(Equipment.SLOT_GLOVES)) { playerProps.putShort( (short) 32768 + eq.get(Equipment.SLOT_GLOVES).getDefinition().getEquipId()); } else { playerProps.putShort((short) 0x100 + app.getHands()); } if (eq.isSlotUsed(Equipment.SLOT_BOOTS)) { playerProps.putShort( (short) 32768 + eq.get(Equipment.SLOT_BOOTS).getDefinition().getEquipId()); } else { playerProps.putShort((short) 0x100 + app.getFeet()); } boolean fullHelm = false; if (helm != null) { fullHelm = !Equipment.is(EquipmentType.FULL_HELM, helm); } if (fullHelm || app.getGender() == 1) { playerProps.put((byte) 0); } else { playerProps.putShort((short) 0x100 + app.getBeard()); } } else { playerProps.putShort(-1); playerProps.putShort(otherPlayer.getAppearance().getNpcIndex()); } playerProps.put((byte) app.getHairColour()); // hairc playerProps.put((byte) app.getTorsoColour()); // torsoc playerProps.put((byte) app.getLegColour()); // legc playerProps.put((byte) app.getFeetColour()); // feetc playerProps.put((byte) app.getSkinColour()); // skinc Item weapon = eq.get(Equipment.SLOT_WEAPON); playerProps.putShort((short) Equipment.standAnimation(weapon)); // stand playerProps.putShort((short) 0x337); // stand turn playerProps.putShort((short) Equipment.walkAnimation(weapon)); // walk playerProps.putShort((short) 0x334); // turn 180 playerProps.putShort((short) 0x335); // turn 90 cw playerProps.putShort((short) 0x336); // turn 90 ccw playerProps.putShort((short) Equipment.runAnimation(weapon)); // run playerProps.putLong(otherPlayer.getNameAsLong()); // player name playerProps.put((byte) otherPlayer.getSkills().getCombatLevel()); // combat level playerProps.putShort( 0); // (skill-level instead of combat-level) otherPlayer.getSkills().getTotalLevel()); // // total level Packet propsPacket = playerProps.toPacket(); packet.put((byte) (propsPacket.getLength() & 0xff)); packet.putBytes(propsPacket.getPayload(), 0, propsPacket.getLength()); }