Elementals.java 8.5 KB

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