diff --git a/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/interfaces/VirtualCraftingHolder.java b/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/interfaces/VirtualCraftingHolder.java index ae49c10..f57e6df 100644 --- a/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/interfaces/VirtualCraftingHolder.java +++ b/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/interfaces/VirtualCraftingHolder.java @@ -125,6 +125,8 @@ public class VirtualCraftingHolder implements InventoryHolder { if(recipe != null){ setCrafting(recipe); playSound(Sound.BLOCK_NOTE_BLOCK_CHIME,0.5f,1f); + } else { + stopCraftingItems(); } isUpdatingRecipe = false; updateGUI(); @@ -185,7 +187,7 @@ public class VirtualCraftingHolder implements InventoryHolder { } public void startCraftingItems(){ - craftItemTask = new CraftItems(); + if(craftItemTask == null || craftItemTask.isCancelled()) craftItemTask = new CraftItems(); } public void stopCraftingItems(){ if(craftItemTask != null) craftItemTask.cancel(); @@ -234,6 +236,9 @@ public class VirtualCraftingHolder implements InventoryHolder { //Play sound if crafting occured. if(didCraft) if(location.getLocation().getWorld() != null) { location.getLocation().getWorld().playSound(location.getLocation(), Sound.BLOCK_DISPENSER_DISPENSE, 0.25f, 1f); + if(output.getHolder() instanceof VirtualInventoryHolder){ + ((VirtualInventoryHolder) output.getHolder()).getStorage().updateDisplayItem(); + } } } } diff --git a/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/storage/abstracts/AbstractStorage.java b/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/storage/abstracts/AbstractStorage.java index 0603d1f..439c740 100644 --- a/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/storage/abstracts/AbstractStorage.java +++ b/ChestsPlusPlus_Main/src/main/java/com/jamesdpeters/minecraft/chests/storage/abstracts/AbstractStorage.java @@ -46,6 +46,8 @@ public abstract class AbstractStorage implements ConfigurationSerializable { private List locationInfoList; private Inventory inventory; + private int signUpdateTask; + public AbstractStorage(OfflinePlayer player, String identifier, Location location, Location signLocation){ this.player = player; this.playerUUID = player.getUniqueId(); @@ -118,16 +120,7 @@ public abstract class AbstractStorage implements ConfigurationSerializable { private void init(){ if(shouldDisplayArmourStands()) { - Bukkit.getScheduler().scheduleSyncRepeatingTask(ChestsPlusPlus.PLUGIN, () -> { - for (LocationInfo locationInfo : locationInfoList) { - World world = locationInfo.getLocation().getWorld(); - if (world != null) { - //Make client think sign is invisible. - if (displayItem != null) world.getPlayers().forEach(player -> player.sendBlockChange(locationInfo.getSignLocation(), air)); - else locationInfo.getSignLocation().getBlock().getState().update(); - } - } - }, 1, 1); + startSignChangeTask(); } else { for (LocationInfo locationInfo : locationInfoList) { locationInfo.getSignLocation().getBlock().getState().update(); @@ -135,6 +128,15 @@ public abstract class AbstractStorage implements ConfigurationSerializable { } } + private int startSignChangeTask(){ + return Bukkit.getScheduler().scheduleSyncRepeatingTask(ChestsPlusPlus.PLUGIN, () -> Bukkit.getOnlinePlayers().forEach(player -> { + for (LocationInfo locationInfo : locationInfoList) { + if (displayItem != null) player.sendBlockChange(locationInfo.getSignLocation(), air); + else locationInfo.getSignLocation().getBlock().getState().update(); + } + }), 1, 5); + } + /** * This is called after the config has loaded into memory. */ @@ -358,6 +360,12 @@ public abstract class AbstractStorage implements ConfigurationSerializable { private ItemStack displayItem; public void onItemDisplayUpdate(ItemStack newItem){ + if(displayItem == null || displayItem.getType().equals(Material.AIR)){ + Bukkit.getScheduler().cancelTask(signUpdateTask); + signUpdateTask = -1; + } else { + if(signUpdateTask == -1) signUpdateTask = startSignChangeTask(); + } displayItem = newItem; updateClients(); }