Browse Source

Jobmaster update (#2369)

* Major changes due to readability and some corrections
* Adds the option to disable Rebirth Classes
* Adds the possibility to give players job related 
  Equipment (mostly weapons) on job change
* Adds more level requirement settings
* Adds BabyExpanded and BabySummoner Jobs
* Thanks to @Braniff, @mazvi, @Mikegyver, @Lemongrass3110, @Akkarinage, @Stolao and @secretdataz!
Jeybla 7 years ago
parent
commit
2676d05394
2 changed files with 434 additions and 155 deletions
  1. 431 154
      npc/custom/jobmaster.txt
  2. 3 1
      src/map/pc.c

+ 431 - 154
npc/custom/jobmaster.txt

@@ -3,7 +3,7 @@
 //===== By: ==================================================
 //===== By: ==================================================
 //= Euphy
 //= Euphy
 //===== Current Version: =====================================
 //===== Current Version: =====================================
-//= 1.4
+//= 1.7
 //===== Compatible With: ===================================== 
 //===== Compatible With: ===================================== 
 //= rAthena Project
 //= rAthena Project
 //===== Description: =========================================
 //===== Description: =========================================
@@ -14,16 +14,86 @@
 //= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support.
 //= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support.
 //= 1.3 Kagerou/Oboro added.
 //= 1.3 Kagerou/Oboro added.
 //= 1.4 Rebellion added.
 //= 1.4 Rebellion added.
+//= 1.5 Added option to disable RebirthClass. [mazvi]
+//= 1.6 Added option to get job related equipment on change. [Braniff]
+//= 1.7 Readability changes. Also added BabyExpanded and BabySummoner classes. [Jey]
 //============================================================
 //============================================================
 
 
 prontera,153,193,6	script	Job Master	123,{
 prontera,153,193,6	script	Job Master	123,{
-function Job_Menu;
-
-	mes "[Job Master]";
-	if (Class > Job_Soul_Linker) {
-		mes "No more jobs are available.";
+function Get_Job_Equip;
+// Checks if the Player has the required level.
+// closes if not, returns if yes
+function	Require_Level	{
+	if (BaseLevel < getarg(0) || JobLevel < getarg(1)) {
+		.@blvl = getarg(0) - BaseLevel;
+		.@jlvl = getarg(1) - JobLevel;
+		mes "Level requirement:";
+		mes ((getarg(0)>1)? 
+			"^bb0000"+getarg(0)+"^000000 (^bb0000Base^000000) / ":"")+"^00bb00"+
+			getarg(1)+"^000000 (^00bb00Job^000000)";
+		mes "You need " +
+			((.@blvl > 0) ? "^bb0000"+.@blvl+"^000000 more base levels " + 
+				((.@jlvl > 0) ? "and " : "") : "") +
+			((.@jlvl > 0) ? "^00bb00"+.@jlvl+"^000000 more job levels " : "") +
+			"to continue.";
 		close;
 		close;
 	}
 	}
+	return;
+}
+
+// Checks if the given eac is a baby class
+function Is_Baby	{
+	return ((getarg(0, eaclass())&EAJL_BABY)>0);
+}
+
+// Checks if the player can change to third class.
+// Note: This does not include the level checks.
+function	Can_Change_Third	{
+	// To change to third class you either need to be:
+	// * Second Class
+	// * Transcendent Second Class
+	// * Baby Second Class
+	if( !.ThirdClass )
+		return false; // Third job change disabled
+	if( !(eaclass()&EAJL_2) )
+		return false; // Not second Class
+	if( eaclass()&EAJL_THIRD )
+		return false; // Already Third Class
+	if( roclass(eaclass()|EAJL_THIRD) < 0 )
+		return false; // Job has no third Class
+	if( (eaclass()&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE )
+		return false; // Exp. Super Novice equals 3rd Cls, but has it's own case
+	if( Is_Baby() && (!.BabyClass || !.BabyThird) )
+		return false; // No Baby (Third) change allowed
+	return true;
+}
+
+function	Can_Rebirth	{
+	// To rebirth, you need to be:
+	// * Second Class
+	if( !.RebirthClass )
+		return false; // Rebirth disabled
+	if( !(eaclass()&EAJL_2) )
+		return false; // Not second Class
+	if( eaclass()&EAJL_UPPER )
+		return false; // Already Rebirthed
+	if( roclass(eaclass()|EAJL_UPPER) < 0 )
+		return false; // Job has no transcended class
+	if( Is_Baby() && !.BabyClass )
+		return false; // No Baby changes allowed
+	return true;
+}
+
+// Checks if the given eac is a first class
+function	Is_First_Cls	{
+	return (getarg(0) <= EAJ_TAEKWON);
+}
+
+function	Check_Riding	{
+	// Note: Why we should always check for Riding:
+	// Mounts are considered as another class, which
+	// would make this NPC bigger just to handle with
+	// those special cases.
 	if (checkfalcon() || checkcart() || checkriding() || ismounting()) {
 	if (checkfalcon() || checkcart() || checkriding() || ismounting()) {
 		mes "Please remove your " +
 		mes "Please remove your " +
 			((checkfalcon()) ? "falcon" : "") +
 			((checkfalcon()) ? "falcon" : "") +
@@ -33,179 +103,254 @@ function Job_Menu;
 			" before proceeding.";
 			" before proceeding.";
 		close;
 		close;
 	}
 	}
+	return;
+}
+function	Check_SkillPoints	{
 	if (.SkillPointCheck && SkillPoint) {
 	if (.SkillPointCheck && SkillPoint) {
 		mes "Please use all your skill points before proceeding.";
 		mes "Please use all your skill points before proceeding.";
 		close;
 		close;
 	}
 	}
+	return;
+}
+
+// addJobOptions is essentially the same like
+// setarray .@array[getarraysize(.@array)],opt1,opt2,...;
+// It's just easier to read, since we're using it very often
+function	Job_Options	{
+	.@argcount = getargcount();
+	.@arr_size = getarraysize(getarg(0));
+	for( .@i = 1; .@i < .@argcount; .@i++) {
+		setarray getelementofarray(getarg(0), .@arr_size++),getarg(.@i);
+	}
+}
 
 
+// Begin of the NPC
+	mes .NPCName$;
+	Check_Riding();
+	Check_SkillPoints();
+
+	// initialisation
+	deletearray .@job_opt[0],getarraysize(.@job_opt);
 	.@eac = eaclass();
 	.@eac = eaclass();
-	.@i = ((.ThirdClass) ? roclass(.@eac&EAJ_UPPERMASK) : Class);
-	if (.@i >= Job_Knight && .@i <= Job_Crusader2) {
-		if (BaseLevel < .Rebirth[0] || JobLevel < .Rebirth[1]) {
-			.@blvl = .Rebirth[0] - BaseLevel;
-			.@jlvl = .Rebirth[1] - JobLevel;
-			mes "You need " +
-				((.@blvl > 0) ? .@blvl + " more base levels " + ((.@jlvl > 0) ? "/ " : "") : "") +
-				((.@jlvl > 0) ? .@jlvl + " more job levels " : "") + "to continue.";
-			close;
-		}
-		if (Class > Job_Crusader2) {
-			mes "Switch to third class?";
-			next;
-			Job_Menu(roclass(.@eac|EAJL_THIRD));
-			close;
-		}
-		while(1) {
-			mes "Select an option.";
-			next;
-			.@i = select(" ~ ^0055FFRebirth^000000:" + ((.ThirdClass) ? " ~ ^FF0000Third Class^000000" : "") + ": ~ ^777777Cancel^000000");
-			if (.@i == 3)
-				close;
-			mes "[Job Master]";
-			mes "Are you sure?";
-			next;
-			Job_Menu(((.@i == 1) ? Job_Novice_High : roclass(.@eac|EAJL_THIRD)));
-			mes "[Job Master]";
-		}
+	.@third_possible = Can_Change_Third();
+	.@rebirth_possible = Can_Rebirth();
+	.@first_eac = .@eac&EAJ_BASEMASK;
+	.@second_eac = .@eac&EAJ_UPPERMASK;
+	// Note: These are already set in pc.c
+	// BaseClass = roclass(.@eac&EAJ_BASEMASK) which is the players First Class
+	// BaseJob = roclass(.@eac&EAJ_UPPERMASK) which is the players Second Class
+	//dispbottom "Debug: eac ("+.@eac+"), third ("+.@third_possible+"), rebirth("+.@rebirth_possible+"), BaseClass ("+BaseClass+"), BaseJob ("+BaseJob+")";
+		
+	// From here on the jobmaster checks the current class
+	// and fills the the array `.@job_opt` with possible
+	// job options for the player.
+	
+	if( .@rebirth_possible ) {
+		// Rebirth option (displayed on the top of the menu)
+		Require_Level(.Req_Rebirth[0], .Req_Rebirth[1]);
+		Job_Options(.@job_opt, Job_Novice_High);
 	}
 	}
-	.@j1 = roclass(.@eac|EAJL_2_1);
-	.@j2 = roclass(.@eac|EAJL_2_2);
-	if ((.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE)
-		setarray .@exp[0], roclass(.@eac|EAJL_THIRD), 99;
-	if (Class == Job_Ninja || Class == Job_Gunslinger)
-		setarray .@exp[0], .@j1, 70;
-	if (.@exp[0] && .SecondExpanded) {
-		if (BaseLevel < .Rebirth[0] || JobLevel < .@exp[1]) {
-			.@blvl = .Rebirth[0] - BaseLevel;
-			.@jlvl = .@exp[1] - JobLevel;
-			mes "You need " +
-				((.@blvl > 0) ? .@blvl + " more base levels " + ((.@jlvl > 0) ? "/ " : "") : "") +
-				((.@jlvl > 0) ? .@jlvl + " more job levels " : "") + "to continue.";
-			close;
+	if( .@third_possible ) {
+		// Third Job change (displayed below rebirth)
+		Require_Level(.Req_Third[0], .Req_Third[1]);
+		Job_Options(.@job_opt, roclass(.@eac|EAJL_THIRD));
+	}
+	 
+	if (.SecondExpanded && 
+	   (.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE && // is Super Novice
+	   !(eaclass()&EAJL_THIRD) ) {				 	// not already Expanded SN
+		// (Baby) Super Novice to Expanded (Baby) Super Novice
+	   	if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) {
+			// .BabyClass & .BabyExpanded must be enabled if the is a baby
+			Require_Level(.Req_Exp_SNOVI[0], .Req_Exp_SNOVI[1]);
+			Job_Options(.@job_opt,roclass(.@eac|EAJL_THIRD)); // Expanded SN is "third" cls
 		}
 		}
-		mes "Switch to " + jobname(.@exp[0]) + "?";
-		next;
-		Job_Menu(.@exp[0]);
-		close;
 	}
 	}
-	if (.@eac&EAJL_2)
-		if ((.@eac&(EAJL_UPPER|EAJL_BABY)) || roclass(.@eac|EAJL_UPPER) == -1) {
-			mes "No more jobs are available.";
-			close;
+	
+	if (.SecondExpanded && 
+		((.@eac&(~EAJL_BABY)) == EAJ_NINJA || 		// is (Baby) Ninja
+		(.@eac&(~EAJL_BABY)) == EAJ_GUNSLINGER)) {	// is (Baby) Gunslinger
+		// (Baby) Ninja to (Baby) Kagerou / Oboro
+		// (Baby) Gunslinger to (Baby) Rebellion
+		if( !Is_Baby(.@eac) || (.BabyClass && .BabyExpanded) ) {
+			// .BabyClass & .BabyExpanded must be enabled if the is a baby
+			Require_Level(.Req_Exp_NJ_GS[0], .Req_Exp_NJ_GS[1]);
+			// Kagerou, Oboro, Rebellion are considered as a 2-1 class
+			Job_Options(.@job_opt, roclass(.@eac|EAJL_2_1));
 		}
 		}
-	if ((.@eac&EAJ_BASEMASK) == EAJ_NOVICE) {
-		if (JobLevel < .JobReq[0])
-			mes "A job level of " + .JobReq[0] + " is required to change into the 1st Class.";
-		else if (Class == Job_Novice_High && .LastJob && lastJob) {
-			mes "Switch classes now?";
-			next;
-			Job_Menu(roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER));
-		} else {
-			switch(Class) {
+	}
+	
+	// Player is Job_Novice, Job_Novice_High or Job_Baby
+	if (.@first_eac == EAJ_NOVICE && .@second_eac != EAJ_SUPER_NOVICE) {
+		// MAPID_NOVICE, MAPID_SUPER_NOVICE, MAPID_NOVICE_HIGH, MAPID_BABY
+		Require_Level(.Req_First[0], .Req_First[1]);
+		switch(Class) {
 			case Job_Novice:
 			case Job_Novice:
-				Job_Menu(
-					Job_Swordman,
-					Job_Mage,
-					Job_Archer,
-					Job_Acolyte,
-					Job_Merchant,
-					Job_Thief,
-					Job_Super_Novice,
-					Job_Taekwon,
-					Job_Gunslinger,
-					Job_Ninja,
-					Job_Baby
-				);
+				// First job change
+				Job_Options(.@job_opt,Job_Swordman,
+					Job_Mage, Job_Archer, Job_Acolyte, Job_Merchant, Job_Thief,
+					Job_Super_Novice, Job_Taekwon, Job_Gunslinger, Job_Ninja);
+				if( .BabyClass )
+					Job_Options(.@job_opt, Job_Baby);
 				break;
 				break;
 			case Job_Novice_High:
 			case Job_Novice_High:
-				Job_Menu(
-					Job_Swordman_High,
-					Job_Mage_High,
-					Job_Archer_High,
-					Job_Acolyte_High,
-					Job_Merchant_High,
-					Job_Thief_High
-				);
+				// Job change after rebirth
+				if( .LastJob && lastJob )
+					Job_Options(.@job_opt,
+						roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER));
+				else
+					Job_Options(.@job_opt, 
+						Job_Swordman_High, Job_Mage_High, Job_Archer_High,
+						Job_Acolyte_High, Job_Merchant_High, Job_Thief_High);
 				break;
 				break;
 			case Job_Baby:
 			case Job_Baby:
-				Job_Menu(
-					Job_Baby_Swordman,
-					Job_Baby_Mage,
-					Job_Baby_Archer,
-					Job_Baby_Acolyte,
-					Job_Baby_Merchant,
-					Job_Baby_Thief,
-					Job_Super_Baby
-				);
+				if( !.BabyClass )
+					break;
+				// First job change as a baby
+				Job_Options(.@job_opt, Job_Baby_Swordman, Job_Baby_Mage,
+					Job_Baby_Archer,Job_Baby_Acolyte, Job_Baby_Merchant,
+					Job_Baby_Thief);
+				if( .BabyExpanded )
+					Job_Options(.@job_opt, Job_Super_Baby, Job_Baby_Taekwon,
+						Job_Baby_Gunslinger, Job_Baby_Ninja);
+				if( .BabySummoner )
+					Job_Options(.@job_opt, Job_Baby_Summoner);
 				break;
 				break;
 			default:
 			default:
 				mes "An error has occurred.";
 				mes "An error has occurred.";
-				break;
+				close;
+		}
+	} else if( Is_First_Cls(.@eac) || 				// First Class
+			   Is_First_Cls(.@eac&(~EAJL_UPPER)) ||	// Trans. First Cls
+			   (.BabyClass && Is_First_Cls(.@eac&(~EAJL_BABY))) ) {	// Baby First Cls
+		// Player is First Class (not Novice)
+		// most jobs should have two options here  (2-1 and 2-2)
+		.@class1 = roclass(.@eac|EAJL_2_1); // 2-1
+		.@class2 = roclass(.@eac|EAJL_2_2); // 2-2
+		// dispbottom "Debug: Classes: class1 ("+.@class1+"), class2 ("+.@class2+")";
+		if(.LastJob && lastJob && (.@eac&EAJL_UPPER)) {
+			// Player is rebirth Cls and linear class changes are enforced
+			Require_Level(.Req_Second[0], .Req_Second[1]);
+			Job_Options(.@job_opt, lastJob + Job_Novice_High);
+		} else {
+			// Class is not enforced, player can decide.
+			if( .@class1 > 0 ) { // 2-1
+				Require_Level(.Req_Second[0], .Req_Second[1]);
+				Job_Options(.@job_opt, .@class1);
+			}
+			if( .@class2 > 0 ) { // 2-2
+				Require_Level(.Req_Second[0], .Req_Second[1]);
+				Job_Options(.@job_opt, .@class2);
 			}
 			}
 		}
 		}
-		close;
 	}
 	}
-	if (roclass(.@eac|EAJL_2_1) == -1 || roclass(.@eac|EAJL_2_2) == -1)
-		mes "No more jobs are available.";
-	else if (!(.@eac&EAJL_2) && JobLevel < .JobReq[1])
-		mes "A job level of " + .JobReq[1] + " is required to change into the 2nd Class.";
-	else if (.LastJob && lastJob && (.@eac&EAJL_UPPER)) {
-		mes "Switch classes now?";
-		next;
-		Job_Menu(lastJob + Job_Novice_High);
-	} else
-		Job_Menu(.@j1, .@j2);
+	
+	// Displaying the Job Menu defined by .@job_opt.
+	// .@job_opt should not be changed below this line.
+	function Job_Menu;
+	Job_Menu(.@job_opt);
 	close;
 	close;
 
 
-function Job_Menu {
-	while(1) {
-		if (getargcount() > 1) {
+// Displays the job menu
+function	Job_Menu	{
+	// getarg(0) is the .@job_opt array holding all available job changes.
+	function Confirm_Change;
+	while(true) {
+		.@opt_cnt =  getarraysize(getarg(0));
+		if( .@opt_cnt <= 0 ) {
+			mes "No more jobs are available.";
+			close;
+		}
+
+		.@selected = 0; // Just a single job class given, no select needed
+		if (.@opt_cnt > 1) {
+			// Multiple job classes given. Select one and save it to .@class
+			// After that confirm .@class
 			mes "Select a job.";
 			mes "Select a job.";
 			.@menu$ = "";
 			.@menu$ = "";
-			for (.@i = 0; .@i < getargcount(); .@i++)
-				.@menu$ = .@menu$ + " ~ " + jobname(getarg(.@i)) + ":";
+			for (.@i = 0; .@i < .@opt_cnt; .@i++) {
+				if( getelementofarray(getarg(0), .@i) == Job_Novice_High)
+					.@jobname$ = "^0055FFRebirth^000000";
+				else
+					.@jobname$ = jobname(getelementofarray(getarg(0), .@i));
+				.@menu$ = .@menu$ + " ~ " + .@jobname$ + ":";
+			}
 			.@menu$ = .@menu$+" ~ ^777777Cancel^000000";
 			.@menu$ = .@menu$+" ~ ^777777Cancel^000000";
-			next;
-			.@i = getarg(select(.@menu$) - 1, 0);
-			if (!.@i)
+			.@selected = select(.@menu$) - 1;
+			if( .@selected < 0 || .@selected >= .@opt_cnt )
 				close;
 				close;
-			if ((.@i == Job_Super_Novice || .@i == Job_Super_Baby) && BaseLevel < .SNovice) {
-				mes "[Job Master]";
-				mes "A base level of " + .SNovice + " is required to turn into a " + jobname(.@i) + ".";
-				close;
-			}
-			mes "[Job Master]";
-			mes "Are you sure?";
 			next;
 			next;
-		} else
-			.@i = getarg(0);
-		if (select(" ~ Change into ^0055FF" + jobname(.@i) + "^000000 class: ~ ^777777" + ((getargcount() > 1) ? "Go back" : "Cancel") + "^000000") == 1) {
-			mes "[Job Master]";
-			mes "You are now " + callfunc("F_InsertArticle", jobname(.@i)) + "!";
-			if (.@i == Job_Novice_High && .LastJob)
-				lastJob = Class;
-			jobchange .@i;
-			if (.@i == Job_Novice_High)
-				resetlvl(1);
-			else if (.@i == Job_Baby) {
-				resetstatus;
-				resetskill;
-				set SkillPoint,0;
-			}
-			specialeffect2 EF_ANGEL2;
-			specialeffect2 EF_ELECTRIC;
-			if (.Platinum)
-				callsub Get_Platinum;
-			close;
+			mes .NPCName$;
 		}
 		}
-		if (getargcount() == 1)
+		.@class = getelementofarray(getarg(0), .@selected);
+		if ((.@class == Job_Super_Novice || .@class == Job_Super_Baby) &&
+				BaseLevel < .SNovice) {
+			// Special Level Requirement because Super Novice and
+			// Supber Baby can both be selected in one of the first class
+			// changes. That's why the Levelrequirement is after and not before
+			// the selection.
+			mes "A base level of " + .SNovice +
+				" is required to turn into a " + jobname(.@class) + ".";
 			return;
 			return;
-		mes "[Job Master]";
+		}
+		// Confirm the Class
+		Confirm_Change(.@class, .@opt_cnt > 1);
+		next;
+		mes .NPCName$;
 	}
 	}
-	end;
+	return;
+}
+
+
+// Executes the actual jobchange and closes.
+function	Job_Change	{
+	function Get_Platinum;
+	.@to_cls = getarg(0);
+	next;
+	mes .NPCName$;
+	mes "You are now " + callfunc("F_InsertArticle", jobname(.@to_cls)) + "!";
+	if (.@to_cls == Job_Novice_High && .LastJob)
+		lastJob = Class; // Saves the lastJob for rebirth
+	jobchange .@to_cls;
+	if (.@to_cls == Job_Novice_High)
+		resetlvl(1);
+	else if (.@to_cls == Job_Baby) {
+		resetstatus;
+		resetskill;
+		set SkillPoint,0;
+	}
+	specialeffect2 EF_ANGEL2;
+	specialeffect2 EF_ELECTRIC;
+	if (.Platinum)
+		Get_Platinum();
+	if (.GetJobEquip)
+		Get_Job_Equip();
+	close; // Always closes after the change
+}
+
+function	Confirm_Change	{
+	// Player confirms he want to change into .@class
+	.@class = getarg(0, -1);
+	.@back = getarg(1, false);
+	if( .@class < 0 ) {
+		mes "Unknow Class Error.";
+		close;
+	}
+	mes "Do you want to change into ^0055FF"+jobname(.@class)+"^000000 class?";
+	.@job_option$ = " ~ Change into ^0055FF"+jobname(.@class)+"^000000 class";
+	if( .@class == Job_Novice_High)
+		.@job_option$ = " ~ ^0055FFRebirth^000000";
+	
+	if (select(.@job_option$+": ~ ^777777" + 
+			((.@back) ?"Go back" : "Cancel") + "^000000") == 1) {
+		Job_Change(.@class);
+	}
+	if (!.@back)
+		close; // "Cancel" pressed
+	return;
 }
 }
 
 
-Get_Platinum:
+function	Get_Platinum	{
 	skill "NV_FIRSTAID",1,SKILL_PERM;
 	skill "NV_FIRSTAID",1,SKILL_PERM;
 	switch (BaseClass) {
 	switch (BaseClass) {
 	case Job_Novice:
 	case Job_Novice:
@@ -292,15 +437,147 @@ Get_Platinum:
 		break;
 		break;
 	}
 	}
 	return;
 	return;
+}
+
+// Function which gives a job related item to the player
+// the items are the rewards from the original job change quests
+function	Get_Job_Equip	{
+	// Note: The item is dropping, when the player can't hold it.
+	// But that's better than not giving the item at all.
+	.@eac = eaclass();
+	if( .@eac&EAJL_THIRD ) {
+		// Third Class Items
+		getitem 2795,1;	//	Green Apple Ring for every 3rd Class
+		switch(BaseJob) {
+			// BaseJob of Third Cls
+			// For Normal Third, Baby Third and Transcended Third Cls
+			case Job_Knight:
+				getitem 5746,1;	break;	//	Rune Circlet [1]
+			case Job_Wizard:
+				getitem 5753,1;	break;	//	Magic Stone Hat [1]
+			case Job_Hunter:
+				getitem 5748,1;	break;	//	Sniper Goggle [1]
+			case Job_Priest:
+				getitem 5747,1;	break;	//	Mitra [1]
+			case Job_Blacksmith:
+				getitem 5749,1;	break;	//	Driver Band [1]
+			case Job_Assassin:
+				getitem 5755,1;	break;	//	Silent Executor [1]
+			case Job_Crusader:
+				getitem 5757,1;	break;	//	Dip Schmidt Helm [1]
+			case Job_Sage:
+				getitem 5756,1;	break;	//	Wind Whisper [1]
+			case Job_Bard:
+				getitem 5751,1;	break;	//	Maestro Song's Hat [1]
+			case Job_Dancer:
+				getitem 5758,1;	break;	//	Dying Swan [1]
+			case Job_Monk:
+				getitem 5754,1;	break;	//	Blazing Soul [1]
+			case Job_Alchemist:
+				getitem 5752,1;	break;	//	Midas Whisper[1]
+			case Job_Rogue:
+				getitem 5750,1; 		//	Shadow Handicraft [1]
+				getitem 6121,1;			//	Makeover Brush
+				getitem 6122,1;	break;	//	Paint Brush
+		}
+	} else if (.@eac&EAJL_2) {
+		// Second Class (And not Third Class)
+		switch(BaseJob) {
+			// Second Class
+			case Job_Knight:
+				getitem 1163,1;	break;	//	Claymore [0]
+			case Job_Priest:
+				getitem 1522,1;	break;	//	Stunner [0]
+			case Job_Wizard:
+				getitem 1617,1;	break;	//	Survivor's Rod [0]
+			case Job_Blacksmith:
+				getitem 1360,1;	break;	//	Two-Handed-Axe [1]
+			case Job_Hunter:
+				getitem 1718,1;	break;	//	Hunter Bow [0]
+			case Job_Assassin:
+				getitem 1254,1;	break;	//	Jamadhar [0]
+			case Job_Crusader:
+				getitem 1410,1;	break;	//	Lance [0]
+			case Job_Monk:
+				getitem 1807,1;	break;	//	Fist [0]
+			case Job_Sage:
+				getitem 1550,1;	break;	//	Book [3]
+			case Job_Rogue:
+				getitem 1222,1;	break;	//	Damascus [1]
+			case Job_Alchemist:
+				getitem 1126,1;	break;	//	Saber [2]
+			case Job_Bard:
+				getitem 1907,1;	break;	//	Guitar [0]
+			case Job_Dancer:
+				getitem 1960,1;	break;	//	Whip [1]
+			case Job_Super_Novice:
+				getitem 1208,1;	break;	//	Main Gauche [4]
+			case Job_Gunslinger:
+				getitem 13101,1; break;	//	Six Shooter [2]
+			case Job_Ninja:
+				getitem 13010,1; break;	//	Asura [2]
+			case Job_Star_Gladiator:
+				getitem 1550,1;	break;	//	Book [3]
+			case Job_Soul_Linker:
+				getitem 1617,1;	break;	//	Survivor's Rod [0]
+		}
+	} else {
+		// Neither Second or Third Cls
+		// => First Cls or not covered by the switch
+		switch(BaseClass) {
+			// First Class
+			case Job_Swordman:
+				getitem 1108,1;	break;	//	Blade [4]
+			case Job_Mage:
+				getitem 1602,1;	break;	//	Rod [4]
+			case Job_Archer:
+				getitem 1705,1;	break;	//	Composite Bow [4]
+			case Job_Acolyte:
+				getitem 1505,1;	break;	//	Mace [4]
+			case Job_Merchant:
+				getitem 1302,1;	break;	//	Axe [4]
+			case Job_Thief:
+				getitem 1208,1;	break;	//	Main Gauche [4]
+		}
+	}
+	return;
+}
 
 
 OnInit:
 OnInit:
-	setarray .Rebirth[0],99,50;	// Minimum base level, job level to rebirth OR change to third class
-	setarray .JobReq[0],10,40;	// Minimum job level to turn into 1st class, 2nd class
-	.ThirdClass = 1;			// Enable third classes? (1: yes / 0: no)
-	.SecondExpanded = 1;		// Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? (1: yes / 0: no)
-	.SNovice = 45;				// Minimum base level to turn into Super Novice
-	.LastJob = 1;				// Enforce linear class changes? (1: yes / 0: no)
-	.SkillPointCheck = 1;		// Force player to use up all skill points? (1: yes / 0: no)
-	.Platinum = 1;				// Get platinum skills automatically? (1: yes / 0: no)
+	// Initialisation, do not edit these
+	.NPCName$ = "[Job Master]";
+	
+	// Settings
+	.ThirdClass = true;			// Enable third classes?
+	.RebirthClass = true;			// Enable rebirth classes?
+	.SecondExpanded = true;		// Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion?
+	.BabyClass = true;				// Enable Baby classes?
+	.BabyThird = true;				// Enable Baby third classes?
+	.BabyExpanded = true;			// Enable Baby Expanded classes: Ex. Baby Ninja, Baby Taekwon, etc.
+	.BabySummoner = true;			// Enable Baby Summoner?
+	.LastJob = true;				// Enforce linear class changes?
+	.SkillPointCheck = true;		// Force player to use up all skill points?
+	.Platinum = true;				// Get platinum skills automatically?
+	.GetJobEquip = false;			// Get job equipment (mostly weapons) on job change?
+
+	// Level Requirements
+	setarray .Req_First[0],1,10; 		// Minimum base level, job level to turn into 1st class
+	setarray .Req_Second[0],1,40; 		// Minimum base level, job level to turn into 2nd class
+	setarray .Req_Rebirth[0],99,50;		// Minimum base level, job level to rebirth
+	setarray .Req_Third[0],99,50;		// Minimum base level, job level to change to third class
+	setarray .Req_Exp_NJ_GS[0],99,70; 	// Minimum base level, job level to turn into Expanded Ninja and Gunslinger
+	setarray .Req_Exp_SNOVI[0],99,99; 	// Minimum base level, job level to turn into Expanded Super Novice
+	.SNovice = 45;						// Minimum base level to turn into Super Novice
+	
+	// Setting adjustments by PACKETVER
+	if( PACKETVER < 20161207 ) {
+		if( .BabyExpanded )
+			debugmes "jobmaster: BabyExpanded is disabled due to outdated PACKETVER.";
+		if( .BabySummoner )
+			debugmes "jobmaster: BabySummoner is disabled due to outdated PACKETVER.";
+		.BabyExpanded = false;
+		.BabySummoner = false;
+	}
 	end;
 	end;
 }
 }
+

+ 3 - 1
src/map/pc.c

@@ -6366,9 +6366,11 @@ const char* job_name(int class_)
 		return msg_txt(NULL,695);
 		return msg_txt(NULL,695);
 
 
 	case JOB_SUMMONER:
 	case JOB_SUMMONER:
+		return msg_txt(NULL,697);
 	case JOB_BABY_SUMMONER:
 	case JOB_BABY_SUMMONER:
+		return msg_txt(NULL,698);
 	case JOB_BABY_NINJA:
 	case JOB_BABY_NINJA:
-		return msg_txt(NULL,697 - JOB_SUMMONER+class_);
+		return msg_txt(NULL,699);
 
 
 	case JOB_BABY_KAGEROU:
 	case JOB_BABY_KAGEROU:
 	case JOB_BABY_OBORO:
 	case JOB_BABY_OBORO: