PlayerClass.java 11 KB

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