public static byte[] charInfo(MapleCharacter chr, boolean isSelf) {
        MaplePacketLittleEndianWriter mplew = new MaplePacketLittleEndianWriter();

        mplew.writeShort(SendPacketOpcode.CHAR_INFO.getValue());
        mplew.writeInt(chr.getId());
        mplew.write(chr.getLevel());
        mplew.writeShort(chr.getJob());
        mplew.writeShort(chr.getSubcategory());
        mplew.write(chr.getStat().pvpRank);
        mplew.writeInt(chr.getFame());
        MapleMarriage marriage = chr.getMarriage();
        mplew.write(marriage != null && marriage.getId() != 0);
        if (marriage != null && marriage.getId() != 0) {
            mplew.writeInt(marriage.getId()); //marriage id
            mplew.writeInt(marriage.getHusbandId()); //husband char id
            mplew.writeInt(marriage.getWifeId()); //wife char id
            mplew.writeShort(3); //msg type
            mplew.writeInt(chr.getMarriageItemId()); //ring id husband
            mplew.writeInt(chr.getMarriageItemId()); //ring id wife
            mplew.writeAsciiString(marriage.getHusbandName(), 13); //husband name
            mplew.writeAsciiString(marriage.getWifeName(), 13); //wife name
        }
        List prof = chr.getProfessions();
        mplew.write(prof.size());
        for (Iterator i$ = prof.iterator(); i$.hasNext();) {
            int i = ((Integer) i$.next());
            mplew.writeShort(i);
        }
        if (chr.getGuildId() <= 0) {
            mplew.writeMapleAsciiString("-");
            mplew.writeMapleAsciiString("");
        } else {
            MapleGuild gs = World.Guild.getGuild(chr.getGuildId());
            if (gs != null) {
                mplew.writeMapleAsciiString(gs.getName());
                if (gs.getAllianceId() > 0) {
                    MapleGuildAlliance allianceName = World.Alliance.getAlliance(gs.getAllianceId());
                    if (allianceName != null) {
                        mplew.writeMapleAsciiString(allianceName.getName());
                    } else {
                        mplew.writeMapleAsciiString("");
                    }
                } else {
                    mplew.writeMapleAsciiString("");
                }
            } else {
                mplew.writeMapleAsciiString("-");
                mplew.writeMapleAsciiString("");
            }
        }

        mplew.write(isSelf ? 1 : 0);
        mplew.write(0);

        byte index = 1;
        mplew.write(index);
        for (MaplePet pet : chr.getSummonedPets()) {
            mplew.writeInt(pet.getPetItemId());
            mplew.writeMapleAsciiString(pet.getName());
            mplew.write(pet.getLevel());
            mplew.writeShort(pet.getCloseness());
            mplew.write(pet.getFullness());
            mplew.writeShort(0);
            Item inv = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) (index == 2 ? -130 : index == 1 ? -114 : -138));
            mplew.writeInt(inv == null ? 0 : inv.getItemId());
            mplew.writeInt(-1);//new v140
            mplew.write(chr.getSummonedPets().size() > index); //continue loop
            index++;
        }
        if (index == 1) { //index no change means no pets
            mplew.write(0);
        }
        /*if ((chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -18) != null) && (chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -19) != null)) {
         MapleMount mount = chr.getMount();
         mplew.write(1);
         mplew.writeInt(mount.getLevel());
         mplew.writeInt(mount.getExp());
         mplew.writeInt(mount.getFatigue());
         } else {
         mplew.write(0);
         }*/
        int wishlistSize = chr.getWishlistSize();
        mplew.write(wishlistSize);
        if (wishlistSize > 0) {
            int[] wishlist = chr.getWishlist();
            for (int x = 0; x < wishlistSize; x++) {
                mplew.writeInt(wishlist[x]);
            }
        }
        Item medal = chr.getInventory(MapleInventoryType.EQUIPPED).getItem((byte) -46);
        mplew.writeInt(medal == null ? 0 : medal.getItemId());
        List<Pair<Integer, Long>> medalQuests = chr.getCompletedMedals();
        mplew.writeShort(medalQuests.size());
        for (Pair x : medalQuests) {
            mplew.writeShort(((Integer) x.left));
            mplew.writeLong(((Long) x.right));
        }
        for (MapleTrait.MapleTraitType t : MapleTrait.MapleTraitType.values()) {
            mplew.write(chr.getTrait(t).getLevel());
        }

        mplew.writeInt(0); //farm id?
        PacketHelper.addFarmInfo(mplew, chr.getClient(), 0);

        mplew.writeInt(0);
        mplew.writeInt(0);

        List chairs = new ArrayList();
        for (Item i : chr.getInventory(MapleInventoryType.SETUP).newList()) {
            if ((i.getItemId() / 10000 == 301) && (!chairs.contains(i.getItemId()))) {
                chairs.add(i.getItemId());
            }
        }
        mplew.writeInt(chairs.size());
        for (Iterator i$ = chairs.iterator(); i$.hasNext();) {
            int i = ((Integer) i$.next());
            mplew.writeInt(i);
        }

        return mplew.getPacket();
    }