SubclassCertification.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. /*
  2. * Copyright (C) 2004-2014 L2J DataPack
  3. *
  4. * This file is part of L2J DataPack.
  5. *
  6. * L2J DataPack is free software: you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation, either version 3 of the License, or
  9. * (at your option) any later version.
  10. *
  11. * L2J DataPack is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  14. * General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this program. If not, see <http://www.gnu.org/licenses/>.
  18. */
  19. package ai.npc.SubclassCertification;
  20. import java.util.HashMap;
  21. import java.util.Map;
  22. import ai.npc.AbstractNpcAI;
  23. import com.l2jserver.gameserver.datatables.ClassListData;
  24. import com.l2jserver.gameserver.model.actor.L2Npc;
  25. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  26. import com.l2jserver.gameserver.model.actor.instance.L2VillageMasterInstance;
  27. import com.l2jserver.gameserver.model.base.ClassId;
  28. import com.l2jserver.gameserver.model.items.instance.L2ItemInstance;
  29. import com.l2jserver.gameserver.model.quest.QuestState;
  30. import com.l2jserver.gameserver.model.quest.State;
  31. import com.l2jserver.gameserver.network.SystemMessageId;
  32. import com.l2jserver.gameserver.network.serverpackets.SystemMessage;
  33. /**
  34. * Subclass certification
  35. * @author xban1x, jurchiks
  36. */
  37. public final class SubclassCertification extends AbstractNpcAI
  38. {
  39. // @formatter:off
  40. private static final int[] NPCS =
  41. {
  42. 30026, 30031, 30037, 30066, 30070, 30109, 30115, 30120, 30154, 30174,
  43. 30175, 30176, 30187, 30191, 30195, 30288, 30289, 30290, 30297, 30358,
  44. 30373, 30462, 30474, 30498, 30499, 30500, 30503, 30504, 30505, 30508,
  45. 30511, 30512, 30513, 30520, 30525, 30565, 30594, 30595, 30676, 30677,
  46. 30681, 30685, 30687, 30689, 30694, 30699, 30704, 30845, 30847, 30849,
  47. 30854, 30857, 30862, 30865, 30894, 30897, 30900, 30905, 30910, 30913,
  48. 31269, 31272, 31276, 31279, 31285, 31288, 31314, 31317, 31321, 31324,
  49. 31326, 31328, 31331, 31334, 31336, 31755, 31958, 31961, 31965, 31968,
  50. 31974, 31977, 31996, 32092, 32093, 32094, 32095, 32096, 32097, 32098,
  51. 32145, 32146, 32147, 32150, 32153, 32154, 32157, 32158, 32160, 32171,
  52. 32193, 32199, 32202, 32213, 32214, 32221, 32222, 32229, 32230, 32233,
  53. 32234
  54. };
  55. // @formatter:on
  56. private static final int CERTIFICATE_EMERGENT_ABILITY = 10280;
  57. private static final int CERTIFICATE_MASTER_ABILITY = 10612;
  58. private static final Map<ClassId, Integer> CLASSES = new HashMap<>();
  59. private static final Map<Integer, Integer> ABILITY_CERTIFICATES = new HashMap<>();
  60. private static final Map<Integer, Integer> TRANSFORMATION_SEALBOOKS = new HashMap<>();
  61. static
  62. {
  63. // Warrior classes
  64. CLASSES.put(ClassId.gladiator, 0);
  65. CLASSES.put(ClassId.warlord, 0);
  66. CLASSES.put(ClassId.destroyer, 0);
  67. CLASSES.put(ClassId.tyrant, 0);
  68. CLASSES.put(ClassId.bountyHunter, 0);
  69. CLASSES.put(ClassId.artisan, 0);
  70. CLASSES.put(ClassId.duelist, 0);
  71. CLASSES.put(ClassId.dreadnought, 0);
  72. CLASSES.put(ClassId.titan, 0);
  73. CLASSES.put(ClassId.grandKhavatari, 0);
  74. CLASSES.put(ClassId.fortuneSeeker, 0);
  75. CLASSES.put(ClassId.maestro, 0);
  76. CLASSES.put(ClassId.berserker, 0);
  77. CLASSES.put(ClassId.maleSoulbreaker, 0);
  78. CLASSES.put(ClassId.femaleSoulbreaker, 0);
  79. CLASSES.put(ClassId.doombringer, 0);
  80. CLASSES.put(ClassId.maleSoulhound, 0);
  81. CLASSES.put(ClassId.femaleSoulhound, 0);
  82. // Rogue classes
  83. CLASSES.put(ClassId.treasureHunter, 1);
  84. CLASSES.put(ClassId.hawkeye, 1);
  85. CLASSES.put(ClassId.plainsWalker, 1);
  86. CLASSES.put(ClassId.silverRanger, 1);
  87. CLASSES.put(ClassId.abyssWalker, 1);
  88. CLASSES.put(ClassId.phantomRanger, 1);
  89. CLASSES.put(ClassId.sagittarius, 1);
  90. CLASSES.put(ClassId.adventurer, 1);
  91. CLASSES.put(ClassId.windRider, 1);
  92. CLASSES.put(ClassId.moonlightSentinel, 1);
  93. CLASSES.put(ClassId.ghostHunter, 1);
  94. CLASSES.put(ClassId.ghostSentinel, 1);
  95. CLASSES.put(ClassId.arbalester, 1);
  96. CLASSES.put(ClassId.trickster, 1);
  97. // Knight classes
  98. CLASSES.put(ClassId.paladin, 2);
  99. CLASSES.put(ClassId.darkAvenger, 2);
  100. CLASSES.put(ClassId.templeKnight, 2);
  101. CLASSES.put(ClassId.shillienKnight, 2);
  102. CLASSES.put(ClassId.phoenixKnight, 2);
  103. CLASSES.put(ClassId.hellKnight, 2);
  104. CLASSES.put(ClassId.evaTemplar, 2);
  105. CLASSES.put(ClassId.shillienTemplar, 2);
  106. // Summoner classes
  107. CLASSES.put(ClassId.warlock, 3);
  108. CLASSES.put(ClassId.elementalSummoner, 3);
  109. CLASSES.put(ClassId.phantomSummoner, 3);
  110. CLASSES.put(ClassId.arcanaLord, 3);
  111. CLASSES.put(ClassId.elementalMaster, 3);
  112. CLASSES.put(ClassId.spectralMaster, 3);
  113. // Wizard classes
  114. CLASSES.put(ClassId.sorceror, 4);
  115. CLASSES.put(ClassId.necromancer, 4);
  116. CLASSES.put(ClassId.spellsinger, 4);
  117. CLASSES.put(ClassId.spellhowler, 4);
  118. CLASSES.put(ClassId.archmage, 4);
  119. CLASSES.put(ClassId.soultaker, 4);
  120. CLASSES.put(ClassId.mysticMuse, 4);
  121. CLASSES.put(ClassId.stormScreamer, 4);
  122. // Healer classes
  123. CLASSES.put(ClassId.bishop, 5);
  124. CLASSES.put(ClassId.elder, 5);
  125. CLASSES.put(ClassId.shillenElder, 5);
  126. CLASSES.put(ClassId.cardinal, 5);
  127. CLASSES.put(ClassId.evaSaint, 5);
  128. CLASSES.put(ClassId.shillienSaint, 5);
  129. // Enchanter classes
  130. CLASSES.put(ClassId.prophet, 6);
  131. CLASSES.put(ClassId.swordSinger, 6);
  132. CLASSES.put(ClassId.bladedancer, 6);
  133. CLASSES.put(ClassId.overlord, 6);
  134. CLASSES.put(ClassId.warcryer, 6);
  135. CLASSES.put(ClassId.hierophant, 6);
  136. CLASSES.put(ClassId.swordMuse, 6);
  137. CLASSES.put(ClassId.spectralDancer, 6);
  138. CLASSES.put(ClassId.dominator, 6);
  139. CLASSES.put(ClassId.doomcryer, 6);
  140. CLASSES.put(ClassId.inspector, 6);
  141. CLASSES.put(ClassId.judicator, 6);
  142. ABILITY_CERTIFICATES.put(0, 10281); // Certificate - Warrior Ability
  143. ABILITY_CERTIFICATES.put(1, 10283); // Certificate - Rogue Ability
  144. ABILITY_CERTIFICATES.put(2, 10282); // Certificate - Knight Ability
  145. ABILITY_CERTIFICATES.put(3, 10286); // Certificate - Summoner Ability
  146. ABILITY_CERTIFICATES.put(4, 10284); // Certificate - Wizard Ability
  147. ABILITY_CERTIFICATES.put(5, 10285); // Certificate - Healer Ability
  148. ABILITY_CERTIFICATES.put(6, 10287); // Certificate - Enchanter Ability
  149. TRANSFORMATION_SEALBOOKS.put(0, 10289); // Transformation Sealbook: Divine Warrior
  150. TRANSFORMATION_SEALBOOKS.put(1, 10290); // Transformation Sealbook: Divine Rogue
  151. TRANSFORMATION_SEALBOOKS.put(2, 10288); // Transformation Sealbook: Divine Knight
  152. TRANSFORMATION_SEALBOOKS.put(3, 10294); // Transformation Sealbook: Divine Summoner
  153. TRANSFORMATION_SEALBOOKS.put(4, 10292); // Transformation Sealbook: Divine Wizard
  154. TRANSFORMATION_SEALBOOKS.put(5, 10291); // Transformation Sealbook: Divine Healer
  155. TRANSFORMATION_SEALBOOKS.put(6, 10293); // Transformation Sealbook: Divine Enchanter
  156. }
  157. private static final int MIN_LVL = 65;
  158. private SubclassCertification()
  159. {
  160. super(SubclassCertification.class.getSimpleName(), "ai/npc");
  161. addStartNpc(NPCS);
  162. addTalkId(NPCS);
  163. }
  164. @Override
  165. public String onTalk(L2Npc npc, L2PcInstance player)
  166. {
  167. final QuestState st = player.getQuestState(getName());
  168. String htmltext = getNoQuestMsg(player);
  169. if (st != null)
  170. {
  171. st.setState(State.STARTED);
  172. htmltext = "Main.html";
  173. }
  174. return htmltext;
  175. }
  176. @Override
  177. public String onAdvEvent(String event, L2Npc npc, L2PcInstance player)
  178. {
  179. String htmltext = null;
  180. final QuestState st = player.getQuestState(getName());
  181. if (st == null)
  182. {
  183. return htmltext;
  184. }
  185. switch (event)
  186. {
  187. case "GetCertified":
  188. {
  189. if (!player.isSubClassActive())
  190. {
  191. htmltext = "NotSubclass.html";
  192. }
  193. else if (player.getLevel() < MIN_LVL)
  194. {
  195. htmltext = "NotMinLevel.html";
  196. }
  197. else if (((L2VillageMasterInstance) npc).checkVillageMaster(player.getActiveClass()))
  198. {
  199. htmltext = "CertificationList.html";
  200. }
  201. else
  202. {
  203. htmltext = "WrongVillageMaster.html";
  204. }
  205. break;
  206. }
  207. case "Obtain65":
  208. {
  209. htmltext = replaceHtml(player, "EmergentAbility.html", true, null).replace("%level%", "65").replace("%skilltype%", "common skill").replace("%event%", "lvl65Emergent");
  210. break;
  211. }
  212. case "Obtain70":
  213. {
  214. htmltext = replaceHtml(player, "EmergentAbility.html", true, null).replace("%level%", "70").replace("%skilltype%", "common skill").replace("%event%", "lvl70Emergent");
  215. break;
  216. }
  217. case "Obtain75":
  218. {
  219. htmltext = replaceHtml(player, "ClassAbility.html", true, null);
  220. break;
  221. }
  222. case "Obtain80":
  223. {
  224. htmltext = replaceHtml(player, "EmergentAbility.html", true, null).replace("%level%", "80").replace("%skilltype%", "transformation skill").replace("%event%", "lvl80Class");
  225. break;
  226. }
  227. case "lvl65Emergent":
  228. {
  229. htmltext = doCertification(player, st, "EmergentAbility", CERTIFICATE_EMERGENT_ABILITY, 65);
  230. break;
  231. }
  232. case "lvl70Emergent":
  233. {
  234. htmltext = doCertification(player, st, "EmergentAbility", CERTIFICATE_EMERGENT_ABILITY, 70);
  235. break;
  236. }
  237. case "lvl75Master":
  238. {
  239. htmltext = doCertification(player, st, "ClassAbility", CERTIFICATE_MASTER_ABILITY, 75);
  240. break;
  241. }
  242. case "lvl75Class":
  243. {
  244. htmltext = doCertification(player, st, "ClassAbility", ABILITY_CERTIFICATES.get(getClassIndex(player)), 75);
  245. break;
  246. }
  247. case "lvl80Class":
  248. {
  249. htmltext = doCertification(player, st, "ClassAbility", TRANSFORMATION_SEALBOOKS.get(getClassIndex(player)), 80);
  250. break;
  251. }
  252. case "Main.html":
  253. case "Explanation.html":
  254. case "NotObtain.html":
  255. {
  256. htmltext = event;
  257. break;
  258. }
  259. }
  260. return htmltext;
  261. }
  262. private String replaceHtml(L2PcInstance player, String htmlFile, boolean replaceClass, String levelToReplace)
  263. {
  264. String htmltext = getHtm(player.getHtmlPrefix(), htmlFile);
  265. if (replaceClass)
  266. {
  267. htmltext = htmltext.replace("%class%", String.valueOf(ClassListData.getInstance().getClass(player.getActiveClass()).getClientCode()));
  268. }
  269. if (levelToReplace != null)
  270. {
  271. htmltext = htmltext.replace("%level%", levelToReplace);
  272. }
  273. return htmltext;
  274. }
  275. private static int getClassIndex(L2PcInstance player)
  276. {
  277. Integer tmp = CLASSES.get(player.getClassId());
  278. if (tmp == null)
  279. {
  280. return -1;
  281. }
  282. return tmp.intValue();
  283. }
  284. private String doCertification(L2PcInstance player, QuestState qs, String variable, Integer itemId, int level)
  285. {
  286. if (itemId == null)
  287. {
  288. return null;
  289. }
  290. String htmltext;
  291. String tmp = variable + level + "-" + player.getClassIndex();
  292. String globalVariable = qs.getGlobalQuestVar(tmp);
  293. if (!globalVariable.equals("") && !globalVariable.equals("0"))
  294. {
  295. htmltext = "AlreadyReceived.html";
  296. }
  297. else if (player.getLevel() < level)
  298. {
  299. htmltext = replaceHtml(player, "LowLevel.html", false, Integer.toString(level));
  300. }
  301. else
  302. {
  303. // Add items to player's inventory
  304. final L2ItemInstance item = player.getInventory().addItem("Quest", itemId, 1, player, player.getTarget());
  305. if (item == null)
  306. {
  307. return null;
  308. }
  309. final SystemMessage smsg = SystemMessage.getSystemMessage(SystemMessageId.EARNED_ITEM_S1);
  310. smsg.addItemName(item);
  311. player.sendPacket(smsg);
  312. qs.saveGlobalQuestVar(tmp, String.valueOf(item.getObjectId()));
  313. htmltext = "GetAbility.html";
  314. }
  315. return htmltext;
  316. }
  317. public static void main(String[] args)
  318. {
  319. new SubclassCertification();
  320. }
  321. }