From 287328e29aea7453b325b24e000ba936187ece53 Mon Sep 17 00:00:00 2001 From: sigonasr2 Date: Sat, 23 Nov 2013 16:53:36 -0700 Subject: [PATCH 01/11] Wither fix for Nether / other worlds. --- BankEconomyMod/src/me/kaZep/Base/Main.java | 26 ++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/BankEconomyMod/src/me/kaZep/Base/Main.java b/BankEconomyMod/src/me/kaZep/Base/Main.java index 208e8a2..5cecf51 100644 --- a/BankEconomyMod/src/me/kaZep/Base/Main.java +++ b/BankEconomyMod/src/me/kaZep/Base/Main.java @@ -1133,6 +1133,32 @@ public void runTick() { } } } + world_entities = Bukkit.getWorld("world_nether").getEntities(); + for (int i=0;il.getHealth()+5+(0.2*(l.getMaxHealth()/l.getHealth()))) { + DecimalFormat df = new DecimalFormat("#0.0"); + //Bukkit.broadcastMessage("Healing for "+(+5+(0.2*(l.getMaxHealth()/l.getHealth())))+" health. "+df.format(l.getHealth())+"/"+l.getMaxHealth()+" HP"); + l.setHealth(l.getHealth()+5+(0.2*(l.getMaxHealth()/l.getHealth()))); + } + } + } + } + world_entities = Bukkit.getWorld("world_the_end").getEntities(); + for (int i=0;il.getHealth()+5+(0.2*(l.getMaxHealth()/l.getHealth()))) { + DecimalFormat df = new DecimalFormat("#0.0"); + //Bukkit.broadcastMessage("Healing for "+(+5+(0.2*(l.getMaxHealth()/l.getHealth())))+" health. "+df.format(l.getHealth())+"/"+l.getMaxHealth()+" HP"); + l.setHealth(l.getHealth()+5+(0.2*(l.getMaxHealth()/l.getHealth()))); + } + } + } + } } for (int zx=0;zx Date: Sat, 23 Nov 2013 20:19:13 -0500 Subject: [PATCH 02/11] Anvil changes added to master. --- .../src/me/kaZep/Base/PlayerListener.java | 789 ++++++++++-------- 1 file changed, 445 insertions(+), 344 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index c0e2520..fae957e 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -12990,6 +12990,7 @@ implements Listener class updateInventoryTask implements Runnable { String playerName; + double repairMultiplier, experienceMultiplier; public updateInventoryTask(String pl){ playerName = pl; @@ -12997,7 +12998,7 @@ class updateInventoryTask implements Runnable { @Override public void run() { - Bukkit.getLogger().info("Runnable task run() called; player name: " + playerName); + // Bukkit.getLogger().info("Runnable task run() called; player name: " + playerName); Player player = Bukkit.getPlayer(playerName); Inventory anvilInv = player.getOpenInventory().getTopInventory(); @@ -13008,62 +13009,69 @@ class updateInventoryTask implements Runnable { final int OUTPUT = 16; final int LEVELS = 22; + // Apply cost reductions for specialists + repairMultiplier = 0.2; // Set to 0.25 if Blacksmith/Weaponsmith + experienceMultiplier = 1; // Halve for enchanters (maybe? balance issue), reduce substantially for tinkerers + // Redundant validation code for verification if (anvilInv.getItem(INPUT) != null) { - if (!(anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("HELMET") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("CHESTPLATE") || + if (!(anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("HELMET") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("CHESTPLATE") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("LEGGINGS") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("BOOTS") || - anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("PICKAXE") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("SPADE") || + anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("PICKAXE") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("SPADE") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("HOE") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("AXE") || - anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("SWORD") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("FISHING") || - anvilInv.getItem(INPUT).getType().toString().toUpperCase().contentEquals("BOW"))) { + anvilInv.getItem(INPUT).getType().toString().toUpperCase().contains("SWORD") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contentEquals("FISHING") || + anvilInv.getItem(INPUT).getType().toString().toUpperCase().contentEquals("BOW") || anvilInv.getItem(INPUT).getType().toString().toUpperCase().contentEquals("ENCHANTED_BOOK"))) { sendToInventory(INPUT, anvilInv.getItem(INPUT).getAmount(), player); - Bukkit.getLogger().info("Invalid input!"); + // Bukkit.getLogger().info("Invalid input!"); } else { - Bukkit.getLogger().info("Valid input, " + anvilInv.getItem(INPUT).toString().toUpperCase() + " with durability " + anvilInv.getItem(INPUT).getDurability()); + // Bukkit.getLogger().info("Valid input, " + anvilInv.getItem(INPUT).toString().toUpperCase() + " with durability " + anvilInv.getItem(INPUT).getDurability()); } } if (anvilInv.getItem(MATERIALS) != null) { - if (!(anvilInv.getItem(MATERIALS).getType() == Material.LEATHER || anvilInv.getItem(MATERIALS).getType() == Material.IRON_INGOT || - anvilInv.getItem(MATERIALS).getType() == Material.GOLD_INGOT || anvilInv.getItem(MATERIALS).getType() == Material.IRON_BLOCK || + if (!(anvilInv.getItem(MATERIALS).getType() == Material.LEATHER || anvilInv.getItem(MATERIALS).getType() == Material.IRON_INGOT || + anvilInv.getItem(MATERIALS).getType() == Material.GOLD_INGOT || anvilInv.getItem(MATERIALS).getType() == Material.IRON_BLOCK || anvilInv.getItem(MATERIALS).getType() == Material.DIAMOND_BLOCK || anvilInv.getItem(MATERIALS).getType() == Material.DIAMOND || anvilInv.getItem(MATERIALS).getType() == Material.WOOD || anvilInv.getItem(MATERIALS).getType() == Material.COBBLESTONE || anvilInv.getItem(MATERIALS).getType() == Material.LOG || anvilInv.getItem(MATERIALS).getType() == Material.STONE || - anvilInv.getItem(MATERIALS).getType() == Material.STRING)) { + anvilInv.getItem(MATERIALS).getType() == Material.STRING || anvilInv.getItem(MATERIALS).getType() == Material.EMERALD || + anvilInv.getItem(MATERIALS).getType() == Material.EMERALD_BLOCK || anvilInv.getItem(MATERIALS).getType() == Material.ENCHANTED_BOOK)) { sendToInventory(MATERIALS, anvilInv.getItem(MATERIALS).getAmount(), player); - Bukkit.getLogger().info("Invalid materials!"); - } else { - Bukkit.getLogger().info("Valid materials, " + anvilInv.getItem(MATERIALS).toString().toUpperCase() + " with durability " + anvilInv.getItem(MATERIALS).getDurability()); + // Bukkit.getLogger().info("Invalid materials!"); + } else if ((anvilInv.getItem(MATERIALS).getType() == Material.ENCHANTED_BOOK || anvilInv.getItem(MATERIALS).getType() == Material.BOOK) && anvilInv.getItem(MAGIC) == null) { + anvilInv.setItem(MAGIC, anvilInv.getItem(MATERIALS).clone()); + anvilInv.setItem(MATERIALS, new ItemStack(Material.AIR)); + // Bukkit.getLogger().info("Valid materials, " + anvilInv.getItem(MATERIALS).toString().toUpperCase() + " with durability " + anvilInv.getItem(MATERIALS).getDurability()); } } if (anvilInv.getItem(MAGIC) != null) { - if (!(anvilInv.getItem(MAGIC).getType() == Material.ENCHANTED_BOOK)) { + if (!(anvilInv.getItem(MAGIC).getType() == Material.ENCHANTED_BOOK || anvilInv.getItem(MAGIC).getType() == Material.BOOK)) { sendToInventory(MAGIC, anvilInv.getItem(MAGIC).getAmount(), player); - Bukkit.getLogger().info("Invalid magic!"); + // Bukkit.getLogger().info("Invalid magic!"); } else { - Bukkit.getLogger().info("Valid magic, " + anvilInv.getItem(MAGIC).toString().toUpperCase()); + // Bukkit.getLogger().info("Valid magic, " + anvilInv.getItem(MAGIC).toString().toUpperCase()); } } if ((anvilInv.getItem(INPUT) == null) || // No input, or material/magic both empty, or all three filled, or input and materials filled but item full (anvilInv.getItem(MAGIC) == null && anvilInv.getItem(MATERIALS) == null) || - (anvilInv.getItem(MAGIC) != null && anvilInv.getItem(MATERIALS) != null && anvilInv.getItem(INPUT) != null) || + (anvilInv.getItem(MAGIC) != null && anvilInv.getItem(MATERIALS) != null && anvilInv.getItem(INPUT) != null) || (anvilInv.getItem(INPUT) != null && anvilInv.getItem(MATERIALS) != null && anvilInv.getItem(INPUT).getDurability() == 0)) { - // No valid combo, set XP orb to stack size 1 and remove output. + // No valid combo, set XP orb to stack size 1 and remove output. anvilInv.setItem(OUTPUT, new ItemStack(Material.AIR)); ItemStack orbs = new ItemStack(Material.SLIME_BALL); ItemMeta temp_meta = orbs.getItemMeta(); temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "Experience Cost of Enchanting."); + temp_meta_lore.add(ChatColor.ITALIC + "Experience Cost of Enchanting."); temp_meta.setLore(temp_meta_lore); orbs.setItemMeta(temp_meta); anvilInv.setItem(LEVELS, orbs); @@ -13073,13 +13081,21 @@ class updateInventoryTask implements Runnable { anvilInv.setContents(anvilInv.getContents()); player.updateInventory(); } else if (anvilInv.getItem(INPUT) != null && anvilInv.getItem(MATERIALS) != null && anvilInv.getItem(INPUT).getDurability() != 0) { - // Both repair slots are populated, and the item is damaged. + // Both repair slots are populated, and the item is damaged. // Verify the right material is combined with the source item. boolean validCombo = false; double multiplier = 0; + boolean isHalloweenItem = false; + + List lore = anvilInv.getItem(INPUT).getItemMeta().getLore(); + for (int i=0;i maxItemsNeeded) { - // Bukkit.getLogger().info("Materials exceed " + maxItemsNeeded + " stack. Dropping " + (anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded) + " of " + anvilInv.getItem(MATERIALS).getType()); + // // Bukkit.getLogger().info("Materials exceed " + maxItemsNeeded + " stack. Dropping " + (anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded) + " of " + anvilInv.getItem(MATERIALS).getType()); sendToInventory(MATERIALS, anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded, player); @@ -13201,32 +13233,32 @@ class updateInventoryTask implements Runnable { int bonus_cost = 0; ItemStack item = anvilInv.getContents()[INPUT]; - Bukkit.getLogger().warning("Repair cost calculation valid"); + // Bukkit.getLogger().warning("Repair cost calculation valid"); Map enchantments = item.getEnchantments(); - Bukkit.getLogger().warning(enchantments.keySet().toString()); + // Bukkit.getLogger().warning(enchantments.keySet().toString()); for (Enchantment e : enchantments.keySet()) { - Bukkit.getLogger().warning("BC: " + bonus_cost + " | INCR: " + 2 + enchantments.get(e)); + // Bukkit.getLogger().warning("BC: " + bonus_cost + " | INCR: " + 2 + enchantments.get(e)); bonus_cost += (2 + enchantments.get(e)); } cost += bonus_cost; - Bukkit.getLogger().info("Raw cost: " + cost); + // Bukkit.getLogger().info("Raw cost: " + cost); cost = (short) Math.floor(cost * multiplier); cost = Math.min(cost, 60); // Cap cost at 60 in case some egregiously enchanted item exists cost = Math.max(cost, 1); // Make sure it's at least one level - Bukkit.getLogger().info("Cost: " + cost); + // Bukkit.getLogger().info("Cost: " + cost); ItemStack orbs = new ItemStack(Material.SLIME_BALL); ItemMeta temp_meta = orbs.getItemMeta(); temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); - temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); if (cost > player.getLevel()) { orbs.setType(Material.MAGMA_CREAM); @@ -13248,7 +13280,7 @@ class updateInventoryTask implements Runnable { // anvilInv.getContents()[OUTPUT].setData(item.getData()); anvilInv.setItem(OUTPUT, item.clone()); - anvilInv.getContents()[OUTPUT].setDurability((short) (item.getDurability() - item.getType().getMaxDurability() * 0.2 * anvilInv.getContents()[MATERIALS].getAmount())); + anvilInv.getContents()[OUTPUT].setDurability((short) (item.getDurability() - item.getType().getMaxDurability() * repairMultiplier * anvilInv.getContents()[MATERIALS].getAmount())); } @@ -13257,356 +13289,426 @@ class updateInventoryTask implements Runnable { anvilInv.setContents(anvilInv.getContents()); player.updateInventory(); } else if (anvilInv.getItem(INPUT) != null && anvilInv.getItem(MAGIC) != null) { - // Both Magic slots are populated. - // Get the list of enchantments from both items. - Map itemEnchantments = anvilInv.getItem(INPUT).getEnchantments(); - Map bookEnchantments = new java.util.HashMap(); - - // Get enchanted book "enchantment" and enchantments. - bookEnchantments.putAll(anvilInv.getItem(MAGIC).getEnchantments()); - bookEnchantments.putAll(((EnchantmentStorageMeta)(anvilInv.getItem(MAGIC).getItemMeta())).getStoredEnchants()); - - // Get the list of bonuses from both items. - Map itemBonuses = new java.util.HashMap(); - Map bookBonuses = new java.util.HashMap(); - - if (anvilInv.getItem(INPUT).getItemMeta().hasLore()) { - for (int i = 0; i < anvilInv.getItem(INPUT).getItemMeta().getLore().size(); i++) { - // Put enchantments together for the input. Also stacks identical enchantments. - Bukkit.getLogger().info("Iterating bonus: " + anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)); - - if (getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)) != null) { - if (itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) == null) { - - Bukkit.getLogger().info("New bonus: " + getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); - itemBonuses.put(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)), getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); - } else { - - Bukkit.getLogger().info("Stacking bonus: " + itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) + " + " + getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); - itemBonuses.put(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)), itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) + getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); + if (anvilInv.getItem(MAGIC).getType() == Material.ENCHANTED_BOOK) { + // Both Magic slots are populated, enchanted book is detected. + // Get the list of enchantments from both items. + Map itemEnchantments = anvilInv.getItem(INPUT).getEnchantments(); + Map bookEnchantments = new java.util.HashMap(); + + // Get enchanted book "enchantment" and enchantments. + bookEnchantments.putAll(anvilInv.getItem(MAGIC).getEnchantments()); + bookEnchantments.putAll(((EnchantmentStorageMeta)(anvilInv.getItem(MAGIC).getItemMeta())).getStoredEnchants()); + + // Get the list of bonuses from both items. + Map itemBonuses = new java.util.HashMap(); + Map bookBonuses = new java.util.HashMap(); + + if (anvilInv.getItem(INPUT).getItemMeta().hasLore()) { + for (int i = 0; i < anvilInv.getItem(INPUT).getItemMeta().getLore().size(); i++) { + // Put enchantments together for the input. Also stacks identical enchantments. + // Bukkit.getLogger().info("Iterating bonus: " + anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)); + + if (getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)) != null) { + if (itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) == null) { + + // Bukkit.getLogger().info("New bonus: " + getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); + itemBonuses.put(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)), getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); + } else { + + // Bukkit.getLogger().info("Stacking bonus: " + itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) + " + " + getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); + itemBonuses.put(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i)), itemBonuses.get(getEnchantmentName(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))) + getEnchantmentNumb(anvilInv.getItem(INPUT).getItemMeta().getLore().get(i))); + } } } } - } - if (anvilInv.getItem(MAGIC).getItemMeta().hasLore()) { - for (int i = 0; i < anvilInv.getItem(MAGIC).getItemMeta().getLore().size(); i++) { - // Put enchantments together for the MAGIC. Also stacks identical enchantments. - Bukkit.getLogger().info("Iterating bonus: " + anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)); - if (bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) == null) { + if (anvilInv.getItem(MAGIC).getItemMeta().hasLore()) { + for (int i = 0; i < anvilInv.getItem(MAGIC).getItemMeta().getLore().size(); i++) { + // Put enchantments together for the MAGIC. Also stacks identical enchantments. + // Bukkit.getLogger().info("Iterating bonus: " + anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)); + if (bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) == null) { - Bukkit.getLogger().info("New bonus: " + getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); - bookBonuses.put(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)), getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); - } else { + // Bukkit.getLogger().info("New bonus: " + getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); + bookBonuses.put(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)), getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); + } else { - Bukkit.getLogger().info("Stacking bonus: " + bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) + " + " + getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); - bookBonuses.put(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)), bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) + getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); + // Bukkit.getLogger().info("Stacking bonus: " + bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) + " + " + getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); + bookBonuses.put(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i)), bookBonuses.get(getEnchantmentName(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))) + getEnchantmentNumb(anvilInv.getItem(MAGIC).getItemMeta().getLore().get(i))); + } } } - } - // Generate appropriate possible enchantments - Map probableEnchantments = new java.util.HashMap(); + // Generate appropriate possible enchantments + Map probableEnchantments = new java.util.HashMap(); - for (Enchantment e : bookEnchantments.keySet()) { - Bukkit.getLogger().info("Iterating enchantment: " + e); + for (Enchantment e : bookEnchantments.keySet()) { + // Bukkit.getLogger().info("Iterating enchantment: " + e); - if (itemEnchantments.get(e) == null || bookEnchantments.get(e) > itemEnchantments.get(e)) { - // Book enchantment is larger in magnitude. Assign it as a possible outcome. - probableEnchantments.put(e, bookEnchantments.get(e)); - } else if (bookEnchantments.get(e) == itemEnchantments.get(e)) { - // Book enchantment is same in magnitude. Upgrade by one level. - probableEnchantments.put(e, bookEnchantments.get(e) + 1); + if (itemEnchantments.get(e) == null || bookEnchantments.get(e) > itemEnchantments.get(e)) { + // Book enchantment is larger in magnitude. Assign it as a possible outcome. + probableEnchantments.put(e, bookEnchantments.get(e)); + } else if (bookEnchantments.get(e) == itemEnchantments.get(e) && bookEnchantments.get(e) <= 10) { + // Book enchantment is same in magnitude. Upgrade by one level. + probableEnchantments.put(e, bookEnchantments.get(e) + 1); + } } - } - // Generate appropriate possible bonuses - Map probableBonuses = new java.util.HashMap(); + // Generate appropriate possible bonuses + Map probableBonuses = new java.util.HashMap(); - for (String e : bookBonuses.keySet()) { - Bukkit.getLogger().info("Iterating bonus: " + e); + for (String e : bookBonuses.keySet()) { + // Bukkit.getLogger().info("Iterating bonus: " + e); - if (itemBonuses.get(e) == null || bookBonuses.get(e) > itemBonuses.get(e)) { - // Book enchantment is larger in magnitude. Assign it as a possible outcome. - probableBonuses.put(e, bookBonuses.get(e)); - } else if (bookBonuses.get(e) == itemBonuses.get(e)) { - // Book enchantment is same in magnitude. Upgrade by half. - probableBonuses.put(e, Math.floor(bookBonuses.get(e) * 1.5)); + if (itemBonuses.get(e) == null) { + // Book enchantment is new. Assign it as a possible outcome. + probableBonuses.put(e, (int)Math.round(bookBonuses.get(e) * 0.2)); + // The int cast appears to be needed to make it display integers and not stuff like "+5.0 Health" + // Don't remove unless workaround can be found. + } else if (bookBonuses.get(e) >= itemBonuses.get(e) * 0.2) { + // Book enchantment is large enough in magnitude to stack. Assign it as a possible outcome. + probableBonuses.put(e, (int)Math.round(itemBonuses.get(e) + bookBonuses.get(e) * 0.2)); + } } - } - if (probableEnchantments.size() == 0 && probableBonuses.size() == 0) { - // No possible valid enchantments. Output nothing - } else { - if (probableEnchantments.size() != 0) { - // Randomly select an enchantment to add. - int random = (int)(Math.random() * probableEnchantments.size()); - Bukkit.getLogger().info("Randomized to # " + (random + 1) + " out of " + probableEnchantments.size()); + if (probableEnchantments.size() == 0 && probableBonuses.size() == 0) { + // No possible valid enchantments. Output nothing + } else { + if (probableEnchantments.size() != 0) { + // Randomly select an enchantment to add. + int random = (int)(Math.random() * probableEnchantments.size()); + // Bukkit.getLogger().info("Randomized to # " + (random + 1) + " out of " + probableEnchantments.size()); - int i = 0; + int i = 0; - Enchantment appliedEnchant = null; - int magnitude = 0; - for (Enchantment e : probableEnchantments.keySet()) { + Enchantment appliedEnchant = null; + int magnitude = 0; + for (Enchantment e : probableEnchantments.keySet()) { - if (i == random) { - // Rolled this one - appliedEnchant = e; - magnitude = probableEnchantments.get(e); + if (i == random) { + // Rolled this one + appliedEnchant = e; + magnitude = probableEnchantments.get(e); + } + i++; } - i++; - } - int cost = 0; + int cost = 0; - if (itemEnchantments.get(appliedEnchant) == null) { - // This enchantment doesn't exist. Calculate full cost. + if (itemEnchantments.get(appliedEnchant) == null) { + // This enchantment doesn't exist. Calculate full cost. - cost = Math.min(60, magnitude * magnitude); - cost = Math.max(cost, 1); // Make sure it's at least one level + cost = Math.min(60, magnitude * magnitude); + cost = Math.max(cost, 1); // Make sure it's at least one level - ItemStack orbs = new ItemStack(Material.SLIME_BALL); + ItemStack orbs = new ItemStack(Material.SLIME_BALL); - ItemMeta temp_meta = orbs.getItemMeta(); - temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); - List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); - temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + ItemMeta temp_meta = orbs.getItemMeta(); + temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); + List temp_meta_lore = new ArrayList(); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); - if (cost > player.getLevel()) { - orbs.setType(Material.MAGMA_CREAM); - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); - } else { - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); - temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); - } + if (cost > player.getLevel()) { + orbs.setType(Material.MAGMA_CREAM); + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); + } else { + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); + temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); + } - temp_meta.setLore(temp_meta_lore); - orbs.setItemMeta(temp_meta); + temp_meta.setLore(temp_meta_lore); + orbs.setItemMeta(temp_meta); - orbs.setAmount(cost); - anvilInv.setItem(LEVELS, orbs); - anvilInv.setItem(OUTPUT, anvilInv.getItem(INPUT).clone()); - anvilInv.getItem(OUTPUT).addUnsafeEnchantment(appliedEnchant, magnitude); + orbs.setAmount(cost); + anvilInv.setItem(LEVELS, orbs); + anvilInv.setItem(OUTPUT, anvilInv.getItem(INPUT).clone()); + anvilInv.getItem(OUTPUT).addUnsafeEnchantment(appliedEnchant, magnitude); - } else { - // This enchantment exists. Calculate incremental cost. + } else { + // This enchantment exists. Calculate incremental cost. - cost = Math.min(60, magnitude * magnitude - itemEnchantments.get(appliedEnchant) * itemEnchantments.get(appliedEnchant)); - cost = Math.max(cost, 1); // Make sure it's at least one level + cost = Math.min(60, magnitude * magnitude - itemEnchantments.get(appliedEnchant) * itemEnchantments.get(appliedEnchant)); + cost = Math.max(cost, 1); // Make sure it's at least one level - ItemStack orbs = new ItemStack(Material.SLIME_BALL); + ItemStack orbs = new ItemStack(Material.SLIME_BALL); - ItemMeta temp_meta = orbs.getItemMeta(); - temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); - List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); - temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + ItemMeta temp_meta = orbs.getItemMeta(); + temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); + List temp_meta_lore = new ArrayList(); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); - if (cost > player.getLevel()) { - orbs.setType(Material.MAGMA_CREAM); - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); - } else { - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); - temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); - } + if (cost > player.getLevel()) { + orbs.setType(Material.MAGMA_CREAM); + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); + } else { + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); + temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); + } - temp_meta.setLore(temp_meta_lore); - orbs.setItemMeta(temp_meta); + temp_meta.setLore(temp_meta_lore); + orbs.setItemMeta(temp_meta); - orbs.setAmount(cost); - anvilInv.setItem(LEVELS, orbs); + orbs.setAmount(cost); + anvilInv.setItem(LEVELS, orbs); + anvilInv.setItem(OUTPUT, anvilInv.getItem(INPUT).clone()); + anvilInv.getItem(OUTPUT).removeEnchantment(appliedEnchant); + anvilInv.getItem(OUTPUT).addUnsafeEnchantment(appliedEnchant, magnitude); + } + } else { + // Can't add enchant, but can add bonus. Prepare output for bonus. anvilInv.setItem(OUTPUT, anvilInv.getItem(INPUT).clone()); - anvilInv.getItem(OUTPUT).removeEnchantment(appliedEnchant); - anvilInv.getItem(OUTPUT).addUnsafeEnchantment(appliedEnchant, magnitude); - } - } else { - // Can't add enchant, but can add bonus. Prepare output for bonus. - anvilInv.setItem(OUTPUT, anvilInv.getItem(INPUT).clone()); - } + } + + boolean isTinkerer = true; // Change this to a playerInJob() call later. - if (probableBonuses.size() != 0) { - // Randomly select a bonus to add. - int random = (int)(Math.random() * probableBonuses.size()); - Bukkit.getLogger().info("Randomized to # " + (random + 1) + " out of " + probableBonuses.size()); + if (probableBonuses.size() != 0 && isTinkerer) { + // Randomly select a bonus to add. + int random = (int)(Math.random() * probableBonuses.size()); + Bukkit.getLogger().info("Randomized to # " + (random + 1) + " out of " + probableBonuses.size()); - int i = 0; + int i = 0; - String appliedEnchant = null; - double magnitude = 0; - for (String e : probableBonuses.keySet()) { + String appliedEnchant = null; + int magnitude = 0; + for (String e : probableBonuses.keySet()) { - if (i == random) { - // Rolled this one - appliedEnchant = e; - magnitude = probableBonuses.get(e); + if (i == random) { + // Rolled this one + appliedEnchant = e; + magnitude = probableBonuses.get(e); + } + i++; } - i++; - } - int cost = 0; + int cost = 0; - if (itemBonuses.get(appliedEnchant) == null) { - // This bonus doesn't exist. Calculate full cost. + if (itemBonuses.get(appliedEnchant) == null) { + // This bonus doesn't exist. Calculate full cost. + Bukkit.getLogger().info("Bonus doesn't exist."); + Bukkit.getLogger().info("Bonus is: " + appliedEnchant + " at magnitude " + magnitude); - cost = 30; + cost += 12; + cost = Math.min(60, cost); + cost = Math.max(1, cost); - ItemStack orbs = new ItemStack(Material.SLIME_BALL); + ItemStack orbs = new ItemStack(Material.SLIME_BALL); - ItemMeta temp_meta = orbs.getItemMeta(); - temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); - List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); - temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + ItemMeta temp_meta = orbs.getItemMeta(); + temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); + List temp_meta_lore = new ArrayList(); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); - if (cost > player.getLevel()) { - orbs.setType(Material.MAGMA_CREAM); - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); - } else { - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); - temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); - } + if (cost > player.getLevel()) { + orbs.setType(Material.MAGMA_CREAM); + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); + } else { + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); + temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); + } - temp_meta.setLore(temp_meta_lore); - orbs.setItemMeta(temp_meta); + temp_meta.setLore(temp_meta_lore); + orbs.setItemMeta(temp_meta); - orbs.setAmount(cost); - anvilInv.setItem(LEVELS, orbs); - - // Change entry matching modified lore - List bonusesLore = anvilInv.getItem(OUTPUT).getItemMeta().getLore(); + orbs.setAmount(cost); + anvilInv.setItem(LEVELS, orbs); - for (int i1 = 0; i1 < bonusesLore.size(); i1++) { - String e = bonusesLore.get(i1); - - if (containsEnchantment(e, appliedEnchant)) { - if (appliedEnchant.equalsIgnoreCase("Critical Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); - } - if (appliedEnchant.equalsIgnoreCase("Armor Penetration")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); - } - if (appliedEnchant.equalsIgnoreCase("Life Steal")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); - } - if (appliedEnchant.equalsIgnoreCase("Attack Speed")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); - } - if (appliedEnchant.equalsIgnoreCase("Damage")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); - } - if (appliedEnchant.equalsIgnoreCase("Health")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); - } - if (appliedEnchant.equalsIgnoreCase("Damage Reduction")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); - } - if (appliedEnchant.equalsIgnoreCase("Durability")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); - } - if (appliedEnchant.equalsIgnoreCase("Block Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); - } - if (appliedEnchant.equalsIgnoreCase("Speed Boost Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); - } + // Change entry matching modified lore + ItemMeta bonusesMeta = anvilInv.getItem(OUTPUT).getItemMeta(); + List bonusesLore = bonusesMeta.getLore(); + if (bonusesLore == null) + { + bonusesLore = new ArrayList(); } - } - - anvilInv.getItem(OUTPUT).getItemMeta().setLore(bonusesLore); - - } else { - // This enchantment exists. Calculate incremental cost. - - cost = (int)(30 * itemBonuses.get(appliedEnchant) / probableBonuses.get(appliedEnchant)); // Make sure it's at least one level - ItemStack orbs = new ItemStack(Material.SLIME_BALL); + // Bukkit.getLogger().info("Bonus enchantment string: " + appliedEnchant); + if (appliedEnchant.equalsIgnoreCase("Critical Chance")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); + } + if (appliedEnchant.equalsIgnoreCase("Armor Penetration")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); + } + if (appliedEnchant.equalsIgnoreCase("Life Steal")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); + } + if (appliedEnchant.equalsIgnoreCase("Attack Speed")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); + } + if (appliedEnchant.equalsIgnoreCase("Damage")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); + } + if (appliedEnchant.equalsIgnoreCase("Health")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); + } + if (appliedEnchant.equalsIgnoreCase("Damage Reduction")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); + } + if (appliedEnchant.equalsIgnoreCase("Durability")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); + } + if (appliedEnchant.equalsIgnoreCase("Block Chance")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); + } + if (appliedEnchant.equalsIgnoreCase("Speed Boost Chance")) { + bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); + } - ItemMeta temp_meta = orbs.getItemMeta(); - temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); - List temp_meta_lore = new ArrayList(); - temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); - temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + bonusesMeta.setLore(bonusesLore); + anvilInv.getItem(OUTPUT).setItemMeta(bonusesMeta); - if (cost > player.getLevel()) { - orbs.setType(Material.MAGMA_CREAM); - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); } else { - temp_meta_lore.add(""); - temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); - temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); - } + // This enchantment exists. Calculate incremental cost. - temp_meta.setLore(temp_meta_lore); - orbs.setItemMeta(temp_meta); + cost += (int)(12 * itemBonuses.get(appliedEnchant) / probableBonuses.get(appliedEnchant)); // Make sure it's at least one level + cost = Math.min(60, cost); + cost = Math.max(1, cost); - orbs.setAmount(cost); - anvilInv.setItem(LEVELS, orbs); + ItemStack orbs = new ItemStack(Material.SLIME_BALL); - // Change entry matching modified lore - List bonusesLore = anvilInv.getItem(OUTPUT).getItemMeta().getLore(); + ItemMeta temp_meta = orbs.getItemMeta(); + temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); + List temp_meta_lore = new ArrayList(); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); - for (int i1 = 0; i1 < bonusesLore.size(); i1++) { - String e = bonusesLore.get(i1); - - if (containsEnchantment(e, appliedEnchant)) { - if (appliedEnchant.equalsIgnoreCase("Critical Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); - } - if (appliedEnchant.equalsIgnoreCase("Armor Penetration")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); - } - if (appliedEnchant.equalsIgnoreCase("Life Steal")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); - } - if (appliedEnchant.equalsIgnoreCase("Attack Speed")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); - } - if (appliedEnchant.equalsIgnoreCase("Damage")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); - } - if (appliedEnchant.equalsIgnoreCase("Health")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); - } - if (appliedEnchant.equalsIgnoreCase("Damage Reduction")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); - } - if (appliedEnchant.equalsIgnoreCase("Durability")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); - } - if (appliedEnchant.equalsIgnoreCase("Block Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); - } - if (appliedEnchant.equalsIgnoreCase("Speed Boost Chance")) { - bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); + if (cost > player.getLevel()) { + orbs.setType(Material.MAGMA_CREAM); + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); + } else { + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); + temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); + } + + temp_meta.setLore(temp_meta_lore); + orbs.setItemMeta(temp_meta); + + orbs.setAmount(cost); + anvilInv.setItem(LEVELS, orbs); + + // Change entry matching modified lore + ItemMeta bonusesMeta = anvilInv.getItem(OUTPUT).getItemMeta(); + List bonusesLore = bonusesMeta.getLore(); + + for (int i1 = 0; i1 < bonusesLore.size(); i1++) { + String e = bonusesLore.get(i1); + + if (containsEnchantment(e, appliedEnchant)) { + // Bukkit.getLogger().info("Success! Found enchantment: " + e); + // Bukkit.getLogger().info("Bonus enchantment: " + appliedEnchant); + + if (appliedEnchant.equalsIgnoreCase("Critical Chance")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); + } + if (appliedEnchant.equalsIgnoreCase("Armor Penetration")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); + } + if (appliedEnchant.equalsIgnoreCase("Life Steal")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); + } + if (appliedEnchant.equalsIgnoreCase("Attack Speed")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); + } + if (appliedEnchant.equalsIgnoreCase("Damage")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); + } + if (appliedEnchant.equalsIgnoreCase("Health")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); + } + if (appliedEnchant.equalsIgnoreCase("Damage Reduction")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); + } + if (appliedEnchant.equalsIgnoreCase("Durability")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); + } + if (appliedEnchant.equalsIgnoreCase("Block Chance")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); + } + if (appliedEnchant.equalsIgnoreCase("Speed Boost Chance")) { + bonusesLore.set(i1, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); + } } } + + bonusesMeta.setLore(bonusesLore); + anvilInv.getItem(OUTPUT).setItemMeta(bonusesMeta); } - - anvilInv.getItem(OUTPUT).getItemMeta().setLore(bonusesLore); - } + } + + } + // TRY EVERYTHING + player.getInventory().setContents(player.getInventory().getContents()); + anvilInv.setContents(anvilInv.getContents()); + player.updateInventory(); + } else if (anvilInv.getItem(MAGIC).getType() == Material.BOOK && anvilInv.getItem(INPUT).getType() != Material.ENCHANTED_BOOK) { + // Magic slot is a book. Unenchanting logic goes here. + anvilInv.setItem(OUTPUT, new ItemStack(Material.ENCHANTED_BOOK)); + anvilInv.getItem(OUTPUT).setType(Material.ENCHANTED_BOOK); + + ItemMeta bookMeta = anvilInv.getItem(INPUT).getItemMeta(); + bookMeta.setDisplayName(null); + anvilInv.getItem(OUTPUT).setItemMeta(bookMeta); + + // If books stacked past 1, return all but 1 book to player inventory. + + if (anvilInv.getItem(MAGIC).getAmount() > 1) { + sendToInventory(MAGIC, anvilInv.getItem(MAGIC).getAmount() - 1, player); + } + + int cost = 12; + + Map enchantments = anvilInv.getItem(INPUT).getEnchantments(); + + for (Enchantment e : enchantments.keySet()) { + cost += (1 + enchantments.get(e)); + } + + ItemStack orbs = new ItemStack(Material.SLIME_BALL); + + ItemMeta temp_meta = orbs.getItemMeta(); + temp_meta.setDisplayName(ChatColor.YELLOW + "Experience Cost"); + List temp_meta_lore = new ArrayList(); + temp_meta_lore.add(ChatColor.ITALIC + "This operation costs " + cost + " levels."); + temp_meta_lore.add(ChatColor.ITALIC + "You currently have " + player.getLevel() + " levels."); + + if (cost > player.getLevel()) { + orbs.setType(Material.MAGMA_CREAM); + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.RED + "You can't afford this!"); + } else { + temp_meta_lore.add(""); + temp_meta_lore.add(ChatColor.GREEN + "Completing the operation will"); + temp_meta_lore.add(ChatColor.GREEN + "bring you to " + (player.getLevel() - cost) + " levels."); } + temp_meta.setLore(temp_meta_lore); + orbs.setItemMeta(temp_meta); + + orbs.setAmount(cost); + anvilInv.setItem(LEVELS, orbs); + + // TRY EVERYTHING + player.getInventory().setContents(player.getInventory().getContents()); + anvilInv.setContents(anvilInv.getContents()); + player.updateInventory(); + } - // TRY EVERYTHING - player.getInventory().setContents(player.getInventory().getContents()); - anvilInv.setContents(anvilInv.getContents()); - player.updateInventory(); } } public void sendToInventory(int slot, int itemCount, Player player) { - Bukkit.getLogger().info("Slot: " + slot); - Bukkit.getLogger().info("Item Count: " + itemCount); - Bukkit.getLogger().info("Player: " + player.getDisplayName()); + // Bukkit.getLogger().info("Slot: " + slot); + // Bukkit.getLogger().info("Item Count: " + itemCount); + // Bukkit.getLogger().info("Player: " + player.getDisplayName()); // Get inventories Inventory anvilInventory = player.getOpenInventory().getTopInventory(); @@ -13620,20 +13722,20 @@ class updateInventoryTask implements Runnable { ItemStack leftovers = playerInventory.addItem(temp).get(0); if (leftovers != null) { - player.getWorld().dropItemNaturally(player.getLocation(), leftovers); + player.getWorld().dropItemNaturally(player.getLocation(), leftovers); } - Bukkit.getLogger().info("Slot stack size is " + anvilInventory.getItem(slot).getAmount()); + // Bukkit.getLogger().info("Slot stack size is " + anvilInventory.getItem(slot).getAmount()); if (anvilInventory.getItem(slot).getAmount() - itemCount == 0) { - // Should reduce stack count to zero, meaning item needs to be removed. - Bukkit.getLogger().info("Item stack size reduced to 0, " + anvilInventory.getItem(slot).getType().toString() + " removed."); - anvilInventory.setItem(slot, new ItemStack(Material.AIR)); + // Should reduce stack count to zero, meaning item needs to be removed. + // Bukkit.getLogger().info("Item stack size reduced to 0, " + anvilInventory.getItem(slot).getType().toString() + " removed."); + anvilInventory.setItem(slot, new ItemStack(Material.AIR)); } else { - // Should set stack size. - Bukkit.getLogger().info("Reduced stack size from " + anvilInventory.getItem(slot).getAmount() + " by " + itemCount); + // Should set stack size. + // Bukkit.getLogger().info("Reduced stack size from " + anvilInventory.getItem(slot).getAmount() + " by " + itemCount); anvilInventory.getItem(slot).setAmount(anvilInventory.getItem(slot).getAmount() - itemCount); } // player.getWorld().dropItemNaturally(player.getLocation(), new ItemStack(anvilInv.getItem(MATERIALS).getType(), anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded)); @@ -13645,7 +13747,7 @@ class updateInventoryTask implements Runnable { String[] enchant = s.split(" "); if (enchant[0].contains(ChatColor.YELLOW+"")) { String newstring = ((enchant[0].replace(ChatColor.YELLOW.getChar(), ' ')).replace('%', ' ')).replace(Character.toString((char)0x00A7), Character.toString((char)0x0020)); - //Bukkit.getLogger().info("Enchant number is "+Double.valueOf(newstring)); + // Bukkit.getLogger().info("Enchant number is "+Double.valueOf(newstring)); return Double.valueOf(newstring); } else { return 0; @@ -13663,12 +13765,11 @@ class updateInventoryTask implements Runnable { } - public boolean containsEnchantment(String s, String enchant) { - if (s.contains(enchant)) { - return true; - } - return false; - } - -} + public boolean containsEnchantment(String s, String enchant) { + if (s.contains(enchant)) { + return true; + } + return false; + } +} \ No newline at end of file From 8ccb4c4c2604f8d0184ed3e285befe46a901e9f1 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 01:22:57 -0500 Subject: [PATCH 03/11] Fixed nullpointerexception causing unenchanted items to be unrepairable. --- .../src/me/kaZep/Base/PlayerListener.java | 160 +++++++++--------- 1 file changed, 81 insertions(+), 79 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index fae957e..078f825 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -208,7 +208,7 @@ implements Listener } enum Cube { SMALL, LARGE, ENDER } - + public boolean naturalBlock(Material mat) { List natural_mats = new ArrayList(); natural_mats.add(Material.DIRT); @@ -231,7 +231,7 @@ implements Listener return false; } } - + public void updateTopSPLEEFSigns() { String name[] = {"","",""}; int rating[] = {-9999,-9999,-9999}, wins[] = {0,0,0}, losses[] = {0,0,0}; @@ -1282,15 +1282,15 @@ implements Listener } - @EventHandler - public void onPlayerWakeup(PlayerBedLeaveEvent e) { - Player p = e.getPlayer(); - //p.sendMessage("Wakeup at "+Bukkit.getWorld("world").getTime()); - if (Bukkit.getWorld("world").getTime()==0) { - this.plugin.last_world_time=0; + @EventHandler + public void onPlayerWakeup(PlayerBedLeaveEvent e) { + Player p = e.getPlayer(); + //p.sendMessage("Wakeup at "+Bukkit.getWorld("world").getTime()); + if (Bukkit.getWorld("world").getTime()==0) { + this.plugin.last_world_time=0; + } + return; } - return; - } @EventHandler public void onPlayerSneak(PlayerToggleSneakEvent e) { @@ -2089,13 +2089,13 @@ implements Listener l.setHealth(l.getMaxHealth()); } } - if (Math.random()<=0.003 && l.getLocation().getY()>=60) { - Skeleton s = (Skeleton)l; - s.setSkeletonType(SkeletonType.WITHER); - s.setMaxHealth(150); - s.setHealth(s.getMaxHealth()); - s.getEquipment().setItemInHand(new ItemStack(Material.IRON_SWORD)); - } + if (Math.random()<=0.003 && l.getLocation().getY()>=60) { + Skeleton s = (Skeleton)l; + s.setSkeletonType(SkeletonType.WITHER); + s.setMaxHealth(150); + s.setHealth(s.getMaxHealth()); + s.getEquipment().setItemInHand(new ItemStack(Material.IRON_SWORD)); + } }break; case SLIME: { }break; @@ -5242,7 +5242,7 @@ implements Listener public ItemStack getGoodie() { return getGoodie(0); } - + public ItemStack getGoodie(int rar /*1=Mythical 0=Normal*/) { ItemStack item = null; if (Math.random()<0.33) { @@ -6941,37 +6941,37 @@ implements Listener l.removePotionEffect(PotionEffectType.NIGHT_VISION); l.addPotionEffect(new PotionEffect(PotionEffectType.DAMAGE_RESISTANCE,999999,2)); LivingEntity zombie = (LivingEntity)Bukkit.getWorld("world").spawnEntity(e.getEntity().getLocation(),EntityType.ZOMBIE); - LivingEntity enderdragon = (LivingEntity)Bukkit.getWorld("world").spawnEntity(e.getEntity().getLocation(),EntityType.ENDER_DRAGON); - //Bukkit.getWorld("world").spawn(e.getEntity().getLocation(), enderdragon.getClass()); - zombie.setCustomName(ChatColor.DARK_PURPLE+"Charge Zombie III"); - zombie.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS)); - zombie.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); - zombie.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS)); - zombie.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,999999,3)); - ItemStack sword = new ItemStack(Material.IRON_SWORD); - sword.addEnchantment(Enchantment.DAMAGE_ALL, 3); - zombie.getEquipment().setItemInHand(sword); - ItemStack skull = new ItemStack(397); - skull.setDurability((short)3); - SkullMeta meta = (SkullMeta)skull.getItemMeta(); - meta.setOwner("MHF_Enderman"); - skull.setItemMeta(meta); - zombie.getEquipment().setHelmet(skull); - - enderdragon.setCustomName(ChatColor.DARK_PURPLE+"Charge Zombie III"); - enderdragon.setMaxHealth(200); - enderdragon.setHealth(200); - enderdragon.remove(); - //enderdragon.teleport(new Location(p.getWorld(),p.getLocation().getBlockX()+i,-250,p.getLocation().getBlockZ()+j)); - //p.sendMessage(ChatColor.DARK_PURPLE+"You feel a dark presence nearby."); - //Bukkit.getPlayer("sigonasr2").sendMessage("Trigger this."); - zombie.setRemoveWhenFarAway(false); - zombie.setMaxHealth(300); - zombie.setHealth(300); - zombie.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,999999,0)); - zombie.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,999999,0)); - zombie.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING,999999,0)); - zombie.setTicksLived(1); + LivingEntity enderdragon = (LivingEntity)Bukkit.getWorld("world").spawnEntity(e.getEntity().getLocation(),EntityType.ENDER_DRAGON); + //Bukkit.getWorld("world").spawn(e.getEntity().getLocation(), enderdragon.getClass()); + zombie.setCustomName(ChatColor.DARK_PURPLE+"Charge Zombie III"); + zombie.getEquipment().setBoots(new ItemStack(Material.IRON_BOOTS)); + zombie.getEquipment().setChestplate(new ItemStack(Material.IRON_CHESTPLATE)); + zombie.getEquipment().setLeggings(new ItemStack(Material.IRON_LEGGINGS)); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.REGENERATION,999999,3)); + ItemStack sword = new ItemStack(Material.IRON_SWORD); + sword.addEnchantment(Enchantment.DAMAGE_ALL, 3); + zombie.getEquipment().setItemInHand(sword); + ItemStack skull = new ItemStack(397); + skull.setDurability((short)3); + SkullMeta meta = (SkullMeta)skull.getItemMeta(); + meta.setOwner("MHF_Enderman"); + skull.setItemMeta(meta); + zombie.getEquipment().setHelmet(skull); + + enderdragon.setCustomName(ChatColor.DARK_PURPLE+"Charge Zombie III"); + enderdragon.setMaxHealth(200); + enderdragon.setHealth(200); + enderdragon.remove(); + //enderdragon.teleport(new Location(p.getWorld(),p.getLocation().getBlockX()+i,-250,p.getLocation().getBlockZ()+j)); + //p.sendMessage(ChatColor.DARK_PURPLE+"You feel a dark presence nearby."); + //Bukkit.getPlayer("sigonasr2").sendMessage("Trigger this."); + zombie.setRemoveWhenFarAway(false); + zombie.setMaxHealth(300); + zombie.setHealth(300); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.NIGHT_VISION,999999,0)); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.FIRE_RESISTANCE,999999,0)); + zombie.addPotionEffect(new PotionEffect(PotionEffectType.WATER_BREATHING,999999,0)); + zombie.setTicksLived(1); } /*if (nexteffect.getType().getName().compareTo(PotionEffectType.JUMP.getName())==0) { p.removePotionEffect(PotionEffectType.JUMP); @@ -6983,15 +6983,15 @@ implements Listener Bukkit.getLogger().warning("Potion Effect Collection not accessible while trying to hurt entity."); } } - if (e.getEntity().getType()==EntityType.ZOMBIE) { - Zombie z = (Zombie)e.getEntity(); - if ((z.getCustomName()==null || ( - z.getCustomName()!=null && !z.getCustomName().contains(ChatColor.DARK_PURPLE+"") && ((!z.getCustomName().contains(ChatColor.DARK_PURPLE+"") && z.getCustomName().contains("II")) || - z.getCustomName().contains("Ninja")))) && z.getHealth()>65) { - //If it's a normal zombie with too much HP, something's wrong. Lower it. - z.setHealth(z.getHealth()/2); - } - } + if (e.getEntity().getType()==EntityType.ZOMBIE) { + Zombie z = (Zombie)e.getEntity(); + if ((z.getCustomName()==null || ( + z.getCustomName()!=null && !z.getCustomName().contains(ChatColor.DARK_PURPLE+"") && ((!z.getCustomName().contains(ChatColor.DARK_PURPLE+"") && z.getCustomName().contains("II")) || + z.getCustomName().contains("Ninja")))) && z.getHealth()>65) { + //If it's a normal zombie with too much HP, something's wrong. Lower it. + z.setHealth(z.getHealth()/2); + } + } if (e.getDamager() instanceof Projectile) { Projectile pp = (Projectile)(e.getDamager()); if (pp.getShooter() instanceof Player && l instanceof Wither) { @@ -9601,7 +9601,7 @@ implements Listener } boolean slot1_equip=false; boolean slot2_equip=false; - ItemMeta meta = event.getInventory().getContents()[2].getItemMeta(); + ItemMeta meta = event.getInventory().getContents()[2].getItemMeta(); if (event.getInventory().getContents()[0].getMaxStackSize()<=1) { slot1_equip=true; } @@ -9615,14 +9615,14 @@ implements Listener meta.setLore(event.getInventory().getContents()[1].getItemMeta().getLore()); } } - meta.setDisplayName(ChatColor.GRAY+"Trader's "+convertToItemName(event.getInventory().getContents()[2].getType().name())); - event.getInventory().getContents()[2].setItemMeta(meta); + meta.setDisplayName(ChatColor.GRAY+"Trader's "+convertToItemName(event.getInventory().getContents()[2].getType().name())); + event.getInventory().getContents()[2].setItemMeta(meta); Random r = new Random(amount); Map map = event.getInventory().getContents()[2].getEnchantments(); - for (Map.Entry entry : map.entrySet()) { - //Bukkit.getLogger().info("Raising "+entry.getKey().toString()+"'s value from "+entry.getValue()); - event.getInventory().getContents()[2].addUnsafeEnchantment(entry.getKey(), entry.getValue()+(r.nextInt(11))); - } + for (Map.Entry entry : map.entrySet()) { + //Bukkit.getLogger().info("Raising "+entry.getKey().toString()+"'s value from "+entry.getValue()); + event.getInventory().getContents()[2].addUnsafeEnchantment(entry.getKey(), entry.getValue()+(r.nextInt(11))); + } } } } @@ -10869,10 +10869,10 @@ implements Listener @EventHandler public void onMinecartExit(VehicleExitEvent e) { - if (e.getVehicle().getType()==EntityType.MINECART && e.getVehicle().getPassenger().getType()==EntityType.PLAYER) { - Bukkit.getWorld("world").dropItemNaturally(e.getVehicle().getLocation(),new ItemStack(Material.MINECART)); - e.getVehicle().remove(); - } + if (e.getVehicle().getType()==EntityType.MINECART && e.getVehicle().getPassenger().getType()==EntityType.PLAYER) { + Bukkit.getWorld("world").dropItemNaturally(e.getVehicle().getLocation(),new ItemStack(Material.MINECART)); + e.getVehicle().remove(); + } } @EventHandler @@ -11388,12 +11388,12 @@ implements Listener @EventHandler public void onPlayerLeave(PlayerQuitEvent e) { Player p = e.getPlayer(); - if (p.isInsideVehicle()) { - p.leaveVehicle(); - } - if (p.getOpenInventory()!=null) { - p.closeInventory(); - } + if (p.isInsideVehicle()) { + p.leaveVehicle(); + } + if (p.getOpenInventory()!=null) { + p.closeInventory(); + } for (int i=0;i lore = anvilInv.getItem(INPUT).getItemMeta().getLore(); - for (int i=0;i Date: Sun, 24 Nov 2013 02:28:04 -0500 Subject: [PATCH 04/11] Fixed dye colors being displayed incorrectly. Added high efficiency recipes for coloring wool (8 white wool around dye). Vanilla recipes for coloring wool disabled. --- BankEconomyMod/src/me/kaZep/Base/Main.java | 14 ++++++++++++++ .../src/me/kaZep/Base/PlayerListener.java | 12 +++++++++--- 2 files changed, 23 insertions(+), 3 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/Main.java b/BankEconomyMod/src/me/kaZep/Base/Main.java index 5cecf51..9f523bf 100644 --- a/BankEconomyMod/src/me/kaZep/Base/Main.java +++ b/BankEconomyMod/src/me/kaZep/Base/Main.java @@ -23,6 +23,7 @@ import java.text.*; import me.kaZep.Commands.JobsDataInfo; import me.kaZep.Commands.commandBankEconomy; import net.milkbowl.vault.economy.Economy; + import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Chunk; @@ -64,6 +65,7 @@ import org.bukkit.inventory.meta.ItemMeta; import org.bukkit.inventory.meta.SkullMeta; import org.bukkit.map.MapRenderer; import org.bukkit.map.MapView; +import org.bukkit.material.MaterialData; import org.bukkit.metadata.FixedMetadataValue; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.PluginDescriptionFile; @@ -431,6 +433,18 @@ public class Main extends JavaPlugin fireproof_wood_slab.setIngredient('b', Material.WOOD_STEP); Bukkit.addRecipe(fireproof_wood_slab); + // Add high efficiency recipes for wool + // White + ShapedRecipe woolRecipe; + + for (int i = 0; i < 16; i++) { + woolRecipe = new ShapedRecipe(new ItemStack(Material.WOOL, 8, (short) i)); + woolRecipe.shape("aaa","aba", "aaa"); + woolRecipe.setIngredient('a', Material.WOOL); + woolRecipe.setIngredient('b', new MaterialData(Material.INK_SACK, (byte) (15 - i))); + Bukkit.addRecipe(woolRecipe); + } + // Add Recipes for Item cube crafting. ItemStack temp = new ItemStack(Material.CHEST); ItemMeta tempmeta = temp.getItemMeta(); diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 078f825..1a75e70 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -4066,6 +4066,12 @@ implements Listener // Disable melon crafting recipe if (result.getResult().getType()==Material.MELON_BLOCK) { result.setResult(new ItemStack(Material.AIR)); + return; + } + + if (result.getResult().getType()==Material.WOOL && result.getResult().getAmount() == 1) { + result.setResult(new ItemStack(Material.AIR)); + return; } // Increase stairs recipe efficiency @@ -12898,13 +12904,13 @@ implements Listener color = "Light Blue"; }break; case 13:{ - color = "Green"; + color = "Magenta"; }break; case 14:{ - color = "Red"; + color = "Orange"; }break; case 15:{ - color = "Black"; + color = "White"; }break; } } else { From d409918bd6b391cfaeb765747e636997e8a7c332 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 12:11:49 -0500 Subject: [PATCH 05/11] Properly capped unenchanting cost to 60. --- BankEconomyMod/src/me/kaZep/Base/PlayerListener.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 1a75e70..daf76d6 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -13679,6 +13679,8 @@ class updateInventoryTask implements Runnable { for (Enchantment e : enchantments.keySet()) { cost += (1 + enchantments.get(e)); } + + cost = Math.min(60, cost); ItemStack orbs = new ItemStack(Material.SLIME_BALL); From 00e5df5718157f8bf15d37c8aadf55936642cba6 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 12:54:31 -0500 Subject: [PATCH 06/11] Fixed rounding error due to using int instead of double. Bonuses are now inserted at the beginning of the item lore instead of at the end. --- .../src/me/kaZep/Base/PlayerListener.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index daf76d6..19d6eef 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -13539,34 +13539,34 @@ class updateInventoryTask implements Runnable { // Bukkit.getLogger().info("Bonus enchantment string: " + appliedEnchant); if (appliedEnchant.equalsIgnoreCase("Critical Chance")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Critical Chance"); } if (appliedEnchant.equalsIgnoreCase("Armor Penetration")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Armor Penetration"); } if (appliedEnchant.equalsIgnoreCase("Life Steal")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Life Steal"); } if (appliedEnchant.equalsIgnoreCase("Attack Speed")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Attack Speed"); } if (appliedEnchant.equalsIgnoreCase("Damage")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Damage"); } if (appliedEnchant.equalsIgnoreCase("Health")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+" "+ChatColor.BLUE+"Health"); } if (appliedEnchant.equalsIgnoreCase("Damage Reduction")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Damage Reduction"); } if (appliedEnchant.equalsIgnoreCase("Durability")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Durability"); } if (appliedEnchant.equalsIgnoreCase("Block Chance")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Block Chance"); } if (appliedEnchant.equalsIgnoreCase("Speed Boost Chance")) { - bonusesLore.add(ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); + bonusesLore.add(0, ChatColor.YELLOW+"+"+magnitude+"% "+ChatColor.BLUE+"Speed Boost Chance"); } bonusesMeta.setLore(bonusesLore); @@ -13575,7 +13575,7 @@ class updateInventoryTask implements Runnable { } else { // This enchantment exists. Calculate incremental cost. - cost += (int)(12 * itemBonuses.get(appliedEnchant) / probableBonuses.get(appliedEnchant)); // Make sure it's at least one level + cost += (int)(12d * itemBonuses.get(appliedEnchant) / probableBonuses.get(appliedEnchant)); // Make sure it's at least one level cost = Math.min(60, cost); cost = Math.max(1, cost); From 8007ddb83ecd065b1a15c42dc3132f3ed4a5b3e8 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 13:23:48 -0500 Subject: [PATCH 07/11] Fixed leather armor being not disenchantable due to LeatherArmorMeta being a separate class that cannot be applied to enchanted books. --- .../src/me/kaZep/Base/PlayerListener.java | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 19d6eef..d7912c6 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -13660,9 +13660,20 @@ class updateInventoryTask implements Runnable { } else if (anvilInv.getItem(MAGIC).getType() == Material.BOOK && anvilInv.getItem(INPUT).getType() != Material.ENCHANTED_BOOK) { // Magic slot is a book. Unenchanting logic goes here. anvilInv.setItem(OUTPUT, new ItemStack(Material.ENCHANTED_BOOK)); - anvilInv.getItem(OUTPUT).setType(Material.ENCHANTED_BOOK); + // anvilInv.getItem(OUTPUT).setType(Material.ENCHANTED_BOOK); - ItemMeta bookMeta = anvilInv.getItem(INPUT).getItemMeta(); + ItemMeta bookMeta = anvilInv.getItem(OUTPUT).getItemMeta(); + + // Grab enchantments and lore. This is necessary due to leather armor meta being a different class. + Map itemEnchantments = anvilInv.getItem(INPUT).getItemMeta().getEnchants(); + + for (Enchantment e : itemEnchantments.keySet()) { + bookMeta.addEnchant(e, itemEnchantments.get(e), true); // force-add all enchants + } + + List bookLore = anvilInv.getItem(INPUT).getItemMeta().getLore(); // add more filtering code after this later + bookMeta.setLore(bookLore); + bookMeta.setDisplayName(null); anvilInv.getItem(OUTPUT).setItemMeta(bookMeta); From 6a152d02047ed82ecce5183b3d8c63361b683aef Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 14:07:47 -0500 Subject: [PATCH 08/11] Fixed error due to getEnchantmentNumb being called for halloween item lore. --- BankEconomyMod/src/me/kaZep/Base/PlayerListener.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index d7912c6..eff3278 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -13355,7 +13355,7 @@ class updateInventoryTask implements Runnable { if (itemEnchantments.get(e) == null || bookEnchantments.get(e) > itemEnchantments.get(e)) { // Book enchantment is larger in magnitude. Assign it as a possible outcome. probableEnchantments.put(e, bookEnchantments.get(e)); - } else if (bookEnchantments.get(e) == itemEnchantments.get(e) && bookEnchantments.get(e) <= 10) { + } else if (bookEnchantments.get(e) == itemEnchantments.get(e) && bookEnchantments.get(e) < 10) { // Book enchantment is same in magnitude. Upgrade by one level. probableEnchantments.put(e, bookEnchantments.get(e) + 1); } @@ -13766,7 +13766,7 @@ class updateInventoryTask implements Runnable { public double getEnchantmentNumb(String s) { //Parse the string for spaces. String[] enchant = s.split(" "); - if (enchant[0].contains(ChatColor.YELLOW+"")) { + if (enchant[0].contains(ChatColor.YELLOW+"") && (enchant.length > 1)) { String newstring = ((enchant[0].replace(ChatColor.YELLOW.getChar(), ' ')).replace('%', ' ')).replace(Character.toString((char)0x00A7), Character.toString((char)0x0020)); // Bukkit.getLogger().info("Enchant number is "+Double.valueOf(newstring)); return Double.valueOf(newstring); From 52dc2d0e7a7f119040648bb01dcaa076b381c7f4 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 16:14:42 -0500 Subject: [PATCH 09/11] Fixed a merging error that somehow slipped through. Disenchanting will now properly keep items a percentage of the time. --- .../src/me/kaZep/Base/PlayerListener.java | 150 +++++++++++++++--- 1 file changed, 126 insertions(+), 24 deletions(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index eff3278..10041e0 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -9881,16 +9881,16 @@ implements Listener final int LEVELS = 22; boolean anvilClicked = false; - Bukkit.getLogger().info("Anvil interface CLICK at slot #" + event.getRawSlot()); + // Bukkit.getLogger().info("Anvil interface CLICK at slot #" + event.getRawSlot()); if (event.getRawSlot() == -999) { anvilClicked = false; - Bukkit.getLogger().info("Window exterior clicked."); + // Bukkit.getLogger().info("Window exterior clicked."); } else if (event.getRawSlot() < 27) { anvilClicked = true; - Bukkit.getLogger().info("Anvil clicked."); + // Bukkit.getLogger().info("Anvil clicked."); } else { - Bukkit.getLogger().info("Inventory clicked."); + // Bukkit.getLogger().info("Inventory clicked."); } if (!anvilClicked) { // Clicked the inventory. Leave the operation alone UNLESS it's a shift-click operation. @@ -9908,7 +9908,7 @@ implements Listener */ if (event.getSlot() == OUTPUT && event.getCursor() != null && event.getCursor().getType() != Material.AIR && !matches(event.getCursor(), event.getCurrentItem())){ - Bukkit.getLogger().info("Anvil OUTPUT click."); + // Bukkit.getLogger().info("Anvil OUTPUT click."); event.setCancelled(true); // Cancel the event if trying to put items into the output slot } @@ -9916,18 +9916,18 @@ implements Listener if (event.getInventory().getContents()[OUTPUT] != null && event.getSlot() == OUTPUT) { - Bukkit.getLogger().info("Anvil OUTPUT click with output populated."); + // Bukkit.getLogger().info("Anvil OUTPUT click with output populated."); if (event.getInventory().getContents()[LEVELS].getAmount() > Bukkit.getPlayer(event.getWhoClicked().getName()).getLevel()) { // Player doesn't have enough XP, abort - Bukkit.getLogger().info("Player has insufficient XP."); + // Bukkit.getLogger().info("Player has insufficient XP."); p.sendMessage(ChatColor.RED+"You don't have enough experience to do that!"); event.setCancelled(true); } else { - Bukkit.getLogger().info("Player has sufficient XP."); + // Bukkit.getLogger().info("Player has sufficient XP."); if (event.getCursor() != null && event.getCursor().getType() != Material.AIR) { - Bukkit.getLogger().info("Anvil OUTPUT click with non-null mouse. Mouse has: " + event.getCursor()); + // Bukkit.getLogger().info("Anvil OUTPUT click with non-null mouse. Mouse has: " + event.getCursor()); event.setCancelled(true); // Cancel event if cursor is not empty @@ -9935,7 +9935,7 @@ implements Listener // Attempts to store the item in the player's inventory. // If it succeeds, remove the item from the anvil // interface. - Bukkit.getLogger().info("Shift-click"); + // Bukkit.getLogger().info("Shift-click"); if (event .getWhoClicked() .getInventory() @@ -9943,16 +9943,48 @@ implements Listener event.getInventory().getContents()[OUTPUT]) .isEmpty()) { - Bukkit.getLogger().info("Can place into inventory."); - - event.getInventory().setItem(INPUT, new ItemStack(Material.AIR)); + // Bukkit.getLogger().info("Can place into inventory."); + + if (event.getCurrentItem().getType() == Material.ENCHANTED_BOOK && event.getInventory().getItem(MAGIC).getType() == Material.BOOK) { + // Halve its durability + event.getInventory().getItem(INPUT).setDurability((short)(event.getInventory().getItem(INPUT).getDurability() + (event.getInventory().getItem(INPUT).getType().getMaxDurability() - event.getInventory().getItem(INPUT).getDurability()) / 2)); + + // DISENCHANT BEGIN + Map map = event.getInventory().getItem(INPUT).getEnchantments(); + for (Map.Entry entry : map.entrySet()) { + event.getInventory().getItem(INPUT).removeEnchantment(entry.getKey()); + } + if (event.getInventory().getItem(INPUT).hasItemMeta() && event.getInventory().getItem(INPUT).getItemMeta().hasLore()) { + List newlore = new ArrayList(); + for (int i=0;i map = event.getInventory().getItem(INPUT).getEnchantments(); + for (Map.Entry entry : map.entrySet()) { + event.getInventory().getItem(INPUT).removeEnchantment(entry.getKey()); + } + if (event.getInventory().getItem(INPUT).hasItemMeta() && event.getInventory().getItem(INPUT).getItemMeta().hasLore()) { + List newlore = new ArrayList(); + for (int i=0;i map = event.getInventory().getItem(INPUT).getEnchantments(); + for (Map.Entry entry : map.entrySet()) { + event.getInventory().getItem(INPUT).removeEnchantment(entry.getKey()); + } + if (event.getInventory().getItem(INPUT).hasItemMeta() && event.getInventory().getItem(INPUT).getItemMeta().hasLore()) { + List newlore = new ArrayList(); + for (int i=0;i Date: Sun, 24 Nov 2013 16:53:56 -0500 Subject: [PATCH 10/11] Fixed Trader's Enchanted Books not being properly multiplied. --- BankEconomyMod/src/me/kaZep/Base/PlayerListener.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 10041e0..792ce83 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -9621,8 +9621,19 @@ implements Listener meta.setLore(event.getInventory().getContents()[1].getItemMeta().getLore()); } } + meta.setDisplayName(ChatColor.GRAY+"Trader's "+convertToItemName(event.getInventory().getContents()[2].getType().name())); event.getInventory().getContents()[2].setItemMeta(meta); + + if (event.getInventory().getContents()[2].getType() == Material.ENCHANTED_BOOK) { + ItemMeta tempMeta = new ItemStack(Material.ENCHANTED_BOOK).getItemMeta(); + Map tempEnchant = ((EnchantmentStorageMeta)(event.getInventory().getContents()[2].getItemMeta())).getStoredEnchants(); + for (Enchantment e : tempEnchant.keySet()) { + tempMeta.addEnchant(e, tempEnchant.get(e), true); + } + event.getInventory().getContents()[2].setItemMeta(tempMeta); + } + Random r = new Random(amount); Map map = event.getInventory().getContents()[2].getEnchantments(); for (Map.Entry entry : map.entrySet()) { From 61ed29266b2035be1e04913f7e7afef37994f656 Mon Sep 17 00:00:00 2001 From: Nonoriri Date: Sun, 24 Nov 2013 19:39:20 -0500 Subject: [PATCH 11/11] Fixed a bug that was making the application of item bonuses cost less XP than intended. --- BankEconomyMod/src/me/kaZep/Base/PlayerListener.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java index 792ce83..40cbfd6 100644 --- a/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java +++ b/BankEconomyMod/src/me/kaZep/Base/PlayerListener.java @@ -13607,7 +13607,7 @@ class updateInventoryTask implements Runnable { i++; } - int cost = 0; + int cost = anvilInv.getItem(LEVELS).getAmount(); if (itemBonuses.get(appliedEnchant) == null) { // This bonus doesn't exist. Calculate full cost.