Elementals.java 8.5 KB

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