PlayerClass.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*
  2. * Copyright (C) 2004-2013 L2J Server
  3. *
  4. * This file is part of L2J Server.
  5. *
  6. * L2J Server 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 Server 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 com.l2jserver.gameserver.model.base;
  20. import static com.l2jserver.gameserver.enums.PcRace.DarkElf;
  21. import static com.l2jserver.gameserver.enums.PcRace.Dwarf;
  22. import static com.l2jserver.gameserver.enums.PcRace.Elf;
  23. import static com.l2jserver.gameserver.enums.PcRace.Human;
  24. import static com.l2jserver.gameserver.enums.PcRace.Kamael;
  25. import static com.l2jserver.gameserver.enums.PcRace.Orc;
  26. import static com.l2jserver.gameserver.model.base.ClassLevel.First;
  27. import static com.l2jserver.gameserver.model.base.ClassLevel.Fourth;
  28. import static com.l2jserver.gameserver.model.base.ClassLevel.Second;
  29. import static com.l2jserver.gameserver.model.base.ClassLevel.Third;
  30. import static com.l2jserver.gameserver.model.base.ClassType.Fighter;
  31. import static com.l2jserver.gameserver.model.base.ClassType.Mystic;
  32. import static com.l2jserver.gameserver.model.base.ClassType.Priest;
  33. import java.util.EnumMap;
  34. import java.util.EnumSet;
  35. import java.util.Set;
  36. import com.l2jserver.Config;
  37. import com.l2jserver.gameserver.enums.PcRace;
  38. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  39. /**
  40. * @author luisantonioa
  41. */
  42. public enum PlayerClass
  43. {
  44. HumanFighter(Human, Fighter, First),
  45. Warrior(Human, Fighter, Second),
  46. Gladiator(Human, Fighter, Third),
  47. Warlord(Human, Fighter, Third),
  48. HumanKnight(Human, Fighter, Second),
  49. Paladin(Human, Fighter, Third),
  50. DarkAvenger(Human, Fighter, Third),
  51. Rogue(Human, Fighter, Second),
  52. TreasureHunter(Human, Fighter, Third),
  53. Hawkeye(Human, Fighter, Third),
  54. HumanMystic(Human, Mystic, First),
  55. HumanWizard(Human, Mystic, Second),
  56. Sorceror(Human, Mystic, Third),
  57. Necromancer(Human, Mystic, Third),
  58. Warlock(Human, Mystic, Third),
  59. Cleric(Human, Priest, Second),
  60. Bishop(Human, Priest, Third),
  61. Prophet(Human, Priest, Third),
  62. ElvenFighter(Elf, Fighter, First),
  63. ElvenKnight(Elf, Fighter, Second),
  64. TempleKnight(Elf, Fighter, Third),
  65. Swordsinger(Elf, Fighter, Third),
  66. ElvenScout(Elf, Fighter, Second),
  67. Plainswalker(Elf, Fighter, Third),
  68. SilverRanger(Elf, Fighter, Third),
  69. ElvenMystic(Elf, Mystic, First),
  70. ElvenWizard(Elf, Mystic, Second),
  71. Spellsinger(Elf, Mystic, Third),
  72. ElementalSummoner(Elf, Mystic, Third),
  73. ElvenOracle(Elf, Priest, Second),
  74. ElvenElder(Elf, Priest, Third),
  75. DarkElvenFighter(DarkElf, Fighter, First),
  76. PalusKnight(DarkElf, Fighter, Second),
  77. ShillienKnight(DarkElf, Fighter, Third),
  78. Bladedancer(DarkElf, Fighter, Third),
  79. Assassin(DarkElf, Fighter, Second),
  80. AbyssWalker(DarkElf, Fighter, Third),
  81. PhantomRanger(DarkElf, Fighter, Third),
  82. DarkElvenMystic(DarkElf, Mystic, First),
  83. DarkElvenWizard(DarkElf, Mystic, Second),
  84. Spellhowler(DarkElf, Mystic, Third),
  85. PhantomSummoner(DarkElf, Mystic, Third),
  86. ShillienOracle(DarkElf, Priest, Second),
  87. ShillienElder(DarkElf, Priest, Third),
  88. OrcFighter(Orc, Fighter, First),
  89. OrcRaider(Orc, Fighter, Second),
  90. Destroyer(Orc, Fighter, Third),
  91. OrcMonk(Orc, Fighter, Second),
  92. Tyrant(Orc, Fighter, Third),
  93. OrcMystic(Orc, Mystic, First),
  94. OrcShaman(Orc, Mystic, Second),
  95. Overlord(Orc, Mystic, Third),
  96. Warcryer(Orc, Mystic, Third),
  97. DwarvenFighter(Dwarf, Fighter, First),
  98. DwarvenScavenger(Dwarf, Fighter, Second),
  99. BountyHunter(Dwarf, Fighter, Third),
  100. DwarvenArtisan(Dwarf, Fighter, Second),
  101. Warsmith(Dwarf, Fighter, Third),
  102. dummyEntry1(null, null, null),
  103. dummyEntry2(null, null, null),
  104. dummyEntry3(null, null, null),
  105. dummyEntry4(null, null, null),
  106. dummyEntry5(null, null, null),
  107. dummyEntry6(null, null, null),
  108. dummyEntry7(null, null, null),
  109. dummyEntry8(null, null, null),
  110. dummyEntry9(null, null, null),
  111. dummyEntry10(null, null, null),
  112. dummyEntry11(null, null, null),
  113. dummyEntry12(null, null, null),
  114. dummyEntry13(null, null, null),
  115. dummyEntry14(null, null, null),
  116. dummyEntry15(null, null, null),
  117. dummyEntry16(null, null, null),
  118. dummyEntry17(null, null, null),
  119. dummyEntry18(null, null, null),
  120. dummyEntry19(null, null, null),
  121. dummyEntry20(null, null, null),
  122. dummyEntry21(null, null, null),
  123. dummyEntry22(null, null, null),
  124. dummyEntry23(null, null, null),
  125. dummyEntry24(null, null, null),
  126. dummyEntry25(null, null, null),
  127. dummyEntry26(null, null, null),
  128. dummyEntry27(null, null, null),
  129. dummyEntry28(null, null, null),
  130. dummyEntry29(null, null, null),
  131. dummyEntry30(null, null, null),
  132. /*
  133. * (3rd classes)
  134. */
  135. duelist(Human, Fighter, Fourth),
  136. dreadnought(Human, Fighter, Fourth),
  137. phoenixKnight(Human, Fighter, Fourth),
  138. hellKnight(Human, Fighter, Fourth),
  139. sagittarius(Human, Fighter, Fourth),
  140. adventurer(Human, Fighter, Fourth),
  141. archmage(Human, Mystic, Fourth),
  142. soultaker(Human, Mystic, Fourth),
  143. arcanaLord(Human, Mystic, Fourth),
  144. cardinal(Human, Priest, Fourth),
  145. hierophant(Human, Priest, Fourth),
  146. evaTemplar(Elf, Fighter, Fourth),
  147. swordMuse(Elf, Fighter, Fourth),
  148. windRider(Elf, Fighter, Fourth),
  149. moonlightSentinel(Elf, Fighter, Fourth),
  150. mysticMuse(Elf, Mystic, Fourth),
  151. elementalMaster(Elf, Mystic, Fourth),
  152. evaSaint(Elf, Priest, Fourth),
  153. shillienTemplar(DarkElf, Fighter, Fourth),
  154. spectralDancer(DarkElf, Fighter, Fourth),
  155. ghostHunter(DarkElf, Fighter, Fourth),
  156. ghostSentinel(DarkElf, Fighter, Fourth),
  157. stormScreamer(DarkElf, Mystic, Fourth),
  158. spectralMaster(DarkElf, Mystic, Fourth),
  159. shillienSaint(DarkElf, Priest, Fourth),
  160. titan(Orc, Fighter, Fourth),
  161. grandKhavatari(Orc, Fighter, Fourth),
  162. dominator(Orc, Mystic, Fourth),
  163. doomcryer(Orc, Mystic, Fourth),
  164. fortuneSeeker(Dwarf, Fighter, Fourth),
  165. maestro(Dwarf, Fighter, Fourth),
  166. dummyEntry31(null, null, null),
  167. dummyEntry32(null, null, null),
  168. dummyEntry33(null, null, null),
  169. dummyEntry34(null, null, null),
  170. maleSoldier(Kamael, Fighter, First),
  171. femaleSoldier(Kamael, Fighter, First),
  172. trooper(Kamael, Fighter, Second),
  173. warder(Kamael, Fighter, Second),
  174. berserker(Kamael, Fighter, Third),
  175. maleSoulbreaker(Kamael, Fighter, Third),
  176. femaleSoulbreaker(Kamael, Fighter, Third),
  177. arbalester(Kamael, Fighter, Third),
  178. doombringer(Kamael, Fighter, Fourth),
  179. maleSoulhound(Kamael, Fighter, Fourth),
  180. femaleSoulhound(Kamael, Fighter, Fourth),
  181. trickster(Kamael, Fighter, Fourth),
  182. inspector(Kamael, Fighter, Third),
  183. judicator(Kamael, Fighter, Fourth);
  184. private PcRace _race;
  185. private ClassLevel _level;
  186. private ClassType _type;
  187. private static final Set<PlayerClass> mainSubclassSet;
  188. private static final Set<PlayerClass> neverSubclassed = EnumSet.of(Overlord, Warsmith);
  189. private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight);
  190. private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker);
  191. private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger);
  192. private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner);
  193. private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler);
  194. private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<>(PlayerClass.class);
  195. static
  196. {
  197. Set<PlayerClass> subclasses = getSet(null, Third);
  198. subclasses.removeAll(neverSubclassed);
  199. mainSubclassSet = subclasses;
  200. subclassSetMap.put(DarkAvenger, subclasseSet1);
  201. subclassSetMap.put(Paladin, subclasseSet1);
  202. subclassSetMap.put(TempleKnight, subclasseSet1);
  203. subclassSetMap.put(ShillienKnight, subclasseSet1);
  204. subclassSetMap.put(TreasureHunter, subclasseSet2);
  205. subclassSetMap.put(AbyssWalker, subclasseSet2);
  206. subclassSetMap.put(Plainswalker, subclasseSet2);
  207. subclassSetMap.put(Hawkeye, subclasseSet3);
  208. subclassSetMap.put(SilverRanger, subclasseSet3);
  209. subclassSetMap.put(PhantomRanger, subclasseSet3);
  210. subclassSetMap.put(Warlock, subclasseSet4);
  211. subclassSetMap.put(ElementalSummoner, subclasseSet4);
  212. subclassSetMap.put(PhantomSummoner, subclasseSet4);
  213. subclassSetMap.put(Sorceror, subclasseSet5);
  214. subclassSetMap.put(Spellsinger, subclasseSet5);
  215. subclassSetMap.put(Spellhowler, subclasseSet5);
  216. }
  217. PlayerClass(PcRace pRace, ClassType pType, ClassLevel pLevel)
  218. {
  219. _race = pRace;
  220. _level = pLevel;
  221. _type = pType;
  222. }
  223. public final Set<PlayerClass> getAvailableSubclasses(L2PcInstance player)
  224. {
  225. Set<PlayerClass> subclasses = null;
  226. if (_level == Third)
  227. {
  228. if (player.getRace() != Kamael)
  229. {
  230. subclasses = EnumSet.copyOf(mainSubclassSet);
  231. subclasses.remove(this);
  232. switch (player.getRace())
  233. {
  234. case Elf:
  235. subclasses.removeAll(getSet(DarkElf, Third));
  236. break;
  237. case DarkElf:
  238. subclasses.removeAll(getSet(Elf, Third));
  239. break;
  240. }
  241. subclasses.removeAll(getSet(Kamael, Third));
  242. Set<PlayerClass> unavailableClasses = subclassSetMap.get(this);
  243. if (unavailableClasses != null)
  244. {
  245. subclasses.removeAll(unavailableClasses);
  246. }
  247. }
  248. else
  249. {
  250. subclasses = getSet(Kamael, Third);
  251. subclasses.remove(this);
  252. // Check sex, male subclasses female and vice versa
  253. // If server owner set MaxSubclass > 3 some kamael's cannot take 4 sub
  254. // So, in that situation we must skip sex check
  255. if (Config.MAX_SUBCLASS <= 3)
  256. {
  257. if (player.getAppearance().getSex())
  258. {
  259. subclasses.removeAll(EnumSet.of(femaleSoulbreaker));
  260. }
  261. else
  262. {
  263. subclasses.removeAll(EnumSet.of(maleSoulbreaker));
  264. }
  265. }
  266. if (!player.getSubClasses().containsKey(2) || (player.getSubClasses().get(2).getLevel() < 75))
  267. {
  268. subclasses.removeAll(EnumSet.of(inspector));
  269. }
  270. }
  271. }
  272. return subclasses;
  273. }
  274. public static final EnumSet<PlayerClass> getSet(PcRace race, ClassLevel level)
  275. {
  276. EnumSet<PlayerClass> allOf = EnumSet.noneOf(PlayerClass.class);
  277. for (PlayerClass playerClass : EnumSet.allOf(PlayerClass.class))
  278. {
  279. if ((race == null) || playerClass.isOfRace(race))
  280. {
  281. if ((level == null) || playerClass.isOfLevel(level))
  282. {
  283. allOf.add(playerClass);
  284. }
  285. }
  286. }
  287. return allOf;
  288. }
  289. public final boolean isOfRace(PcRace pRace)
  290. {
  291. return _race == pRace;
  292. }
  293. public final boolean isOfType(ClassType pType)
  294. {
  295. return _type == pType;
  296. }
  297. public final boolean isOfLevel(ClassLevel pLevel)
  298. {
  299. return _level == pLevel;
  300. }
  301. public final ClassLevel getLevel()
  302. {
  303. return _level;
  304. }
  305. }