@ -9773,7 +9773,19 @@ implements Listener
Bukkit . getLogger ( ) . info ( "Can place into inventory." ) ;
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 ) ) ;
// Destroy the item if random() exceeds %remaining durability
if ( Math . random ( ) < ( double ) ( event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) - event . getInventory ( ) . getItem ( INPUT ) . getDurability ( ) ) / ( double ) event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) ) {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
} else {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
@ -9825,7 +9837,18 @@ implements Listener
Bukkit . getLogger ( ) . info ( "Can place into inventory." ) ;
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 ) ) ;
// Destroy the item if random() exceeds %remaining durability
if ( Math . random ( ) < ( double ) ( event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) - event . getInventory ( ) . getItem ( INPUT ) . getDurability ( ) ) / ( double ) event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) ) {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
} else {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
@ -9856,7 +9879,18 @@ implements Listener
Bukkit . getLogger ( ) . info ( "Normal click" ) ;
Bukkit . getLogger ( ) . info ( "Normal click" ) ;
// Cursor is empty, item picked up. Subtract XP levels and remove ingredients.
// Cursor is empty, item picked up. Subtract XP levels and remove ingredients.
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 ) ) ;
// Destroy the item if random() exceeds %remaining durability
if ( Math . random ( ) < ( double ) ( event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) - event . getInventory ( ) . getItem ( INPUT ) . getDurability ( ) ) / ( double ) event . getInventory ( ) . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) ) {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
} else {
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
}
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
// event.getInventory().setItem(OUTPUT, new ItemStack(Material.AIR));
// event.getInventory().setItem(OUTPUT, new ItemStack(Material.AIR));
@ -12850,8 +12884,8 @@ class updateInventoryTask implements Runnable {
anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "LEGGINGS" ) | | anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "BOOTS" ) | |
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 ( "HOE" ) | | anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "AXE" ) | |
anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "SWORD" ) | | anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contain s ( "FISHING" ) | |
anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "SWORD" ) | | anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contentEqual s ( "FISHING" ) | |
anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contentEquals ( "BOW" ) ) ) {
anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contentEquals ( "BOW" ) | | anvilInv . getItem ( INPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contentEquals ( "ENCHANTED_BOOK" ) ) ) {
sendToInventory ( INPUT , anvilInv . getItem ( INPUT ) . getAmount ( ) , player ) ;
sendToInventory ( INPUT , anvilInv . getItem ( INPUT ) . getAmount ( ) , player ) ;
Bukkit . getLogger ( ) . info ( "Invalid input!" ) ;
Bukkit . getLogger ( ) . info ( "Invalid input!" ) ;
@ -12866,7 +12900,8 @@ class updateInventoryTask implements Runnable {
anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . DIAMOND_BLOCK | | anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . DIAMOND | |
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 . WOOD | | anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . COBBLESTONE | |
anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . LOG | | anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . STONE | |
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 ) ) {
sendToInventory ( MATERIALS , anvilInv . getItem ( MATERIALS ) . getAmount ( ) , player ) ;
sendToInventory ( MATERIALS , anvilInv . getItem ( MATERIALS ) . getAmount ( ) , player ) ;
@ -12877,7 +12912,7 @@ class updateInventoryTask implements Runnable {
}
}
if ( anvilInv . getItem ( MAGIC ) ! = null ) {
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 ) ;
sendToInventory ( MAGIC , anvilInv . getItem ( MAGIC ) . getAmount ( ) , player ) ;
@ -13017,6 +13052,16 @@ class updateInventoryTask implements Runnable {
multiplier = 0 . 12 ;
multiplier = 0 . 12 ;
}
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . EMERALD ) {
validCombo = true ;
multiplier = 0 . 5 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . EMERALD_BLOCK ) {
validCombo = true ;
multiplier = 0 . 05 ;
}
if ( validCombo ) {
if ( validCombo ) {
// If materials stacked past number needed to full repair, reduce stack size and drop the rest
// If materials stacked past number needed to full repair, reduce stack size and drop the rest
// in the player's inventory, or if that fails, drop it on the ground.
// in the player's inventory, or if that fails, drop it on the ground.
@ -13091,7 +13136,8 @@ class updateInventoryTask implements Runnable {
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
player . updateInventory ( ) ;
player . updateInventory ( ) ;
} else if ( anvilInv . getItem ( INPUT ) ! = null & & anvilInv . getItem ( MAGIC ) ! = null ) {
} else if ( anvilInv . getItem ( INPUT ) ! = null & & anvilInv . getItem ( MAGIC ) ! = null ) {
// Both Magic slots are populated.
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.
// Get the list of enchantments from both items.
Map < Enchantment , Integer > itemEnchantments = anvilInv . getItem ( INPUT ) . getEnchantments ( ) ;
Map < Enchantment , Integer > itemEnchantments = anvilInv . getItem ( INPUT ) . getEnchantments ( ) ;
Map < Enchantment , Integer > bookEnchantments = new java . util . HashMap < Enchantment , Integer > ( ) ;
Map < Enchantment , Integer > bookEnchantments = new java . util . HashMap < Enchantment , Integer > ( ) ;
@ -13155,17 +13201,19 @@ class updateInventoryTask implements Runnable {
}
}
// Generate appropriate possible bonuses
// Generate appropriate possible bonuses
Map < String , Double > probableBonuses = new java . util . HashMap < String , Double > ( ) ;
Map < String , Integer > probableBonuses = new java . util . HashMap < String , Integer > ( ) ;
for ( String e : bookBonuses . keySet ( ) ) {
for ( String e : bookBonuses . keySet ( ) ) {
Bukkit . getLogger ( ) . info ( "Iterating bonus: " + e ) ;
Bukkit . getLogger ( ) . info ( "Iterating bonus: " + e ) ;
if ( itemBonuses . get ( e ) = = null | | bookBonuses . get ( e ) > itemBonuses . get ( e ) ) {
if ( itemBonuses . get ( e ) = = null ) {
// Book enchantment is larger in magnitude. Assign it as a possible outcome.
// Book enchantment is new. Assign it as a possible outcome.
probableBonuses . put ( e , bookBonuses . get ( e ) ) ;
probableBonuses . put ( e , ( int ) Math . round ( bookBonuses . get ( e ) * 0 . 2 ) ) ;
} else if ( bookBonuses . get ( e ) = = itemBonuses . get ( e ) ) {
// The int cast appears to be needed to make it display integers and not stuff like "+5.0 Health"
// Book enchantment is same in magnitude. Upgrade by half.
// Don't remove unless workaround can be found.
probableBonuses . put ( e , Math . floor ( bookBonuses . get ( e ) * 1 . 5 ) ) ;
} 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 ) ) ;
}
}
}
}
@ -13264,7 +13312,9 @@ class updateInventoryTask implements Runnable {
anvilInv . setItem ( OUTPUT , anvilInv . getItem ( INPUT ) . clone ( ) ) ;
anvilInv . setItem ( OUTPUT , anvilInv . getItem ( INPUT ) . clone ( ) ) ;
}
}
if ( probableBonuses . size ( ) ! = 0 ) {
boolean isTinkerer = true ; // Change this to a playerInJob() call later.
if ( probableBonuses . size ( ) ! = 0 & & isTinkerer ) {
// Randomly select a bonus to add.
// Randomly select a bonus to add.
int random = ( int ) ( Math . random ( ) * probableBonuses . size ( ) ) ;
int random = ( int ) ( Math . random ( ) * probableBonuses . size ( ) ) ;
Bukkit . getLogger ( ) . info ( "Randomized to # " + ( random + 1 ) + " out of " + probableBonuses . size ( ) ) ;
Bukkit . getLogger ( ) . info ( "Randomized to # " + ( random + 1 ) + " out of " + probableBonuses . size ( ) ) ;
@ -13272,7 +13322,7 @@ class updateInventoryTask implements Runnable {
int i = 0 ;
int i = 0 ;
String appliedEnchant = null ;
String appliedEnchant = null ;
double magnitude = 0 ;
int magnitude = 0 ;
for ( String e : probableBonuses . keySet ( ) ) {
for ( String e : probableBonuses . keySet ( ) ) {
if ( i = = random ) {
if ( i = = random ) {
@ -13287,8 +13337,12 @@ class updateInventoryTask implements Runnable {
if ( itemBonuses . get ( appliedEnchant ) = = null ) {
if ( itemBonuses . get ( appliedEnchant ) = = null ) {
// This bonus doesn't exist. Calculate full cost.
// 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 ) ;
@ -13315,51 +13369,50 @@ class updateInventoryTask implements Runnable {
anvilInv . setItem ( LEVELS , orbs ) ;
anvilInv . setItem ( LEVELS , orbs ) ;
// Change entry matching modified lore
// Change entry matching modified lore
List < String > bonusesLore = anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) . getLore ( ) ;
ItemMeta bonusesMeta = anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) ;
List < String > bonusesLore = bonusesMeta . getLore ( ) ;
for ( int i1 = 0 ; i1 < bonusesLore . size ( ) ; i1 + + ) {
String e = bonusesLore . get ( i1 ) ;
if ( containsEnchantment ( e , appliedEnchant ) ) {
Bukkit . getLogger ( ) . info ( "Bonus enchantment string: " + appliedEnchant ) ;
if ( appliedEnchant . equalsIgnoreCase ( "Critical Chance" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Critical Chance" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Critical Chance" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Critical Chance" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Armor Penetration" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Armor Penetration" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Armor Penetration" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Armor Penetration" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Life Steal" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Life Steal" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Life Steal" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Life Steal" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Attack Speed" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Attack Speed" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Attack Speed" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Attack Speed" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Damage" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Damage" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Damage" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Damage" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Health" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Health" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Health" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + " " + ChatColor . BLUE + "Health" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Damage Reduction" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Damage Reduction" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Damage Reduction" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Damage Reduction" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Durability" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Durability" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Durability" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Durability" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Block Chance" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Block Chance" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Block Chance" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Block Chance" ) ;
}
}
if ( appliedEnchant . equalsIgnoreCase ( "Speed Boost Chance" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Speed Boost Chance" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Speed Boost Chance" ) ;
bonusesLore . add ( ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Speed Boost Chance" ) ;
}
}
}
}
anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) . setLore ( bonusesLore ) ;
bonusesMeta . setLore ( bonusesLore ) ;
anvilInv . getItem ( OUTPUT ) . setItemMeta ( bonusesMeta ) ;
} else {
} else {
// This enchantment exists. Calculate incremental cost.
// This enchantment exists. Calculate incremental cost.
cost = ( int ) ( 30 * itemBonuses . get ( appliedEnchant ) / probableBonuses . get ( appliedEnchant ) ) ; // Make sure it's at least one level
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 ) ;
ItemStack orbs = new ItemStack ( Material . SLIME_BALL ) ;
ItemStack orbs = new ItemStack ( Material . SLIME_BALL ) ;
@ -13386,12 +13439,16 @@ class updateInventoryTask implements Runnable {
anvilInv . setItem ( LEVELS , orbs ) ;
anvilInv . setItem ( LEVELS , orbs ) ;
// Change entry matching modified lore
// Change entry matching modified lore
List < String > bonusesLore = anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) . getLore ( ) ;
ItemMeta bonusesMeta = anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) ;
List < String > bonusesLore = bonusesMeta . getLore ( ) ;
for ( int i1 = 0 ; i1 < bonusesLore . size ( ) ; i1 + + ) {
for ( int i1 = 0 ; i1 < bonusesLore . size ( ) ; i1 + + ) {
String e = bonusesLore . get ( i1 ) ;
String e = bonusesLore . get ( i1 ) ;
if ( containsEnchantment ( e , appliedEnchant ) ) {
if ( containsEnchantment ( e , appliedEnchant ) ) {
Bukkit . getLogger ( ) . info ( "Success! Found enchantment: " + e ) ;
Bukkit . getLogger ( ) . info ( "Bonus enchantment: " + appliedEnchant ) ;
if ( appliedEnchant . equalsIgnoreCase ( "Critical Chance" ) ) {
if ( appliedEnchant . equalsIgnoreCase ( "Critical Chance" ) ) {
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Critical Chance" ) ;
bonusesLore . set ( i1 , ChatColor . YELLOW + "+" + magnitude + "% " + ChatColor . BLUE + "Critical Chance" ) ;
}
}
@ -13425,15 +13482,60 @@ class updateInventoryTask implements Runnable {
}
}
}
}
anvilInv . getItem ( OUTPUT ) . getItemMeta ( ) . setLore ( bonusesLore ) ;
bonusesMeta . setLore ( bonusesLore ) ;
anvilInv . getItem ( OUTPUT ) . setItemMeta ( bonusesMeta ) ;
}
}
}
}
// TRY EVERYTHING
player . getInventory ( ) . setContents ( player . getInventory ( ) . getContents ( ) ) ;
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
player . updateInventory ( ) ;
} else if ( anvilInv . getItem ( MAGIC ) . getType ( ) = = Material . BOOK ) {
// Magic slot is a book. Unenchanting logic goes here.
anvilInv . setItem ( OUTPUT , anvilInv . getItem ( INPUT ) . clone ( ) ) ;
anvilInv . getItem ( OUTPUT ) . setType ( Material . ENCHANTED_BOOK ) ;
anvilInv . getItem ( OUTPUT ) . setDurability ( ( short ) 0 ) ;
// 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 = 1 ;
ItemStack orbs = new ItemStack ( Material . SLIME_BALL ) ;
ItemMeta temp_meta = orbs . getItemMeta ( ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Experience Cost" ) ;
List < String > temp_meta_lore = new ArrayList < String > ( ) ;
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
// TRY EVERYTHING
player . getInventory ( ) . setContents ( player . getInventory ( ) . getContents ( ) ) ;
player . getInventory ( ) . setContents ( player . getInventory ( ) . getContents ( ) ) ;
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
player . updateInventory ( ) ;
player . updateInventory ( ) ;
}
}
}
}
}