/* * This file is part of aion-unique <aion-unique.org>. * * aion-unique is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * aion-unique is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with aion-unique. If not, see <http://www.gnu.org/licenses/>. */ package com.aionemu.gameserver.services; import javax.inject.Inject; import org.apache.log4j.Logger; import com.aionemu.commons.utils.Rnd; import com.aionemu.gameserver.model.DescriptionId; import com.aionemu.gameserver.model.gameobjects.Item; import com.aionemu.gameserver.model.gameobjects.PersistentState; import com.aionemu.gameserver.model.gameobjects.player.Player; import com.aionemu.gameserver.model.gameobjects.player.Storage; import com.aionemu.gameserver.model.gameobjects.stats.listeners.ItemEquipmentListener; import com.aionemu.gameserver.model.items.ManaStone; import com.aionemu.gameserver.model.templates.item.ItemQuality; import com.aionemu.gameserver.model.templates.item.ItemTemplate; import com.aionemu.gameserver.network.aion.serverpackets.SM_DELETE_ITEM; import com.aionemu.gameserver.network.aion.serverpackets.SM_STATS_INFO; import com.aionemu.gameserver.network.aion.serverpackets.SM_SYSTEM_MESSAGE; import com.aionemu.gameserver.network.aion.serverpackets.SM_UPDATE_ITEM; import com.aionemu.gameserver.utils.PacketSendUtility; /** * @author ATracer * */ public class EnchantService { @SuppressWarnings("unused") private static final Logger log = Logger.getLogger(EnchantService.class); @Inject private ItemService itemService; /** * @param player * @param targetItem * @param parentItem */ public void breakItem(Player player, Item targetItem, Item parentItem) { Storage inventory = player.getInventory(); ItemTemplate itemTemplate = targetItem.getItemTemplate(); ItemQuality quality = itemTemplate.getItemQuality(); int number = 0; int level = 0; switch(quality) { case COMMON: case JUNK: number = Rnd.get(1, 2); level = Rnd.get(0, 5); break; case RARE: number = Rnd.get(1, 3); level = Rnd.get(0, 10); break; case LEGEND: case MYTHIC: number = Rnd.get(1, 3); level = Rnd.get(0, 15); break; case EPIC: case UNIQUE: number = Rnd.get(1, 3); level = Rnd.get(0, 20); break; } int enchantItemLevel = targetItem.getItemTemplate().getLevel() + level; int enchantItemId = 166000000 + enchantItemLevel; inventory.removeFromBag(targetItem, true); PacketSendUtility.sendPacket(player, new SM_DELETE_ITEM(targetItem.getObjectId())); inventory.removeFromBagByObjectId(parentItem.getObjectId(), 1); itemService.addItem(player, enchantItemId, number); } /** * @param player * @param parentItem * @param targetItem */ public boolean enchantItem(Player player, Item parentItem, Item targetItem) { int enchantStoneLevel = parentItem.getItemTemplate().getLevel(); int targetItemLevel = targetItem.getItemTemplate().getLevel(); if(targetItemLevel > enchantStoneLevel) return false; int qualityCap = 0; ItemQuality quality = targetItem.getItemTemplate().getItemQuality(); switch(quality) { case COMMON: case JUNK: qualityCap = 0; break; case RARE: qualityCap = 5; break; case LEGEND: case MYTHIC: qualityCap = 10; break; case EPIC: case UNIQUE: qualityCap = 15; break; } int success = 50; int levelDiff = enchantStoneLevel - targetItemLevel; int extraSuccess = levelDiff - qualityCap; if(extraSuccess > 0) { success += extraSuccess * 5; } if(success >= 95) success = 95; boolean result = false; if(Rnd.get(0, 100) < success) result = true; int currentEnchant = targetItem.getEchantLevel(); if(!result) { if(currentEnchant > 0) currentEnchant -= 1; } else { if(currentEnchant < 10) currentEnchant += 1; } targetItem.setEchantLevel(currentEnchant); PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(targetItem)); if(targetItem.isEquipped()) player.getEquipment().setPersistentState(PersistentState.UPDATE_REQUIRED); else player.getInventory().setPersistentState(PersistentState.UPDATE_REQUIRED); if (result) { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ENCHANT_ITEM_SUCCEED(new DescriptionId(Integer.parseInt(targetItem.getName())))); } else { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_ENCHANT_ITEM_FAILED(new DescriptionId(Integer.parseInt(targetItem.getName())))); } player.getInventory().removeFromBagByObjectId(parentItem.getObjectId(), 1); return result; } /** * @param player * @param parentItem * @param targetItem */ public void socketManastone(Player player, Item parentItem, Item targetItem) { PacketSendUtility.sendPacket(player, SM_SYSTEM_MESSAGE.STR_GIVE_ITEM_OPTION_SUCCEED(new DescriptionId( Integer.parseInt(targetItem.getName())))); ManaStone manaStone = itemService.addManaStone(targetItem, parentItem.getItemTemplate().getTemplateId()); if(manaStone == null) return; if(targetItem.isEquipped()) { ItemEquipmentListener.addStoneStats(manaStone, player.getGameStats()); PacketSendUtility.sendPacket(player, new SM_STATS_INFO(player)); } PacketSendUtility.sendPacket(player, new SM_UPDATE_ITEM(targetItem)); player.getInventory().removeFromBagByObjectId(parentItem.getObjectId(), 1); } }