package com.taiter.ce;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import org.bukkit.Bukkit;
import org.bukkit.ChatColor;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.Material;
import org.bukkit.block.Block;
import org.bukkit.entity.Entity;
import org.bukkit.entity.Player;
import org.bukkit.event.Event;
import org.bukkit.event.enchantment.EnchantItemEvent;
import org.bukkit.event.entity.EntityDamageByEntityEvent;
import org.bukkit.event.entity.EntityShootBowEvent;
import org.bukkit.event.entity.ProjectileLaunchEvent;
import org.bukkit.event.inventory.InventoryClickEvent;
import org.bukkit.event.player.PlayerMoveEvent;
import org.bukkit.inventory.Inventory;
import org.bukkit.inventory.ItemStack;
import org.bukkit.inventory.meta.ItemMeta;
import org.bukkit.metadata.FixedMetadataValue;
import org.bukkit.potion.PotionEffect;
import org.bukkit.potion.PotionEffectType;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.util.Vector;
import com.taiter.ce.CBasic.Trigger;
import com.taiter.ce.EffectManager.ParticleEffect;
import com.taiter.ce.CItems.CItem;
import com.taiter.ce.CItems.HookshotBow;
import com.taiter.ce.CItems.NecromancersStaff;
import com.taiter.ce.CItems.RocketBoots;
import com.taiter.ce.Enchantments.CEnchantment;
import com.taiter.ce.Enchantments.CEnchantment.Application;
import com.taiter.ce.Enchantments.EnchantManager;
import com.taiter.ce.Enchantments.Bow.Volley;
/*
* This file is part of Custom Enchantments
* Copyright (C) Taiterio 2015
*
* This program is free software: you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by the
* Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program 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 Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
public class CEventHandler {
private static boolean stackEnchantments = Main.config.getBoolean("Global.Runecrafting.CanStackEnchantments");
private static boolean disenchanting = Main.config.getBoolean("Global.Runecrafting.Disenchanting");
private static boolean transform = Main.config.getBoolean("Global.Runecrafting.TransformationEffect");
public static void handleArmor(Player toCheck, ItemStack toAdd, Boolean remove, Event event) {
if (toAdd != null && toAdd.getType() != Material.AIR && toAdd.hasItemMeta() && toAdd.getItemMeta().hasLore())
for (String s : toAdd.getItemMeta().getLore())
for (CBasic c : Main.listener.wearItem) {
if (c instanceof CEnchantment)
if (EnchantManager.containsEnchantment(s, (CEnchantment) c)) {
int level = EnchantManager.getLevel(s);
HashMap<PotionEffectType, Integer> potioneffects = c.getPotionEffectsOnWear();
if (potioneffects.size() < 1)
return;
if (remove) {
for (PotionEffectType pt : potioneffects.keySet())
if (toCheck.hasPotionEffect(pt))
toCheck.removePotionEffect(pt);
} else
for (PotionEffectType pt : potioneffects.keySet())
toCheck.addPotionEffect(new PotionEffect(pt, 600000, potioneffects.get(pt) + level - 2), true);
}
}
}
public static void handleEvent(Player toCheck, Event e, HashSet<CBasic> list) {
long time = System.currentTimeMillis();
for (ItemStack i : toCheck.getInventory().getArmorContents())
if (i != null && i.getType() != Material.AIR)
handleEventMain(toCheck, i, e, list);
handleEventMain(toCheck, toCheck.getItemInHand(), e, list);
if (Boolean.parseBoolean(Main.config.getString("Global.Logging.Enabled")) && Boolean.parseBoolean(Main.config.getString("Global.Logging.LogEvents"))) {
long timeF = (System.currentTimeMillis() - time);
if (timeF > Integer.parseInt(Main.config.getString("Global.Logging.MinimumMsForLog")))
Bukkit.getConsoleSender().sendMessage(ChatColor.GOLD + "[CE] Event " + e.getEventName() + " took " + timeF + "ms to process CE-Events.");
}
}
public static void handleEnchanting(EnchantItemEvent e) {
Player p = e.getEnchanter();
ItemStack i = e.getItem();
if (i == null)
return;
if (i.getType().equals(Material.BOOK)) {
List<CEnchantment> list = new ArrayList<CEnchantment>();
for (CEnchantment ce : EnchantManager.getEnchantments())
if (!Boolean.parseBoolean(Main.config.getString("Global.Enchantments.RequirePermissions")) || Tools.checkPermission(ce, p))
list.add(ce);
if (list.isEmpty())
return;
e.setCancelled(true);
CEnchantment ce = list.get(Tools.random.nextInt(list.size()));
int level = Tools.random.nextInt(ce.getEnchantmentMaxLevel()) + 1;
ItemStack book = EnchantManager.getEnchantBook(ce, level);
e.getInventory().clear(0);
e.getInventory().setItem(0, book);
if (!p.getGameMode().equals(GameMode.CREATIVE))
p.setLevel(p.getLevel() - 30);
return;
}
HashSet<CEnchantment> list = Tools.getEnchantList(Tools.getApplicationByMaterial(i.getType()), p);
if (i.getType().toString().endsWith("_AXE"))
list.addAll(Tools.getEnchantList(Application.GLOBAL));
if (list.isEmpty())
return;
ItemMeta im = i.getItemMeta();
List<String> lore = new ArrayList<String>();
if (im.hasLore()) {
lore = im.getLore();
if (EnchantManager.containsEnchantment(lore))
return;
}
int numberOfEnchantments = Tools.random.nextInt(3) + 1;
int maxTries = 10;
int appliedEnchantments = 0;
if (EnchantManager.getMaxEnchants() < numberOfEnchantments)
numberOfEnchantments = EnchantManager.getMaxEnchants();
if (list.size() < numberOfEnchantments)
numberOfEnchantments = list.size();
while (numberOfEnchantments > 0 && maxTries >= 0) {
for (CEnchantment ce : list) {
if (numberOfEnchantments < 0)
break;
else if (Tools.random.nextInt(100) < ce.getEnchantProbability()) {
if (!lore.isEmpty()) {
Boolean hasFound = false;
for (String s : lore)
if (s.startsWith(ce.getDisplayName()) || ChatColor.stripColor(s).startsWith(ce.getOriginalName()))
hasFound = true;
if (hasFound)
continue;
}
int level = ce.getEnchantmentMaxLevel() - 1;
if (level > 0)
level = Tools.random.nextInt(ce.getEnchantmentMaxLevel()) + 1;
else
level = 1;
lore.add(ce.getDisplayName() + " " + EnchantManager.intToLevel(level));
appliedEnchantments++;
numberOfEnchantments--;
}
}
maxTries--;
}
if (appliedEnchantments == 0)
return;
im.setLore(lore);
i.setItemMeta(im);
EffectManager.playSound(p.getLocation(), "ENTITY_FIREWORK_BLAST", 1f, 1f);
}
public static void handleMines(Player toCheck, PlayerMoveEvent e) {
Block b = toCheck.getLocation().getBlock();
if (b.hasMetadata("ce.mine") || b.hasMetadata("ce.mine.secondary")) {
String locString = b.getX() + " " + b.getY() + " " + b.getZ();
if (b.hasMetadata("ce.mine.secondary")) {
locString = b.getMetadata("ce.mine.secondary").get(0).asString();
String[] s = locString.split(" ");
b = new Location(toCheck.getWorld(), Integer.parseInt(s[0]), Integer.parseInt(s[1]), Integer.parseInt(s[2])).getBlock();
}
if (b.getType().equals(Material.AIR)) {
b.removeMetadata("ce.mine", Main.plugin);
Block[] blocks = { b.getRelative(0, 1, 0), b.getRelative(1, 0, 0), b.getRelative(-1, 0, 0), b.getRelative(0, 0, 1), b.getRelative(0, 0, -1) };
for (Block block : blocks) {
if (block.hasMetadata("ce.mine.secondary")) {
String[] s = block.getMetadata("ce.mine.secondary").get(0).asString().split(" ");
Location loc = new Location(e.getPlayer().getWorld(), Integer.parseInt(s[0]), Integer.parseInt(s[1]), Integer.parseInt(s[2]));
Location blockLoc = b.getLocation();
if (loc.getBlockX() == blockLoc.getBlockX() && loc.getBlockY() == blockLoc.getBlockY() && loc.getBlockZ() == blockLoc.getBlockZ())
block.removeMetadata("ce.mine.secondary", Main.plugin);
}
}
}
toCheck.setMetadata("ce.mine", new FixedMetadataValue(Main.plugin, locString));
if (b.hasMetadata("ce.mine"))
Tools.getItemByOriginalname(b.getMetadata("ce.mine").get(0).asString()).effect(e, toCheck);
}
}
public static void handleBows(Player toCheck, EntityDamageByEntityEvent e) {
if (e.getDamager().hasMetadata("ce.bow.item")) {
Tools.getItemByOriginalname(e.getDamager().getMetadata("ce.bow.item").get(0).asString()).effect(e, toCheck);
e.getDamager().removeMetadata("ce.bow.item", Main.plugin);
}
if (e.getDamager().hasMetadata("ce.bow.enchantment")) {
String[] enchantments = e.getDamager().getMetadata("ce.bow.enchantment").get(0).asString().split(" ; ");
for (String ench : enchantments) {
String[] enchantment = ench.split(" : ");
CEnchantment ce = EnchantManager.getInternalEnchantment(enchantment[0]);
ce.effect(e, toCheck.getItemInHand(), Integer.parseInt(enchantment[1]));
}
e.getDamager().removeMetadata("ce.bow.enchantment", Main.plugin);
}
}
public static void handleEventMain(Player toCheck, ItemStack i, Event e, HashSet<CBasic> list) {
if (i != null && i.hasItemMeta()) {
ItemMeta im = i.getItemMeta();
if (!list.isEmpty()) {
Boolean checkLore = im.hasLore();
Boolean checkName = im.hasDisplayName();
int volleyLevel = -1; // Level to let Volley have its effect after all other bow enchantments
List<String> lore = im.getLore();
String name = im.getDisplayName();
for (CBasic cb : list) {
if (checkLore)
if (cb instanceof CEnchantment) {
CEnchantment ce = (CEnchantment) cb;
for (String s : lore)
if (Tools.isApplicable(i, ce)) {
if (EnchantManager.containsEnchantment(s, ce)) {
int level = EnchantManager.getLevel(s);
if (!Boolean.parseBoolean(Main.config.getString("Global.Enchantments.RequirePermissions")) || Tools.checkPermission(ce, toCheck))
if (!ce.lockList.contains(toCheck))
if (!ce.getHasCooldown(toCheck))
try {
long time = System.currentTimeMillis();
if (Tools.random.nextDouble() * 100 <= ce.getOccurrenceChance()) {
// BOWS
if (e instanceof EntityShootBowEvent) {
String enchantments = ce.getOriginalName() + " : " + level;
Entity proj = ((EntityShootBowEvent) e).getProjectile();
if (((EntityShootBowEvent) e).getProjectile().hasMetadata("ce.bow.enchantment"))
enchantments += " ; " + proj.getMetadata("ce.bow.enchantment").get(0).asString();
proj.setMetadata("ce.bow.enchantment", new FixedMetadataValue(Main.plugin, enchantments));
if (ce instanceof Volley) {
volleyLevel = level;
continue;
}
}
// BOWS
if (e instanceof EntityDamageByEntityEvent && ((EntityDamageByEntityEvent) e).getDamager() instanceof Player
&& ce.triggers.contains(Trigger.SHOOT_BOW)
&& ((Player) ((EntityDamageByEntityEvent) e).getDamager()).getItemInHand().getType().equals(Material.BOW))
continue;
ce.effect(e, i, level);
}
if (Boolean.parseBoolean(Main.config.getString("Global.Logging.Enabled"))
&& Boolean.parseBoolean(Main.config.getString("Global.Logging.LogEnchantments"))) {
long timeF = (System.currentTimeMillis() - time);
if (timeF > Integer.parseInt(Main.config.getString("Global.Logging.MinimumMsForLog")))
Bukkit.getConsoleSender().sendMessage("[CE] Event " + e.getEventName() + " took " + timeF + "ms to process " + ce.getDisplayName()
+ ChatColor.RESET + "(" + ce.getOriginalName() + ").");
}
} catch (Exception ex) {
if (!(ex instanceof ClassCastException))
for (StackTraceElement element : ex.getStackTrace()) {
String className = element.getClassName();
if (className.contains("com.taiter.ce")) {
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[CE] An error occurred in " + element.getFileName() + " on line "
+ element.getLineNumber() + ": " + ex.getCause());
break;
}
}
}
}
}
}
if (checkName && checkLore)
if (cb instanceof CItem) {
CItem ci = (CItem) cb;
if (name.equals(ci.getDisplayName())) {
if (!(ci instanceof RocketBoots) && !(ci instanceof NecromancersStaff) && !(ci instanceof HookshotBow) && !lore.equals(ci.getDescription())) {
boolean lorePass = true;
if (lore.size() != ci.getDescription().size())
continue;
for (int x = 0; x < lore.size(); x++) {
if (!lore.get(x).replace(ChatColor.MAGIC + "", "").equals(ci.getDescription().get(x).replace(ChatColor.MAGIC + "", ""))) {
lorePass = false;
break;
}
}
if (lorePass)
continue;
}
if (!Boolean.parseBoolean(Main.config.getString("Global.Enchantments.RequirePermissions")) || Tools.checkPermission(ci, toCheck))
if (!ci.getHasCooldown(toCheck))
if (!ci.lockList.contains(toCheck)) {
if (e instanceof PlayerMoveEvent && (ci.getOriginalName().equals("Landmine") || ci.getOriginalName().equals("Bear Trap")
|| ci.getOriginalName().equals("Piranha Trap") || ci.getOriginalName().equals("Poison Ivy") || ci.getOriginalName().equals("Prickly Block")))
return;
try {
if (e instanceof EntityShootBowEvent)
((EntityShootBowEvent) e).getProjectile().setMetadata("ce.bow.item", new FixedMetadataValue(Main.plugin, ci.getOriginalName()));
if (e instanceof ProjectileLaunchEvent)
((ProjectileLaunchEvent) e).getEntity().setMetadata("ce.projectile.item", new FixedMetadataValue(Main.plugin, ci.getOriginalName()));
long time = System.currentTimeMillis();
if (ci.effect(e, toCheck))
ci.generateCooldown(toCheck, ci.getCooldown());
if (Boolean.parseBoolean(Main.config.getString("Global.Logging.Enabled")) && Boolean.parseBoolean(Main.config.getString("Global.Logging.LogItems"))) {
long timeF = (System.currentTimeMillis() - time);
if (timeF > Integer.parseInt(Main.config.getString("Global.Logging.MinimumMsForLog")))
Bukkit.getConsoleSender().sendMessage(ChatColor.GOLD + "[CE] Event " + e.getEventName() + " took " + timeF + "ms to process "
+ ci.getDisplayName() + " (" + ci.getOriginalName() + ")" + ChatColor.RESET + ".");
}
} catch (Exception ex) {
if (!(ex instanceof ClassCastException))
for (StackTraceElement element : ex.getStackTrace()) {
String className = element.getClassName();
if (className.contains("com.taiter.ce")) {
Bukkit.getConsoleSender().sendMessage(ChatColor.RED + "[CE] An error occurred in " + element.getFileName() + " on line "
+ element.getLineNumber() + ": " + ex.getCause());
break;
}
}
}
}
return; // Stops going through the list of items as it is not needed anymore
}
}
}
if (volleyLevel >= 0) {
for (CBasic cb : list)
if (cb instanceof Volley)
((Volley) cb).effect(e, i, volleyLevel);
}
}
}
}
public static void handleRunecrafting(final InventoryClickEvent event) {
if (event.getView() == null)
return;
if (event.getRawSlot() >= 0 && event.getRawSlot() < 3) {
final Inventory inv = event.getView().getTopInventory();
ItemStack item = event.getCursor();
ItemStack current = event.getCurrentItem();
event.setCancelled(true);
if (event.getClick().isShiftClick()) {
if (event.getSlot() != 2) {
if (event.getView().getBottomInventory().firstEmpty() != -1) {
event.getView().getBottomInventory().addItem(event.getCurrentItem());
event.setCurrentItem(new ItemStack(Material.AIR));
updateRunecraftingInventory(inv);
}
}
return;
}
switch (event.getSlot()) {
case 0:
if (item != null && item.getAmount() > 1) {
item.setAmount(item.getAmount() - 1);
event.getWhoClicked().setItemOnCursor(item.clone());
if (current != null && !current.getType().equals(Material.AIR))
event.getWhoClicked().getInventory().addItem(current);
item.setAmount(1);
} else {
event.getWhoClicked().setItemOnCursor(current);
}
inv.setItem(0, item);
updateRunecraftingInventory(inv);
break;
case 1:
//Check if item does not belong in this slot
if (item != null && !item.getType().equals(Material.AIR) && !EnchantManager.isEnchantmentBook(item) && !EnchantManager.hasEnchantments(item)) {
event.setCancelled(true);
break;
}
inv.setItem(1, item);
event.getWhoClicked().setItemOnCursor(current);
updateRunecraftingInventory(inv);
break;
case 2:
final ItemStack result = inv.getItem(2);
if (result != null && !result.getType().equals(Material.AIR)) {
if (result.hasItemMeta() && result.getItemMeta().hasDisplayName()
&& (result.getItemMeta().getDisplayName().equals(ChatColor.LIGHT_PURPLE + "" + ChatColor.MAGIC + "Transforming...")
|| result.getItemMeta().getDisplayName().equals(ChatColor.DARK_RED + "Incompatible Enchantment")))
return;
final Player p = (Player) event.getWhoClicked();
ItemMeta im = result.getItemMeta();
List<String> lore = im.getLore();
if (lore.get(lore.size() - 1).startsWith(ChatColor.GRAY + "Cost: ")) {
int levelCost = 0;
double moneyCost = 0;
String[] costSplit = ChatColor.stripColor(lore.get(lore.size() - 1)).split(" ");
String resultString = ChatColor.WHITE + "" + ChatColor.BOLD + costSplit[1];
if (costSplit.length >= 3 && costSplit[2].equals("Levels")) {
levelCost = Integer.parseInt(costSplit[1]);
resultString += " Levels";
if (costSplit.length >= 4) {
moneyCost = Double.parseDouble(costSplit[3]);
resultString += ChatColor.GREEN + " and " + ChatColor.WHITE + ChatColor.BOLD + costSplit[3];
for (int i = 4; i < costSplit.length; i++)
resultString += " " + costSplit[i];
}
} else {
moneyCost = Double.parseDouble(costSplit[1]);
if (costSplit.length >= 3)
resultString += costSplit[2];
for (int i = 3; i < costSplit.length; i++)
resultString += " " + costSplit[i];
}
if (!p.getGameMode().equals(GameMode.CREATIVE))
if (p.getLevel() >= levelCost)
p.setLevel(p.getLevel() - levelCost);
else {
p.sendMessage(ChatColor.RED + "Your level is not high enough!");
return;
}
if (moneyCost > 0)
if (Main.econ.getBalance(p.getName()) >= moneyCost)
Main.econ.withdrawPlayer(p.getName(), moneyCost);
else {
p.sendMessage(ChatColor.RED + "You do not have enough money!");
return;
}
p.sendMessage(ChatColor.GREEN + "Used " + resultString + ChatColor.GREEN + " for the transformation.");
lore = lore.subList(0, lore.size() - 2);
im.setLore(lore);
result.setItemMeta(im);
}
EffectManager.playSound(p.getLocation(), "BLOCK_ANVIL_USE", 1f, 2f);
EffectManager.playSound(p.getLocation(), "ENTITY_FIREWORK_LAUNCH", 1f, 1.5f);
inv.clear();
if (!result.getType().equals(Material.ENCHANTED_BOOK) && transform) {
final ItemStack transformation = new ItemStack(Material.POTATO);
ItemMeta tim = transformation.getItemMeta();
tim.setDisplayName(ChatColor.LIGHT_PURPLE + "" + ChatColor.MAGIC + "Transforming...");
transformation.setItemMeta(tim);
final List<Player> targets = new ArrayList<Player>();
targets.add(p);
for (Entity e : p.getNearbyEntities(30, 30, 30))
if (e instanceof Player)
targets.add((Player) e);
new BukkitRunnable() {
int counter = 50;
Material[] mats = Material.values();
@Override
public void run() {
if (counter <= 0) {
inv.setItem(2, new ItemStack(Material.AIR));
if (p.getOpenInventory() != null && p.getOpenInventory().getTitle().equals(ChatColor.LIGHT_PURPLE + "" + ChatColor.MAGIC + "abc" + ChatColor.RESET
+ ChatColor.DARK_PURPLE + " Runecrafting " + ChatColor.LIGHT_PURPLE + "" + ChatColor.MAGIC + "cba"))
p.setItemOnCursor(result);
else
p.getInventory().addItem(result);
this.cancel();
return;
}
EffectManager.sendEffect(targets, ParticleEffect.SPELL_MOB, p.getLocation(), new Vector(Math.random() * 2 - 1, Math.random() * 2 - 1, Math.random() * 2 - 1), 1, 100);
transformation.setType(mats[Tools.random.nextInt(mats.length - 1)]);
inv.setItem(2, transformation);
counter--;
}
}.runTaskTimer(Main.plugin, 0, 2);
} else {
new BukkitRunnable() {
@Override
public void run() {
event.getWhoClicked().setItemOnCursor(result);
}
}.runTaskLater(Main.plugin, 1);
}
}
break;
}
} else {
if (event.isShiftClick()) {
event.setCancelled(true);
Inventory top = event.getView().getTopInventory();
ItemStack current = event.getCurrentItem().clone();
ItemStack topItem = current.clone();
topItem.setAmount(1);
if (EnchantManager.isEnchantmentBook(current) || EnchantManager.hasEnchantments(current)) {
if (current.getAmount() > 1) {
current.setAmount(current.getAmount() - 1);
} else if (current.getAmount() == 1) {
current.setType(Material.AIR);
}
if (top.getItem(1) == null || top.getItem(1).getType().equals(Material.AIR)) {
top.setItem(1, topItem);
event.setCurrentItem(current);
updateRunecraftingInventory(top);
} else if (top.getItem(0) == null || top.getItem(0).getType().equals(Material.AIR)) {
top.setItem(0, topItem);
event.setCurrentItem(current);
updateRunecraftingInventory(top);
}
} else if (EnchantManager.isEnchantable(current.getType().toString())) {
if (current.getAmount() > 1) {
current.setAmount(current.getAmount() - 1);
} else if (current.getAmount() == 1) {
current.setType(Material.AIR);
}
if ((top.getItem(0) == null || top.getItem(0).getType().equals(Material.AIR))) {
top.setItem(0, topItem);
event.setCurrentItem(current);
updateRunecraftingInventory(top);
}
}
}
}
}
public static void updateRunecraftingInventory(final Inventory inv) {
new BukkitRunnable() {
@Override
public void run() {
ItemStack top = inv.getItem(0);
ItemStack bot = inv.getItem(1);
if (top == null || bot == null || top.getType().equals(Material.AIR) || bot.getType().equals(Material.AIR)) {
inv.setItem(2, new ItemStack(Material.AIR));
return;
}
int levelCost = 0;
double moneyCost = 0;
if (disenchanting && top.getType().equals(Material.BOOK) && !bot.getType().equals(Material.ENCHANTED_BOOK)) {
HashMap<CEnchantment, Integer> enchs = EnchantManager.getEnchantmentLevels(bot.getItemMeta().getLore());
for (CEnchantment ce : enchs.keySet()) {
int lvl = ce.getRunecraftCostLevel(enchs.get(ce));
double money = ce.getRunecraftCostMoney(enchs.get(ce));
if (lvl > 0)
levelCost += lvl;
if (money > 0)
moneyCost += money;
}
ItemStack book = EnchantManager.getEnchantBook(enchs);
ItemMeta im = book.getItemMeta();
List<String> lore = im.getLore();
String costString = ChatColor.GRAY + "Cost: " + (levelCost > 0 ? ChatColor.WHITE + "" + ChatColor.BOLD + levelCost + ChatColor.GOLD + " Levels " : "");
if (Main.hasEconomy)
costString += (moneyCost > 0
? ChatColor.WHITE + "" + ChatColor.BOLD + moneyCost + " " + ChatColor.GOLD + (moneyCost == 1 ? Main.econ.currencyNameSingular() : Main.econ.currencyNamePlural()) : "");
if (!costString.endsWith("Cost: ")) {
lore.add("");
lore.add(costString);
im.setLore(lore);
book.setItemMeta(im);
}
inv.setItem(2, book);
return;
}
if (top.getType().equals(Material.BOOK)) {
return;
}
if (EnchantManager.isEnchantmentBook(bot)) {
ItemStack item = top.clone();
HashMap<CEnchantment, Integer> botList = EnchantManager.getEnchantmentLevels(bot.getItemMeta().getLore());
HashMap<CEnchantment, Integer> topList = EnchantManager.getEnchantmentLevels(top.getItemMeta().getLore());
if (stackEnchantments) {
if (EnchantManager.isEnchantmentBook(top)) {
for (CEnchantment ce : topList.keySet())
if (botList.containsKey(ce)) {
int newLevel = botList.get(ce) + topList.get(ce);
if (newLevel > ce.getEnchantmentMaxLevel())
newLevel = ce.getEnchantmentMaxLevel();
int lvl = ce.getRunecraftCostLevel((newLevel - botList.get(ce)));
double money = ce.getRunecraftCostMoney((newLevel - botList.get(ce)));
if (lvl > 0)
levelCost += lvl;
if (money > 0)
moneyCost += money;
botList.replace(ce, newLevel);
} else {
if (botList.size() < EnchantManager.getMaxEnchants()) {
int newLevel = topList.get(ce);
int lvl = ce.getRunecraftCostLevel(newLevel);
double money = ce.getRunecraftCostMoney(newLevel);
if (lvl > 0)
levelCost += lvl;
if (money > 0)
moneyCost += money;
botList.put(ce, newLevel);
} else
break;
}
ItemStack book = EnchantManager.getEnchantBook(botList);
ItemMeta im = book.getItemMeta();
List<String> lore = im.getLore();
String costString = ChatColor.GRAY + "Cost: " + (levelCost > 0 ? ChatColor.WHITE + "" + ChatColor.BOLD + levelCost + ChatColor.GOLD + " Levels " : "");
if (Main.hasEconomy)
costString += (moneyCost > 0 ? ChatColor.WHITE + "" + ChatColor.BOLD + moneyCost + " " + ChatColor.GOLD
+ (moneyCost == 1 ? Main.econ.currencyNameSingular() : Main.econ.currencyNamePlural()) : "");
if (!costString.endsWith("Cost: ")) {
lore.add("");
lore.add(costString);
im.setLore(lore);
book.setItemMeta(im);
}
inv.setItem(2, book);
return;
}
} else if (EnchantManager.hasEnchantments(top) || EnchantManager.isEnchantmentBook(top)) {
return;
}
for (CEnchantment ce : botList.keySet())
if (!topList.containsKey(ce) && Tools.isApplicable(item, ce)) {
int newLevel = botList.get(ce);
int lvl = ce.getRunecraftCostLevel(newLevel);
double money = ce.getRunecraftCostMoney(newLevel);
if (lvl > 0)
levelCost += lvl;
if (money > 0)
moneyCost += money;
item = EnchantManager.addEnchant(item, ce, newLevel);
}
if (EnchantManager.getEnchantments(item.getItemMeta().getLore()).size() > topList.size()) {
String costString = ChatColor.GRAY + "Cost: " + (levelCost > 0 ? ChatColor.WHITE + "" + ChatColor.BOLD + levelCost + ChatColor.GOLD + " Levels " : "");
if (Main.hasEconomy)
costString += (moneyCost > 0
? ChatColor.WHITE + "" + ChatColor.BOLD + moneyCost + " " + ChatColor.GOLD + (moneyCost == 1 ? Main.econ.currencyNameSingular() : Main.econ.currencyNamePlural())
: "");
if (!costString.endsWith("Cost: ")) {
ItemMeta im = item.getItemMeta();
List<String> lore = im.getLore();
lore.add("");
lore.add(costString);
im.setLore(lore);
item.setItemMeta(im);
}
inv.setItem(2, item);
} else {
ItemMeta im = item.getItemMeta();
im.setDisplayName(ChatColor.DARK_RED + "Incompatible Enchantment");
im.setLore(new ArrayList<String>());
item.setItemMeta(im);
item.setType(Material.BARRIER);
inv.setItem(2, item);
}
return;
}
inv.setItem(2, new ItemStack(Material.AIR));
}
}.runTaskLater(Main.plugin, 2);
}
}