public static final int[] PRICE_PER_ENCHANT = {
0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000
};
public static final int ENCHANT_ITEM_ID = 57; // Adena
public static final int MAX_ENCHANT = 100;
@Override
public void onBypassFeedback(Player player, String command) {
if (command.equals("itemsEnchant")) {
showEnchantableItems(player);
return;
}
if (command.startsWith("enchantItem")) {
int itemObjectId = parseItemObjectId(command);
if (itemObjectId == -1) {
player.sendMessage("Invalid command.");
return;
}
enchantItem(player, itemObjectId);
}
}
private void showEnchantableItems(Player player) {
NpcHtmlMessage html = new NpcHtmlMessage(getObjectId());
html.setFile("data/html/enchant/" + getNpcId() + "-100.htm");
html.replace("%maxenchant%", MAX_ENCHANT);
html.replace("%maxenchantcost%", PRICE_PER_ENCHANT[10]);
html.replace("%currentAdenaItems%", getAdenaCount(player));
html.replace("%items%", buildEnchantableItemsTable(player));
html.replace("%objectId%", getObjectId());
player.sendPacket(html);
}
private int parseItemObjectId(String command) {
try {
return Integer.parseInt(command.substring(12));
} catch (Exception e) {
return -1;
}
}
private String buildEnchantableItemsTable(Player player) {
StringBuilder sb = new StringBuilder();
for (ItemInstance item : player.getInventory().getItems()) {
if (!isEnchantCandidate(item)) {
continue;
}
int price = calculateEnchantPrice(item);
sb.append(formatItemRow(item, price));
}
return sb.toString();
}
private boolean isEnchantCandidate(ItemInstance item) {
if (!item.isEquipped() || item.isShadowItem())
return false;
if (!item.isWeapon() && !item.isArmor())
return false;
int maxAllowed = item.isWeapon() ? maxEnchantWeapon : maxEnchantArmor;
if (item.getEnchantLevel() >= maxAllowed)
return false;
if (item.getItem().getCrystalType().getId() == 0)
return false;
int nextLevel = item.getEnchantLevel() + 1;
if (nextLevel <= 0 || nextLevel >= MAX_ENCHANT)
return false;
return true;
}
private int calculateEnchantPrice(ItemInstance item) {
int nextLevel = item.getEnchantLevel() + 1;
int base = PRICE_PER_ENCHANT[Math.min(nextLevel, PRICE_PER_ENCHANT.length - 1)] * nextLevel;
int crystalId = item.getItem().getCrystalType().getId();
int categoryMultiplier = item.isWeapon() ? 2 : 1;
return base * crystalId * categoryMultiplier;
}
private String formatItemRow(ItemInstance item, int price) {
String icon = IconTable.getIcon(item.getItemId());
StringBuilder row = new StringBuilder();
row.append("<table><tr>")
.append("<td><img src=").append(icon).append(" width=32 height=32></td>")
.append("<td><a action=\"bypass -h npc_%objectId%_enchantItem ").append(item.getObjectId())
.append("\" msg=\"1983;\">+").append(item.getEnchantLevel()).append(" ")
.append(item.getName())
.append("<br1><font color=B09B79>Price:</font> ").append(price).append(" Adena</a></td>")
.append("</tr></table>");
return row.toString();
}
private String getAdenaCount(Player player) {
ItemInstance adena = player.getInventory().getItemByItemId(ENCHANT_ITEM_ID);
return String.valueOf(adena != null ? adena.getCount() : 0);
}
private void enchantItem(Player player, int itemObjectId) {
ItemInstance item = player.getInventory().getItemByObjectId(itemObjectId);
if (item == null) {
player.sendMessage("Item not found.");
return;
}
if (!isEnchantCandidate(item)) {
player.sendMessage("This item cannot be enchanted further.");
return;
}
int price = calculateEnchantPrice(item);
ItemInstance adena = player.getInventory().getItemByItemId(ENCHANT_ITEM_ID);
if (adena == null || adena.getCount() < price) {
player.sendMessage("Incorrect item count.");
return;
}
player.destroyItemByItemId("item", ENCHANT_ITEM_ID, price, this, true);
item.setEnchantLevel(item.getEnchantLevel() + 1);
item.updateDatabase();
player.sendPacket(new ItemList(player, false));
player.broadcastUserInfo();
player.sendMessage("You have successfully enchanted your " + item.getName() + " to +" + item.getEnchantLevel() + "!");
showEnchantableItems(player);
}