diff --git a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java b/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java index ce0b6e711..209fa31f8 100644 --- a/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java +++ b/src/me/mrCookieSlime/Slimefun/AncientAltar/RitualAnimation.java @@ -1,11 +1,13 @@ package me.mrCookieSlime.Slimefun.AncientAltar; import java.util.ArrayList; +import java.util.HashSet; import java.util.List; import me.mrCookieSlime.CSCoreLibPlugin.general.Particles.MC_1_8.ParticleEffect; import me.mrCookieSlime.Slimefun.SlimefunStartup; import me.mrCookieSlime.Slimefun.listeners.AncientAltarListener; +import me.mrCookieSlime.Slimefun.Variables; import org.bukkit.Effect; import org.bukkit.Location; @@ -92,9 +94,9 @@ public class RitualAnimation implements Runnable { private void abort() { running = false; - for (ItemStack stack: items) { - l.getWorld().dropItemNaturally(l, stack); - } +// for (ItemStack stack: items) { +// l.getWorld().dropItemNaturally(l, stack); +// } l.getWorld().playSound(l, Sound.BLOCK_NOTE_SNARE, 5F, 1F); altars.remove(altar); } @@ -103,6 +105,12 @@ public class RitualAnimation implements Runnable { l.getWorld().playSound(l, Sound.ENTITY_ZOMBIE_VILLAGER_CURE, 1F, 1F); l.getWorld().playEffect(l, Effect.STEP_SOUND, Material.EMERALD_BLOCK); l.getWorld().dropItemNaturally(l.add(0, 1, 0), output); + + pedestals.forEach((pblock)->{ + Variables.altarinuse.remove(pblock.getLocation()); + }); + Variables.altarinuse.remove(altar.getLocation()); // should re-enable altar blocks on craft completion. + altars.remove(altar); } diff --git a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java index 849570de0..c8894068a 100644 --- a/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java +++ b/src/me/mrCookieSlime/Slimefun/Lists/SlimefunItems.java @@ -705,7 +705,7 @@ public class SlimefunItems { PROGRAMMABLE_ANDROID = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzUwM2NiN2VkODQ1ZTdhNTA3ZjU2OWFmYzY0N2M0N2FjNDgzNzcxNDY1YzlhNjc5YTU0NTk0Yzc2YWZiYSJ9fX0="), "&cProgrammable Android &7(Normal)", "", "&8\u21E8 &7Function: None", "&8\u21E8 &7Fuel Efficiency: 1.0x"); PROGRAMMABLE_ANDROID_FARMER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZjlkMzMzNTdlODQxODgyM2JmNzgzZGU5MmRlODAyOTFiNGViZDM5MmFlYzg3MDY2OThlMDY4OTZkNDk4ZjYifX19"), "&cProgrammable Android &7(Farmer)", "", "&8\u21E8 &7Function: Farming", "&8\u21E8 &7Fuel Efficiency: 1.0x"); - PROGRAMMABLE_ANDROID_MINER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTYzOGEyODU0MWFiM2FlMGE3MjNkNTU3ODczOGUwODc1ODM4OGVjNGMzMzI0N2JkNGNhMTM0ODJhZWYzMzQifX19"), "§cProgrammable Android &7(Miner)", "", "§8\u21E8 §7Function: Mining", "§8\u21E8 §7Fuel Efficiency: 1.0x"); + PROGRAMMABLE_ANDROID_MINER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZTYzOGEyODU0MWFiM2FlMGE3MjNkNTU3ODczOGUwODc1ODM4OGVjNGMzMzI0N2JkNGNhMTM0ODJhZWYzMzQifX19"), "&cProgrammable Android &7(Miner)", "", "&8\u21E8 &7Function: Mining", "&8\u21E8 &7Fuel Efficiency: 1.0x"); PROGRAMMABLE_ANDROID_WOODCUTTER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvZDMyYTgxNDUxMDE0MjIwNTE2OWExYWQzMmYwYTc0NWYxOGU5Y2I2YzY2ZWU2NGVjYTJlNjViYWJkZWY5ZmYifX19"), "&cProgrammable Android &7(Woodcutter)", "", "&8\u21E8 &7Function: Woodcutting", "&8\u21E8 &7Fuel Efficiency: 1.0x"); PROGRAMMABLE_ANDROID_BUTCHER = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvM2I0NzJkZjBhZDlhM2JlODhmMmU1ZDVkNDIyZDAyYjExNmQ2NGQ4ZGYxNDc1ZWQzMmU1NDZhZmM4NGIzMSJ9fX0="), "&cProgrammable Android &7(Butcher)", "", "&8\u21E8 &7Function: Slaughtering", "&8\u21E8 &7Damage: 4", "&8\u21E8 &7Fuel Efficiency: 1.0x"); PROGRAMMABLE_ANDROID_FISHERMAN = new CustomItem(CustomSkull.getItem("eyJ0ZXh0dXJlcyI6eyJTS0lOIjp7InVybCI6Imh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMzQ1ZTg3MzNhNzMxMTQzMzNiOThiMzYwMTc1MTI0MTcyMmY0NzEzZTFhMWE1ZDM2ZmJiMTMyNDkzZjFjNyJ9fX0="), "&cProgrammable Android &7(Fisherman)", "", "&8\u21E8 &7Function: Fishing", "&8\u21E8 &7Success Rate: 10%", "&8\u21E8 &7Fuel Efficiency: 1.0x"); diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java index d8ad926dd..992acd1d0 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/SlimefunItem.java @@ -331,7 +331,7 @@ public class SlimefunItem { public static SlimefunItem getByItem(ItemStack item) { if (item == null) return null; if (SlimefunManager.isItemSimiliar(item, SlimefunItems.BROKEN_SPAWNER, false)) return getByID("BROKEN_SPAWNER"); - if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REPAIRED_SPAWNER, false)) return getByID("REPAIRED_SPAWNER"); + if (SlimefunManager.isItemSimiliar(item, SlimefunItems.REPAIRED_SPAWNER, false)) return getByID("REINFORCED_SPAWNER"); for (SlimefunItem sfi: items) { if (sfi instanceof ChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; else if (sfi instanceof DamagableChargableItem && SlimefunManager.isItemSimiliar(item, sfi.getItem(), false)) return sfi; diff --git a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java index ed6e52c35..27b954281 100644 --- a/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java +++ b/src/me/mrCookieSlime/Slimefun/Objects/SlimefunItem/machines/AutoDisenchanter.java @@ -97,7 +97,10 @@ public class AutoDisenchanter extends AContainer { ItemStack item = BlockStorage.getInventory(b).getItemInSlot(slot); // Check if disenchantable - SlimefunItem sfItem = SlimefunItem.getByItem(item); + SlimefunItem sfItem = null; + if ((item != null) && (item.getType() != Material.BOOK)) { // stops endless checks of getByItem for empty book stacks. + sfItem = SlimefunItem.getByItem(item); + } if (sfItem != null && !sfItem.isDisenchantable()) return; // Disenchant diff --git a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java index f93c01af5..455eee37b 100644 --- a/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java +++ b/src/me/mrCookieSlime/Slimefun/SlimefunStartup.java @@ -439,6 +439,7 @@ public class SlimefunStartup extends JavaPlugin { Variables.jump = null; Variables.mode = null; SlimefunGuide.history = null; + Variables.altarinuse = null; Variables.enchanting = null; Variables.backpack = null; Variables.soulbound = null; diff --git a/src/me/mrCookieSlime/Slimefun/Variables.java b/src/me/mrCookieSlime/Slimefun/Variables.java index 2d5ef8306..d47a44372 100644 --- a/src/me/mrCookieSlime/Slimefun/Variables.java +++ b/src/me/mrCookieSlime/Slimefun/Variables.java @@ -2,10 +2,12 @@ package me.mrCookieSlime.Slimefun; import java.util.ArrayList; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.UUID; +import org.bukkit.Location; import org.bukkit.entity.Entity; import org.bukkit.inventory.ItemStack; @@ -18,6 +20,7 @@ public class Variables { public static Map enchanting = new HashMap(); public static Map backpack = new HashMap(); + public static HashSet altarinuse = new HashSet(); public static Map> soulbound = new HashMap>(); public static List blocks = new ArrayList(); diff --git a/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java b/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java index 6b01452db..a5a041f01 100644 --- a/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java +++ b/src/me/mrCookieSlime/Slimefun/listeners/AncientAltarListener.java @@ -16,6 +16,7 @@ import me.mrCookieSlime.Slimefun.AncientAltar.RitualAnimation; import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.Setup.Messages; import me.mrCookieSlime.Slimefun.api.BlockStorage; +import me.mrCookieSlime.Slimefun.Variables; import org.bukkit.Bukkit; import org.bukkit.Material; @@ -51,6 +52,10 @@ public class AncientAltarListener implements Listener { SlimefunItem item = BlockStorage.check(b); if (item != null) { if (item.getID().equals("ANCIENT_PEDESTAL")) { + if (Variables.altarinuse.contains(b.getLocation())) { + e.setCancelled(true); + return; + } e.setCancelled(true); Item stack = findItem(b); if (stack == null) { @@ -80,6 +85,11 @@ public class AncientAltarListener implements Listener { } } else if (item.getID().equals("ANCIENT_ALTAR")) { + if (Variables.altarinuse.contains(b.getLocation())) { + e.setCancelled(true); + return; + } + Variables.altarinuse.add(b.getLocation()); // make altarinuse simply because that was the last block clicked. e.setCancelled(true); ItemStack catalyst = new CustomItem(e.getPlayer().getInventory().getItemInMainHand(), 1); @@ -88,6 +98,9 @@ public class AncientAltarListener implements Listener { if (!altars.contains(e.getClickedBlock())) { altars.add(e.getClickedBlock()); if (pedestals.size() == 8) { + pedestals.forEach((pblock)->{ + Variables.altarinuse.add(pblock.getLocation()); + }); if (catalyst != null && !catalyst.getType().equals(Material.AIR)) { List input = new ArrayList(); for (Block pedestal: pedestals) { @@ -105,16 +118,25 @@ public class AncientAltarListener implements Listener { else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-recipe", true); + pedestals.forEach((pblock)->{ + Variables.altarinuse.remove(pblock.getLocation()); + }); + Variables.altarinuse.remove(b.getLocation()); // bad recipe, no longer in use. } } else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.unknown-catalyst", true); + pedestals.forEach((pblock)->{ + Variables.altarinuse.remove(pblock.getLocation()); + }); + Variables.altarinuse.remove(b.getLocation()); // unkown catalyst, no longer in use } } else { altars.remove(e.getClickedBlock()); Messages.local.sendTranslation(e.getPlayer(), "machines.ANCIENT_ALTAR.not-enough-pedestals", true, new Variable("%pedestals%", String.valueOf(pedestals.size()))); + Variables.altarinuse.remove(b.getLocation()); // not a valid altar so remove from inuse } } }