I have not test it. But I think it should work.
//===== rAthena Script =======================================
//= All-in-One NPC
//===== By: ==================================================
//= Euphy
//===== Current Version: =====================================
//= 1.8
//===== Description: =========================================
//= A compilation of commonly-used NPC scripts.
//== Includes job changer, stylist, refiner, card remover,
//== coin exchanger, rentals, resetter, platinum skills,
//== sex changer, identifier, healer, buffer, and repairman.
//============================================================
new_1-2,100,113,6 script All-in-One NPC 403,{
function Get_Platinum; function Cm;
if (getarraysize(.OnClick)) {
if (.OnClick[0]) {
specialeffect2 EF_HEAL2;
percentheal 100,100;
}
if (.OnClick[1]) {
specialeffect2 EF_BLESSING; sc_start SC_BLESSING,600000,10;
specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,600000,10;
}
if (.OnClick[2])
repairall;
}
mes .n$;
set
[email protected], gettime(3);
mes "Good "+((
[email protected] < 5 ||
[email protected] > 17)?"evening":((
[email protected] < 12)?"morning":"afternoon"))+", "+strcharinfo(0)+"!";
mes "What can I do for you?";
emotion ET_DELIGHT;
next;
disable_items;
switch(select(.menu$)) {
case 1:
function Job_Menu; function A_An;
mes .n$;
if (Class > 4049) {
mes "No more jobs are available.";
close;
}
if (checkfalcon() || checkcart() || checkriding() || ismounting()) {
mes "Please remove your "+((checkfalcon())?"falcon":"")+((checkcart())?"cart":"")+((checkriding())?"Peco":"")+((ismounting())?"mount":"")+" before proceeding.";
close;
}
if (.SkillPointCheck && SkillPoint) {
mes "Please use all your skill points before proceeding.";
close;
}
set
[email protected], eaclass();
set
[email protected], ((.ThirdClass)?roclass(
[email protected]&EAJ_UPPERMASK):Class);
if (
[email protected] > 6 &&
[email protected] < 22) {
if (BaseLevel < .Rebirth[0] || JobLevel < .Rebirth[1]) {
set
[email protected], .Rebirth[0]-BaseLevel; set
[email protected], .Rebirth[1]-JobLevel;
mes "You need "+((
[email protected]>0)
[email protected]+" more base levels "+((
[email protected]>0)?"/ ":""):"")+((
[email protected]>0)
[email protected]+" more job levels ":"")+"to continue.";
close;
}
if (Class > 21) {
mes "Switch to third class?";
next;
Job_Menu(roclass(
[email protected]|EAJL_THIRD));
close;
}
while(1) {
mes "Select an option.";
next;
set
[email protected], select(" ~ ^0055FFRebirth^000000:"+((.ThirdClass)?" ~ ^FF0000Third Class^000000":"")+": ~ ^777777Cancel^000000");
if (
[email protected]==3) close;
mes .n$;
mes "Are you sure?";
next;
Job_Menu(((
[email protected]==1)?4001:roclass(
[email protected]|EAJL_THIRD)));
mes .n$;
}
}
set
[email protected], roclass(
[email protected]|EAJL_2_1); set
[email protected],roclass(
[email protected]|EAJL_2_2);
if ((
[email protected]&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE) setarray
[email protected][0],roclass(
[email protected]|EAJL_THIRD),99;
if (Class == Job_Ninja || Class == Job_Gunslinger) setarray
[email protected][0],
[email protected],70;
if (
[email protected][0] && .SecondExpanded) {
if (BaseLevel < .Rebirth[0] || JobLevel <
[email protected][1]) {
set
[email protected], .Rebirth[0]-BaseLevel; set
[email protected],
[email protected][1]-JobLevel;
mes "You need "+((
[email protected]>0)
[email protected]+" more base levels "+((
[email protected]>0)?"/ ":""):"")+((
[email protected]>0)
[email protected]+" more job levels ":"")+"to continue.";
close;
}
mes "Switch to "+jobname(
[email protected][0])+"?";
next;
Job_Menu(
[email protected][0]);
close;
}
if (
[email protected]&EAJL_2)
if (
[email protected]&(EAJL_UPPER|EAJL_BABY) || roclass(
[email protected]|EAJL_UPPER) == -1) {
mes "No more jobs are available.";
close;
}
if ((
[email protected]&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 == 4001 && .LastJob && lastJob) {
mes "Switch classes now?";
next;
Job_Menu(roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER));
} else switch(Class) {
case 0: Job_Menu(1,2,3,4,5,6,23,4046,24,25,4023);
case 4001: Job_Menu(4002,4003,4004,4005,4006,4007);
case 4023: Job_Menu(4024,4025,4026,4027,4028,4029,4045);
default: mes "An error has occurred."; break;
}
close;
}
if (roclass(
[email protected]|EAJL_2_1) == -1 || roclass(
[email protected]|EAJL_2_2) == -1)
mes "No more jobs are available.";
else if (!(
[email protected]&EAJL_2) && JobLevel < .JobReq[1])
mes "A job level of "+.JobReq[1]+" is required to change into the 2nd Class.";
else if (.LastJob && lastJob && (
[email protected]&EAJL_UPPER)) {
mes "Switch classes now?";
next;
Job_Menu(lastJob+4001);
} else
Job_Menu(
[email protected],
[email protected]);
close;
function Job_Menu {
while(1) {
if (getargcount() > 1) {
mes "Select a job.";
set
[email protected]$,"";
for(set
[email protected],0;
[email protected]<getargcount(); set
[email protected],
[email protected]+1)
set
[email protected]$,
[email protected]$+" ~ "+jobname(getarg(
[email protected]))+":";
set
[email protected]$,
[email protected]$+" ~ ^777777Cancel^000000";
next;
set
[email protected], getarg(select(
[email protected]$)-1,0);
if (
[email protected]) close;
if ((
[email protected] == 23 ||
[email protected] == 4045) && BaseLevel < .SNovice) {
mes .n$;
mes "A base level of "+.SNovice+" is required to turn into a "+jobname(
[email protected])+".";
close;
}
mes .n$;
mes "Are you sure?";
next;
} else
set
[email protected], getarg(0);
if (select(" ~ Change into ^0055FF"+jobname(
[email protected])+"^000000 class: ~ ^777777"+((getargcount() > 1)?"Go back":"Cancel")+"^000000") == 1) {
mes .n$;
mes "You are now "+A_An(jobname(
[email protected]))+"!";
if (
[email protected]==4001 && .LastJob) set lastJob, Class;
jobchange
[email protected];
if (
[email protected]==4001 ||
[email protected]==4023)
resetlvl(1);
specialeffect2 EF_ANGEL2;
specialeffect2 EF_ELECTRIC;
if (.Platinum)
Get_Platinum;
close;
}
if (getargcount() == 1) return;
mes .n$;
}
end;
}
function Get_Platinum {
skill 142,1,0;
switch(BaseClass) {
case 0: if (Class !=23) skill 143,1,0; break;
case 1: skill 144,1,0; skill 145,1,0; skill 146,1,0; break;
case 2: skill 157,1,0; break;
case 3: skill 147,1,0; skill 148,1,0; break;
case 4: skill 156,1,0; break;
case 5: skill 153,1,0; skill 154,1,0; skill 155,1,0; break;
case 6: skill 149,1,0; skill 150,1,0; skill 151,1,0; skill 152,1,0; break;
default: break;
}
switch(BaseJob) {
case 7: skill 1001,1,0; break;
case 8: skill 1014,1,0; break;
case 9: skill 1006,1,0; break;
case 10: skill 1012,1,0; skill 1013,1,0; break;
case 11: skill 1009,1,0; break;
case 12: skill 1003,1,0; skill 1004,1,0; break;
case 14: skill 1002,1,0; break;
case 15: skill 1015,1,0; skill 1016,1,0; break;
case 16: skill 1007,1,0; skill 1008,1,0; skill 1017,1,0; skill 1018,1,0; skill 1019,1,0; break;
case 17: skill 1005,1,0; break;
case 18: skill 238,1,0; break;
case 19: skill 1010,1,0; break;
case 20: skill 1011,1,0; break;
default: break;
}
return;
}
function A_An {
setarray
[email protected]$[0],"a","e","i","o","u";
set
[email protected]$, "_"+getarg(0);
for(set
[email protected],0;
[email protected]<5; set
[email protected],
[email protected]+1)
if (compare(
[email protected]$,"_"
[email protected]$[
[email protected]])) return "an "+getarg(0);
return "a "+getarg(0);
}
case 2:
Get_Platinum;
specialeffect2 EF_BLUECASTING;
mes .n$;
mes "Platinum skills received!";
close;
case 3:
if (Zeny < .Prices[2]) {
mes .n$;
mes "It costs "+Cm(.Prices[2])+" Zeny to rent.";
close;
}
if (ismounting()) {
mes .n$;
mes "You must first remove your mount.";
close;
} else if ((eaclass()&EAJ_THIRDMASK==EAJ_RANGER) && !countitem(6124)) {
if (!checkfalcon() && getskilllv("HT_FALCON") && !checkoption(Option_Wug) && !checkoption(Option_Wugrider)) {
mes .n$;
mes "Please select an option.";
next;
if(select(" ~ Falcon: ~ Warg") == 1) setfalcon;
else getitem 6124,1;
} else getitem 6124,1;
} else if ((eaclass()&EAJ_THIRDMASK==EAJ_MECHANIC) && !checkcart() && getskilllv("MC_PUSHCART")) {
if (!checkmadogear() && getskilllv("NC_MADOLICENCE")) {
mes .n$;
mes "Please select an option.";
next;
if(select(" ~ Cart: ~ Mado")==1) setcart;
else setmadogear;
} else setcart;
} else if (!checkcart() && getskilllv("MC_PUSHCART")) setcart;
else if (!checkfalcon() && getskilllv("HT_FALCON") && !checkoption(Option_Wug) && !checkoption(Option_Wugrider)) setfalcon;
else if (!checkriding() && getskilllv("KN_RIDING")) {
if (eaclass()&EAJ_THIRDMASK == EAJ_RUNE_KNIGHT) setdragon;
else setriding;
} else if (!checkmadogear() && getskilllv("NC_MADOLICENCE")) setmadogear;
else {
mes .n$;
mes "You do not meet requirements to rent.";
close;
}
set Zeny, Zeny-.Prices[2];
specialeffect2 EF_TEIHIT3;
mes .n$;
mes "Here you go.";
emotion ET_BEST;
close;
case 4:
mes "[ All Skill Npc ]";
if (JobLevel < 10) {
mes "Come back where you're job level is 10.";
end;
}
function Cm {
set
[email protected]$, getarg(0);
for(set
[email protected],getstrlen(
[email protected]$)-3;
[email protected]>0; set
[email protected],
[email protected])
set
[email protected]$, insertchar(
[email protected]$,",",
[email protected]);
return
[email protected]$;
}
mes "Okay.. I got you here you go...";
atcommand "@skillall "+strcharinfo(0);
end;
}
OnInit:
// --------------------- Config ---------------------
setarray .MainMenu$[0], // Set menu options!
"Change Jobs", // [1]
"Platinum Skills", // [2]
"Rentals", // [4]
"All Skills"; // [8]
set
[email protected],1|2|4|8;
setarray .OnClick[0],1,1,1; // When clicked: heal [0], buff [1], repair [2] (1: yes / 0: no)
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
set .ThirdClass,0; // Enable third classes? (1: yes / 0: no)
set .SecondExpanded,1; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? (1: yes / 0: no)
set .SNovice,45; // Minimum base level to turn into Super Novice
set .LastJob,1; // Enforce linear class changes? (1: yes / 0: no)
set .SkillPointCheck,0; // Force player to use up all skill points? (1: yes / 0: no)
set .Platinum,1; // Get platinum skills automatically? (1: yes / 0: no)
set .n$, "[All-in-One NPC]"; // NPC Name
// --------------------------------------------------
set .menu$,"";
for (set
[email protected],0;
[email protected] < getarraysize(.MainMenu$); set
[email protected],
[email protected]+1) {
if (
[email protected] & (1<<
[email protected]))
set .menu$, .menu$+" ~ "+.MainMenu$[
[email protected]];
set .menu$, .menu$+":";
}
end;
}