diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java index 7b78c9b..2f04a69 100644 --- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java +++ b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Filter.java @@ -1,5 +1,6 @@ package com.songoda.epichoppers.api.hopper; +import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; @@ -18,7 +19,7 @@ public interface Filter { void setVoidList(List voidList); - Block getEndPoint(); + Location getEndPoint(); - void setEndPoint(Block endPoint); + void setEndPoint(Location endPoint); } diff --git a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java index 1900c95..26f356f 100644 --- a/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java +++ b/EpicHoppers-API/src/main/java/com/songoda/epichoppers/api/hopper/Hopper.java @@ -109,9 +109,9 @@ public interface Hopper { */ void setTeleportTrigger(TeleportTrigger teleportTrigger); - List getLinkedBlocks(); + List getLinkedBlocks(); - void addLinkedBlock(Block block); + void addLinkedBlock(Location block); void clearLinkedBlocks(); diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java index 50aaa22..3d33048 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/EpicHoppersPlugin.java @@ -151,15 +151,15 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers { if (storage.containsGroup("sync")) { for (StorageRow row : storage.getRowsByGroup("sync")) { Location location = Serialize.getInstance().unserializeLocation(row.getKey()); - if (location == null || location.getBlock() == null) return; + if (location == null) return; int level = row.get("level").asInt(); List blockLoc = row.get("block").asStringList(); - List blocks = new ArrayList<>(); + List blocks = new ArrayList<>(); if (blockLoc != null) { for (String string : blockLoc) { - blocks.add(Arconix.pl().getApi().serialize().unserializeLocation(string).getBlock()); + blocks.add(Arconix.pl().getApi().serialize().unserializeLocation(string)); } } @@ -177,7 +177,7 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers { Material autoCrafting = Material.valueOf(row.get("autocrafting").asString() == null ? "AIR" : row.get("autocrafting").asString()); String blackLoc = row.get("black").asString(); - Block black = blackLoc == null ? null : Arconix.pl().getApi().serialize().unserializeLocation(blackLoc).getBlock(); + Location black = blackLoc == null ? null : Arconix.pl().getApi().serialize().unserializeLocation(blackLoc); EFilter filter = new EFilter(); @@ -319,7 +319,7 @@ public class EpicHoppersPlugin extends JavaPlugin implements EpicHoppers { new StorageItem("whitelist", hopper.getFilter().getWhiteList()), new StorageItem("blacklist", hopper.getFilter().getBlackList()), new StorageItem("void", hopper.getFilter().getVoidList()), - new StorageItem("black", hopper.getFilter().getEndPoint() == null ? null : Arconix.pl().getApi().serialize().serializeLocation(hopper.getFilter().getEndPoint().getLocation()))); + new StorageItem("black", hopper.getFilter().getEndPoint() == null ? null : Arconix.pl().getApi().serialize().serializeLocation(hopper.getFilter().getEndPoint()))); } /* diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/HopHandler.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/HopHandler.java index 5e5e14c..afc02b2 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/HopHandler.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/HopHandler.java @@ -30,7 +30,6 @@ public class HopHandler { try { this.instance = instance; Bukkit.getScheduler().scheduleSyncDelayedTask(instance, () -> { - hopperCleaner(); Bukkit.getScheduler().scheduleSyncRepeatingTask(instance, this::hopperRunner, 0, instance.getConfig().getLong("Main.Amount of Ticks Between Hops")); }, 40L); } catch (Exception e) { @@ -38,48 +37,27 @@ public class HopHandler { } } - private void hopperCleaner() { - try { - ConfigurationSection data = instance.getConfig().createSection("data"); - if (!data.contains("sync")) return; - for (String key : data.getConfigurationSection("sync").getKeys(false)) { - if (Arconix.pl().getApi().serialize().unserializeLocation(key).getWorld() == null) continue; - Block block = Arconix.pl().getApi().serialize().unserializeLocation(key).getBlock(); - if (block != null && block.getState() instanceof Hopper) continue; - data.getConfigurationSection("sync").set(key, null); - instance.getLogger().info("EpicHoppers Removing non-hopper entry: " + key); - } - } catch (Exception e) { - Debugger.runReport(e); - } - } - private void hopperRunner() { try { main: for (com.songoda.epichoppers.api.hopper.Hopper hopper : new HashMap<>(instance.getHopperManager().getHoppers()).values()) { - Location location = hopper.getLocation(); int x = location.getBlockX() >> 4; int z = location.getBlockZ() >> 4; - try { - if (!location.getWorld().isChunkLoaded(x, z)) { - continue; - } - } catch (Exception e) { + if (!location.getWorld().isChunkLoaded(x, z)) continue; - } - Block block = location.getBlock(); - if (block.isBlockPowered() || block.isBlockIndirectlyPowered()) continue; + Block block = location.getBlock(); if (block == null || block.getType() != Material.HOPPER) { instance.getHopperManager().removeHopper(location); continue; } + if (block.isBlockPowered() || block.isBlockIndirectlyPowered()) continue; + Hopper hopperBlock = hopper.getHopper(); List blockedMaterials = new ArrayList<>(); @@ -98,38 +76,33 @@ public class HopHandler { if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) continue; - for (Block destBlock : hopper.getLinkedBlocks()) { - Location dest = destBlock.getLocation(); - if (dest == null) continue; + for (Location destinationLocation : hopper.getLinkedBlocks()) { + if (destinationLocation == null) continue; int destx = location.getBlockX() >> 4; int destz = location.getBlockZ() >> 4; - if (!dest.getWorld().isChunkLoaded(destx, destz)) { - continue; - } - Block b2 = dest.getBlock(); - if (!(b2.getState() instanceof InventoryHolder)) { + if (!destinationLocation.getWorld().isChunkLoaded(destx, destz)) + continue; + + Block destinationBlock = destinationLocation.getBlock(); + if (!(destinationBlock.getState() instanceof InventoryHolder)) { hopper.clearLinkedBlocks(); continue; } - //InventoryHolder inventoryHolder = (InventoryHolder) b2.getState(); - //TODO add some restrictions here if needed - BoostData boostData = instance.getBoostManager().getBoost(hopper.getPlacedBy()); - int amt = hopper.getLevel().getAmount() * (boostData == null ? 1 : boostData.getMultiplier()); + int amount = hopper.getLevel().getAmount() * (boostData == null ? 1 : boostData.getMultiplier()); List whiteList = hopper.getFilter().getWhiteList(); - List blackList = hopper.getFilter().getBlackList(); for (int i = 0; i < 5; i++) { - ItemStack it; + ItemStack item; if (is[i] != null) { - it = is[i].clone(); - it.setAmount(1); + item = is[i].clone(); + item.setAmount(1); } if (hopper.getLocation().getBlock().isBlockPowered() || is[i] != null && blockedMaterials.contains(is[i].getType())) { @@ -137,25 +110,25 @@ public class HopHandler { if (i >= 5) continue; } - int finalI = i; + int finalIncrement = i; if (is[i] != null && !whiteList.isEmpty() - && whiteList.stream().noneMatch(itemStack -> itemStack.isSimilar(is[finalI]))) { - doBlacklist(hopperBlock, hopper, is[i].clone(), is, amt, i); + && whiteList.stream().noneMatch(itemStack -> itemStack.isSimilar(is[finalIncrement]))) { + doBlacklist(hopperBlock, hopper, is[i].clone(), is, amount, i); continue main; - } else { - if (is[i] != null && blackList.stream().noneMatch(itemStack -> itemStack.isSimilar(is[finalI]))) { - if (addItem(hopperBlock, hopper, b2, is[i], is, amt, i)) { - block.getState().update(); - continue main; - } - } else { - if (is[i] != null && blackList.stream().anyMatch(itemStack -> itemStack.isSimilar(is[finalI]))) { - doBlacklist(hopperBlock, hopper, is[i].clone(), is, amt, i); - continue main; - } + } + + if (is[i] != null && blackList.stream().noneMatch(itemStack -> itemStack.isSimilar(is[finalIncrement]))) { + if (addItem(hopperBlock, hopper, destinationBlock, is[i], is, amount, i)) { + //block.getState().update(); + continue main; } } + + if (is[i] != null && blackList.stream().anyMatch(itemStack -> itemStack.isSimilar(is[finalIncrement]))) { + doBlacklist(hopperBlock, hopper, is[i].clone(), is, amount, i); + continue main; + } } } } @@ -167,16 +140,17 @@ public class HopHandler { private void doBlacklist(Hopper hopperBlock, com.songoda.epichoppers.api.hopper.Hopper hopper, ItemStack item, ItemStack[] isS, int amt, int place) { try { - Location loc = hopperBlock.getLocation(); - Block block = loc.getBlock(); + Location location = hopperBlock.getLocation(); + Block block = location.getBlock(); if (hopper.getFilter().getEndPoint() != null && block != null && block.getState() instanceof Hopper) { - Location dest = hopper.getFilter().getEndPoint().getLocation(); - int destx = loc.getBlockX() >> 4; - int destz = loc.getBlockZ() >> 4; - if (!dest.getWorld().isChunkLoaded(destx, destz)) { + Location dest = hopper.getFilter().getEndPoint(); + int destx = location.getBlockX() >> 4; + int destz = location.getBlockZ() >> 4; + + if (!dest.getWorld().isChunkLoaded(destx, destz)) return; - } + Block b2 = dest.getBlock(); if (!(b2.getState() instanceof InventoryHolder)) { @@ -185,7 +159,7 @@ public class HopHandler { } addItem(hopperBlock, hopper, b2, item, isS, amt, place); - block.getState().update(); + //block.getState().update(); } } catch (Exception e) { diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java index 0ce1fb2..99dee43 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/handlers/TeleportHandler.java @@ -72,7 +72,15 @@ public class TeleportHandler { while (instance.getHopperManager().isHopper(next.getLocation()) && instance.getHopperManager().getHopper(next.getLocation()).getLinkedBlocks() != null && num != 15) { Hopper nextHopper = instance.getHopperManager().getHopper(next); if (nextHopper.getLinkedBlocks() != null && !nextHopper.getLinkedBlocks().isEmpty()) { - next = nextHopper.getLinkedBlocks().get(0); + Location location = nextHopper.getLinkedBlocks().get(0); + + int x = location.getBlockX() >> 4; + int z = location.getBlockZ() >> 4; + + if (!location.getWorld().isChunkLoaded(x, z)) + continue; + + next = location.getBlock(); } if (!next.getType().equals(Material.HOPPER)) { diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java index 60eceb0..8595943 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EFilter.java @@ -1,6 +1,7 @@ package com.songoda.epichoppers.hopper; import com.songoda.epichoppers.api.hopper.Filter; +import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; @@ -13,7 +14,7 @@ public class EFilter implements Filter { private List blackList = new ArrayList<>(); private List voidList = new ArrayList<>(); - private Block endPoint; + private Location endPoint; @Override public List getWhiteList() { @@ -49,12 +50,12 @@ public class EFilter implements Filter { } @Override - public Block getEndPoint() { + public Location getEndPoint() { return endPoint; } @Override - public void setEndPoint(Block endPoint) { + public void setEndPoint(Location endPoint) { this.endPoint = endPoint; } } diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java index 30bd9b2..a50529e 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/hopper/EHopper.java @@ -36,13 +36,13 @@ public class EHopper implements Hopper { private Level level; private UUID lastPlayer; private UUID placedBy; - private List linkedBlocks; + private List linkedBlocks; private Filter filter; private TeleportTrigger teleportTrigger; private Material autoCrafting; private org.bukkit.block.Hopper hopper; - public EHopper(Location location, Level level, UUID lastPlayer, UUID placedBy, List linkedBlocks, Filter filter, TeleportTrigger teleportTrigger, Material autoCrafting) { + public EHopper(Location location, Level level, UUID lastPlayer, UUID placedBy, List linkedBlocks, Filter filter, TeleportTrigger teleportTrigger, Material autoCrafting) { this.location = location; this.level = level; this.linkedBlocks = linkedBlocks; @@ -51,11 +51,18 @@ public class EHopper implements Hopper { this.placedBy = placedBy; this.teleportTrigger = teleportTrigger; this.autoCrafting = autoCrafting; + + int x = location.getBlockX() >> 4; + int z = location.getBlockZ() >> 4; + + if (!location.getWorld().isChunkLoaded(x, z)) + return; + this.reloadHopper(); this.syncName(); } - public EHopper(Block block, Level level, UUID lastPlayer, UUID placedBy, List linkedBlocks, Filter filter, TeleportTrigger teleportTrigger, Material autoCrafting) { + public EHopper(Block block, Level level, UUID lastPlayer, UUID placedBy, List linkedBlocks, Filter filter, TeleportTrigger teleportTrigger, Material autoCrafting) { this(block.getLocation(), level, lastPlayer, placedBy, linkedBlocks, filter, teleportTrigger, autoCrafting); } @@ -556,9 +563,9 @@ public class EHopper implements Hopper { } if (!filtered) - this.linkedBlocks.add(toLink); + this.linkedBlocks.add(toLink.getLocation()); else - this.filter.setEndPoint(toLink); + this.filter.setEndPoint(toLink.getLocation()); this.lastPlayer = player.getUniqueId(); if (level.getLinkAmount() > 1) { @@ -637,12 +644,12 @@ public class EHopper implements Hopper { } @Override - public List getLinkedBlocks() { + public List getLinkedBlocks() { return Collections.unmodifiableList(linkedBlocks); } @Override - public void addLinkedBlock(Block block) { + public void addLinkedBlock(Location block) { linkedBlocks.add(block); } diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java index 9f086f0..6030775 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/BlockListeners.java @@ -42,10 +42,6 @@ public class BlockListeners implements Listener { public void onBlockPlace(BlockPlaceEvent e) { try { Player player = e.getPlayer(); - if (e.getBlock().getType().equals(Material.ENDER_CHEST)) { - //instance.getDataFile().getConfig().set("data.enderTracker." + Arconix.pl().getApi().serialize().serializeLocation(e.getBlock()), player.getUniqueId().toString()); - return; - } if (e.getBlock().getType() != Material.HOPPER) return; @@ -103,10 +99,6 @@ public class BlockListeners implements Listener { @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onBlockBreak(BlockBreakEvent event) { try { - if (event.getBlock().getType().equals(Material.ENDER_CHEST)) { - //instance.getDataFile().getConfig().set("data.enderTracker." + Arconix.pl().getApi().serialize().serializeLocation(event.getBlock()), null); - } - Block block = event.getBlock(); Player player = event.getPlayer(); diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java index e1f31d2..cec8f7d 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/listeners/HopperListeners.java @@ -34,7 +34,7 @@ public class HopperListeners implements Listener { Hopper hopper = instance.getHopperManager().getHopper(source.getLocation()); if (hopper.getLinkedBlocks() == null || hopper.getLinkedBlocks().isEmpty()) { hopper.clearLinkedBlocks(); - hopper.addLinkedBlock(event.getDestination().getLocation().getBlock()); + hopper.addLinkedBlock(event.getDestination().getLocation()); } event.setCancelled(true); } catch (Exception ee) { diff --git a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java index 3801dc9..db319c5 100644 --- a/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java +++ b/EpicHoppers-Plugin/src/main/java/com/songoda/epichoppers/storage/StorageItem.java @@ -2,6 +2,7 @@ package com.songoda.epichoppers.storage; import com.songoda.arconix.plugin.Arconix; import com.songoda.epichoppers.utils.Serializers; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.inventory.ItemStack; @@ -33,10 +34,10 @@ public class StorageItem { this.object = object.toString(); } - public StorageItem(String key, boolean type, List blocks) { + public StorageItem(String key, boolean type, List blocks) { StringBuilder object = new StringBuilder(); - for (Block block : blocks) { - object.append(Arconix.pl().getApi().serialize().serializeLocation(block)); + for (Location location : blocks) { + object.append(Arconix.pl().getApi().serialize().serializeLocation(location)); object.append(";;"); } this.key = key;