/**
   * Appends the state of a player's appearance to a buffer.
   *
   * @param player the player.
   * @param out the buffer.
   */
  public static void appendAppearance(Player player, PacketBuffer.WriteBuffer out) {
    PacketBuffer.WriteBuffer block = PacketBuffer.newWriteBuffer(128);

    /** Gender. */
    block.writeByte(player.getGender()); // Gender

    /** Head icon. */
    block.writeByte(player.getHeadIcon());

    /** Skull icon. */
    block.writeByte(player.getSkullIcon());
    if (player.getNpcAppearanceId() == -1) {

      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD));
      } else {
        block.writeByte(0);
      }

      /** Cape. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CAPE) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CAPE));
      } else {
        block.writeByte(0);
      }

      /** Amulet. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_AMULET) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_AMULET));
      } else {
        block.writeByte(0);
      }

      /** Weapon. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_WEAPON) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_WEAPON));
      } else {
        block.writeByte(0);
      }

      /** Chest. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CHEST) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CHEST));
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_CHEST]);
      }

      /** Shield. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_SHIELD) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_SHIELD));
      } else {
        block.writeByte(0);
      }

      /** Arms. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CHEST) > 1) {

        if (!Misc.getIsPlatebody()[
            player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_CHEST)]) {
          block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_ARMS]);
        } else {
          block.writeByte(0);
        }
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_ARMS]);
      }

      /** Legs. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_LEGS) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_LEGS));
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_LEGS]);
      }

      /** Head. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD) > 1
          && Misc.getIsFullHelm()[
              player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD)]) {
        block.writeByte(0);
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_HEAD]);
      }

      /** Hands. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HANDS) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HANDS));
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_HANDS]);
      }

      /** Feet. */
      if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_FEET) > 1) {
        block.writeShort(
            0x200 + player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_FEET));
      } else {
        block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_FEET]);
      }

      /** Beard. */
      if (player.getGender() == Misc.GENDER_MALE) {
        if (player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD) > 1
                && !Misc.getIsFullHelm()[
                    player.getEquipment().getContainer().getItemId(Misc.EQUIPMENT_SLOT_HEAD)]
            || player.getEquipment().getContainer().isSlotFree(Misc.EQUIPMENT_SLOT_HEAD)) {
          block.writeShort(0x100 + player.getAppearance()[Misc.APPEARANCE_SLOT_BEARD]);
        } else {
          block.writeByte(0);
        }
      }

    } else {
      block.writeShort(-1);
      block.writeShort(player.getNpcAppearanceId());
    }

    /** Player colors */
    block.writeByte(player.getColors()[0]);
    block.writeByte(player.getColors()[1]);
    block.writeByte(player.getColors()[2]);
    block.writeByte(player.getColors()[3]);
    block.writeByte(player.getColors()[4]);

    /** Movement animations */
    block.writeShort(
        player.getUpdateAnimation().getStandingAnimation() == -1
            ? PlayerAnimation.getStandEmote()
            : player.getUpdateAnimation().getStandingAnimation()); // stand
    block.writeShort(PlayerAnimation.getStandTurnEmote()); // stand turn
    block.writeShort(
        player.getUpdateAnimation().getWalkingAnimation() == -1
            ? PlayerAnimation.getWalkEmote()
            : player.getUpdateAnimation().getWalkingAnimation()); // walk
    block.writeShort(PlayerAnimation.getTurn180Emote()); // turn 180
    block.writeShort(PlayerAnimation.getTurn90CWEmote()); // turn 90 cw
    block.writeShort(PlayerAnimation.getTurn90CCWEmote()); // turn 90 ccw
    block.writeShort(
        player.getUpdateAnimation().getRunningAnimation() == -1
            ? PlayerAnimation.getRunEmote()
            : player.getUpdateAnimation().getRunningAnimation()); // run

    /** Player context menus */
    block.writeLong(Misc.nameToLong(player.getUsername()));
    block.writeByte(player.getCombatLevel());
    block.writeShort(0);

    /** Append the block length and the block to the packet. */
    out.writeByte(block.getBuffer().position(), PacketBuffer.ValueType.C);
    out.writeBytes(block.getBuffer());
  }