public static MaplePacket charInfo(final MapleCharacter chr) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();
        mplew.writeShort(SendPacketOpcode.CHAR_INFO);
        // mplew.writeShort(0x31);
        mplew.writeInt(chr.getId());
        mplew.write(chr.getLevel());
        mplew.writeShort(chr.getJob());
        mplew.writeShort(chr.getFame());
        mplew.write(1); // heart red or gray
        if (chr.getGuildId() <= 0) {
            mplew.writeMapleAsciiString("-");
            mplew.writeMapleAsciiString("-");
        } else {
            final MapleGuildSummary gs = chr.getClient().getChannelServer().getGuildSummary(chr.getGuildId());
            mplew.writeMapleAsciiString(gs.getName());
            final MapleAlliance alliance = chr.getGuild().getAlliance(chr.getClient());
            if (alliance == null) {
                mplew.writeMapleAsciiString("-");
            } else {
                mplew.writeMapleAsciiString(alliance.getName());
            }
        }
        mplew.write(0);

        final IItem inv = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -114);
        final int peteqid = inv != null ? inv.getItemId() : 0;

        for (final MaplePet pet : chr.getPets()) {
            if (pet.getSummoned()) {
                mplew.write(pet.getUniqueId());
                mplew.writeInt(pet.getPetItemId()); // petid
                mplew.writeMapleAsciiString(pet.getName());
                mplew.write(pet.getLevel()); // pet level
                mplew.writeShort(pet.getCloseness()); // pet closeness
                mplew.write(pet.getFullness()); // pet fullness
                mplew.writeShort(0);
                mplew.writeInt(peteqid);
            }
        }
        mplew.write(0); // End of pet
        if (chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -22) != null) {
            final MapleMount mount = chr.getMount();
            mplew.write(1);
            mplew.writeInt(mount.getLevel());
            mplew.writeInt(mount.getExp());
            mplew.writeInt(mount.getFatigue());
        } else {
            mplew.write(0);
        }

        final int wishlistSize = chr.getWishlistSize();
        mplew.write(wishlistSize);
        if (wishlistSize > 0) {
            final int[] wishlist = chr.getWishlist();
            for (int i = 0; i < wishlistSize; i++) {
                mplew.writeInt(wishlist[i]);
            }
        }

        chr.getMonsterBook().addCharInfoPacket(chr.getMonsterBookCover(), mplew);

        return mplew.getPacket();
    }