All(Well not quite)-in-One NPC [Fixed typos in script ><]

Newbie Spellweaver
Joined
Jun 27, 2008
Messages
30
Reaction score
0
So I was lying about the "all" bit. But well, this NPC acts as a

Universal Job Advancer w/ Overlevel Fix
-cum-
Skill Maxer
-cum-
Rebirth
-cum-
Level 201 Fix!

What more can one ask for!? (:

Basically, I stole a "dispose properly" script off somewhere in the forum (can't remember who, but credits to him/her anyway ^^), and rearranged it to consider job before level, added in skills (lots of them) specific to the jobs, (labelled them), added in 1st job, and added rebirth + lvl 201 fix.

The purpose of the getSkillLevel() function, is is for 4th job. Without the function, this NPC will reset your skills to the default when you advance to 4th job, even if you have maxed those skills before, and you will have to reuse the skillbooks. So the main objective of this function, is to check for Hero's Will. If Hero's Will is added, it implies that you have advanced to that job before, and it will preserve your skills. If not, it will set it to the defaults.

First things first, in order to use the getSkillLevel() NPC function, you have to add the following in your net\sf\odinms\scripting\npc\NPCConversationManager.java:

PHP:
        public int getSkillLevel(int skillid) {
                ISkill id = SkillFactory.getSkill(skillid);
                int skilllevel = getPlayer().getSkillLevel(id);
                return skilllevel;
        }

I'm not sure whether you have to do this, but add:
PHP:
import net.sf.odinms.client.ISkill;

And once we've got that done, here's the NPC script:

PHP:
/* [NPC]
	Universal Job Advancer w/ Overlevel Fix
	Skill Maxer
	Rebirth
	Level 201 Fix

	Made by Kedano
	@RageZone
*/

importPackage(net.sf.odinms.client);


var status = 0;
var jobName;
var job;

function start() {
	status = -1;
	action(1, 0, 0);
}

function action(mode, type, selection) {
	if (mode == -1) {
		cm.sendOk("Well okay then. Come back if you change your mind.\r\n\r\nGood luck on your training.");
		cm.dispose();
	} else {
		if (mode == 1)
			status++;
		else
			status--;
		if (status == 0) {
			cm.sendNext("Hello, I'm in charge of Job Advancing.");
		} else if (status == 1) {
			if (cm.getLevel() < 200 && cm.getJob().equals(net.sf.odinms.client.MapleJob.BEGINNER)) {
				if (cm.getLevel() < 8) {
					cm.sendNext("Sorry, but you have to be at least level 8 to use my services.");
					status = 98;
				} else if (cm.getLevel() < 10) {
					cm.sendYesNo("Congratulations of reaching such a high level. Would you like to make the #rFirst Job Advancement#k as a #rMagician#k?");
					status = 150;
				} else {
					cm.sendYesNo("Congratulations on reaching such a high level. Would you like to make the #rFirst Job Advancement#k?");
					status = 153;
				}
			} else if (cm.getLevel() < 30) {
				cm.sendNext("Sorry, but you have to be at least level 30 to make the #rSecond Job Advancement#k.");
				status = 98;
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.THIEF)) {
				cm.sendSimple("Conratulations on reaching such a high level. Which would you like to be? #b\r\n#L0#Assassin#l\r\n#L1#Bandit#l#k");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.WARRIOR)) {
				cm.sendSimple("Conratulations on reaching such a high level. Which would you like to be? #b\r\n#L2#Fighter#l\r\n#L3#Page#l\r\n#L4#Spearman#l#k");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.MAGICIAN)) {
				cm.sendSimple("Conratulations on reaching such a high level. Which would you like to be? #b\r\n#L5#Ice Lightning Wizard#l\r\n#L6#Fire Poison Wizard#l\r\n#L7#Cleric#l#k");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.BOWMAN)) {
				cm.sendSimple("Conratulations on reaching such a high level. Which would you like to be? #b\r\n#L8#Hunter#l\r\n#L9#Crossbowman#l#k");
			} else if (cm.getLevel() < 70) {
				cm.sendNext("Sorry, but you have to be at least level 70 to make the #rThird Job Advancement#k.");
				status = 98;
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.ASSASSIN)) {
				status = 63;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.BANDIT)) {
				status = 66;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.HUNTER)) {
				status = 69;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CROSSBOWMAN)) {
				status = 72;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FP_WIZARD)) {
				status = 75;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.IL_WIZARD)) {
				status = 78;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CLERIC)) {
				status = 81;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FIGHTER)) {
				status = 84;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.PAGE)) {
				status = 87;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.SPEARMAN)) {
				status = 90;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getLevel() < 120) {
				cm.sendNext("Sorry, but you have to be at least level 120 to make the #rForth Job Advancement#k.");
				status = 98;
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.HERMIT)) {
				status = 105;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CHIEFBANDIT)) {
				status = 108;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.RANGER)) {
				status = 111;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.SNIPER)) {
				status = 114;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FP_MAGE)) {
				status = 117;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.IL_MAGE)) {
				status = 120;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.PRIEST)) {
				status = 123;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CRUSADER)) {
				status = 126;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.WHITEKNIGHT)) {
				status = 129;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.DRAGONKNIGHT)) {
				status = 132;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getLevel() < 200) {
				cm.sendNext("Sorry, but you have already attained the highest level of your job's mastery. \r\n\r\nHowever, you can #rrebirth#k when you are level 200.");
				status = 98;
			} else if (cm.getLevel() == 200) {
				cm.sendYesNo("Ahh... It is good to see you again. Your skills have finally reached the maximum of its potential. So, with all my heart, I congratulate you, great hero. \r\n\r\nYou have been through a long and challenging road, and in so doing, have become immensely strong. However, I can increase your power even further, and surpass your limits! If you accept, you will become a level 1 #bBeginner#k again, but all your abilities, skills, items and mesos, will remain as they are. However, you will only be able to keep the skills that you have placed in your #bkey setting#k. \r\n\r\nSo, tell me, do you wish to be #rreborn#k?");
				status = 160;
			} else if (cm.getLevel() > 200) {
				cm.sendYesNo("Hmm... I see you have somehow surpassed the limits of your power. Unfortunately, your mind is not strong enough to harness this extra power as of yet. If this power is allowed to be left there, it will eventually take over your mind and consume your soul. Do you want me to relieve you of this burden?");
				status = 162;
			} else {
				cm.dispose();
			}

		} else if (status == 2) {
			if (selection == 0) {
				jobName = "Assassin";
				job = net.sf.odinms.client.MapleJob.ASSASSIN;
			}
			if (selection == 1) {
				jobName = "Bandit";
				job = net.sf.odinms.client.MapleJob.BANDIT;
			}
			if (selection == 2) {
				jobName = "Fighter";
				job = net.sf.odinms.client.MapleJob.FIGHTER;
			}
			if (selection == 3) {
				jobName = "Page";
				job = net.sf.odinms.client.MapleJob.PAGE;
			}
			if (selection == 4) {
				jobName = "Spearman";
				job = net.sf.odinms.client.MapleJob.SPEARMAN;
			}
			if (selection == 5) {
				jobName = "Ice Lightning Wizard";
				job = net.sf.odinms.client.MapleJob.IL_WIZARD;
			}
			if (selection == 6) {
				jobName = "Fire Poison Wizard";
				job = net.sf.odinms.client.MapleJob.FP_WIZARD;
			}
			if (selection == 7) {
				jobName = "Cleric";
				job = net.sf.odinms.client.MapleJob.CLERIC;
			}
			if (selection == 8) {
				jobName = "Hunter";
				job = net.sf.odinms.client.MapleJob.HUNTER;
			}
			if (selection == 9) {
				jobName = "Crossbowman";
				job = net.sf.odinms.client.MapleJob.CROSSBOWMAN;
			}
			cm.sendYesNo("Do you want to become a #r" + jobName + "#k?");
                        
        				
		} else if (status == 3) {
			cm.changeJob(job);
			if (cm.getJob().equals(net.sf.odinms.client.MapleJob.ASSASSIN)) { 
				cm.teachSkill(4100000,20,20); //Claw Mastery
				cm.teachSkill(4100001,30,30); //Critical Throw
				cm.teachSkill(4100002,20,20); //Endure
				cm.teachSkill(4101003,20,20); //Claw Booster
				cm.teachSkill(4101004,20,20); //Haste
				cm.teachSkill(4101005,30,30); //Drain
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.BANDIT)) {
				cm.teachSkill(4200000,20,20); //Dagger Mastery
				cm.teachSkill(4200001,20,20); //Endure
				cm.teachSkill(4201002,20,20); //Dagger Booster
				cm.teachSkill(4201003,20,20); //Haste
				cm.teachSkill(4201004,30,30); //Steal
				cm.teachSkill(4201005,30,30); //Savage Blow
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FIGHTER)) {
				cm.teachSkill(1100000,20,20); //Sword Mastery
				cm.teachSkill(1100001,20,20); //Axe Mastery
				cm.teachSkill(1100002,30,30); //Final Attack: Sword
				cm.teachSkill(1100003,30,30); //Final Attack: Axe
				cm.teachSkill(1101004,20,20); //Sword Booster
				cm.teachSkill(1101005,20,20); //Axe Booster
				cm.teachSkill(1101006,20,20); //Rage
				cm.teachSkill(1101007,30,30); //Power Guard
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.PAGE)) {
				cm.teachSkill(1200000,20,20); //Sword Mastery
				cm.teachSkill(1200001,20,20); //BW Mastery
				cm.teachSkill(1200002,30,30); //Final Attack: Sword
				cm.teachSkill(1200003,30,30); //Final Attack: BW
				cm.teachSkill(1201004,20,20); //Sword Booster
				cm.teachSkill(1201005,20,20); //BW Booster
				cm.teachSkill(1201006,20,20); //Threaten
				cm.teachSkill(1201007,30,30); //Power Guard
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.SPEARMAN)) {
				cm.teachSkill(1300000,20,20); //Spear Mastery
				cm.teachSkill(1300001,20,20); //Polearm Mastery
				cm.teachSkill(1300002,30,30); //Final Attack: Spear
				cm.teachSkill(1300003,30,30); //Final Attack: Polearm
				cm.teachSkill(1301004,20,20); //Spear Booster
				cm.teachSkill(1301005,20,20); //Polearm Booster
				cm.teachSkill(1301006,20,20); //Iron Will
				cm.teachSkill(1301007,30,30); //Hyper Body
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.IL_WIZARD)) {
				cm.teachSkill(2200000,20,20); //MP Eater
				cm.teachSkill(2201001,20,20); //Meditation
				cm.teachSkill(2201002,20,20); //Teleport
				cm.teachSkill(2201003,20,20); //Slow
				cm.teachSkill(2201004,30,30); //Cold Bean
				cm.teachSkill(2201005,30,30); //Thunderbolt
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FP_WIZARD)) {
				cm.teachSkill(2100000,20,20); //MP Eater
				cm.teachSkill(2101001,20,20); //Meditation
				cm.teachSkill(2101002,20,20); //Teleport
				cm.teachSkill(2101003,20,20); //Slow
				cm.teachSkill(2101004,30,30); //Fire Arrow
				cm.teachSkill(2101005,30,30); //Poison Brace
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CLERIC)) {
				cm.teachSkill(2300000,20,20); //MP Eater
				cm.teachSkill(2301001,20,20); //Teleport
				cm.teachSkill(2301002,30,30); //Heal
				cm.teachSkill(2301003,20,20); //Invincible
				cm.teachSkill(2301004,20,20); //Bless
				cm.teachSkill(2301005,30,30); //Holy Arrow
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.HUNTER)) {
				cm.teachSkill(3100000,20,20); //Bow Mastery
				cm.teachSkill(3100001,30,30); //Final Attack: Bow
				cm.teachSkill(3101002,20,20); //Bow Booster
				cm.teachSkill(3101003,20,20); //Power Knock-Back
				cm.teachSkill(3101004,20,20); //Soul Arrow: Bow
				cm.teachSkill(3101005,30,30); //Arrow Bomb
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CROSSBOWMAN)) {
				cm.teachSkill(3200000,20,20); //Crossbow Mastery
				cm.teachSkill(3200001,30,30); //Final Attack: Crossbow
				cm.teachSkill(3201002,20,20); //Crossbow Booster
				cm.teachSkill(3201003,20,20); //Power Knock-Back
				cm.teachSkill(3201004,20,20); //Soul Arrow: Crossbow
				cm.teachSkill(3201005,30,30); //Iron Arrow
			}
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();

		} else if (status == 61) {
			if (cm.getJob().equals(net.sf.odinms.client.MapleJob.ASSASSIN)) {
				status = 63;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.BANDIT)) {
				status = 66;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.HUNTER)) {
				status = 69;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CROSSBOWMAN)) {
				status = 72;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FP_WIZARD)) {
				status = 75;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.IL_WIZARD)) {
				status = 78;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CLERIC)) {
				status = 81;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FIGHTER)) {
				status = 84;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.PAGE)) {
				status = 87;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.SPEARMAN)) {
				status = 90;

				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else { 
				cm.dispose();
			}



		} else if (status == 64) {
			cm.teachSkill(4110000,20,20); //Alchemist
			cm.teachSkill(4111001,20,20); //Meso Up
			cm.teachSkill(4111002,30,30); //Shadow Partner
			cm.teachSkill(4111003,20,20); //Shadow Web
			cm.teachSkill(4111004,30,30); //Shadow Meso
			cm.teachSkill(4111005,30,30); //Avenger
			cm.teachSkill(4111006,20,20); //Flash Jump
			cm.changeJob(MapleJob.HERMIT);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 67) {
			cm.teachSkill(4210000,20,20); //Shield Mastery
			cm.teachSkill(4211001,30,30); //Chakra
			cm.teachSkill(4211002,30,30); //Assaulter
			cm.teachSkill(4211003,20,20); //Pickpocket
			cm.teachSkill(4211004,30,30); //Band of Thieves
			cm.teachSkill(4211005,20,20); //Meso Guard
			cm.teachSkill(4211006,30,30); //Meso Explosion
			cm.changeJob(MapleJob.CHIEFBANDIT);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 70) {
			cm.teachSkill(3110000,20,20); //Thrust
			cm.teachSkill(3110001,20,20); //Mortal Blow
			cm.teachSkill(3111002,20,20); //Puppet
			cm.teachSkill(3111003,30,30); //Inferno
			cm.teachSkill(3111004,30,30); //Arrow Rain
			cm.teachSkill(3111005,30,30); //Silver Hawk
			cm.teachSkill(3111006,30,30); //Strafe
			cm.changeJob(MapleJob.RANGER);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 73) {
			cm.teachSkill(3210000,20,20); //Thrust
			cm.teachSkill(3210001,20,20); //Mortal Blow
			cm.teachSkill(3211002,20,20); //Puppet
			cm.teachSkill(3211003,30,30); //Blizzard
			cm.teachSkill(3211004,30,30); //Arrow Eruption
			cm.teachSkill(3211005,30,30); //Golden Eagle
			cm.teachSkill(3211006,30,30); //Strafe
			cm.changeJob(MapleJob.SNIPER);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 76) {
			cm.teachSkill(2110000,20,20); //Partial Resistance
			cm.teachSkill(2110001,30,30); //Element Amplification
			cm.teachSkill(2111002,30,30); //Explosion
			cm.teachSkill(2111003,30,30); //Poison Mist
			cm.teachSkill(2111004,20,20); //Seal
			cm.teachSkill(2111005,20,20); //Spell Booster
			cm.teachSkill(2111006,30,30); //Element Composition
			cm.changeJob(MapleJob.FP_MAGE);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 79) {
			cm.teachSkill(2210000,20,20); //Partial Resistance
			cm.teachSkill(2210001,30,30); //Element Amplification
			cm.teachSkill(2211002,30,30); //Ice Strike
			cm.teachSkill(2211003,30,30); //Thunder Spear
			cm.teachSkill(2211004,20,20); //Seal
			cm.teachSkill(2211005,20,20); //Spell Booster
			cm.teachSkill(2211006,30,30); //Element Composition
			cm.changeJob(MapleJob.IL_MAGE);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 82) {
			cm.teachSkill(2310000,20,20); //Elemental Resistance
			cm.teachSkill(2311001,20,20); //Dispel
			cm.teachSkill(2311002,20,20); //Mystic Door
			cm.teachSkill(2311003,30,30); //Holy Symbol
			cm.teachSkill(2311004,30,30); //Shining Ray
			cm.teachSkill(2311005,30,30); //Doom
			cm.teachSkill(2311006,30,30); //Summon Dragon
			cm.changeJob(MapleJob.PRIEST);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 85) {
			cm.teachSkill(1110000,20,20); //Improving MP Recovery
			cm.teachSkill(1110001,20,20); //Shield Mastery
			cm.teachSkill(1111002,30,30); //Combo Attack
			cm.teachSkill(1111003,30,30); //Panic: Sword
			cm.teachSkill(1111004,30,30); //Panic: Axe
			cm.teachSkill(1111005,30,30); //Coma: Sword
			cm.teachSkill(1111006,30,30); //Coma: Axe
			cm.teachSkill(1111007,20,20); //Armor Crash
			cm.teachSkill(1111008,30,30); //Shout
			cm.changeJob(MapleJob.CRUSADER);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 88) {
			cm.teachSkill(1210000,20,20); //Improving MP Recovery
			cm.teachSkill(1210001,20,20); //Shield Mastery
			cm.teachSkill(1211002,30,30); //Charged Blow
			cm.teachSkill(1211003,30,30); //Fire Charge: Sword
			cm.teachSkill(1211004,30,30); //Flame Charge: BW
			cm.teachSkill(1211005,30,30); //Ice Charge: Sword
			cm.teachSkill(1211006,30,30); //Blizzard Charge: BW
			cm.teachSkill(1211007,30,30); //Thunder Charge: Sword
			cm.teachSkill(1211008,30,30); //Lightning Charge: BW
			cm.teachSkill(1211009,20,20); //Magic Crash
			cm.changeJob(MapleJob.WHITEKNIGHT);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 91) {
			cm.teachSkill(1310000,20,20); //Elemental Resistance
			cm.teachSkill(1311001,30,30); //Dragon Crusher: Spear
			cm.teachSkill(1311002,30,30); //Dragon Crusher: Polearm
			cm.teachSkill(1311003,30,30); //Dragon Fury: Spear
			cm.teachSkill(1311004,30,30); //Dragon Fury: Polearm
			cm.teachSkill(1311005,30,30); //Sacrifice
			cm.teachSkill(1311006,30,30); //Dragon Roar
			cm.teachSkill(1311007,20,20); //Power Crash
			cm.teachSkill(1311008,20,20); //Dragon Blood
			cm.changeJob(MapleJob.DRAGONKNIGHT);
			cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
			cm.dispose();
		} else if (status == 99) {
			cm.sendOk("Good luck on your training.");
			cm.dispose();

		} else if (status == 102) {
			if (cm.getJob().equals(net.sf.odinms.client.MapleJob.HERMIT)) {
				status = 105;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CHIEFBANDIT)) {
				status = 108;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.RANGER)) {
				status = 111;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.SNIPER)) {
				status = 114;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.FP_MAGE)) {
				status = 117;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.IL_MAGE)) {
				status = 120;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.PRIEST)) {
				status = 123;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.CRUSADER)) {
				status = 126;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.WHITEKNIGHT)) {
				status = 129;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.DRAGONKNIGHT)) {
				status = 132;
				cm.sendYesNo("Conratulations on reaching such a high level. Do you want to Job Advance now?");
			} else { 
				cm.dispose();
			}


		} else if (status == 106) {
			if (cm.getSkillLevel(4121009) == 0) {
				cm.teachSkill(4121000,0,0);   //Maple Warrior
				cm.teachSkill(4120002,10,10); //Shadow Shifter
				cm.teachSkill(4121003,0,0);   //Taunt
				cm.teachSkill(4121004,10,10); //Ninja Ambush
				cm.teachSkill(4120005,10,10); //Venomous Star
				cm.teachSkill(4121006,10,10); //Shadow Claw
				cm.teachSkill(4121007,0,0);   //Triple Throw
				cm.teachSkill(4121008,10,10); //Ninja Storm
				cm.teachSkill(4121009,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.NIGHTLORD);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 109) {
			if (cm.getSkillLevel(4221008) == 0) {
				cm.teachSkill(4221000,0,0);   //Maple Warrior
				cm.teachSkill(4221001,10,10); //Assassinate
				cm.teachSkill(4220002,10,10); //Shadow Shifter
				cm.teachSkill(4221003,0,0);   //Taunt
				cm.teachSkill(4221004,10,10); //Ninja Ambush
				cm.teachSkill(4220005,10,10); //Venomous Dagger
				cm.teachSkill(4221006,10,10); //Smokescreen
				cm.teachSkill(4221007,10,10); //Boomerang Step
				cm.teachSkill(4221008,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.SHADOWER);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 112) {
			if (cm.getSkillLevel(3121009) == 0) {
				cm.teachSkill(3121000,0,0);   //Maple Warrior
				cm.teachSkill(3121002,10,10); //Sharp Eyes
				cm.teachSkill(3121003,0,0);   //Dragon's Breath
				cm.teachSkill(3121004,10,10); //Hurricane
				cm.teachSkill(3120005,10,10); //Bow Expert
				cm.teachSkill(3121006,10,10); //Phoenix
				cm.teachSkill(3121007,10,10); //Hamstring
				cm.teachSkill(3121008,10,10); //Concentration
				cm.teachSkill(3121009,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.BOWMASTER);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 115) {
			if (cm.getSkillLevel(3221008) == 0) {
				cm.teachSkill(3221000,0,0);   //Maple Warrior
				cm.teachSkill(3221001,10,10); //Piercing Arrow
				cm.teachSkill(3221002,10,10); //Sharp Eyes
				cm.teachSkill(3221003,0,0);   //Dragon's Breath
				cm.teachSkill(3220004,10,10); //Crossbow Expert
				cm.teachSkill(3221005,10,10); //Frostprey
				cm.teachSkill(3221006,10,10); //Blind
				cm.teachSkill(3221007,0,0);   //Snipe
				cm.teachSkill(3221008,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.CROSSBOWMASTER);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 118) {
			if (cm.getSkillLevel(2121008) == 0) {
				cm.teachSkill(2121000,0,0);   //Maple Warrior
				cm.teachSkill(2121001,10,10); //Big Bang
				cm.teachSkill(2121002,10,10); //Mana Reflection
				cm.teachSkill(2121003,0,0);   //Fire Demon
				cm.teachSkill(2121004,0,0);   //Infinity
				cm.teachSkill(2121005,10,10); //Elquines
				cm.teachSkill(2121006,10,10); //Paralyze
				cm.teachSkill(2121007,10,10); //Meteor Shower
				cm.teachSkill(2121008,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.FP_ARCHMAGE);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 121) {
			if (cm.getSkillLevel(2221008) == 0) {
				cm.teachSkill(2221000,0,0);   //Maple Warrior
				cm.teachSkill(2221001,10,10); //Big Bang
				cm.teachSkill(2221002,10,10); //Mana Reflection
				cm.teachSkill(2221003,0,0);   //Fire Demon
				cm.teachSkill(2221004,0,0);   //Infinity
				cm.teachSkill(2221005,10,10); //Ifrit
				cm.teachSkill(2221006,10,10); //Chain Lightning
				cm.teachSkill(2221007,10,10); //Blizzard
				cm.teachSkill(2221008,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.IL_ARCHMAGE);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 124) {
			if (cm.getSkillLevel(2321007) == 0) {
				cm.teachSkill(2321000,0,0);   //Maple Warrior
				cm.teachSkill(2321001,10,10); //Big Bang
				cm.teachSkill(2321002,10,10); //Mana Reflection
				cm.teachSkill(2321003,30,30); //Bahumat
				cm.teachSkill(2321004,0,0);   //Infinity
				cm.teachSkill(2321005,10,10); //Holy Shield
				cm.teachSkill(2321006,10,10); //Resurrection
				cm.teachSkill(2321007,0,0);   //Angel Ray
				cm.teachSkill(2321008,10,10); //Genesis
				cm.teachSkill(2321009,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.BISHOP);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 127) {
			if (cm.getSkillLevel(1121011) == 0) {
				cm.teachSkill(1121000,0,0);   //Maple Warrior
				cm.teachSkill(1121001,10,10); //Monster Magnet
				cm.teachSkill(1121002,10,10); //Power Stance
				cm.teachSkill(1120003,0,0);   //Advanced Combo Attack
				cm.teachSkill(1120004,10,10); //Achilles
				cm.teachSkill(1120005,10,10); //Guardian
				cm.teachSkill(1121006,0,0);   //Rush
				cm.teachSkill(1121008,10,10); //Brandish
				cm.teachSkill(1121010,10,10); //Enrage
				cm.teachSkill(1121011,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.HERO);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 130) {
			if (cm.getSkillLevel(1221012) == 0) {
				cm.teachSkill(1221000,0,0);   //Maple Warrior
				cm.teachSkill(1221001,10,10); //Monster Magnet
				cm.teachSkill(1221002,10,10); //Power Stance
				cm.teachSkill(1221003,19,19); //Holy Charge: Sword
				cm.teachSkill(1221004,19,19); //Divine Charge: BW
				cm.teachSkill(1220005,10,10); //Achilles
				cm.teachSkill(1220006,10,10); //Guardian
				cm.teachSkill(1221007,0,0);   //Rush
				cm.teachSkill(1221009,10,10); //Blast
				cm.teachSkill(1220010,0,0);   //Advanced Charge
				cm.teachSkill(1221011,10,10); //Heaven's Hammer
				cm.teachSkill(1221012,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.PALADIN);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();
		} else if (status == 133) {
			if (cm.getSkillLevel(1321010) == 0) {
				cm.teachSkill(1321000,0,0);   //Maple Warrior
				cm.teachSkill(1321001,10,10); //Monster Magnet
				cm.teachSkill(1321002,10,10); //Power Stance
				cm.teachSkill(1321003,0,0);   //Rush
				cm.teachSkill(1320005,10,10); //Achilles
				cm.teachSkill(1320006,10,10); //Berserk
				cm.teachSkill(1321007,10,10); //Beholder
				cm.teachSkill(1320008,25,25); //Aura of the Beholder
				cm.teachSkill(1320009,25,25); //Hex of the Beholder
				cm.teachSkill(1321010,1,1);   //Hero's Will
			}
			cm.changeJob(MapleJob.DARKKNIGHT);
			cm.sendOk("There you go. Hope you enjoy it. I've given you a full set of skills as well, aren't you lucky!");
			cm.dispose();

		} else if (status == 151) {
			if (cm.c.getPlayer().getInt() >= 20) {
				cm.teachSkill(2000000,16,16); //Improving MP Recovery
				cm.teachSkill(2000001,10,10); //Improving Max MP Increase
				cm.teachSkill(2001002,20,20); //Magic Guard
				cm.teachSkill(2001003,20,20); //Magic Armor
				cm.teachSkill(2001004,20,20); //Energy Bolt
				cm.teachSkill(2001005,20,20); //Magic Claw
				cm.changeJob(net.sf.odinms.client.MapleJob.MAGICIAN);
				cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
				cm.dispose();
			} else {
				cm.sendOk("You did not meet the minimum requirement of #r20 INT#k.");
				cm.dispose();
			}
		} else if (status == 154) {
			cm.sendSimple("Which would you like to be? #b\r\n#L0#Warrior#l\r\n#L1#Magician#l\r\n#L2#Bowman#l\r\n#L3#Thief#l#k");


		} else if (status == 155) {
			if (selection == 0) {
				jobName = "Warrior";
				job = net.sf.odinms.client.MapleJob.WARRIOR;
			}
			if (selection == 1) {
				jobName = "Magician";
				job = net.sf.odinms.client.MapleJob.MAGICIAN;
			}
			if (selection == 2) {
				jobName = "Bowman";
				job = net.sf.odinms.client.MapleJob.BOWMAN;
			}
			if (selection == 3) {
				jobName = "Thief";
				job = net.sf.odinms.client.MapleJob.THIEF;
			}
			cm.sendYesNo("Do you want to become a #r" + jobName + "#k?");
                        
        				
		} else if (status == 156) {
			if (job == net.sf.odinms.client.MapleJob.WARRIOR && cm.c.getPlayer().getStr() < 35) {
				cm.sendOk("You did not meet the minimum requirement of #r35 STR#k.");
				cm.dispose();
			} else if (job == net.sf.odinms.client.MapleJob.MAGICIAN && cm.c.getPlayer().getInt() < 20) {
				cm.sendOk("You did not meet the minimum requirement of #r20 INT#k.");
				cm.dispose();
			} else if (job == net.sf.odinms.client.MapleJob.BOWMAN && cm.c.getPlayer().getDex() < 25) {
				cm.sendOk("You did not meet the minimum requirement of #r25 DEX#k.");
				cm.dispose();
			} else if (job == net.sf.odinms.client.MapleJob.THIEF && cm.c.getPlayer().getDex() < 25) {
				cm.sendOk("You did not meet the minimum requirement of #r25 DEX#k.");
				cm.dispose();
			} else {
				cm.changeJob(job);
				if (cm.getJob().equals(net.sf.odinms.client.MapleJob.WARRIOR)) {
					cm.teachSkill(1000000,16,16); //Improving HP Recovery
					cm.teachSkill(1000001,10,10); //Improving Max HP Increase
					cm.teachSkill(1000002,8,8);   //Endure
					cm.teachSkill(1001003,20,20); //Iron Body
					cm.teachSkill(1001004,20,20); //Power Strike
					cm.teachSkill(1001005,20,20); //Slash Blast
				} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.MAGICIAN)) {
					cm.teachSkill(2000000,16,16); //Improving MP Recovery
					cm.teachSkill(2000001,10,10); //Improving Max MP Increase
					cm.teachSkill(2001002,20,20); //Magic Guard
					cm.teachSkill(2001003,20,20); //Magic Armor
					cm.teachSkill(2001004,20,20); //Energy Bolt
					cm.teachSkill(2001005,20,20); //Magic Claw
				} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.BOWMAN)) {
					cm.teachSkill(3000000,16,16); //The Blessing of Amazon
					cm.teachSkill(3000001,20,20); //Critical Shot
					cm.teachSkill(3000002,8,8);   //The Eye of Amazon
					cm.teachSkill(3001003,20,20); //Focus
					cm.teachSkill(3001004,20,20); //Arrow Blow
					cm.teachSkill(3001005,20,20); //Double Shot
				} else if (cm.getJob().equals(net.sf.odinms.client.MapleJob.THIEF)) {
					cm.teachSkill(4000000,20,20); //Nimble Body
					cm.teachSkill(4000001,8,8);   //Keen Eyes
					cm.teachSkill(4001002,20,20); //Disorder
					cm.teachSkill(4001003,20,20); //Dark Sight
					cm.teachSkill(4001334,20,20); //Double Stab
					cm.teachSkill(4001344,20,20); //Lucky Seven
				}
				cm.sendOk("There you go. Hope you enjoy it. See you around in the future maybe :)");
				cm.dispose();
			}
		} else if (status == 161) {
			wui = 1;
                        var statup = new java.util.ArrayList();
                        var p = cm.c.getPlayer();
			cm.changeJob(net.sf.odinms.client.MapleJob.BEGINNER);
			cm.sendOk("You have been reborn! Good luck on your next journey.");
			p.setLevel(2);
			p.gainExp(-p.getExp(), false, false);
			statup.add (new net.sf.odinms.tools.Pair(net.sf.odinms.client.MapleStat.LEVEL, java.lang.Integer.valueOf(1)));
			statup.add (new net.sf.odinms.tools.Pair(net.sf.odinms.client.MapleStat.EXP, java.lang.Integer.valueOf(0)));
			p.getClient().getSession().write (net.sf.odinms.tools.MaplePacketCreator.updatePlayerStats(statup));
			cm.setSP(0);
			cm.dispose();

		} else if (status == 163) {
			wui = 1;
                        var statup = new java.util.ArrayList();
                        var p = cm.c.getPlayer();
			p.setLevel(201);
			statup.add (new net.sf.odinms.tools.Pair(net.sf.odinms.client.MapleStat.LEVEL, java.lang.Integer.valueOf(200)));
			p.getClient().getSession().write (net.sf.odinms.tools.MaplePacketCreator.updatePlayerStats(statup));
			cm.sendYesNo("You have been cleansed. Do you wish to opt for a #rrebirth#k now?");
			status = 160;
		} else {
			cm.dispose();
		}
	}	
}

It's long, I know... But what less to expect from an "All(Well not quite)-in-One NPC"?

A few things to note:

1. The format for the getSkillLevel NPC function is
PHP:
cm.getSkillLevel(<skill id>);
(if that wasn't obvious enough)

2. The format for the teachSkill NPC function is
PHP:
cm.teachSkill(<skill id>, <skill level>, <skill masterlevel>);
(if that wasn't obvious enough either)

3. For 4th job skills in the script, I didn't max all of them. All skills that can be gotten through skillbooks are left at 0; those which can be added through mastery books are left at 10; and those which can't be gotten through any other means are maxed.

For me, even with the setSP(0) fix, I still get the "You're lacking level 1 skills" error after the first rebirth. So my fix to it was to make mastery books change the skill level to the mastery level on success. If you want to implement a similar system, here's how to do it:

In, net\sf\odinms\net\channel\handler\SkillBookHandler.java, change:
PHP:
player.changeSkillLevel(skill2, curlevel, skilldata.get("masterLevel"));

to:
PHP:
player.changeSkillLevel(skill2, skilldata.get("masterLevel"), skilldata.get("masterLevel"));

And you're done.

4. If you don't want to implement the system mentioned in the previous note, then you could just edit the script accordingly. The labels should help (alot).

5. I do not guarantee that the script is 100% bug free. It's 726 lines long. Not exactly very long, but not that short either. Neither is it the most condensed. I've gone through it a few times: the master levels and skills should be correct, such that you don't get rollbacks, but I can't be sure. Bug reports will be appreciated. (:
 
Last edited:
Re: [Release] All(Well not quite)-in-One NPC

Don't worry, there isn't a "I suggest you join blahblahblahms if the owner hasn't already removed this" hidden somewhere in the 724 lines. That, I can assure you. (;
 
Re: [Release] All(Well not quite)-in-One NPC

Hey even though its not all in one this is considered dead good m8 =]
all it needs is all job advancer :) nice release

Well it does advance all jobs! (:

Even first job! There are two seperate cases for level 8 and level 10, and it check for stat prerequisites. (:
 
Back