PageRenderTime 46ms CodeModel.GetById 13ms RepoModel.GetById 1ms app.codeStats 0ms

/GameServer/src/gameserver/services/EnchantService.java

http://aionxemu.googlecode.com/
Java | 912 lines | 722 code | 121 blank | 69 comment | 177 complexity | 073facec0915b471b3b92b1afdce150a MD5 | raw file
Possible License(s): GPL-2.0, Apache-2.0, BSD-2-Clause
  1. /**
  2. * This file is part of Aion X Emu <aionxemu.com>
  3. *
  4. * This is free software: you can redistribute it and/or modify
  5. * it under the terms of the GNU Lesser Public License as published by
  6. * the Free Software Foundation, either version 3 of the License, or
  7. * (at your option) any later version.
  8. *
  9. * This software is distributed in the hope that it will be useful,
  10. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. * GNU Lesser Public License for more details.
  13. *
  14. * You should have received a copy of the GNU Lesser Public License
  15. * along with this software. If not, see <http://www.gnu.org/licenses/>.
  16. */
  17. package gameserver.services;
  18. import com.aionemu.commons.utils.Rnd;
  19. import gameserver.configs.main.EnchantsConfig;
  20. import gameserver.model.DescriptionId;
  21. import gameserver.model.gameobjects.Item;
  22. import gameserver.model.gameobjects.PersistentState;
  23. import gameserver.model.gameobjects.player.Player;
  24. import gameserver.model.gameobjects.player.Storage;
  25. import gameserver.model.gameobjects.stats.StatEnum;
  26. import gameserver.model.gameobjects.stats.id.EnchantStatEffectId;
  27. import gameserver.model.gameobjects.stats.listeners.ItemEquipmentListener;
  28. import gameserver.model.gameobjects.stats.modifiers.AddModifier;
  29. import gameserver.model.gameobjects.stats.modifiers.RateModifier;
  30. import gameserver.model.gameobjects.stats.modifiers.StatModifier;
  31. import gameserver.model.items.FusionStone;
  32. import gameserver.model.items.ManaStone;
  33. import gameserver.model.templates.item.ArmorType;
  34. import gameserver.model.templates.item.ItemQuality;
  35. import gameserver.model.templates.item.ItemTemplate;
  36. import gameserver.model.templates.item.WeaponType;
  37. import gameserver.network.aion.serverpackets.SM_DELETE_ITEM;
  38. import gameserver.network.aion.serverpackets.SM_STATS_INFO;
  39. import gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE;
  40. import gameserver.network.aion.serverpackets.SM_UPDATE_ITEM;
  41. import gameserver.utils.PacketSendUtility;
  42. import org.apache.log4j.Logger;
  43. import java.util.Set;
  44. import java.util.TreeSet;
  45. /**
  46. * @author ATracer, ZeroSignal
  47. */
  48. public class EnchantService {
  49. private static final Logger log = Logger.getLogger(EnchantService.class);
  50. /**
  51. * @param player
  52. * @param targetItem
  53. * @param parentItem
  54. */
  55. public static boolean breakItem(Player player, Item targetItem, Item parentItem) {
  56. Storage inventory = player.getInventory();
  57. if (!inventory.isItemByObjId(targetItem.getObjectId()))
  58. return false;
  59. if (!inventory.isItemByObjId(parentItem.getObjectId()))
  60. return false;
  61. ItemTemplate itemTemplate = targetItem.getItemTemplate();
  62. ItemQuality quality = itemTemplate.getItemQuality();
  63. int number = 0;
  64. int level = 0;
  65. switch (quality) {
  66. case COMMON:
  67. case JUNK:
  68. number = Rnd.get(1, 2);
  69. level = Rnd.get(-4, 5);
  70. break;
  71. case RARE:
  72. number = Rnd.get(1, 4);
  73. level = Rnd.get(-4, 10);
  74. break;
  75. case LEGEND:
  76. case MYTHIC:
  77. number = Rnd.get(1, 6);
  78. level = Rnd.get(-4, 20);
  79. break;
  80. case EPIC:
  81. number = Rnd.get(1, 8);
  82. level = Rnd.get(-4, 40);
  83. break;
  84. case UNIQUE:
  85. number = Rnd.get(1, 8);
  86. level = Rnd.get(-4, 40);
  87. break;
  88. }
  89. int enchantItemLevel = targetItem.getItemTemplate().getLevel() + level;
  90. int enchantItemId = 166000000 + enchantItemLevel;
  91. inventory.removeFromBag(targetItem, true);
  92. PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(targetItem.getObjectId()));
  93. inventory.removeFromBagByObjectId(parentItem.getObjectId(), 1);
  94. ItemService.addItem(player, enchantItemId, number);
  95. return true;
  96. }
  97. /**
  98. * @param player
  99. * @param parentItem
  100. * @param targetItem
  101. */
  102. public static boolean enchantItem(Player player, Item parentItem, Item targetItem, Item supplementItem) {
  103. // Check that parentItem is still in Inventory.
  104. if (!player.getInventory().isItemByObjId(parentItem.getObjectId()))
  105. return false;
  106. if (!player.getInventory().isItemByObjId(targetItem.getObjectId()) &&
  107. !player.getEquipment().isItemByObjId(targetItem.getObjectId()))
  108. {
  109. return false;
  110. }
  111. int enchantStoneLevel = parentItem.getItemTemplate().getLevel();
  112. int targetItemLevel = targetItem.getItemTemplate().getLevel();
  113. if (targetItem.getItemTemplate().isNoEnchant() || targetItemLevel > enchantStoneLevel)
  114. return false;
  115. int qualityCap = 0;
  116. ItemQuality quality = targetItem.getItemTemplate().getItemQuality();
  117. switch (quality) {
  118. case COMMON:
  119. case JUNK:
  120. qualityCap = 0;
  121. break;
  122. case RARE:
  123. qualityCap = 10;
  124. break;
  125. case LEGEND:
  126. case MYTHIC:
  127. qualityCap = 20;
  128. break;
  129. case EPIC:
  130. case UNIQUE:
  131. qualityCap = 25;
  132. break;
  133. }
  134. int success = 50;
  135. int levelDiff = enchantStoneLevel - targetItemLevel;
  136. int extraSuccess = levelDiff - qualityCap;
  137. if (extraSuccess > 0) {
  138. success += extraSuccess * 5;
  139. }
  140. if (supplementItem != null) {
  141. if (!player.getInventory().isItemByObjId(supplementItem.getObjectId()))
  142. return false;
  143. int supplementUseCount = 1;
  144. int addsuccessRate = 10;
  145. int supplementId = supplementItem.getItemTemplate().getTemplateId();
  146. int enchantstoneLevel = parentItem.getItemTemplate().getLevel();
  147. int enchantitemLevel = targetItem.getEnchantLevel() + 1;
  148. //lesser supplements
  149. if (supplementId == 166100000 || supplementId == 166100003 || supplementId == 166100006)
  150. addsuccessRate = EnchantsConfig.LSSUP;
  151. //supplements
  152. if (supplementId == 166100001 || supplementId == 166100004 || supplementId == 166100007)
  153. addsuccessRate = EnchantsConfig.RGSUP;
  154. //greater supplements
  155. if (supplementId == 166100002 || supplementId == 166100005 || supplementId == 166100008)
  156. addsuccessRate = EnchantsConfig.GRSUP;
  157. if (enchantstoneLevel > 30 && enchantstoneLevel < 41)
  158. supplementUseCount = 5;
  159. if (enchantstoneLevel > 40 && enchantstoneLevel < 51)
  160. supplementUseCount = 10;
  161. if (enchantstoneLevel > 50 && enchantstoneLevel < 61)
  162. supplementUseCount = 25;
  163. if (enchantstoneLevel > 60 && enchantstoneLevel < 71)
  164. supplementUseCount = 55;
  165. if (enchantstoneLevel > 70 && enchantstoneLevel < 81)
  166. supplementUseCount = 85;
  167. if (enchantstoneLevel > 80 && enchantstoneLevel < 91)
  168. supplementUseCount = 115;
  169. if (enchantstoneLevel > 90)
  170. supplementUseCount = 145;
  171. if (enchantitemLevel > 10)
  172. supplementUseCount = supplementUseCount * 2;
  173. player.getInventory().removeFromBagByItemId(supplementItem.getItemId(), supplementUseCount);
  174. //Add successRate
  175. success = success + addsuccessRate;
  176. }
  177. if (success >= 95)
  178. success = 95;
  179. boolean result = false;
  180. if (Rnd.get(0, 100) < success)
  181. result = true;
  182. int currentEnchant = targetItem.getEnchantLevel();
  183. if (!result) {
  184. // Retail: http://powerwiki.na.aiononline.com/aion/Patch+Notes:+1.9.0.1
  185. // When socketing fails at +11~+15, the value falls back to +10.
  186. if (currentEnchant > 10)
  187. currentEnchant = 10;
  188. else if (currentEnchant > 0)
  189. currentEnchant -= 1;
  190. } else {
  191. // Items that are Fabled or Eternal can get up to +15.
  192. ItemQuality targetQuality = targetItem.getItemTemplate().getItemQuality();
  193. if (targetQuality == ItemQuality.UNIQUE || targetQuality == ItemQuality.EPIC) {
  194. if (currentEnchant < 15)
  195. currentEnchant += 1;
  196. } else {
  197. if (currentEnchant < 10)
  198. currentEnchant += 1;
  199. }
  200. }
  201. if (targetItem.isEquipped())
  202. onItemUnequip(player, targetItem);
  203. targetItem.setEnchantLevel(currentEnchant);
  204. if (targetItem.isEquipped() && !targetItem.isWeaponSwapped(player))
  205. onItemEquip(player, targetItem);
  206. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(targetItem));
  207. if (targetItem.isEquipped())
  208. player.getEquipment().setPersistentState(PersistentState.UPDATE_REQUIRED);
  209. else
  210. player.getInventory().setPersistentState(PersistentState.UPDATE_REQUIRED);
  211. if (result) {
  212. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ENCHANT_ITEM_SUCCEED(new DescriptionId(Integer
  213. .parseInt(targetItem.getName()))));
  214. } else {
  215. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ENCHANT_ITEM_FAILED(new DescriptionId(Integer
  216. .parseInt(targetItem.getName()))));
  217. }
  218. player.getInventory().removeFromBagByObjectId(parentItem.getObjectId(), 1);
  219. return result;
  220. }
  221. /**
  222. * @param player
  223. * @param parentItem
  224. * @param targetItem
  225. */
  226. public static boolean socketManastone(Player player, Item parentItem, Item targetItem, Item supplementItem, int targetWeapon) {
  227. // Check that parentItem is still in Inventory.
  228. if (!player.getInventory().isItemByObjId(parentItem.getObjectId()))
  229. return false;
  230. if (!player.getInventory().isItemByObjId(targetItem.getObjectId()) &&
  231. !player.getEquipment().isItemByObjId(targetItem.getObjectId()))
  232. {
  233. return false;
  234. }
  235. boolean result = false;
  236. int successRate = 76;
  237. int stoneCount;
  238. int checkCount;
  239. if (targetWeapon == 1) {
  240. stoneCount = targetItem.getItemStones().size();
  241. checkCount = targetItem.getMaxStoneSlots();
  242. } else {
  243. stoneCount = targetItem.getFusionStones().size();
  244. Item fusionedItem = ItemService.newItem(targetItem.getFusionedItem(), 1);
  245. checkCount = fusionedItem.getMaxStoneSlots();
  246. }
  247. if (stoneCount >= checkCount){
  248. log.info("[AUDIT] Possible use Manastone bug player : " + player.getName());
  249. return false;
  250. }
  251. switch (stoneCount) {
  252. case 1:
  253. successRate = EnchantsConfig.MSPERCENT;
  254. break;
  255. case 2:
  256. successRate = EnchantsConfig.MSPERCENT1;
  257. break;
  258. case 3:
  259. successRate = EnchantsConfig.MSPERCENT2;
  260. break;
  261. case 4:
  262. successRate = EnchantsConfig.MSPERCENT3;
  263. break;
  264. case 5:
  265. successRate = EnchantsConfig.MSPERCENT4;
  266. break;
  267. }
  268. if (targetWeapon == 1) {
  269. if (stoneCount >= targetItem.getSockets(false))
  270. successRate = EnchantsConfig.MSPERCENT5;
  271. } else {
  272. if (stoneCount >= targetItem.getSockets(true))
  273. successRate = EnchantsConfig.MSPERCENT5;
  274. }
  275. if (supplementItem != null) {
  276. if (!player.getInventory().isItemByObjId(supplementItem.getObjectId()))
  277. return false;
  278. int supplementUseCount = 1;
  279. int addsuccessRate = 10;
  280. int supplementId = supplementItem.getItemTemplate().getTemplateId();
  281. int manastoneId = parentItem.getItemTemplate().getTemplateId();
  282. int manastoneLevel = parentItem.getItemTemplate().getLevel();
  283. int manastoneCount;
  284. if (targetWeapon == 1) {
  285. manastoneCount = targetItem.getItemStones().size() + 1;
  286. } else {
  287. manastoneCount = targetItem.getFusionStones().size() + 1;
  288. }
  289. //lesser supplements
  290. if (supplementId == 166100000 || supplementId == 166100003 || supplementId == 166100006)
  291. addsuccessRate = EnchantsConfig.LSSUP;
  292. //supplements
  293. if (supplementId == 166100001 || supplementId == 166100004 || supplementId == 166100007)
  294. addsuccessRate = EnchantsConfig.RGSUP;
  295. //greater supplements
  296. if (supplementId == 166100002 || supplementId == 166100005 || supplementId == 166100008)
  297. addsuccessRate = EnchantsConfig.GRSUP;
  298. //basic formula by manastone level
  299. if (manastoneLevel > 30)
  300. supplementUseCount = supplementUseCount + 1;
  301. if (manastoneLevel > 40)
  302. supplementUseCount = supplementUseCount + 1;
  303. if (manastoneLevel > 50)
  304. supplementUseCount = supplementUseCount + 1;
  305. //manastone attacks and crit strike use more supplements
  306. if (manastoneId == 167000230 || manastoneId == 167000235)
  307. supplementUseCount = 5;
  308. if (manastoneId == 167000294 || manastoneId == 167000267 || manastoneId == 167000299)
  309. supplementUseCount = 5;
  310. if (manastoneId == 167000331)
  311. supplementUseCount = 10;
  312. if (manastoneId == 167000358 || manastoneId == 167000363)
  313. supplementUseCount = 15;
  314. if (manastoneId == 167000550)
  315. supplementUseCount = 20;
  316. if (manastoneId == 167000454 || manastoneId == 167000427 || manastoneId == 167000459)
  317. supplementUseCount = 25;
  318. if (manastoneId == 167000491)
  319. supplementUseCount = 50;
  320. if (manastoneId == 167000518 || manastoneId == 167000522)
  321. supplementUseCount = 75;
  322. //supplementUseCount * manastoneCount
  323. if (stoneCount > 0)
  324. supplementUseCount = supplementUseCount * manastoneCount;
  325. player.getInventory().removeFromBagByItemId(supplementItem.getItemId(), supplementUseCount);
  326. //Add successRate
  327. successRate = successRate + addsuccessRate;
  328. }
  329. if (Rnd.get(0, 100) < successRate)
  330. result = true;
  331. if (player.getInventory().removeFromBagByObjectId(parentItem.getObjectId(), 1) && result) {
  332. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_OPTION_SUCCEED(new DescriptionId(
  333. Integer.parseInt(targetItem.getName()))));
  334. if (targetWeapon == 1) {
  335. ManaStone manaStone = ItemService.addManaStone(targetItem, parentItem.getItemTemplate().getTemplateId());
  336. if (targetItem.isEquipped()) {
  337. ItemEquipmentListener.addStoneStats(manaStone, player.getGameStats());
  338. PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player));
  339. }
  340. } else {
  341. FusionStone manaStone = ItemService.addFusionStone(targetItem, parentItem.getItemTemplate().getTemplateId());
  342. if (targetItem.isEquipped()) {
  343. ItemEquipmentListener.addFusionStats(manaStone, player.getGameStats());
  344. PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player));
  345. }
  346. }
  347. } else {
  348. PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_OPTION_FAILED(new DescriptionId(
  349. Integer.parseInt(targetItem.getName()))));
  350. if (targetWeapon == 1) {
  351. Set<ManaStone> manaStones = targetItem.getItemStones();
  352. if (targetItem.isEquipped()) {
  353. ItemEquipmentListener.removeStoneStats(manaStones, player.getGameStats());
  354. PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player));
  355. }
  356. ItemService.removeAllManastone(player, targetItem);
  357. } else {
  358. Set<FusionStone> manaStones = targetItem.getFusionStones();
  359. if (targetItem.isEquipped()) {
  360. ItemEquipmentListener.removeFusionStats(manaStones, player.getGameStats());
  361. PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player));
  362. }
  363. ItemService.removeAllFusionStone(player, targetItem);
  364. }
  365. }
  366. PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(targetItem));
  367. if (targetItem.isEquipped())
  368. player.getEquipment().setPersistentState(PersistentState.UPDATE_REQUIRED);
  369. else
  370. player.getInventory().setPersistentState(PersistentState.UPDATE_REQUIRED);
  371. return result;
  372. }
  373. /**
  374. * @param player
  375. * @param item
  376. */
  377. public static void onItemEquip(Player player, Item item) {
  378. try {
  379. int enchantLevel = item.getEnchantLevel();
  380. if (enchantLevel == 0)
  381. return;
  382. boolean isWeapon = item.getItemTemplate().isWeapon();
  383. boolean isArmor = item.getItemTemplate().isArmor();
  384. if (isWeapon) {
  385. TreeSet<StatModifier> modifiers = getWeaponModifiers(player, item);
  386. if (modifiers == null)
  387. return;
  388. EnchantStatEffectId statId = EnchantStatEffectId.getInstance(item.getObjectId(), item
  389. .getEquipmentSlot());
  390. player.getGameStats().addModifiers(statId, modifiers);
  391. return;
  392. }
  393. if (isArmor) {
  394. TreeSet<StatModifier> modifiers = getArmorModifiers(player, item);
  395. if (modifiers == null)
  396. return;
  397. EnchantStatEffectId statId = EnchantStatEffectId.getInstance(item.getObjectId(), item
  398. .getEquipmentSlot());
  399. player.getGameStats().addModifiers(statId, modifiers);
  400. }
  401. }
  402. catch (Exception ex) {
  403. log.error(ex.getCause() != null ? ex.getCause().getMessage() : "Error on item equip.");
  404. }
  405. }
  406. /**
  407. * @param player
  408. * @param item
  409. */
  410. public static void onItemUnequip(Player player, Item item) {
  411. try {
  412. int enchantLevel = item.getEnchantLevel();
  413. if (enchantLevel == 0)
  414. return;
  415. EnchantStatEffectId statId = EnchantStatEffectId.getInstance(item.getObjectId(), item.getEquipmentSlot());
  416. if (player.getGameStats().effectAlreadyAdded(statId))
  417. player.getGameStats().endEffect(statId);
  418. }
  419. catch (Exception ex) {
  420. log.error(ex.getCause() != null ? ex.getCause().getMessage() : null);
  421. }
  422. }
  423. /**
  424. * @param item
  425. * @return
  426. */
  427. private static TreeSet<StatModifier> getArmorModifiers(Player player, Item item) {
  428. TreeSet<StatModifier> modifiers = null;
  429. ArmorType armorType = item.getItemTemplate().getArmorType();
  430. if (armorType == null)
  431. return null;
  432. switch (armorType) {
  433. case ROBE:
  434. switch (item.getEquipmentSlot()) {
  435. case 1 << 3: // torso
  436. modifiers = EnchantWeapon.DEF3.getModifiers(player, item);
  437. break;
  438. case 1 << 5: // boots
  439. modifiers = EnchantWeapon.DEF1.getModifiers(player, item);
  440. break;
  441. case 1 << 11: // pauldrons
  442. modifiers = EnchantWeapon.DEF1.getModifiers(player, item);
  443. break;
  444. case 1 << 12: // pants
  445. modifiers = EnchantWeapon.DEF2.getModifiers(player, item);
  446. break;
  447. case 1 << 4: // gloves
  448. modifiers = EnchantWeapon.DEF1.getModifiers(player, item);
  449. break;
  450. }
  451. break;
  452. case LEATHER:
  453. switch (item.getEquipmentSlot()) {
  454. case 1 << 3: // torso
  455. modifiers = EnchantWeapon.DEF6.getModifiers(player, item);
  456. break;
  457. case 1 << 5: // boots
  458. modifiers = EnchantWeapon.DEF4.getModifiers(player, item);
  459. break;
  460. case 1 << 11: // pauldrons
  461. modifiers = EnchantWeapon.DEF4.getModifiers(player, item);
  462. break;
  463. case 1 << 12: // pants
  464. modifiers = EnchantWeapon.DEF5.getModifiers(player, item);
  465. break;
  466. case 1 << 4: // gloves
  467. modifiers = EnchantWeapon.DEF4.getModifiers(player, item);
  468. break;
  469. }
  470. break;
  471. case CHAIN:
  472. switch (item.getEquipmentSlot()) {
  473. case 1 << 3: // torso
  474. modifiers = EnchantWeapon.DEF9.getModifiers(player, item);
  475. break;
  476. case 1 << 5: // boots
  477. modifiers = EnchantWeapon.DEF7.getModifiers(player, item);
  478. break;
  479. case 1 << 11: // pauldrons
  480. modifiers = EnchantWeapon.DEF7.getModifiers(player, item);
  481. break;
  482. case 1 << 12: // pants
  483. modifiers = EnchantWeapon.DEF8.getModifiers(player, item);
  484. break;
  485. case 1 << 4: // gloves
  486. modifiers = EnchantWeapon.DEF7.getModifiers(player, item);
  487. break;
  488. }
  489. break;
  490. case PLATE:
  491. switch (item.getEquipmentSlot()) {
  492. case 1 << 3: // torso
  493. modifiers = EnchantWeapon.DEF12.getModifiers(player, item);
  494. break;
  495. case 1 << 5: // boots
  496. modifiers = EnchantWeapon.DEF10.getModifiers(player, item);
  497. break;
  498. case 1 << 11: // pauldrons
  499. modifiers = EnchantWeapon.DEF10.getModifiers(player, item);
  500. break;
  501. case 1 << 12: // pants
  502. modifiers = EnchantWeapon.DEF11.getModifiers(player, item);
  503. break;
  504. case 1 << 4: // gloves
  505. modifiers = EnchantWeapon.DEF10.getModifiers(player, item);
  506. break;
  507. }
  508. break;
  509. case SHIELD:
  510. modifiers = EnchantWeapon.SHIELD.getModifiers(player, item);
  511. break;
  512. }
  513. return modifiers;
  514. }
  515. /**
  516. * @param item
  517. * @return
  518. */
  519. private static TreeSet<StatModifier> getWeaponModifiers(Player player, Item item) {
  520. WeaponType weaponType = item.getItemTemplate().getWeaponType();
  521. if (weaponType == null)
  522. return null;
  523. TreeSet<StatModifier> modifiers = null;
  524. switch (weaponType) {
  525. case DAGGER_1H:
  526. modifiers = EnchantWeapon.DAGGER.getModifiers(player, item);
  527. break;
  528. case SWORD_1H:
  529. modifiers = EnchantWeapon.SWORD.getModifiers(player, item);
  530. break;
  531. case MACE_1H:
  532. modifiers = EnchantWeapon.MACE.getModifiers(player, item);
  533. break;
  534. case BOOK_2H:
  535. modifiers = EnchantWeapon.SPELLBOOK.getModifiers(player, item);
  536. break;
  537. case BOW:
  538. modifiers = EnchantWeapon.BOW.getModifiers(player, item);
  539. break;
  540. case ORB_2H:
  541. modifiers = EnchantWeapon.ORB.getModifiers(player, item);
  542. break;
  543. case STAFF_2H:
  544. modifiers = EnchantWeapon.STAFF.getModifiers(player, item);
  545. break;
  546. case SWORD_2H:
  547. modifiers = EnchantWeapon.GREATSWORD.getModifiers(player, item);
  548. break;
  549. case POLEARM_2H:
  550. modifiers = EnchantWeapon.POLEARM.getModifiers(player, item);
  551. break;
  552. }
  553. return modifiers;
  554. }
  555. /**
  556. * @author ATracer
  557. */
  558. private enum EnchantWeapon {
  559. DAGGER() {
  560. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  561. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  562. StatEnum stat = (player.getEquipment().getMainHandWeapon() == item) ?
  563. StatEnum.MAIN_HAND_POWER : StatEnum.OFF_HAND_POWER;
  564. mod.add(AddModifier.newInstance(stat, 2 * item.getEnchantLevel(), true));
  565. return mod;
  566. }
  567. },
  568. SWORD() {
  569. @Override
  570. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  571. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  572. StatEnum stat = (player.getEquipment().getMainHandWeapon() == item) ?
  573. StatEnum.MAIN_HAND_POWER : StatEnum.OFF_HAND_POWER;
  574. mod.add(AddModifier.newInstance(stat, 2 * item.getEnchantLevel(), true));
  575. return mod;
  576. }
  577. },
  578. MACE() {
  579. @Override
  580. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  581. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  582. StatEnum stat = (player.getEquipment().getMainHandWeapon() == item) ?
  583. StatEnum.MAIN_HAND_POWER : StatEnum.OFF_HAND_POWER;
  584. mod.add(AddModifier.newInstance(stat, 3 * item.getEnchantLevel(), true));
  585. mod.add(AddModifier.newInstance(StatEnum.BOOST_MAGICAL_SKILL, 20 * item.getEnchantLevel(), true));
  586. return mod;
  587. }
  588. },
  589. GREATSWORD() {
  590. @Override
  591. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  592. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  593. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 4 * item.getEnchantLevel(), true));
  594. return mod;
  595. }
  596. },
  597. POLEARM() {
  598. @Override
  599. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  600. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  601. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 4 * item.getEnchantLevel(), true));
  602. return mod;
  603. }
  604. },
  605. BOW() {
  606. @Override
  607. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  608. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  609. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 4 * item.getEnchantLevel(), true));
  610. return mod;
  611. }
  612. },
  613. STAFF() {
  614. @Override
  615. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  616. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  617. int level = item.getEnchantLevel();
  618. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 3 * level, true));
  619. mod.add(AddModifier.newInstance(StatEnum.BOOST_MAGICAL_SKILL, 20 * level, true));
  620. return mod;
  621. }
  622. },
  623. SPELLBOOK() {
  624. @Override
  625. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  626. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  627. int level = item.getEnchantLevel();
  628. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 3 * level, true));
  629. mod.add(AddModifier.newInstance(StatEnum.BOOST_MAGICAL_SKILL, 20 * level, true));
  630. return mod;
  631. }
  632. },
  633. ORB() {
  634. @Override
  635. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  636. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  637. int level = item.getEnchantLevel();
  638. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_ATTACK, 3 * level, true));
  639. mod.add(AddModifier.newInstance(StatEnum.BOOST_MAGICAL_SKILL, 20 * level, true));
  640. return mod;
  641. }
  642. },
  643. SHIELD() {
  644. @Override
  645. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  646. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  647. int level = item.getEnchantLevel();
  648. if(level <= 10)
  649. mod.add(AddModifier.newInstance(StatEnum.DAMAGE_REDUCE, 2 * level, true));
  650. else {
  651. mod.add(AddModifier.newInstance(StatEnum.BLOCK, 5 * level, true));
  652. mod.add(AddModifier.newInstance(StatEnum.DAMAGE_REDUCE, 20, true));
  653. }
  654. return mod;
  655. }
  656. },
  657. DEF1() {
  658. @Override
  659. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  660. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  661. int level = item.getEnchantLevel();
  662. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 1 * level, true));
  663. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 10 * level, true));
  664. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 2 * level, true));
  665. return mod;
  666. }
  667. },
  668. DEF2() {
  669. @Override
  670. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  671. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  672. int level = item.getEnchantLevel();
  673. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 2 * level, true));
  674. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 12 * level, true));
  675. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 3 * level, true));
  676. return mod;
  677. }
  678. },
  679. DEF3() {
  680. @Override
  681. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  682. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  683. int level = item.getEnchantLevel();
  684. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 3 * level, true));
  685. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 14 * level, true));
  686. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 4 * level, true));
  687. return mod;
  688. }
  689. },
  690. DEF4() {
  691. @Override
  692. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  693. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  694. int level = item.getEnchantLevel();
  695. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 3 * level, true));
  696. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 8 * level, true));
  697. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 2 * level, true));
  698. return mod;
  699. }
  700. },
  701. DEF5() {
  702. @Override
  703. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  704. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  705. int level = item.getEnchantLevel();
  706. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 5 * level, true));
  707. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 10 * level, true));
  708. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 3 * level, true));
  709. return mod;
  710. }
  711. },
  712. DEF6() {
  713. @Override
  714. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  715. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  716. int level = item.getEnchantLevel();
  717. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 4 * level, true));
  718. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 12 * level, true));
  719. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 4 * level, true));
  720. return mod;
  721. }
  722. },
  723. DEF7() {
  724. @Override
  725. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  726. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  727. int level = item.getEnchantLevel();
  728. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 3 * level, true));
  729. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 6 * level, true));
  730. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 2 * level, true));
  731. return mod;
  732. }
  733. },
  734. DEF8() {
  735. @Override
  736. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  737. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  738. int level = item.getEnchantLevel();
  739. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 4 * level, true));
  740. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 8 * level, true));
  741. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 3 * level, true));
  742. return mod;
  743. }
  744. },
  745. DEF9() {
  746. @Override
  747. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  748. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  749. int level = item.getEnchantLevel();
  750. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 5 * level, true));
  751. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 10 * level, true));
  752. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 4 * level, true));
  753. return mod;
  754. }
  755. },
  756. DEF10() {
  757. @Override
  758. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  759. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  760. int level = item.getEnchantLevel();
  761. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 4 * level, true));
  762. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 4 * level, true));
  763. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 2 * level, true));
  764. return mod;
  765. }
  766. },
  767. DEF11() {
  768. @Override
  769. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  770. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  771. int level = item.getEnchantLevel();
  772. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 5 * level, true));
  773. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 6 * level, true));
  774. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 3 * level, true));
  775. return mod;
  776. }
  777. },
  778. DEF12() {
  779. @Override
  780. public TreeSet<StatModifier> getModifiers(Player player, Item item) {
  781. TreeSet<StatModifier> mod = new TreeSet<StatModifier>();
  782. int level = item.getEnchantLevel();
  783. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_DEFENSE, 6 * level, true));
  784. mod.add(AddModifier.newInstance(StatEnum.MAXHP, 8 * level, true));
  785. mod.add(AddModifier.newInstance(StatEnum.PHYSICAL_CRITICAL_RESIST, 4 * level, true));
  786. return mod;
  787. }
  788. };
  789. public abstract TreeSet<StatModifier> getModifiers(Player player, Item item);
  790. }
  791. }