Anvil code largely implemented. Shift-clicking from inventory still

doesn't work seamlessly (Shift-click places into different inventory
slot than , but otherwise functionality is present. Notification Options
bug fixed. Anvil sounds do not play for nearby players. Anvil dupes
items in specific conditions. event.getCursor() apparently returns
an air stack and not null in certain conditions. Suggest code review.
devAnvil
Nonoriri 11 years ago
parent f3994f0269
commit c97f048847
  1. 683
      BankEconomyMod/src/me/kaZep/Base/PlayerListener.java

@ -196,7 +196,7 @@ import me.kaZep.Base.SupportEntity;
import me.kaZep.Base.SupportPlayer;
public class PlayerListener
implements Listener
implements Listener
{
public Main plugin;
@ -5187,7 +5187,7 @@ public class PlayerListener
}
}
public ItemStack getGoodie() {
public ItemStack getGoodie() {
ItemStack item = null;
if (Math.random()<0.33) {
//Add a weapon/armor piece.
@ -5863,7 +5863,7 @@ public ItemStack getGoodie() {
}
}
return item;
}
}
@EventHandler
public void onEnemyKill(EntityDeathEvent e) {
@ -6392,6 +6392,93 @@ public ItemStack getGoodie() {
@EventHandler
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());
Player p = (Player)e.getPlayer();
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));
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
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 (event.getCurrentItem()!=null) {
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
if (event.getInventory().getName().equalsIgnoreCase("Notification Options")) {
if (event.getSlotType()==SlotType.CONTAINER && (event.getSlot()==2 || event.getSlot()==6 ||
event.getSlot()==11 || event.getSlot()==15 ||
event.getSlot()==20 || event.getSlot()==24)) {
} else if (event.getInventory().getTitle().equalsIgnoreCase("Repair and Enchant")) {
final int INPUT = 10;
final int MATERIALS = 12;
final int MAGIC = 14;
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) {
event.getInventory().getContents()[event.getSlot()].setType(Material.REDSTONE_TORCH_ON);
} else {
event.getInventory().getContents()[event.getSlot()].setType(Material.REDSTONE_TORCH_OFF);
}
}
if (event.getSlotType()==SlotType.CONTAINER && (event.getSlot()==1 || event.getSlot()==5 ||
event.getSlot()==10 || event.getSlot()==14 ||
event.getSlot()==19 || event.getSlot()==23)) {
if (optionsClicked && (event.getSlot() % 9 == 1 || event.getSlot() % 9 == 5)) {
if (event.getInventory().getContents()[event.getSlot()+1].getType()==Material.REDSTONE_TORCH_OFF) {
event.getInventory().getContents()[event.getSlot()+1].setType(Material.REDSTONE_TORCH_ON);
} else {
@ -10328,7 +10692,7 @@ public ItemStack getGoodie() {
}
@EventHandler
public void onMinecartExit(VehicleExitEvent e) {
public void onMinecartExit(VehicleExitEvent e) {
if (e.getVehicle().getType()==EntityType.MINECART && e.getVehicle().getPassenger().getType()==EntityType.PLAYER && ((Player)e.getVehicle().getPassenger()).isOnline()) {
Bukkit.getWorld("world").dropItemNaturally(e.getVehicle().getLocation(),new ItemStack(Material.MINECART));
e.getVehicle().remove();
@ -10336,7 +10700,7 @@ public void onMinecartExit(VehicleExitEvent e) {
}
@EventHandler
public void onMinecartEnter(VehicleEnterEvent e) {
public void onMinecartEnter(VehicleEnterEvent e) {
/*if (e.getEntered().getType()==EntityType.PLAYER) {
if (e.getVehicle().getType()==EntityType.MINECART) {
Minecart m = (Minecart)e.getVehicle();
@ -10380,8 +10744,8 @@ public void onMinecartEnter(VehicleEnterEvent e) {
}
}*/
@EventHandler
public void onShootArrow(ProjectileHitEvent e) {
@EventHandler
public void onShootArrow(ProjectileHitEvent e) {
LivingEntity l = e.getEntity().getShooter();
if (l!=null && l.getType()==EntityType.SKELETON && l.getCustomName()!=null) {
if ((l.getCustomName().compareTo(ChatColor.YELLOW+"Sniper")==0)) {
@ -10402,10 +10766,10 @@ public void onShootArrow(ProjectileHitEvent e) {
}
}
}
}
}
@EventHandler
public void onEntityExpode(ExplosionPrimeEvent e) {
@EventHandler
public void onEntityExpode(ExplosionPrimeEvent e) {
//Bukkit.getPlayer("AaMay").sendMessage("Entity Type: "+e.getEntity().getType().getName());
if (e.getEntity().getType()==EntityType.CREEPER) {
LivingEntity c = (LivingEntity)e.getEntity();
@ -10443,9 +10807,9 @@ public void onEntityExpode(ExplosionPrimeEvent e) {
}
}
//Bukkit.broadcastMessage("Explosion occurs.");
}
}
/*
/*
@SuppressWarnings("deprecation")
@EventHandler
public void onPlayerMove(PlayerMoveEvent e) {
@ -10843,7 +11207,7 @@ public void onEntityExpode(ExplosionPrimeEvent e) {
String secondpart=name.substring(firstpart.length(),name.length()-firstpart.length());
event.setTag(ChatColor.GREEN + firstpart + ChatColor.DARK_RED + secondpart);
}
*/
*/
@EventHandler
public void onPlayerLeave(PlayerQuitEvent e) {
@ -12249,15 +12613,15 @@ public void onEntityExpode(ExplosionPrimeEvent e) {
else;
}
public boolean special_convert(Material mat) {
public boolean special_convert(Material mat) {
if (mat==Material.WOOL || mat==Material.INK_SACK || mat==Material.CARPET) {
return true;
} else {
return false;
}
}
}
public String convertToItemName(String val) {
public String convertToItemName(String val) {
val=val.replace('_', ' ');
char[] mod = val.toCharArray();
boolean first=false;
@ -12285,9 +12649,9 @@ public String convertToItemName(String val) {
}
}
return String.valueOf(mod);
}
}
public String convertToItemName(String val, short data, Material material_id) {
public String convertToItemName(String val, short data, Material material_id) {
String color = "";
String name = "";
switch (material_id) {
@ -12405,27 +12769,27 @@ public String convertToItemName(String val, short data, Material material_id) {
}
}
return String.valueOf(color+" "+name);
}
}
@EventHandler
public void onHangingBreak(HangingBreakEvent e) {
@EventHandler
public void onHangingBreak(HangingBreakEvent e) {
//Bukkit.broadcastMessage(""+e.getCause());
if (e.getCause().name().equalsIgnoreCase(RemoveCause.DEFAULT.name()) || e.getCause().name().equalsIgnoreCase(RemoveCause.EXPLOSION.name())) {
//Prevent this from happening here.
e.setCancelled(true);
}
}
}
@EventHandler
public void onHangingBreakEntity(HangingBreakByEntityEvent e) {
@EventHandler
public void onHangingBreakEntity(HangingBreakByEntityEvent e) {
//Bukkit.broadcastMessage(""+e.getRemover().getType());
if (e.getRemover().getType()==EntityType.LIGHTNING || (e.getRemover() instanceof Monster)) {
//Prevent this from happening here.
e.setCancelled(true);
}
}
}
/*
/*
@EventHandler
public void onLightningStrike(LightningStrikeEvent e) {
Bukkit.getWorld("world").strikeLightning(new Location("world", Bukkit.getOnlinePlayers()[(int)(Math.random()*Bukkit.getOnlinePlayers().length)].getLocation().getX(), 0d, 0d));
@ -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));
}
}

Loading…
Cancel
Save