public final static MapleCharacter ReconstructChr(final CharacterTransfer ct, final MapleClient c, final boolean isChannel) {
        final MapleCharacter ret = new MapleCharacter(true);
        ret.client = c;
        if (!isChannel) {
            ret.client.setChannel(ct.channel);
        }
        ret.id = ct.characterid;
        ret.accountid = ct.accountid;
        ret.name = ct.name;
        ret.level = ct.level;
        ret.fame = ct.fame;

        ret.stats = new PlayerStats(ret);
        ret.stats.setStr(ct.str);
        ret.stats.setDex(ct.dex);
        ret.stats.setInt(ct.int_);
        ret.stats.setLuk(ct.luk);
        ret.stats.setMaxHp(ct.maxhp);
        ret.stats.setMaxMp(ct.maxmp);
        ret.stats.setHp(ct.hp);
        ret.stats.setMp(ct.mp);

        ret.exp = ct.exp;
        ret.remainingAp = ct.remainingAp;
        ret.meso = ct.meso;
        ret.gmLevel = ct.gmLevel;


        ret.skinColor = ct.skinColor;
        ret.gender = ct.gender;
        ret.job = ct.job;
        ret.hair = ct.hair;
        ret.face = ct.face;

        ret.mapid = ct.mapid;
        ret.initialSpawnPoint = ct.initialSpawnPoint;
        ret.world = ct.world;

        ret.rank = ct.rank;
        ret.rankMove = ct.rankmove;
        ret.jobRank = ct.jobrank;
        ret.jobRankMove = ct.jobrankmove;

        ret.bookCover = ct.mBookCover;
        ret.dojoPoints = ct.dojoPoints;
        ret.lastDojoStage = ct.lastDojoStage;

        ret.guildid = ct.guildid;
        ret.guildrank = ct.guildrank;
        ret.allianceRank = ct.allianceRank;
        if (ret.guildid > 0) {
            ret.mgc = new MapleGuildCharacter(ret);
        }

        ret.reborn = ct.reborns;
        ret.mobkilled = ct.mobkilled;
        ret.bosskilled = ct.bosskilled;

        ret.mutality = ct.mutality;
        ret.clonelimit = ct.clonelimit;
        ret.rasengan = ct.rasengan;
        ret.legend = ct.legend;
        ret.maxstatitem = ct.msi;
        ret.lmpoints = ct.lmpoints;
        ret.pvpdeaths = ct.pvpdeaths;
        ret.pvpkills = ct.pvpkills;
        ret.prefixshit = ct.prefixshit;
        ret.autoap = ct.autoap;
        ret.buddylist = new BuddyList(200);

        ret.createdate = ct.createdate;
        ret.previousnames = ct.previousnames;
        ret.taocheck = ct.taocheck;
        ret.GMSMode = ct.GMSMode;

        ret.taorank = ct.taorank;
        ret.clantaorank = ct.clantaorank;
        ret.smega = ct.smega;

        ret.bossPoints = ct.bossPoints;
        ret.kpqpoints = ct.kpqpoints;

        ret.expBoost = ct.expBoost;
        ret.mesoBoost = ct.mesoBoost;
        ret.dropBoost = ct.dropBoost;
        ret.bdropBoost = ct.bdropBoost;

        ret.textColour = ct.textColour;
        ret.mission = ct.mission;

        ret.paypalNX = ct.paypalNX;
        ret.maplePoints = ct.maplePoints;
        ret.cardNX = ct.cardNX;
        ret.ninjatensu = ct.ninjatensu;
        ret.dpoints = ct.dpoints;
        ret.damount = ct.damount;
        ret.jqPoints = ct.jqpoints;
        ret.jqFinished = ct.jqfinished;
        ret.lastjq = ct.lastjq;
        ret.footnote = ct.footnote;
        ret.village = ct.village;
        ret.autobuffs = (List<Integer>) ct.autobuffs;

        ret.monsterbook = (MonsterBook) ct.monsterbook;
        ret.inventory = (MapleInventory[]) ct.inventorys;
        ret.skillMacros = (SkillMacro[]) ct.skillmacro;
        ret.keylayout = (MapleKeyLayout) ct.keymap;
        ret.savedLocations = (int[]) ct.savedlocation;
        ret.wishlist = (int[]) ct.wishlist;
        ret.rocks = (int[]) ct.rocks;

        ret.storage = (MapleStorage) ct.storage;
        c.setAccountName(ct.accountname);

        ret.lastfametime = ct.lastfametime;
        ret.lastmonthfameids = (List<Integer>) ct.famedcharacters;

        ret.buddylist.loadFromTransfer((List<BuddyData>) ct.buddies);


        ret.mount = new MapleMount(ret, ct.mount_itemid, 1004, ct.mount_Fatigue, ct.mount_level, ct.mount_exp);
        if (isChannel) {
            final MapleMapFactory mapFactory = ChannelServer.getInstance(c.getChannel()).getMapFactory();
            ret.map = mapFactory.getMap(ret.mapid);
            if (ret.map == null) { //char is on a map that doesn't exist warp it to henesys
                ret.map = mapFactory.getMap(100000000);
            } else {
                if (ret.map.getForcedReturnId() != 999999999) {
                    ret.map = ret.map.getForcedReturnMap();
                }
            }
            MaplePortal portal = ret.map.getPortal(ret.initialSpawnPoint);
            if (portal == null) {
                portal = ret.map.getPortal(0); // char is on a spawnpoint that doesn't exist - select the first spawnpoint instead
                ret.initialSpawnPoint = 0;
            }
            ret.setPosition(portal.getPosition());

            int partyid = ct.partyid;
            if (partyid >= 0) {
                try {
                    MapleParty party = c.getChannelServer().getWorldInterface().getParty(partyid);
                    if (party != null && party.getMemberById(ret.id) != null) {
                        ret.party = party;
                    }
                } catch (RemoteException e) {
                    c.getChannelServer().reconnectWorld();
                }
            }

            final int messengerid = ct.messengerid;
            final int position = ct.messengerposition;
            if (messengerid > 0 && position < 4 && position > -1) {
                try {
                    WorldChannelInterface wci = ChannelServer.getInstance(c.getChannel()).getWorldInterface();
                    MapleMessenger messenger = wci.getMessenger(messengerid);
                    if (messenger != null) {
                        ret.messenger = messenger;
                        ret.messengerposition = position;
                    }
                } catch (RemoteException e) {
                    c.getChannelServer().reconnectWorld();
                }
            }
        } else {
            int partyid = ct.partyid;
            if (partyid >= 0) {
                try {
                    MapleParty party = CashShopServer.getInstance().getCSInterface().getParty(partyid);
                    if (party != null && party.getMemberById(ret.id) != null) {
                        ret.party = party;
                    }
                } catch (RemoteException e) {
                    c.getChannelServer().reconnectWorld();
                }
            }

            ret.messenger = null;
            ret.messengerposition = ct.messengerposition;
        }

        ret.stats.recalcLocalStats();
        ret.silentEnforceMaxHpMp();

        return ret;
    }