PlayerClass.java 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340
  1. /*
  2. * $Header: PlayerClass.java, 24/11/2005 12:56:01 luisantonioa Exp $
  3. *
  4. * $Author: luisantonioa $
  5. * $Date: 24/11/2005 12:56:01 $
  6. * $Revision: 1 $
  7. * $Log: PlayerClass.java,v $
  8. * Revision 1 24/11/2005 12:56:01 luisantonioa
  9. * Added copyright notice
  10. *
  11. *
  12. * This program is free software: you can redistribute it and/or modify it under
  13. * the terms of the GNU General Public License as published by the Free Software
  14. * Foundation, either version 3 of the License, or (at your option) any later
  15. * version.
  16. *
  17. * This program is distributed in the hope that it will be useful, but WITHOUT
  18. * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
  19. * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
  20. * details.
  21. *
  22. * You should have received a copy of the GNU General Public License along with
  23. * this program. If not, see <http://www.gnu.org/licenses/>.
  24. */
  25. package net.sf.l2j.gameserver.model.base;
  26. import static net.sf.l2j.gameserver.model.base.ClassLevel.First;
  27. import static net.sf.l2j.gameserver.model.base.ClassLevel.Fourth;
  28. import static net.sf.l2j.gameserver.model.base.ClassLevel.Second;
  29. import static net.sf.l2j.gameserver.model.base.ClassLevel.Third;
  30. import static net.sf.l2j.gameserver.model.base.ClassType.Fighter;
  31. import static net.sf.l2j.gameserver.model.base.ClassType.Mystic;
  32. import static net.sf.l2j.gameserver.model.base.ClassType.Priest;
  33. import static net.sf.l2j.gameserver.model.base.Race.DarkElf;
  34. import static net.sf.l2j.gameserver.model.base.Race.Dwarf;
  35. import static net.sf.l2j.gameserver.model.base.Race.Elf;
  36. import static net.sf.l2j.gameserver.model.base.Race.Human;
  37. import static net.sf.l2j.gameserver.model.base.Race.Kamael;
  38. import static net.sf.l2j.gameserver.model.base.Race.Orc;
  39. import java.util.EnumMap;
  40. import java.util.EnumSet;
  41. import java.util.Set;
  42. import net.sf.l2j.gameserver.model.actor.instance.L2PcInstance;
  43. /**
  44. * This class ...
  45. *
  46. * @version $Revision: 1.2 $ $Date: 2004/06/27 08:12:59 $
  47. */
  48. public enum PlayerClass
  49. {
  50. HumanFighter(Human, Fighter, First),
  51. Warrior(Human, Fighter, Second),
  52. Gladiator(Human, Fighter, Third),
  53. Warlord(Human, Fighter, Third),
  54. HumanKnight(Human, Fighter, Second),
  55. Paladin(Human, Fighter, Third),
  56. DarkAvenger(Human, Fighter, Third),
  57. Rogue(Human, Fighter, Second),
  58. TreasureHunter(Human, Fighter, Third),
  59. Hawkeye(Human, Fighter, Third),
  60. HumanMystic(Human, Mystic, First),
  61. HumanWizard(Human, Mystic, Second),
  62. Sorceror(Human, Mystic, Third),
  63. Necromancer(Human, Mystic, Third),
  64. Warlock(Human, Mystic, Third),
  65. Cleric(Human, Priest, Second),
  66. Bishop(Human, Priest, Third),
  67. Prophet(Human, Priest, Third),
  68. ElvenFighter(Elf, Fighter, First),
  69. ElvenKnight(Elf, Fighter, Second),
  70. TempleKnight(Elf, Fighter, Third),
  71. Swordsinger(Elf, Fighter, Third),
  72. ElvenScout(Elf, Fighter, Second),
  73. Plainswalker(Elf, Fighter, Third),
  74. SilverRanger(Elf, Fighter, Third),
  75. ElvenMystic(Elf, Mystic, First),
  76. ElvenWizard(Elf, Mystic, Second),
  77. Spellsinger(Elf, Mystic, Third),
  78. ElementalSummoner(Elf, Mystic, Third),
  79. ElvenOracle(Elf, Priest, Second),
  80. ElvenElder(Elf, Priest, Third),
  81. DarkElvenFighter(DarkElf, Fighter, First),
  82. PalusKnight(DarkElf, Fighter, Second),
  83. ShillienKnight(DarkElf, Fighter, Third),
  84. Bladedancer(DarkElf, Fighter, Third),
  85. Assassin(DarkElf, Fighter, Second),
  86. AbyssWalker(DarkElf, Fighter, Third),
  87. PhantomRanger(DarkElf, Fighter, Third),
  88. DarkElvenMystic(DarkElf, Mystic, First),
  89. DarkElvenWizard(DarkElf, Mystic, Second),
  90. Spellhowler(DarkElf, Mystic, Third),
  91. PhantomSummoner(DarkElf, Mystic, Third),
  92. ShillienOracle(DarkElf, Priest, Second),
  93. ShillienElder(DarkElf, Priest, Third),
  94. OrcFighter(Orc, Fighter, First),
  95. OrcRaider(Orc, Fighter, Second),
  96. Destroyer(Orc, Fighter, Third),
  97. OrcMonk(Orc, Fighter, Second),
  98. Tyrant(Orc, Fighter, Third),
  99. OrcMystic(Orc, Mystic, First),
  100. OrcShaman(Orc, Mystic, Second),
  101. Overlord(Orc, Mystic, Third),
  102. Warcryer(Orc, Mystic, Third),
  103. DwarvenFighter(Dwarf, Fighter, First),
  104. DwarvenScavenger(Dwarf, Fighter, Second),
  105. BountyHunter(Dwarf, Fighter, Third),
  106. DwarvenArtisan(Dwarf, Fighter, Second),
  107. Warsmith(Dwarf, Fighter, Third),
  108. dummyEntry1(null, null, null),
  109. dummyEntry2(null, null, null),
  110. dummyEntry3(null, null, null),
  111. dummyEntry4(null, null, null),
  112. dummyEntry5(null, null, null),
  113. dummyEntry6(null, null, null),
  114. dummyEntry7(null, null, null),
  115. dummyEntry8(null, null, null),
  116. dummyEntry9(null, null, null),
  117. dummyEntry10(null, null, null),
  118. dummyEntry11(null, null, null),
  119. dummyEntry12(null, null, null),
  120. dummyEntry13(null, null, null),
  121. dummyEntry14(null, null, null),
  122. dummyEntry15(null, null, null),
  123. dummyEntry16(null, null, null),
  124. dummyEntry17(null, null, null),
  125. dummyEntry18(null, null, null),
  126. dummyEntry19(null, null, null),
  127. dummyEntry20(null, null, null),
  128. dummyEntry21(null, null, null),
  129. dummyEntry22(null, null, null),
  130. dummyEntry23(null, null, null),
  131. dummyEntry24(null, null, null),
  132. dummyEntry25(null, null, null),
  133. dummyEntry26(null, null, null),
  134. dummyEntry27(null, null, null),
  135. dummyEntry28(null, null, null),
  136. dummyEntry29(null, null, null),
  137. dummyEntry30(null, null, null),
  138. /*
  139. * (3rd classes)
  140. */
  141. duelist(Human, Fighter, Fourth),
  142. dreadnought(Human, Fighter, Fourth),
  143. phoenixKnight(Human, Fighter, Fourth),
  144. hellKnight(Human, Fighter, Fourth),
  145. sagittarius(Human, Fighter, Fourth),
  146. adventurer(Human, Fighter, Fourth),
  147. archmage(Human, Mystic, Fourth),
  148. soultaker(Human, Mystic, Fourth),
  149. arcanaLord(Human, Mystic, Fourth),
  150. cardinal(Human, Mystic, Fourth),
  151. hierophant(Human, Mystic, Fourth),
  152. evaTemplar(Elf, Fighter, Fourth),
  153. swordMuse(Elf, Fighter, Fourth),
  154. windRider(Elf, Fighter, Fourth),
  155. moonlightSentinel(Elf, Fighter, Fourth),
  156. mysticMuse(Elf, Mystic, Fourth),
  157. elementalMaster(Elf, Mystic, Fourth),
  158. evaSaint(Elf, Mystic, Fourth),
  159. shillienTemplar(DarkElf, Fighter, Fourth),
  160. spectralDancer(DarkElf, Fighter, Fourth),
  161. ghostHunter(DarkElf, Fighter, Fourth),
  162. ghostSentinel(DarkElf, Fighter, Fourth),
  163. stormScreamer(DarkElf, Mystic, Fourth),
  164. spectralMaster(DarkElf, Mystic, Fourth),
  165. shillienSaint(DarkElf, Mystic, Fourth),
  166. titan(Orc, Fighter, Fourth),
  167. grandKhauatari(Orc, Fighter, Fourth),
  168. dominator(Orc, Mystic, Fourth),
  169. doomcryer(Orc, Mystic, Fourth),
  170. fortuneSeeker(Dwarf, Fighter, Fourth),
  171. maestro(Dwarf, Fighter, Fourth),
  172. dummyEntry31(null, null, null),
  173. dummyEntry32(null, null, null),
  174. dummyEntry33(null, null, null),
  175. dummyEntry34(null, null, null),
  176. maleSoldier(Kamael, Fighter, First),
  177. femaleSoldier(Kamael, Fighter, First),
  178. trooper(Kamael, Fighter, Second),
  179. warder(Kamael, Fighter, Second),
  180. berserker(Kamael, Fighter, Third),
  181. maleSoulbreaker(Kamael, Fighter, Third),
  182. femaleSoulbreaker(Kamael, Fighter, Third),
  183. arbalester(Kamael, Fighter, Third),
  184. doombringer(Kamael, Fighter, Fourth),
  185. maleSoulhound(Kamael, Fighter, Fourth),
  186. femaleSoulhound(Kamael, Fighter, Fourth),
  187. trickster(Kamael, Fighter, Fourth),
  188. inspector(Kamael, Fighter, Third),
  189. judicator(Kamael, Fighter, Fourth);
  190. private Race _race;
  191. private ClassLevel _level;
  192. private ClassType _type;
  193. private static final Set<PlayerClass> mainSubclassSet;
  194. private static final Set<PlayerClass> neverSubclassed = EnumSet.of(Overlord, Warsmith);
  195. private static final Set<PlayerClass> subclasseSet1 = EnumSet.of(DarkAvenger, Paladin, TempleKnight, ShillienKnight);
  196. private static final Set<PlayerClass> subclasseSet2 = EnumSet.of(TreasureHunter, AbyssWalker, Plainswalker);
  197. private static final Set<PlayerClass> subclasseSet3 = EnumSet.of(Hawkeye, SilverRanger, PhantomRanger);
  198. private static final Set<PlayerClass> subclasseSet4 = EnumSet.of(Warlock, ElementalSummoner, PhantomSummoner);
  199. private static final Set<PlayerClass> subclasseSet5 = EnumSet.of(Sorceror, Spellsinger, Spellhowler);
  200. private static final EnumMap<PlayerClass, Set<PlayerClass>> subclassSetMap = new EnumMap<PlayerClass, Set<PlayerClass>>(PlayerClass.class);
  201. static
  202. {
  203. Set<PlayerClass> subclasses = getSet(null, Third);
  204. subclasses.removeAll(neverSubclassed);
  205. mainSubclassSet = subclasses;
  206. subclassSetMap.put(DarkAvenger, subclasseSet1);
  207. subclassSetMap.put(Paladin, subclasseSet1);
  208. subclassSetMap.put(TempleKnight, subclasseSet1);
  209. subclassSetMap.put(ShillienKnight, subclasseSet1);
  210. subclassSetMap.put(TreasureHunter, subclasseSet2);
  211. subclassSetMap.put(AbyssWalker, subclasseSet2);
  212. subclassSetMap.put(Plainswalker, subclasseSet2);
  213. subclassSetMap.put(Hawkeye, subclasseSet3);
  214. subclassSetMap.put(SilverRanger, subclasseSet3);
  215. subclassSetMap.put(PhantomRanger, subclasseSet3);
  216. subclassSetMap.put(Warlock, subclasseSet4);
  217. subclassSetMap.put(ElementalSummoner, subclasseSet4);
  218. subclassSetMap.put(PhantomSummoner, subclasseSet4);
  219. subclassSetMap.put(Sorceror, subclasseSet5);
  220. subclassSetMap.put(Spellsinger, subclasseSet5);
  221. subclassSetMap.put(Spellhowler, subclasseSet5);
  222. }
  223. PlayerClass(Race pRace, ClassType pType, ClassLevel pLevel)
  224. {
  225. _race = pRace;
  226. _level = pLevel;
  227. _type = pType;
  228. }
  229. public final Set<PlayerClass> getAvailableSubclasses(L2PcInstance player)
  230. {
  231. Set<PlayerClass> subclasses = null;
  232. if (_level == Third)
  233. {
  234. if (player.getRace() != Kamael)
  235. {
  236. subclasses = EnumSet.copyOf(mainSubclassSet);
  237. subclasses.remove(this);
  238. switch (_race)
  239. {
  240. case Elf:
  241. subclasses.removeAll(getSet(DarkElf, Third));
  242. break;
  243. case DarkElf:
  244. subclasses.removeAll(getSet(Elf, Third));
  245. break;
  246. }
  247. subclasses.removeAll(getSet(Kamael, Third));
  248. Set<PlayerClass> unavailableClasses = subclassSetMap.get(this);
  249. if (unavailableClasses != null)
  250. subclasses.removeAll(unavailableClasses);
  251. }
  252. else
  253. {
  254. subclasses = getSet(Kamael, Third);
  255. subclasses.remove(this);
  256. //Check sex, male can't subclass female and vice versa
  257. if (player.getAppearance().getSex())
  258. subclasses.removeAll(EnumSet.of(maleSoulbreaker));
  259. else
  260. subclasses.removeAll(EnumSet.of(femaleSoulbreaker));
  261. if (player.getTotalSubClasses() < 2)
  262. subclasses.removeAll(EnumSet.of(inspector));
  263. }
  264. }
  265. return subclasses;
  266. }
  267. public static final EnumSet<PlayerClass> getSet(Race race, ClassLevel level)
  268. {
  269. EnumSet<PlayerClass> allOf = EnumSet.noneOf(PlayerClass.class);
  270. for (PlayerClass playerClass : EnumSet.allOf(PlayerClass.class))
  271. {
  272. if (race == null || playerClass.isOfRace(race))
  273. {
  274. if (level == null || playerClass.isOfLevel(level))
  275. {
  276. allOf.add(playerClass);
  277. }
  278. }
  279. }
  280. return allOf;
  281. }
  282. public final boolean isOfRace(Race pRace)
  283. {
  284. return _race == pRace;
  285. }
  286. public final boolean isOfType(ClassType pType)
  287. {
  288. return _type == pType;
  289. }
  290. public final boolean isOfLevel(ClassLevel pLevel)
  291. {
  292. return _level == pLevel;
  293. }
  294. public final ClassLevel getLevel()
  295. {
  296. return _level;
  297. }
  298. }