@ -6392,6 +6392,93 @@ public ItemStack getGoodie() {
@EventHandler
@EventHandler
public void onInventoryOpen ( InventoryOpenEvent e ) {
public void onInventoryOpen ( InventoryOpenEvent e ) {
boolean disabled = false ; // set to true to disable custom anvils
// Inventory override if anvil.
if ( e . getInventory ( ) . getType ( ) = = InventoryType . ANVIL & & ! disabled ) {
// Bukkit.getLogger().info("If triggered.");
Inventory i = Bukkit . createInventory ( e . getPlayer ( ) , 27 , "Repair and Enchant" ) ;
ItemStack filler , temp ;
int count = - 1 ;
temp = new ItemStack ( Material . COBBLESTONE ) ;
ItemMeta temp_meta = temp . getItemMeta ( ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Item Input" ) ;
List < String > temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . ITALIC
+ "Place the item to be repaired or enchanted here." ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . IRON_AXE ) ;
i . setItem ( count + = 2 , temp ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Item Tributes" ) ;
temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . ITALIC
+ "Place applicable item tributes here." ) ;
temp_meta_lore . add ( ChatColor . ITALIC + "" ) ;
temp_meta_lore . add ( ChatColor . ITALIC + "" + ChatColor . GRAY
+ "Chainmail repairs with iron ingots." ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . IRON_INGOT ) ;
i . setItem ( count + = 2 , temp ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Magical Artifacts" ) ;
temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . ITALIC
+ "Place applicable magic artifacts here." ) ;
temp_meta_lore . add ( ChatColor . ITALIC + "" ) ;
temp_meta_lore . add ( ChatColor . ITALIC + "" + ChatColor . GRAY
+ "Includes enchanted boots and repair shards." ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . WRITTEN_BOOK ) ;
i . setItem ( count + = 2 , temp ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Output" ) ;
temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . ITALIC
+ "Grab your finished item here!" ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . CHEST ) ;
i . setItem ( count + = 2 , temp ) ;
temp_meta . setDisplayName ( ChatColor . YELLOW + "Experience Cost" ) ;
temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . ITALIC
+ "Experience Cost of Enchanting." ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . SLIME_BALL ) ;
i . setItem ( count + = 15 , temp ) ;
temp_meta . setDisplayName ( ChatColor . RESET + "Anvil Interface" ) ;
temp_meta_lore = new ArrayList < String > ( ) ;
temp_meta_lore . add ( ChatColor . GRAY + "Nothing to see here. Shoo!" ) ;
temp_meta . setLore ( temp_meta_lore ) ;
temp . setItemMeta ( temp_meta ) ;
temp . setType ( Material . COBBLESTONE ) ;
for ( int c = 0 ; c < 27 ; c + + ) {
if ( i . getItem ( c ) = = null ) {
i . setItem ( c , temp ) ;
}
}
i . setItem ( 10 , new ItemStack ( Material . AIR ) ) ;
i . setItem ( 12 , new ItemStack ( Material . AIR ) ) ;
i . setItem ( 14 , new ItemStack ( Material . AIR ) ) ;
i . setItem ( 16 , new ItemStack ( Material . AIR ) ) ;
e . setCancelled ( true ) ;
e . getPlayer ( ) . closeInventory ( ) ;
e . getPlayer ( ) . openInventory ( i ) ;
}
// 笆<EFBFBD> 笆<EFBFBD> (Player)e.getPlayer()).sendMessage(((Player)e.getPlayer()).getScoreboard().getPlayerTeam((OfflinePlayer)e.getPlayer()).getName());
// 笆<EFBFBD> 笆<EFBFBD> (Player)e.getPlayer()).sendMessage(((Player)e.getPlayer()).getScoreboard().getPlayerTeam((OfflinePlayer)e.getPlayer()).getName());
Player p = ( Player ) e . getPlayer ( ) ;
Player p = ( Player ) e . getPlayer ( ) ;
p . getScoreboard ( ) . getTeam ( p . getName ( ) ) . setPrefix ( ChatColor . DARK_GRAY + "" ) ;
p . getScoreboard ( ) . getTeam ( p . getName ( ) ) . setPrefix ( ChatColor . DARK_GRAY + "" ) ;
@ -9103,6 +9190,17 @@ public ItemStack getGoodie() {
savefile . set ( p . getName ( ) + ".settings.notify6" , Boolean . valueOf ( e . getInventory ( ) . getItem ( 24 ) . getType ( ) = = Material . REDSTONE_TORCH_ON ) ) ;
savefile . set ( p . getName ( ) + ".settings.notify6" , Boolean . valueOf ( e . getInventory ( ) . getItem ( 24 ) . getType ( ) = = Material . REDSTONE_TORCH_ON ) ) ;
this . plugin . saveAccountsConfig ( ) ;
this . plugin . saveAccountsConfig ( ) ;
}
}
if ( e . getInventory ( ) . getTitle ( ) . equalsIgnoreCase ( "Repair and Enchant" ) ) {
// We have to return the items the player placed inside the anvil
// interface.
for ( int i = 10 ; i < 16 ; i + = 2 ) {
if ( e . getInventory ( ) . getItem ( i ) ! = null
& & e . getInventory ( ) . getItem ( i ) . getType ( ) ! = Material . AIR ) {
p . getWorld ( ) . dropItemNaturally ( p . getLocation ( ) ,
e . getInventory ( ) . getItem ( i ) ) ;
}
}
}
}
}
@ -9547,7 +9645,7 @@ public ItemStack getGoodie() {
}
}
}
}
} else
} else
if ( event . getInventory ( ) . getType ( ) = = InventoryType . CHEST & & ! event . getInventory ( ) . getName ( ) . equalsIgnoreCase ( "Notification Options ") ) {
if ( event . getInventory ( ) . getType ( ) = = InventoryType . CHEST & & event . getInventory ( ) . getName ( ) . contains ( "Item Cube ") ) {
//If we click a chest, make sure it's not the same ID chest.
//If we click a chest, make sure it's not the same ID chest.
if ( event . getCurrentItem ( ) ! = null ) {
if ( event . getCurrentItem ( ) ! = null ) {
if ( ( event . getCurrentItem ( ) . getType ( ) = = Material . CHEST | | event . getCurrentItem ( ) . getType ( ) = = Material . TRAPPED_CHEST | | event . getCurrentItem ( ) . getType ( ) = = Material . ENDER_CHEST ) ) {
if ( ( event . getCurrentItem ( ) . getType ( ) = = Material . CHEST | | event . getCurrentItem ( ) . getType ( ) = = Material . TRAPPED_CHEST | | event . getCurrentItem ( ) . getType ( ) = = Material . ENDER_CHEST ) ) {
@ -9607,20 +9705,286 @@ public ItemStack getGoodie() {
}
}
}
}
}
}
} else
} else if ( event . getInventory ( ) . getTitle ( ) . equalsIgnoreCase ( "Repair and Enchant" ) ) {
if ( event . getInventory ( ) . getName ( ) . equalsIgnoreCase ( "Notification Options" ) ) {
final int INPUT = 10 ;
if ( event . getSlotType ( ) = = SlotType . CONTAINER & & ( event . getSlot ( ) = = 2 | | event . getSlot ( ) = = 6 | |
final int MATERIALS = 12 ;
event . getSlot ( ) = = 11 | | event . getSlot ( ) = = 15 | |
final int MAGIC = 14 ;
event . getSlot ( ) = = 20 | | event . getSlot ( ) = = 24 ) ) {
final int OUTPUT = 16 ;
final int LEVELS = 22 ;
boolean anvilClicked = false ;
Bukkit . getLogger ( ) . info ( "Anvil interface CLICK at slot #" + event . getRawSlot ( ) ) ;
if ( event . getRawSlot ( ) < 27 ) {
anvilClicked = true ;
Bukkit . getLogger ( ) . info ( "Anvil clicked." ) ;
} else {
Bukkit . getLogger ( ) . info ( "Inventory clicked." ) ;
}
if ( ! anvilClicked ) {
// Clicked the inventory. Leave the operation alone UNLESS it's a shift-click operation.
if ( event . isShiftClick ( ) ) {
// Call the scheduled task to validate and update the inventory
Bukkit . getServer ( ) . getScheduler ( ) . scheduleSyncDelayedTask ( this . plugin , new updateInventoryTask ( event . getWhoClicked ( ) . getName ( ) ) ) ;
}
} else {
// Clicked the anvil. If GUI items are clicked or an invalid operation happens, cancel the operation.
if ( event . getSlot ( ) = = INPUT | | event . getSlot ( ) = = MATERIALS
| | event . getSlot ( ) = = MAGIC | | event . getSlot ( ) = = OUTPUT )
{
/ *
* OUTPUT Block
* /
if ( event . getSlot ( ) = = OUTPUT & & event . getCursor ( ) ! = null & & event . getCursor ( ) . getType ( ) ! = Material . AIR & & ! matches ( event . getCursor ( ) , event . getCurrentItem ( ) ) ) {
Bukkit . getLogger ( ) . info ( "Anvil OUTPUT click." ) ;
event . setCancelled ( true ) ; // Cancel the event if trying to put items into the output slot
}
// If click on output and it's not null, take the item and clear anvil inventory
if ( event . getInventory ( ) . getContents ( ) [ OUTPUT ] ! = null
& & event . getSlot ( ) = = OUTPUT ) {
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." ) ;
p . sendMessage ( ChatColor . RED + "You don't have enough experience to do that!" ) ;
event . setCancelled ( true ) ;
} else {
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 ( ) ) ;
event . setCancelled ( true ) ; // Cancel event if cursor is not empty
if ( event . isShiftClick ( ) ) {
// 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" ) ;
if ( event
. getWhoClicked ( )
. getInventory ( )
. addItem (
event . getInventory ( ) . getContents ( ) [ OUTPUT ] )
. isEmpty ( ) ) {
Bukkit . getLogger ( ) . info ( "Can place into inventory." ) ;
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
// Set XP
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . setLevel ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLevel ( ) - event . getInventory ( ) . getContents ( ) [ LEVELS ] . getAmount ( ) ) ;
Bukkit . getLogger ( ) . info ( "Item is: " + event . getInventory ( ) . getItem ( OUTPUT ) ) ;
// Play anvil sound
if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "IRON" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "GOLD" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "DIAMOND" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "CHAINMAIL" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . BLAZE_HIT , 10 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "WOOD" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOD , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "STONE" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_STONE , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "LEATHER" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOL , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "BOW" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "FISHING" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . ARROW_HIT , 10 , 1 ) ;
}
event . getInventory ( ) . setItem ( OUTPUT , new ItemStack ( Material . AIR ) ) ;
Bukkit . getServer ( ) . getScheduler ( ) . scheduleSyncDelayedTask ( this . plugin , new updateInventoryTask ( event . getWhoClicked ( ) . getName ( ) ) ) ;
}
}
} else {
Bukkit . getLogger ( ) . info ( "Anvil OUTPUT click with null mouse." ) ;
if ( event . isShiftClick ( ) ) {
event . setCancelled ( true ) ; // Cancel event if Shift-Click, run checks
// 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" ) ;
if ( event
. getWhoClicked ( )
. getInventory ( )
. addItem (
event . getInventory ( ) . getContents ( ) [ OUTPUT ] )
. isEmpty ( ) ) {
Bukkit . getLogger ( ) . info ( "Can place into inventory." ) ;
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
// Set XP
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . setLevel ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLevel ( ) - event . getInventory ( ) . getContents ( ) [ LEVELS ] . getAmount ( ) ) ;
// Play anvil sound
if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "IRON" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "GOLD" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "DIAMOND" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "CHAINMAIL" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . BLAZE_HIT , 10 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "WOOD" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOD , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "STONE" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_STONE , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "LEATHER" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOL , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "BOW" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "FISHING" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . ARROW_HIT , 10 , 1 ) ;
}
event . getInventory ( ) . setItem ( OUTPUT , new ItemStack ( Material . AIR ) ) ;
Bukkit . getServer ( ) . getScheduler ( ) . scheduleSyncDelayedTask ( this . plugin , new updateInventoryTask ( event . getWhoClicked ( ) . getName ( ) ) ) ;
}
} else {
Bukkit . getLogger ( ) . info ( "Normal click" ) ;
// Cursor is empty, item picked up. Subtract XP levels and remove ingredients.
event . getInventory ( ) . setItem ( INPUT , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MATERIALS , new ItemStack ( Material . AIR ) ) ;
event . getInventory ( ) . setItem ( MAGIC , new ItemStack ( Material . AIR ) ) ;
// event.getInventory().setItem(OUTPUT, new ItemStack(Material.AIR));
// Set XP
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . setLevel ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLevel ( ) - event . getInventory ( ) . getContents ( ) [ LEVELS ] . getAmount ( ) ) ;
// Play anvil sound
if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "IRON" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "GOLD" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "DIAMOND" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "CHAINMAIL" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . BLAZE_HIT , 10 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "WOOD" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOD , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "STONE" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_STONE , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "LEATHER" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . DIG_WOOL , 20 , 1 ) ;
} else if ( event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "BOW" ) | |
event . getInventory ( ) . getItem ( OUTPUT ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "FISHING" ) ) {
Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . playSound ( Bukkit . getPlayer ( event . getWhoClicked ( ) . getName ( ) ) . getLocation ( ) , Sound . ARROW_HIT , 10 , 1 ) ;
}
Bukkit . getServer ( ) . getScheduler ( ) . scheduleSyncDelayedTask ( this . plugin , new updateInventoryTask ( event . getWhoClicked ( ) . getName ( ) ) ) ;
}
}
}
}
boolean valid = false ;
if ( event . isShiftClick ( ) & & event . getRawSlot ( ) ! = OUTPUT ) {
valid = true ; // always valid if shift clicking an anvil slot that isn't the output.
}
if ( event . getCursor ( ) = = null | | event . getCursor ( ) . getType ( ) = = Material . AIR ) {
valid = true ; // always valid if cursor carries nothing
} else if ( event . getSlotType ( ) = = SlotType . CONTAINER & & event . getSlot ( ) = = INPUT ) {
/ *
* INPUT Block
* All tools and armor types , as well as fishing rods and bows .
* /
Bukkit . getLogger ( ) . info ( "Anvil INPUT click with this item on mouse: " + event . getCursor ( ) . getType ( ) . toString ( ) ) ;
if ( event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "HELMET" ) | | event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "CHESTPLATE" ) | |
event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "LEGGINGS" ) | | event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "BOOTS" ) | |
event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "PICKAXE" ) | | event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "SPADE" ) | |
event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "HOE" ) | | event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "AXE" ) | |
event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "SWORD" ) | | event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contains ( "FISHING" ) | |
event . getCursor ( ) . getType ( ) . toString ( ) . toUpperCase ( ) . contentEquals ( "BOW" ) ) {
valid = true ;
}
if ( event . getCursor ( ) . getDurability ( ) = = 0 )
{
// Can't put fully repaired item into input slot.
valid = false ;
}
} else if ( event . getSlotType ( ) = = SlotType . CONTAINER & & event . getSlot ( ) = = MATERIALS ) {
/ *
* MATERIALS Block
* Leather , string , wood , cobble , iron , gold , and diamond allowed .
* /
Bukkit . getLogger ( ) . info ( "Anvil MATERIALS click with this item on mouse: " + event . getCursor ( ) . getType ( ) . toString ( ) ) ;
if ( event . getCursor ( ) . getType ( ) = = Material . LEATHER | | event . getCursor ( ) . getType ( ) = = Material . IRON_INGOT | |
event . getCursor ( ) . getType ( ) = = Material . GOLD_INGOT | | event . getCursor ( ) . getType ( ) = = Material . IRON_BLOCK | |
event . getCursor ( ) . getType ( ) = = Material . DIAMOND_BLOCK | | event . getCursor ( ) . getType ( ) = = Material . DIAMOND | |
event . getCursor ( ) . getType ( ) = = Material . WOOD | | event . getCursor ( ) . getType ( ) = = Material . COBBLESTONE | |
event . getCursor ( ) . getType ( ) = = Material . STRING ) {
valid = true ;
}
} else if ( event . getSlotType ( ) = = SlotType . CONTAINER & & event . getSlot ( ) = = MAGIC ) {
/ *
* MAGIC Block
* Shards and Enchanted Books allowed .
* Not implemented yet , so nothing is allowed at the moment .
* /
Bukkit . getLogger ( ) . info ( "Anvil MAGIC click with this item on mouse: " + event . getCursor ( ) . getType ( ) . toString ( ) ) ;
/ *
if ( event . getCursor ( ) . getType ( ) = = Material . FLINT | | event . getCursor ( ) . getType ( ) = = Material . QUARTZ | |
event . getCursor ( ) . getType ( ) = = Material . NETHER_STAR | | event . getCursor ( ) . getType ( ) = = Material . ENCHANTED_BOOK ) {
valid = true ;
}
* /
}
if ( ! valid ) {
event . setCancelled ( true ) ;
} else {
// Update the inventory if it is valid
// Set up anvil inventory update scheduler
Bukkit . getServer ( ) . getScheduler ( ) . scheduleSyncDelayedTask ( this . plugin , new updateInventoryTask ( event . getWhoClicked ( ) . getName ( ) ) ) ;
}
} else {
event . setCancelled ( true ) ;
}
}
} else if ( event . getInventory ( ) . getName ( ) . equalsIgnoreCase ( "Notification Options" ) ) {
boolean optionsClicked ;
if ( event . getRawSlot ( ) < 27 ) {
optionsClicked = true ;
// Bukkit.getLogger().info("Options clicked.");
} else {
optionsClicked = false ;
// Bukkit.getLogger().info("Inventory clicked.");
}
if ( optionsClicked & & ( event . getSlot ( ) % 9 = = 2 | | event . getSlot ( ) % 9 = = 6 ) ) {
if ( event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . getType ( ) = = Material . REDSTONE_TORCH_OFF ) {
if ( event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . getType ( ) = = Material . REDSTONE_TORCH_OFF ) {
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . setType ( Material . REDSTONE_TORCH_ON ) ;
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . setType ( Material . REDSTONE_TORCH_ON ) ;
} else {
} else {
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . setType ( Material . REDSTONE_TORCH_OFF ) ;
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) ] . setType ( Material . REDSTONE_TORCH_OFF ) ;
}
}
}
}
if ( event . getSlotType ( ) = = SlotType . CONTAINER & & ( event . getSlot ( ) = = 1 | | event . getSlot ( ) = = 5 | |
if ( optionsClicked & & ( event . getSlot ( ) % 9 = = 1 | | event . getSlot ( ) % 9 = = 5 ) ) {
event . getSlot ( ) = = 10 | | event . getSlot ( ) = = 14 | |
event . getSlot ( ) = = 19 | | event . getSlot ( ) = = 23 ) ) {
if ( event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) + 1 ] . getType ( ) = = Material . REDSTONE_TORCH_OFF ) {
if ( event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) + 1 ] . getType ( ) = = Material . REDSTONE_TORCH_OFF ) {
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) + 1 ] . setType ( Material . REDSTONE_TORCH_ON ) ;
event . getInventory ( ) . getContents ( ) [ event . getSlot ( ) + 1 ] . setType ( Material . REDSTONE_TORCH_ON ) ;
} else {
} else {
@ -12433,3 +12797,252 @@ public void onHangingBreakEntity(HangingBreakByEntityEvent e) {
}
}
class updateInventoryTask implements Runnable {
String playerName ;
public updateInventoryTask ( String pl ) {
playerName = pl ;
}
@Override
public void run ( ) {
Bukkit . getLogger ( ) . info ( "Runnable task run() called; player name: " + playerName ) ;
Player player = Bukkit . getPlayer ( playerName ) ;
Inventory anvilInv = player . getOpenInventory ( ) . getTopInventory ( ) ;
final int INPUT = 10 ;
final int MATERIALS = 12 ;
final int MAGIC = 14 ;
final int OUTPUT = 16 ;
final int LEVELS = 22 ;
if ( anvilInv . getItem ( INPUT ) = = null | | anvilInv . getItem ( MATERIALS ) = = null ) {
// No valid combo, set XP orb to stack size 1 and remove output.
anvilInv . getItem ( LEVELS ) . setAmount ( 1 ) ;
anvilInv . setItem ( OUTPUT , new ItemStack ( Material . AIR ) ) ;
}
else
{
// Redundant validation code for verification
if ( ! ( ( anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "HELMET" ) | | anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "CHESTPLATE" ) | |
anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "LEGGINGS" ) | | anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "BOOTS" ) | |
anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "PICKAXE" ) | | anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "SPADE" ) | |
anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "HOE" ) | | anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "AXE" ) | |
anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "SWORD" ) | | anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contains ( "FISHING" ) | |
anvilInv . getItem ( INPUT ) . toString ( ) . toUpperCase ( ) . contentEquals ( "BOW" ) ) & & anvilInv . getItem ( INPUT ) . getDurability ( ) ! = 0 ) ) {
sendToInventory ( anvilInv . getItem ( INPUT ) , anvilInv . getItem ( INPUT ) . getAmount ( ) , player , player . getInventory ( ) ) ;
Bukkit . getLogger ( ) . info ( "Invalid input!" ) ;
}
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 . STRING ) ) {
sendToInventory ( anvilInv . getItem ( MATERIALS ) , anvilInv . getItem ( MATERIALS ) . getAmount ( ) , player , player . getInventory ( ) ) ;
Bukkit . getLogger ( ) . info ( "Invalid materials!" ) ;
}
// Verify the right material is combined with the source item.
boolean validCombo = false ;
double multiplier = 0 ;
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . WOOD & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . WOOD_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . WOOD_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . WOOD_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . WOOD_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . WOOD_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 1 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . STRING & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . FISHING_ROD | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . BOW ) ) {
validCombo = true ;
multiplier = 1 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . COBBLESTONE & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . STONE_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . STONE_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . STONE_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . STONE_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . STONE_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 2 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . LEATHER & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . LEATHER_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . LEATHER_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . LEATHER_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . LEATHER_LEGGINGS ) ) {
validCombo = true ;
multiplier = 0 . 15 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . IRON_INGOT & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_LEGGINGS | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 8 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . IRON_BLOCK & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_LEGGINGS | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . IRON_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 08 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . IRON_INGOT & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . CHAINMAIL_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . CHAINMAIL_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . CHAINMAIL_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . CHAINMAIL_LEGGINGS ) ) {
validCombo = true ;
multiplier = 0 . 65 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . GOLD_INGOT & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_LEGGINGS | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . GOLD_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 3 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . DIAMOND & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_LEGGINGS | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_SPADE ) ) {
validCombo = true ;
multiplier = 1 . 2 ;
}
if ( anvilInv . getItem ( MATERIALS ) . getType ( ) = = Material . DIAMOND_BLOCK & & ( anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_BOOTS | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_CHESTPLATE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_HELMET | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_LEGGINGS | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_AXE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_SWORD | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_HOE | |
anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_PICKAXE | | anvilInv . getItem ( INPUT ) . getType ( ) = = Material . DIAMOND_SPADE ) ) {
validCombo = true ;
multiplier = 0 . 12 ;
}
if ( validCombo ) {
// 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.
// Limit to 5 just in case math doesn't work.
int maxItemsNeeded = Math . min ( 5 , 1 + ( 5 * anvilInv . getItem ( INPUT ) . getDurability ( ) / anvilInv . getItem ( INPUT ) . getType ( ) . getMaxDurability ( ) ) ) ;
if ( anvilInv . getItem ( MATERIALS ) . getAmount ( ) > maxItemsNeeded ) {
// Bukkit.getLogger().info("Materials exceed " + maxItemsNeeded + " stack. Dropping " + (anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded) + " of " + anvilInv.getItem(MATERIALS).getType());
sendToInventory ( anvilInv . getItem ( MATERIALS ) , anvilInv . getItem ( MATERIALS ) . getAmount ( ) - maxItemsNeeded , player , player . getInventory ( ) ) ;
// anvilInv.getItem(MATERIALS).setAmount(maxItemsNeeded);
}
int cost = anvilInv . getContents ( ) [ MATERIALS ] . getAmount ( ) * 2 ;
int bonus_cost = 0 ;
ItemStack item = anvilInv . getContents ( ) [ INPUT ] ;
Bukkit . getLogger ( ) . warning ( "Repair cost calculation valid" ) ;
Map < Enchantment , Integer > enchantments = item . getEnchantments ( ) ;
Bukkit . getLogger ( ) . warning ( enchantments . keySet ( ) . toString ( ) ) ;
for ( Enchantment e : enchantments . keySet ( ) ) {
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 ) ;
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 ) ;
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 ) ;
// anvilInv.getContents()[OUTPUT].setType(item.getType());
// 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 ( ) ) ) ;
}
// TRY EVERYTHING
player . getInventory ( ) . setContents ( player . getInventory ( ) . getContents ( ) ) ;
anvilInv . setContents ( anvilInv . getContents ( ) ) ;
player . updateInventory ( ) ;
}
}
public void sendToInventory ( ItemStack item , int number , Player player , Inventory target ) {
ItemStack temp = item . clone ( ) ;
temp . setAmount ( number ) ;
ItemStack leftovers = target . addItem ( temp ) . get ( 0 ) ;
if ( leftovers ! = null ) {
player . getWorld ( ) . dropItemNaturally ( player . getLocation ( ) , leftovers ) ;
}
item . setAmount ( item . getAmount ( ) - number ) ;
if ( item . getAmount ( ) - number = = 0 ) {
item . setType ( Material . AIR ) ;
Bukkit . getLogger ( ) . info ( "Item stack size reduced to 0, " + item . getType ( ) . toString ( ) + " removed." ) ;
}
// player.getWorld().dropItemNaturally(player.getLocation(), new ItemStack(anvilInv.getItem(MATERIALS).getType(), anvilInv.getItem(MATERIALS).getAmount() - maxItemsNeeded));
}
}