public void baseSkills() {
        Map<Skill, SkillEntry> list = new HashMap<>();
        if (GameConstants.getJobNumber(job) >= 3) { //third job.
            List<Integer> base_skills = SkillFactory.getSkillsByJob(job);
            if (base_skills != null) {
                for (int i : base_skills) {
                    final Skill skil = SkillFactory.getSkill(i);
                    if (skil != null && !skil.isInvisible() && skil.isFourthJob() && getSkillLevel(skil) <= 0 && getMasterLevel(skil) <= 0 && skil.getMasterLevel() > 0) {
                        list.put(skil, new SkillEntry((byte) 0, (byte) skil.getMasterLevel(), SkillFactory.getDefaultSExpiry(skil))); //usually 10 master
                    } else if (skil != null && skil.getName() != null && (skil.getName().contains("Maple Warrior") || skil.getName().contains("Nova Warrior")) && getSkillLevel(skil) <= 0 && getMasterLevel(skil) <= 0) {
                        list.put(skil, new SkillEntry((byte) 0, (byte) 10, SkillFactory.getDefaultSExpiry(skil))); //hackish
                    }
                }

            }
        }
        Skill skil;

        int start = (job / 100) * 1000000;
        int end = job * 10000 + 3000;
//        System.out.println(start + " | " + end);
        for (int i = start; i < end; i++) {
            skil = SkillFactory.getSkill(i);
            if (skil != null) {
                if (getSkillLevel(skil) <= 0 && !skil.isInvisible()) {
                    boolean fourth = skil.isFourthJob();
                    int master = skil.getMasterLevel();
                    list.put(skil, new SkillEntry((byte) 0, (byte) (fourth ? master > 0 ? master : skil.getMaxLevel() : skil.getMaxLevel()), -1));
                }
            }
        }

        /*
         if (job >= 2211 && job <= 2218) { // evan fix magic guard
         skil = SkillFactory.getSkill(22111001);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 20, -1));
         }
         }
         }
         if (job >= 2100 && job <= 2112) {
         int[] ss = {21120002, 21120001, 21120005, 21120003, 21121000, 211210012, 211210004, 211210006, 211210007};
         for (int i : ss) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 10, -1));
         }
         }
         }
         }
         if (job >= 430 && job <= 434) {
         final int[] ss0 = {4331002, 4330009, 4341004, 4341006, 4341007, 4341011, 4340013};
         for (int i : ss0) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 10, -1));
         }
         }
         }
         final int[] ss1 = {4311003, 4321006};
         for (int i : ss1) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 5, -1));
         }
         }
         }
         skil = SkillFactory.getSkill(4341006);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 10, -1));
         }
         }
         skil = SkillFactory.getSkill(4341011);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 0, (byte) 10, -1));
         }
         }
         }
         if (job >= 430 && job <= 434) {
         Skill skill;
         int ss431 = 4311003;
         int ss432 = 4321006;
         int[] ss433 = {4331002, 4330009};
         if (job == 431) {
         skill = SkillFactory.getSkill(ss431);
         if (skill != null) {
         changeSingleSkillLevel(skill, 0, (byte) 20);
         }
         }
         if (job == 432) {
         skill = SkillFactory.getSkill(ss432);
         if (skill != null) {
         changeSingleSkillLevel(skill, 0, (byte) 20);
         }
         }
         if (job == 433) {
         for (int i : ss433) {
         skill = SkillFactory.getSkill(i);
         if (skill != null) {
         changeSingleSkillLevel(skill, 0, (byte) 20);
         }
         }
         }
         }

         if (GameConstants.isWildHunter(job)) {
         int[] ss = {30001061, 30001062};
         for (int i : ss) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         }

         if (GameConstants.isMercedes(job)) {
         final int[] ss = {20021000, 20021001, 20020002, 20020022, 20020109, 20021110, 20020111, 20020112};
         for (int i : ss) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         skil = SkillFactory.getSkill(20021181);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) -1, (byte) 0, -1));
         }
         }
         skil = SkillFactory.getSkill(20021166);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) -1, (byte) 0, -1));
         }
         }
         }
         if (GameConstants.isDemonSlayer(job)) {
         final int[] ss1 = {30011000, 30011001, 30010002, 30010185, 30010112, 30010111, 30010110, 30010022, 30011109};
         for (int i : ss1) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         final int[] ss2 = {30011170, 30011169, 30011168, 30011167, 30010166, 30010184, 30010183, 30010186};
         for (int i : ss2) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) -1, (byte) -1, -1));
         }
         }
         }
         }

         if (GameConstants.isXenon(job)) {
         final int[] ss = {30020232, 30020233, 30020234, 30020240, 30021236, 30021237};
         for (int i : ss) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) {
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         final int[] ss2 = {36120005, 36120006, 36120015, 36121000, 36121001, 36121002, 36121003, 36121004, 36121007, 36121011, 36121012, 36121013, 36121014};
         for (int i : ss2) {
         skil = SkillFactory.getSkill(i);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) {
         list.put(skil, new SkillEntry((byte) 0, (byte) skil.getMasterLevel(), -1));
         }
         }
         }
         int[][] jobs = {{3002, 30020234}, {3600, 36000004}, {3610, 36100007}, {3611, 36110007}, {3612, 36120010}};
         for (int[] _job : jobs) {
         if (job >= _job[0]) {
         skil = SkillFactory.getSkill(_job[1]);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         }
         if (job == 3612 && level >= 200) {
         skil = SkillFactory.getSkill(36120016);
         if (skil != null) {
         if (getSkillLevel(skil) <= 0) { // no total
         list.put(skil, new SkillEntry((byte) 1, (byte) 1, -1));
         }
         }
         }
         }
         */
        if (!list.isEmpty()) {
            changeSkillsLevel(list);
        }
        //redemption for completed quests. holy fk. ex
	    /*
         * List<MapleQuestStatus> cq = getCompletedQuests(); for
         * (MapleQuestStatus q : cq) { for (MapleQuestAction qs :
         * q.getQuest().getCompleteActs()) { if (qs.getType() ==
         * MapleQuestActionType.skill) { for (Pair<Integer, Pair<Integer,
         * Integer>> skill : qs.getSkills()) { final Skill skil =
         * SkillFactory.getSkill(skill.left); if (skil != null &&
         * getSkillLevel(skil) <= skill.right.left && getMasterLevel(skil) <=
         * skill.right.right) { changeSkillLevel(skil, (byte)
         * (int)skill.right.left, (byte) (int)skill.right.right); } } } else if
         * (qs.getType() == MapleQuestActionType.item) { //skillbooks for
         * (MapleQuestAction.QuestItem item : qs.getItems()) { if (item.itemid /
         * 10000 == 228 && !haveItem(item.itemid,1)) { //skillbook //check if we
         * have the skill final Map<String, Integer> skilldata =
         * MapleItemInformationProvider.getInstance().getSkillStats(item.itemid);
         * if (skilldata != null) { byte i = 0; Skill finalSkill = null; Integer
         * skillID = 0; while (finalSkill == null) { skillID =
         * skilldata.get("skillid" + i); i++; if (skillID == null) { break; }
         * final Skill CurrSkill = SkillFactory.getSkill(skillID); if (CurrSkill
         * != null && CurrSkill.canBeLearnedBy(job) && getSkillLevel(CurrSkill)
         * <= 0 && getMasterLevel(CurrSkill) <= 0) { finalSkill = CurrSkill; } }
         * if (finalSkill != null) { //may as well give the skill
         * changeSkillLevel(finalSkill, (byte) 0, (byte)10);
         * //MapleInventoryManipulator.addById(client, item.itemid, item.count);
         * } } } } } } }
         */
    }