Elementals.java 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  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;
  20. import com.l2jserver.gameserver.model.actor.instance.L2PcInstance;
  21. import com.l2jserver.gameserver.model.skills.funcs.FuncAdd;
  22. import com.l2jserver.gameserver.model.skills.funcs.LambdaConst;
  23. import com.l2jserver.gameserver.model.stats.Stats;
  24. import gnu.trove.map.hash.TIntObjectHashMap;
  25. public final class Elementals
  26. {
  27. private static final TIntObjectHashMap<ElementalItems> TABLE = new TIntObjectHashMap<>();
  28. static
  29. {
  30. for (ElementalItems item : ElementalItems.values())
  31. {
  32. TABLE.put(item._itemId, item);
  33. }
  34. }
  35. public static final byte NONE = -1;
  36. public static final byte FIRE = 0;
  37. public static final byte WATER = 1;
  38. public static final byte WIND = 2;
  39. public static final byte EARTH = 3;
  40. public static final byte HOLY = 4;
  41. public static final byte DARK = 5;
  42. public static final int FIRST_WEAPON_BONUS = 20;
  43. public static final int NEXT_WEAPON_BONUS = 5;
  44. public static final int ARMOR_BONUS = 6;
  45. public static final int[] WEAPON_VALUES =
  46. {
  47. 0, // Level 1
  48. 25, // Level 2
  49. 75, // Level 3
  50. 150, // Level 4
  51. 175, // Level 5
  52. 225, // Level 6
  53. 300, // Level 7
  54. 325, // Level 8
  55. 375, // Level 9
  56. 450, // Level 10
  57. 475, // Level 11
  58. 525, // Level 12
  59. 600, // Level 13
  60. Integer.MAX_VALUE
  61. // TODO: Higher stones
  62. };
  63. public static final int[] ARMOR_VALUES =
  64. {
  65. 0, // Level 1
  66. 12, // Level 2
  67. 30, // Level 3
  68. 60, // Level 4
  69. 72, // Level 5
  70. 90, // Level 6
  71. 120, // Level 7
  72. 132, // Level 8
  73. 150, // Level 9
  74. 180, // Level 10
  75. 192, // Level 11
  76. 210, // Level 12
  77. 240, // Level 13
  78. Integer.MAX_VALUE
  79. // TODO: Higher stones
  80. };
  81. public static enum ElementalItemType
  82. {
  83. Stone(3),
  84. Roughore(3),
  85. Crystal(6),
  86. Jewel(9),
  87. Energy(12);
  88. public int _maxLevel;
  89. private ElementalItemType(int maxLvl)
  90. {
  91. _maxLevel = maxLvl;
  92. }
  93. }
  94. public static enum ElementalItems
  95. {
  96. fireStone(FIRE, 9546, ElementalItemType.Stone),
  97. waterStone(WATER, 9547, ElementalItemType.Stone),
  98. windStone(WIND, 9549, ElementalItemType.Stone),
  99. earthStone(EARTH, 9548, ElementalItemType.Stone),
  100. divineStone(HOLY, 9551, ElementalItemType.Stone),
  101. darkStone(DARK, 9550, ElementalItemType.Stone),
  102. fireRoughtore(FIRE, 10521, ElementalItemType.Roughore),
  103. waterRoughtore(WATER, 10522, ElementalItemType.Roughore),
  104. windRoughtore(WIND, 10524, ElementalItemType.Roughore),
  105. earthRoughtore(EARTH, 10523, ElementalItemType.Roughore),
  106. divineRoughtore(HOLY, 10526, ElementalItemType.Roughore),
  107. darkRoughtore(DARK, 10525, ElementalItemType.Roughore),
  108. fireCrystal(FIRE, 9552, ElementalItemType.Crystal),
  109. waterCrystal(WATER, 9553, ElementalItemType.Crystal),
  110. windCrystal(WIND, 9555, ElementalItemType.Crystal),
  111. earthCrystal(EARTH, 9554, ElementalItemType.Crystal),
  112. divineCrystal(HOLY, 9557, ElementalItemType.Crystal),
  113. darkCrystal(DARK, 9556, ElementalItemType.Crystal),
  114. fireJewel(FIRE, 9558, ElementalItemType.Jewel),
  115. waterJewel(WATER, 9559, ElementalItemType.Jewel),
  116. windJewel(WIND, 9561, ElementalItemType.Jewel),
  117. earthJewel(EARTH, 9560, ElementalItemType.Jewel),
  118. divineJewel(HOLY, 9563, ElementalItemType.Jewel),
  119. darkJewel(DARK, 9562, ElementalItemType.Jewel),
  120. // not yet supported by client (Freya pts)
  121. fireEnergy(FIRE, 9564, ElementalItemType.Energy),
  122. waterEnergy(WATER, 9565, ElementalItemType.Energy),
  123. windEnergy(WIND, 9567, ElementalItemType.Energy),
  124. earthEnergy(EARTH, 9566, ElementalItemType.Energy),
  125. divineEnergy(HOLY, 9569, ElementalItemType.Energy),
  126. darkEnergy(DARK, 9568, ElementalItemType.Energy);
  127. public byte _element;
  128. public int _itemId;
  129. public ElementalItemType _type;
  130. private ElementalItems(byte element, int itemId, ElementalItemType type)
  131. {
  132. _element = element;
  133. _itemId = itemId;
  134. _type = type;
  135. }
  136. }
  137. public static byte getItemElement(int itemId)
  138. {
  139. ElementalItems item = TABLE.get(itemId);
  140. if (item != null)
  141. {
  142. return item._element;
  143. }
  144. return NONE;
  145. }
  146. public static ElementalItems getItemElemental(int itemId)
  147. {
  148. return TABLE.get(itemId);
  149. }
  150. public static int getMaxElementLevel(int itemId)
  151. {
  152. ElementalItems item = TABLE.get(itemId);
  153. if (item != null)
  154. {
  155. return item._type._maxLevel;
  156. }
  157. return -1;
  158. }
  159. public static String getElementName(byte element)
  160. {
  161. switch (element)
  162. {
  163. case FIRE:
  164. return "Fire";
  165. case WATER:
  166. return "Water";
  167. case WIND:
  168. return "Wind";
  169. case EARTH:
  170. return "Earth";
  171. case DARK:
  172. return "Dark";
  173. case HOLY:
  174. return "Holy";
  175. }
  176. return "None";
  177. }
  178. public static byte getElementId(String name)
  179. {
  180. String tmp = name.toLowerCase();
  181. if (tmp.equals("fire"))
  182. {
  183. return FIRE;
  184. }
  185. if (tmp.equals("water"))
  186. {
  187. return WATER;
  188. }
  189. if (tmp.equals("wind"))
  190. {
  191. return WIND;
  192. }
  193. if (tmp.equals("earth"))
  194. {
  195. return EARTH;
  196. }
  197. if (tmp.equals("dark"))
  198. {
  199. return DARK;
  200. }
  201. if (tmp.equals("holy"))
  202. {
  203. return HOLY;
  204. }
  205. return NONE;
  206. }
  207. public static byte getOppositeElement(byte element)
  208. {
  209. return (byte) (((element % 2) == 0) ? (element + 1) : (element - 1));
  210. }
  211. public static class ElementalStatBoni
  212. {
  213. private byte _elementalType;
  214. private int _elementalValue;
  215. private boolean _active;
  216. public ElementalStatBoni(byte type, int value)
  217. {
  218. _elementalType = type;
  219. _elementalValue = value;
  220. _active = false;
  221. }
  222. public void applyBonus(L2PcInstance player, boolean isArmor)
  223. {
  224. // make sure the bonuses are not applied twice..
  225. if (_active)
  226. {
  227. return;
  228. }
  229. switch (_elementalType)
  230. {
  231. case FIRE:
  232. player.addStatFunc(new FuncAdd(isArmor ? Stats.FIRE_RES : Stats.FIRE_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  233. break;
  234. case WATER:
  235. player.addStatFunc(new FuncAdd(isArmor ? Stats.WATER_RES : Stats.WATER_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  236. break;
  237. case WIND:
  238. player.addStatFunc(new FuncAdd(isArmor ? Stats.WIND_RES : Stats.WIND_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  239. break;
  240. case EARTH:
  241. player.addStatFunc(new FuncAdd(isArmor ? Stats.EARTH_RES : Stats.EARTH_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  242. break;
  243. case DARK:
  244. player.addStatFunc(new FuncAdd(isArmor ? Stats.DARK_RES : Stats.DARK_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  245. break;
  246. case HOLY:
  247. player.addStatFunc(new FuncAdd(isArmor ? Stats.HOLY_RES : Stats.HOLY_POWER, 0x40, this, new LambdaConst(_elementalValue)));
  248. break;
  249. }
  250. _active = true;
  251. }
  252. public void removeBonus(L2PcInstance player)
  253. {
  254. // make sure the bonuses are not removed twice
  255. if (!_active)
  256. {
  257. return;
  258. }
  259. player.removeStatsOwner(this);
  260. _active = false;
  261. }
  262. public void setValue(int val)
  263. {
  264. _elementalValue = val;
  265. }
  266. public void setElement(byte type)
  267. {
  268. _elementalType = type;
  269. }
  270. }
  271. // non static:
  272. private ElementalStatBoni _boni = null;
  273. private byte _element = NONE;
  274. private int _value = 0;
  275. public byte getElement()
  276. {
  277. return _element;
  278. }
  279. public void setElement(byte type)
  280. {
  281. _element = type;
  282. _boni.setElement(type);
  283. }
  284. public int getValue()
  285. {
  286. return _value;
  287. }
  288. public void setValue(int val)
  289. {
  290. _value = val;
  291. _boni.setValue(val);
  292. }
  293. @Override
  294. public String toString()
  295. {
  296. return getElementName(_element) + " +" + _value;
  297. }
  298. public Elementals(byte type, int value)
  299. {
  300. _element = type;
  301. _value = value;
  302. _boni = new ElementalStatBoni(_element, _value);
  303. }
  304. public void applyBonus(L2PcInstance player, boolean isArmor)
  305. {
  306. _boni.applyBonus(player, isArmor);
  307. }
  308. public void removeBonus(L2PcInstance player)
  309. {
  310. _boni.removeBonus(player);
  311. }
  312. public void updateBonus(L2PcInstance player, boolean isArmor)
  313. {
  314. _boni.removeBonus(player);
  315. _boni.applyBonus(player, isArmor);
  316. }
  317. }