Elementals.java 8.7 KB

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