jobmaster.txt 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  1. //===== rAthena Script =======================================
  2. //= Job Master
  3. //===== By: ==================================================
  4. //= Euphy
  5. //===== Current Version: =====================================
  6. //= 1.4
  7. //===== Compatible With: =====================================
  8. //= rAthena Project
  9. //===== Description: =========================================
  10. //= A fully functional job changer.
  11. //===== Additional Comments: =================================
  12. //= 1.0 Initial script.
  13. //= 1.1 Fixed reset on Baby job change.
  14. //= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support.
  15. //= 1.3 Kagerou/Oboro added.
  16. //= 1.4 Rebellion added.
  17. //============================================================
  18. prontera,153,193,6 script Job Master 123,{
  19. function Job_Menu;
  20. mes "[Job Master]";
  21. if (Class > Job_Soul_Linker) {
  22. mes "No more jobs are available.";
  23. close;
  24. }
  25. if (checkfalcon() || checkcart() || checkriding() || ismounting()) {
  26. mes "Please remove your " +
  27. ((checkfalcon()) ? "falcon" : "") +
  28. ((checkcart()) ? "cart" : "") +
  29. ((checkriding()) ? "Peco" : "") +
  30. ((ismounting()) ? "mount" : "") +
  31. " before proceeding.";
  32. close;
  33. }
  34. if (.SkillPointCheck && SkillPoint) {
  35. mes "Please use all your skill points before proceeding.";
  36. close;
  37. }
  38. .@eac = eaclass();
  39. .@i = ((.ThirdClass) ? roclass(.@eac&EAJ_UPPERMASK) : Class);
  40. if (.@i >= Job_Knight && .@i <= Job_Crusader2) {
  41. if (BaseLevel < .Rebirth[0] || JobLevel < .Rebirth[1]) {
  42. .@blvl = .Rebirth[0] - BaseLevel;
  43. .@jlvl = .Rebirth[1] - JobLevel;
  44. mes "You need " +
  45. ((.@blvl > 0) ? .@blvl + " more base levels " + ((.@jlvl > 0) ? "/ " : "") : "") +
  46. ((.@jlvl > 0) ? .@jlvl + " more job levels " : "") + "to continue.";
  47. close;
  48. }
  49. if (Class > Job_Crusader2) {
  50. mes "Switch to third class?";
  51. next;
  52. Job_Menu(roclass(.@eac|EAJL_THIRD));
  53. close;
  54. }
  55. while(1) {
  56. mes "Select an option.";
  57. next;
  58. .@i = select(" ~ ^0055FFRebirth^000000:" + ((.ThirdClass) ? " ~ ^FF0000Third Class^000000" : "") + ": ~ ^777777Cancel^000000");
  59. if (.@i == 3)
  60. close;
  61. mes "[Job Master]";
  62. mes "Are you sure?";
  63. next;
  64. Job_Menu(((.@i == 1) ? Job_Novice_High : roclass(.@eac|EAJL_THIRD)));
  65. mes "[Job Master]";
  66. }
  67. }
  68. .@j1 = roclass(.@eac|EAJL_2_1);
  69. .@j2 = roclass(.@eac|EAJL_2_2);
  70. if ((.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE)
  71. setarray .@exp[0], roclass(.@eac|EAJL_THIRD), 99;
  72. if (Class == Job_Ninja || Class == Job_Gunslinger)
  73. setarray .@exp[0], .@j1, 70;
  74. if (.@exp[0] && .SecondExpanded) {
  75. if (BaseLevel < .Rebirth[0] || JobLevel < .@exp[1]) {
  76. .@blvl = .Rebirth[0] - BaseLevel;
  77. .@jlvl = .@exp[1] - JobLevel;
  78. mes "You need " +
  79. ((.@blvl > 0) ? .@blvl + " more base levels " + ((.@jlvl > 0) ? "/ " : "") : "") +
  80. ((.@jlvl > 0) ? .@jlvl + " more job levels " : "") + "to continue.";
  81. close;
  82. }
  83. mes "Switch to " + jobname(.@exp[0]) + "?";
  84. next;
  85. Job_Menu(.@exp[0]);
  86. close;
  87. }
  88. if (.@eac&EAJL_2)
  89. if ((.@eac&(EAJL_UPPER|EAJL_BABY)) || roclass(.@eac|EAJL_UPPER) == -1) {
  90. mes "No more jobs are available.";
  91. close;
  92. }
  93. if ((.@eac&EAJ_BASEMASK) == EAJ_NOVICE) {
  94. if (JobLevel < .JobReq[0])
  95. mes "A job level of " + .JobReq[0] + " is required to change into the 1st Class.";
  96. else if (Class == Job_Novice_High && .LastJob && lastJob) {
  97. mes "Switch classes now?";
  98. next;
  99. Job_Menu(roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER));
  100. } else {
  101. switch(Class) {
  102. case Job_Novice:
  103. Job_Menu(
  104. Job_Swordman,
  105. Job_Mage,
  106. Job_Archer,
  107. Job_Acolyte,
  108. Job_Merchant,
  109. Job_Thief,
  110. Job_Super_Novice,
  111. Job_Taekwon,
  112. Job_Gunslinger,
  113. Job_Ninja,
  114. Job_Baby
  115. );
  116. break;
  117. case Job_Novice_High:
  118. Job_Menu(
  119. Job_Swordman_High,
  120. Job_Mage_High,
  121. Job_Archer_High,
  122. Job_Acolyte_High,
  123. Job_Merchant_High,
  124. Job_Thief_High
  125. );
  126. break;
  127. case Job_Baby:
  128. Job_Menu(
  129. Job_Baby_Swordman,
  130. Job_Baby_Mage,
  131. Job_Baby_Archer,
  132. Job_Baby_Acolyte,
  133. Job_Baby_Merchant,
  134. Job_Baby_Thief,
  135. Job_Super_Baby
  136. );
  137. break;
  138. default:
  139. mes "An error has occurred.";
  140. break;
  141. }
  142. }
  143. close;
  144. }
  145. if (roclass(.@eac|EAJL_2_1) == -1 || roclass(.@eac|EAJL_2_2) == -1)
  146. mes "No more jobs are available.";
  147. else if (!(.@eac&EAJL_2) && JobLevel < .JobReq[1])
  148. mes "A job level of " + .JobReq[1] + " is required to change into the 2nd Class.";
  149. else if (.LastJob && lastJob && (.@eac&EAJL_UPPER)) {
  150. mes "Switch classes now?";
  151. next;
  152. Job_Menu(lastJob + Job_Novice_High);
  153. } else
  154. Job_Menu(.@j1, .@j2);
  155. close;
  156. function Job_Menu {
  157. while(1) {
  158. if (getargcount() > 1) {
  159. mes "Select a job.";
  160. .@menu$ = "";
  161. for (.@i = 0; .@i < getargcount(); .@i++)
  162. .@menu$ = .@menu$ + " ~ " + jobname(getarg(.@i)) + ":";
  163. .@menu$ = .@menu$+" ~ ^777777Cancel^000000";
  164. next;
  165. .@i = getarg(select(.@menu$) - 1, 0);
  166. if (!.@i)
  167. close;
  168. if ((.@i == Job_Super_Novice || .@i == Job_Super_Baby) && BaseLevel < .SNovice) {
  169. mes "[Job Master]";
  170. mes "A base level of " + .SNovice + " is required to turn into a " + jobname(.@i) + ".";
  171. close;
  172. }
  173. mes "[Job Master]";
  174. mes "Are you sure?";
  175. next;
  176. } else
  177. .@i = getarg(0);
  178. if (select(" ~ Change into ^0055FF" + jobname(.@i) + "^000000 class: ~ ^777777" + ((getargcount() > 1) ? "Go back" : "Cancel") + "^000000") == 1) {
  179. mes "[Job Master]";
  180. mes "You are now " + callfunc("F_InsertArticle", jobname(.@i)) + "!";
  181. if (.@i == Job_Novice_High && .LastJob)
  182. lastJob = Class;
  183. jobchange .@i;
  184. if (.@i == Job_Novice_High)
  185. resetlvl(1);
  186. else if (.@i == Job_Baby) {
  187. resetstatus;
  188. resetskill;
  189. set SkillPoint,0;
  190. }
  191. specialeffect2 EF_ANGEL2;
  192. specialeffect2 EF_ELECTRIC;
  193. if (.Platinum)
  194. callsub Get_Platinum;
  195. close;
  196. }
  197. if (getargcount() == 1)
  198. return;
  199. mes "[Job Master]";
  200. }
  201. end;
  202. }
  203. Get_Platinum:
  204. skill "NV_FIRSTAID",1,SKILL_PERM;
  205. switch (BaseClass) {
  206. case Job_Novice:
  207. if (Class != Job_Super_Novice)
  208. skill "NV_TRICKDEAD",1,SKILL_PERM;
  209. break;
  210. case Job_Swordman:
  211. skill "SM_MOVINGRECOVERY",1,SKILL_PERM;
  212. skill "SM_FATALBLOW",1,SKILL_PERM;
  213. skill "SM_AUTOBERSERK",1,SKILL_PERM;
  214. break;
  215. case Job_Mage:
  216. skill "MG_ENERGYCOAT",1,SKILL_PERM;
  217. break;
  218. case Job_Archer:
  219. skill "AC_MAKINGARROW",1,SKILL_PERM;
  220. skill "AC_CHARGEARROW",1,SKILL_PERM;
  221. break;
  222. case Job_Acolyte:
  223. skill "AL_HOLYLIGHT",1,SKILL_PERM;
  224. break;
  225. case Job_Merchant:
  226. skill "MC_CARTREVOLUTION",1,SKILL_PERM;
  227. skill "MC_CHANGECART",1,SKILL_PERM;
  228. skill "MC_LOUD",1,SKILL_PERM;
  229. break;
  230. case Job_Thief:
  231. skill "TF_SPRINKLESAND",1,SKILL_PERM;
  232. skill "TF_BACKSLIDING",1,SKILL_PERM;
  233. skill "TF_PICKSTONE",1,SKILL_PERM;
  234. skill "TF_THROWSTONE",1,SKILL_PERM;
  235. break;
  236. default:
  237. break;
  238. }
  239. switch (BaseJob) {
  240. case Job_Knight:
  241. skill "KN_CHARGEATK",1,SKILL_PERM;
  242. break;
  243. case Job_Priest:
  244. skill "PR_REDEMPTIO",1,SKILL_PERM;
  245. break;
  246. case Job_Wizard:
  247. skill "WZ_SIGHTBLASTER",1,SKILL_PERM;
  248. break;
  249. case Job_Blacksmith:
  250. skill "BS_UNFAIRLYTRICK",1,SKILL_PERM;
  251. skill "BS_GREED",1,SKILL_PERM;
  252. break;
  253. case Job_Hunter:
  254. skill "HT_PHANTASMIC",1,SKILL_PERM;
  255. break;
  256. case Job_Assassin:
  257. skill "AS_SONICACCEL",1,SKILL_PERM;
  258. skill "AS_VENOMKNIFE",1,SKILL_PERM;
  259. break;
  260. case Job_Crusader:
  261. skill "CR_SHRINK",1,SKILL_PERM;
  262. break;
  263. case Job_Monk:
  264. skill "MO_KITRANSLATION",1,SKILL_PERM;
  265. skill "MO_BALKYOUNG",1,SKILL_PERM;
  266. break;
  267. case Job_Sage:
  268. skill "SA_CREATECON",1,SKILL_PERM;
  269. skill "SA_ELEMENTWATER",1,SKILL_PERM;
  270. skill "SA_ELEMENTGROUND",1,SKILL_PERM;
  271. skill "SA_ELEMENTFIRE",1,SKILL_PERM;
  272. skill "SA_ELEMENTWIND",1,SKILL_PERM;
  273. break;
  274. case Job_Rogue:
  275. skill "RG_CLOSECONFINE",1,SKILL_PERM;
  276. break;
  277. case Job_Alchemist:
  278. skill "AM_BIOETHICS",1,SKILL_PERM;
  279. break;
  280. case Job_Bard:
  281. skill "BA_PANGVOICE",1,SKILL_PERM;
  282. break;
  283. case Job_Dancer:
  284. skill "DC_WINKCHARM",1,SKILL_PERM;
  285. break;
  286. default:
  287. break;
  288. }
  289. return;
  290. OnInit:
  291. setarray .Rebirth[0],99,50; // Minimum base level, job level to rebirth OR change to third class
  292. setarray .JobReq[0],10,40; // Minimum job level to turn into 1st class, 2nd class
  293. .ThirdClass = 1; // Enable third classes? (1: yes / 0: no)
  294. .SecondExpanded = 1; // Enable new expanded second classes: Ex. Super Novice, Kagerou/Oboro, Rebellion? (1: yes / 0: no)
  295. .SNovice = 45; // Minimum base level to turn into Super Novice
  296. .LastJob = 1; // Enforce linear class changes? (1: yes / 0: no)
  297. .SkillPointCheck = 1; // Force player to use up all skill points? (1: yes / 0: no)
  298. .Platinum = 1; // Get platinum skills automatically? (1: yes / 0: no)
  299. end;
  300. }