diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java index f6e2c46e9..7bd4b5002 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/BlockStorage.java @@ -39,8 +39,8 @@ import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; public class BlockStorage { - private static final String path_blocks = "data-storage/Slimefun/stored-blocks/"; - private static final String path_chunks = "data-storage/Slimefun/stored-chunks/"; + private static final String PATH_BLOCKS = "data-storage/Slimefun/stored-blocks/"; + private static final String PATH_CHUNKS = "data-storage/Slimefun/stored-chunks/"; private World world; private Map storage = new HashMap<>(); @@ -87,7 +87,7 @@ public class BlockStorage { Slimefun.getLogger().log(Level.INFO, "Loading Blocks for World \"" + w.getName() + "\""); Slimefun.getLogger().log(Level.INFO, "This may take a long time..."); - File f = new File(path_blocks + w.getName()); + File f = new File(PATH_BLOCKS + w.getName()); if (f.exists()) { long total = f.listFiles().length; long start = System.currentTimeMillis(); @@ -157,7 +157,7 @@ public class BlockStorage { } else f.mkdirs(); - File chunks = new File(path_chunks + "chunks.sfc"); + File chunks = new File(PATH_CHUNKS + "chunks.sfc"); if (chunks.exists()) { FileConfiguration cfg = YamlConfiguration.loadConfiguration(chunks); @@ -277,8 +277,8 @@ public class BlockStorage { } if (chunkChanges > 0) { - File chunks = new File(path_chunks + "chunks.sfc"); - Config cfg = new Config(path_chunks + "chunks.temp"); + File chunks = new File(PATH_CHUNKS + "chunks.sfc"); + Config cfg = new Config(PATH_CHUNKS + "chunks.temp"); for (Map.Entry entry : SlimefunPlugin.getUtilities().mapChunks.entrySet()) { cfg.setValue(entry.getKey(), entry.getValue().toJSON()); @@ -551,7 +551,7 @@ public class BlockStorage { } private static void refreshCache(BlockStorage storage, Location l, String key, String value, boolean updateTicker) { - Config cfg = storage.blocksCache.computeIfAbsent(key, k -> new Config(path_blocks + l.getWorld().getName() + '/' + key + ".sfb")); + Config cfg = storage.blocksCache.computeIfAbsent(key, k -> new Config(PATH_BLOCKS + l.getWorld().getName() + '/' + key + ".sfb")); cfg.setValue(serializeLocation(l), value); if (updateTicker) { @@ -672,20 +672,20 @@ public class BlockStorage { return inventories.containsKey(l); } - public boolean hasUniversalInventory(String id) { + public static boolean hasUniversalInventory(String id) { return SlimefunPlugin.getUtilities().universalInventories.containsKey(id); } - public UniversalBlockMenu getUniversalInventory(Block block) { + public static UniversalBlockMenu getUniversalInventory(Block block) { return getUniversalInventory(block.getLocation()); } - public UniversalBlockMenu getUniversalInventory(Location l) { + public static UniversalBlockMenu getUniversalInventory(Location l) { String id = checkID(l); return id == null ? null: getUniversalInventory(id); } - public UniversalBlockMenu getUniversalInventory(String id) { + public static UniversalBlockMenu getUniversalInventory(String id) { return SlimefunPlugin.getUtilities().universalInventories.get(id); } @@ -693,11 +693,19 @@ public class BlockStorage { return getInventory(b.getLocation()); } + public static boolean hasInventory(Block b) { + BlockStorage storage = getStorage(b.getWorld()); + if (storage == null) return false; + else return storage.hasInventory(b.getLocation()); + } + public static BlockMenu getInventory(Location l) { BlockStorage storage = getStorage(l.getWorld()); if (storage == null) return null; - if (!storage.hasInventory(l)) return storage.loadInventory(l, BlockMenuPreset.getPreset(checkID(l))); - else return storage.inventories.get(l); + + BlockMenu menu = storage.inventories.get(l); + if (menu != null) return menu; + else return storage.loadInventory(l, BlockMenuPreset.getPreset(checkID(l))); } public static Config getChunkInfo(Chunk chunk) { diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java index 1eb6cb4ec..0c3aee592 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenu.java @@ -1,47 +1,33 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; -import java.util.ArrayList; import java.util.logging.Level; import org.bukkit.Location; import org.bukkit.block.Block; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; -import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; -import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.api.Slimefun; public class BlockMenu extends DirtyChestMenu { - private BlockMenuPreset preset; - private Location l; - - private ItemManipulationEvent event; + private Location location; private static String serializeLocation(Location l) { return l.getWorld().getName() + ';' + l.getBlockX() + ';' + l.getBlockY() + ';' + l.getBlockZ(); } public BlockMenu(BlockMenuPreset preset, Location l) { - super(preset.getTitle()); - this.preset = preset; - this.l = l; - changes = 1; - + super(preset); + this.location = l; + preset.clone(this); - this.getContents(); } public BlockMenu(BlockMenuPreset preset, Location l, Config cfg) { - super(preset.getTitle()); - this.preset = preset; - this.l = l; + super(preset); + this.location = l; for (int i = 0; i < 54; i++) { if (cfg.contains(String.valueOf(i))) addItem(i, cfg.getItem(String.valueOf(i))); @@ -49,15 +35,13 @@ public class BlockMenu extends DirtyChestMenu { preset.clone(this); - if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); + if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) { + addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); + } this.getContents(); } - public void registerEvent(ItemManipulationEvent event) { - this.event = event; - } - public void save(Location l) { if (!isDirty()) { return; @@ -69,9 +53,11 @@ public class BlockMenu extends DirtyChestMenu { File file = new File("data-storage/Slimefun/stored-inventories/" + serializeLocation(l) + ".sfi"); Config cfg = new Config(file); cfg.setValue("preset", preset.getID()); - for (int slot: preset.getInventorySlots()) { + + for (int slot : preset.getInventorySlots()) { cfg.setValue(String.valueOf(slot), getItemInSlot(slot)); } + cfg.save(); changes = 0; @@ -83,18 +69,18 @@ public class BlockMenu extends DirtyChestMenu { } public void move(Location l) { - this.delete(this.l); - this.l = l; + this.delete(this.location); + this.location = l; this.preset.newInstance(this, l); this.save(l); } public Block getBlock() { - return this.l.getBlock(); + return this.location.getBlock(); } public Location getLocation() { - return l; + return location; } public void delete(Location l) { @@ -104,61 +90,4 @@ public class BlockMenu extends DirtyChestMenu { Slimefun.getLogger().log(Level.WARNING, "Could not delete File: " + file.getName()); } } - - public BlockMenuPreset getPreset() { - return this.preset; - } - - public boolean canOpen(Block b, Player p) { - return this.preset.canOpen(b, p); - } - - @Override - public void replaceExistingItem(int slot, ItemStack item) { - this.replaceExistingItem(slot, item, true); - } - - public void replaceExistingItem(int slot, ItemStack item, boolean event) { - final ItemStack previous = getItemInSlot(slot); - - if (event && this.event != null) { - item = this.event.onEvent(slot, previous, item); - } - super.replaceExistingItem(slot, item); - markDirty(); - } - - public boolean fits(ItemStack item, int... slots) { - return InvUtils.fits(toInventory(), item, slots); - } - - public ItemStack pushItem(ItemStack item, int... slots) { - int amount = item.getAmount(); - for (int slot: slots) { - if (amount <= 0) break; - - ItemStack stack = getItemInSlot(slot); - if (stack == null) { - replaceExistingItem(slot, item); - return null; - } - else if (stack.getAmount() < stack.getMaxStackSize() && ItemUtils.canStack(item, stack)) { - amount -= (stack.getMaxStackSize() - stack.getAmount()); - stack.setAmount(Math.min(stack.getAmount() + item.getAmount(), stack.getMaxStackSize())); - } - } - - if (amount > 0) { - return new CustomItem(item, amount); - } - else { - return null; - } - } - - public void close() { - for (HumanEntity human: new ArrayList<>(toInventory().getViewers())) { - human.closeInventory(); - } - } } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java index 583661449..e80dd2c78 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/BlockMenuPreset.java @@ -54,12 +54,17 @@ public abstract class BlockMenuPreset extends ChestMenu { // This method can optionally be overridden by implementations } + @Deprecated public int[] getSlotsAccessedByItemTransport(BlockMenu menu, ItemTransportFlow flow, ItemStack item) { - // This method will default to this method, can be overridden though - return this.getSlotsAccessedByItemTransport(flow); + return getSlotsAccessedByItemTransport((DirtyChestMenu) menu, flow, item); } + @Deprecated public int[] getSlotsAccessedByItemTransport(UniversalBlockMenu menu, ItemTransportFlow flow, ItemStack item) { + return getSlotsAccessedByItemTransport((DirtyChestMenu) menu, flow, item); + } + + public int[] getSlotsAccessedByItemTransport(DirtyChestMenu menu, ItemTransportFlow flow, ItemStack item) { // This method will default to this method, can be overridden though return this.getSlotsAccessedByItemTransport(flow); } @@ -122,7 +127,7 @@ public abstract class BlockMenuPreset extends ChestMenu { public void clone(final BlockMenu menu) { menu.setPlayerInventoryClickable(true); - for (int slot: occupied) { + for (int slot : occupied) { menu.addItem(slot, getItemInSlot(slot)); } @@ -130,7 +135,9 @@ public abstract class BlockMenuPreset extends ChestMenu { newInstance(menu, menu.getLocation()); for (int slot = 0; slot < 54; slot++) { - if (getMenuClickHandler(slot) != null) menu.addMenuClickHandler(slot, getMenuClickHandler(slot)); + if (getMenuClickHandler(slot) != null) { + menu.addMenuClickHandler(slot, getMenuClickHandler(slot)); + } } menu.addMenuOpeningHandler(getMenuOpeningHandler()); @@ -141,11 +148,12 @@ public abstract class BlockMenuPreset extends ChestMenu { public void clone(UniversalBlockMenu menu) { menu.setPlayerInventoryClickable(true); - for (int slot: occupied) { + for (int slot : occupied) { menu.addItem(slot, getItemInSlot(slot)); } if (size > -1) menu.addItem(size - 1, null); + for (int slot = 0; slot < 54; slot++) { if (getMenuClickHandler(slot) != null) menu.addMenuClickHandler(slot, getMenuClickHandler(slot)); } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java index 789c326a5..739267da6 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/DirtyChestMenu.java @@ -1,15 +1,27 @@ package me.mrCookieSlime.Slimefun.api.inventory; -import org.bukkit.entity.Player; +import java.util.ArrayList; +import org.bukkit.block.Block; +import org.bukkit.entity.HumanEntity; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; + +import io.github.thebusybiscuit.cscorelib2.inventory.InvUtils; +import io.github.thebusybiscuit.cscorelib2.inventory.ItemUtils; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu; +import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; public class DirtyChestMenu extends ChestMenu { - - protected int changes = 0; - public DirtyChestMenu(String title) { - super(title); + protected final BlockMenuPreset preset; + protected ItemManipulationEvent event; + protected int changes = 1; + + public DirtyChestMenu(BlockMenuPreset preset) { + super(preset.getTitle()); + + this.preset = preset; } public void markDirty() { @@ -24,6 +36,24 @@ public class DirtyChestMenu extends ChestMenu { return changes; } + public BlockMenuPreset getPreset() { + return this.preset; + } + + public boolean canOpen(Block b, Player p) { + return this.preset.canOpen(b, p); + } + + public void close() { + for (HumanEntity human : new ArrayList<>(toInventory().getViewers())) { + human.closeInventory(); + } + } + + public void registerEvent(ItemManipulationEvent event) { + this.event = event; + } + @Override public ChestMenu addMenuOpeningHandler(MenuOpeningHandler handler) { if (handler instanceof SaveHandler) { @@ -34,6 +64,50 @@ public class DirtyChestMenu extends ChestMenu { } } + public boolean fits(ItemStack item, int... slots) { + return InvUtils.fits(toInventory(), item, slots); + } + + public ItemStack pushItem(ItemStack item, int... slots) { + int amount = item.getAmount(); + for (int slot : slots) { + if (amount <= 0) break; + + ItemStack stack = getItemInSlot(slot); + if (stack == null) { + replaceExistingItem(slot, item); + return null; + } + else if (stack.getAmount() < stack.getMaxStackSize() && ItemUtils.canStack(item, stack)) { + amount -= (stack.getMaxStackSize() - stack.getAmount()); + stack.setAmount(Math.min(stack.getAmount() + item.getAmount(), stack.getMaxStackSize())); + } + } + + if (amount > 0) { + return new CustomItem(item, amount); + } + else { + return null; + } + } + + @Override + public void replaceExistingItem(int slot, ItemStack item) { + this.replaceExistingItem(slot, item, true); + } + + public void replaceExistingItem(int slot, ItemStack item, boolean event) { + ItemStack previous = getItemInSlot(slot); + + if (event && this.event != null) { + item = this.event.onEvent(slot, previous, item); + } + + super.replaceExistingItem(slot, item); + markDirty(); + } + public static class SaveHandler implements MenuOpeningHandler { private DirtyChestMenu menu; diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java index 7576dcae1..9f88a2d3d 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/inventory/UniversalBlockMenu.java @@ -1,24 +1,13 @@ package me.mrCookieSlime.Slimefun.api.inventory; import java.io.File; -import java.util.ArrayList; - -import org.bukkit.block.Block; -import org.bukkit.entity.HumanEntity; -import org.bukkit.entity.Player; -import org.bukkit.inventory.ItemStack; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; public class UniversalBlockMenu extends DirtyChestMenu { - private BlockMenuPreset preset; - private ItemManipulationEvent event; - public UniversalBlockMenu(BlockMenuPreset preset) { - super(preset.getTitle()); - this.preset = preset; - changes = 1; + super(preset); preset.clone(this); @@ -26,24 +15,23 @@ public class UniversalBlockMenu extends DirtyChestMenu { } public UniversalBlockMenu(BlockMenuPreset preset, Config cfg) { - super(preset.getTitle()); - this.preset = preset; + super(preset); for (int i = 0; i < 54; i++) { - if (cfg.contains(String.valueOf(i))) addItem(i, cfg.getItem(String.valueOf(i))); + if (cfg.contains(String.valueOf(i))) { + addItem(i, cfg.getItem(String.valueOf(i))); + } } preset.clone(this); - if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); + if (preset.getSize() > -1 && !preset.getPresetSlots().contains(preset.getSize() - 1) && cfg.contains(String.valueOf(preset.getSize() - 1))) { + addItem(preset.getSize() - 1, cfg.getItem(String.valueOf(preset.getSize() - 1))); + } this.getContents(); } - public void registerEvent(ItemManipulationEvent event) { - this.event = event; - } - public void save() { if (!isDirty()) return; // To force CS-CoreLib to build the Inventory @@ -52,41 +40,14 @@ public class UniversalBlockMenu extends DirtyChestMenu { File file = new File("data-storage/Slimefun/universal-inventories/" + preset.getID() + ".sfi"); Config cfg = new Config(file); cfg.setValue("preset", preset.getID()); - for (int slot: preset.getInventorySlots()) { + + for (int slot : preset.getInventorySlots()) { cfg.setValue(String.valueOf(slot), getItemInSlot(slot)); } + cfg.save(); changes = 0; } - public BlockMenuPreset getPreset() { - return this.preset; - } - - public boolean canOpen(Block b, Player p) { - return this.preset.canOpen(b, p); - } - - @Override - public void replaceExistingItem(int slot, ItemStack item) { - this.replaceExistingItem(slot, item, true); - } - - public void replaceExistingItem(int slot, ItemStack item, boolean event) { - final ItemStack previous = getItemInSlot(slot); - - if (event && this.event != null) { - item = this.event.onEvent(slot, previous, item); - } - super.replaceExistingItem(slot, item); - markDirty(); - } - - public void close() { - for (HumanEntity human: new ArrayList<>(toInventory().getViewers())) { - human.closeInventory(); - } - } - } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java index 0a8d6763b..0eec54bf9 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoManager.java @@ -4,26 +4,33 @@ import java.util.ArrayList; import java.util.List; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; import org.bukkit.inventory.ItemStack; +import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; -import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; +import me.mrCookieSlime.Slimefun.api.inventory.DirtyChestMenu; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; public final class CargoManager { + //Whitelist or blacklist slots + private static final int[] SLOTS = new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; + private CargoManager() {} - public static ItemStack withdraw(Block node, BlockStorage storage, Block target, ItemStack template) { - if (storage.hasUniversalInventory(target)) { - UniversalBlockMenu menu = storage.getUniversalInventory(target); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { - final ItemStack is = menu.getItemInSlot(slot); + public static ItemStack withdraw(Block node, Block target, ItemStack template) { + DirtyChestMenu menu = getChestMenu(target); + + if (menu != null) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { + ItemStack is = menu.getItemInSlot(slot); + if (SlimefunManager.isItemSimilar(is, template, true) && matchesFilter(node, is, -1)) { if (is.getAmount() > template.getAmount()) { menu.replaceExistingItem(slot, new CustomItem(is, is.getAmount() - template.getAmount())); @@ -36,138 +43,76 @@ public final class CargoManager { } } } - else if (storage.hasInventory(target.getLocation())) { - BlockMenu menu = BlockStorage.getInventory(target.getLocation()); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { - final ItemStack is = menu.getItemInSlot(slot); - if (SlimefunManager.isItemSimilar(is, template, true) && matchesFilter(node, is, -1)) { - if (is.getAmount() > template.getAmount()) { - menu.replaceExistingItem(slot, new CustomItem(is, is.getAmount() - template.getAmount())); - return template; - } - else { - menu.replaceExistingItem(slot, null); - return is.clone(); - } - } - } - } - else if (target.getState() instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) target.getState()).getInventory(); - for (int slot = 0; slot < inv.getContents().length; slot++) { - final ItemStack is = inv.getContents()[slot]; - if (SlimefunManager.isItemSimilar(is, template, true) && matchesFilter(node, is, -1)) { - if (is.getAmount() > template.getAmount()) { - inv.setItem(slot, ChestManipulator.trigger(target, slot, is, new CustomItem(is, is.getAmount() - template.getAmount()))); - return template; - } - else { - inv.setItem(slot, ChestManipulator.trigger(target, slot, is, new CustomItem(is, is.getAmount() - template.getAmount()))); - return is.clone(); - } - } - } - } - return null; - } - - public static ItemSlot withdraw(Block node, BlockStorage storage, Block target, int index) { - if (storage.hasUniversalInventory(target)) { - UniversalBlockMenu menu = storage.getUniversalInventory(target); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { - ItemStack is = menu.getItemInSlot(slot); - if (matchesFilter(node, is, index)) { - menu.replaceExistingItem(slot, null); - return new ItemSlot(is.clone(), slot); - } - } - } - else if (storage.hasInventory(target.getLocation())) { - BlockMenu menu = BlockStorage.getInventory(target.getLocation()); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { - ItemStack is = menu.getItemInSlot(slot); - if (matchesFilter(node, is, index)) { - menu.replaceExistingItem(slot, null); - return new ItemSlot(is.clone(), slot); - } - } - } - else if (target.getState() instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) target.getState()).getInventory(); - for (int slot = 0; slot < inv.getContents().length; slot++) { - ItemStack is = inv.getContents()[slot]; - if (matchesFilter(node, is, index)) { - inv.setItem(slot, ChestManipulator.trigger(target, slot, is, null)); - return new ItemSlot(is.clone(), slot); - } - } - } - return null; - } - - public static ItemStack insert(Block node, BlockStorage storage, Block target, ItemStack stack, int index) { - if (!matchesFilter(node, stack, index)) return stack; - if (storage.hasUniversalInventory(target)) { - UniversalBlockMenu menu = storage.getUniversalInventory(target); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.INSERT, stack)) { - ItemStack is = menu.getItemInSlot(slot) == null ? null: menu.getItemInSlot(slot).clone(); - if (is == null) { - menu.replaceExistingItem(slot, stack.clone()); - return null; - } - else if (SlimefunManager.isItemSimilar(new CustomItem(is, 1), new CustomItem(stack, 1), true) && is.getAmount() < is.getType().getMaxStackSize()) { - int amount = is.getAmount() + stack.getAmount(); - - if (amount > is.getType().getMaxStackSize()) { - is.setAmount(is.getType().getMaxStackSize()); - stack.setAmount(amount - is.getType().getMaxStackSize()); - } - else { - is.setAmount(amount); - stack = null; - } - - menu.replaceExistingItem(slot, is); - return stack; - } - } - } - else if (storage.hasInventory(target.getLocation())) { - BlockMenu menu = BlockStorage.getInventory(target.getLocation()); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.INSERT, stack)) { - ItemStack is = menu.getItemInSlot(slot) == null ? null: menu.getItemInSlot(slot).clone(); - if (is == null) { - menu.replaceExistingItem(slot, stack.clone()); - return null; - } - else if (SlimefunManager.isItemSimilar(new CustomItem(is, 1), new CustomItem(stack, 1), true) && is.getAmount() < is.getType().getMaxStackSize()) { - int amount = is.getAmount() + stack.getAmount(); - - if (amount > is.getType().getMaxStackSize()) { - is.setAmount(is.getType().getMaxStackSize()); - stack.setAmount(amount - is.getType().getMaxStackSize()); - } - else { - is.setAmount(amount); - stack = null; - } - - menu.replaceExistingItem(slot, is); - return stack; - } - } - } - else if (target.getState() instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) target.getState()).getInventory(); + else { + BlockState state = target.getState(); - for (int slot = 0; slot < inv.getContents().length; slot++) { - ItemStack is = inv.getContents()[slot]; + if (state instanceof InventoryHolder) { + Inventory inv = ((InventoryHolder) state).getInventory(); + for (int slot = 0; slot < inv.getContents().length; slot++) { + ItemStack is = inv.getContents()[slot]; + + if (SlimefunManager.isItemSimilar(is, template, true) && matchesFilter(node, is, -1)) { + if (is.getAmount() > template.getAmount()) { + inv.setItem(slot, ChestManipulator.trigger(target, slot, is, new CustomItem(is, is.getAmount() - template.getAmount()))); + return template; + } + else { + inv.setItem(slot, ChestManipulator.trigger(target, slot, is, new CustomItem(is, is.getAmount() - template.getAmount()))); + return is.clone(); + } + } + } + } + } + return null; + } + + public static ItemSlot withdraw(Block node, Block target, int index) { + DirtyChestMenu menu = getChestMenu(target); + + if (menu != null) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { + ItemStack is = menu.getItemInSlot(slot); + + if (matchesFilter(node, is, index)) { + menu.replaceExistingItem(slot, null); + return new ItemSlot(is.clone(), slot); + } + } + } + else { + BlockState state = target.getState(); + + if (state instanceof InventoryHolder) { + Inventory inv = ((InventoryHolder) state).getInventory(); + + for (int slot = 0; slot < inv.getContents().length; slot++) { + ItemStack is = inv.getContents()[slot]; + + if (matchesFilter(node, is, index)) { + inv.setItem(slot, ChestManipulator.trigger(target, slot, is, null)); + return new ItemSlot(is.clone(), slot); + } + } + } + } + return null; + } + + public static ItemStack insert(Block node, Block target, ItemStack stack, int index) { + if (!matchesFilter(node, stack, index)) return stack; + + DirtyChestMenu menu = getChestMenu(target); + + if (menu != null) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.INSERT, stack)) { + ItemStack is = menu.getItemInSlot(slot) == null ? null: menu.getItemInSlot(slot).clone(); + if (is == null) { - inv.setItem(slot, ChestManipulator.trigger(target, slot, null, stack.clone())); + menu.replaceExistingItem(slot, stack.clone()); return null; } else if (SlimefunManager.isItemSimilar(new CustomItem(is, 1), new CustomItem(stack, 1), true) && is.getAmount() < is.getType().getMaxStackSize()) { - ItemStack prev = is.clone(); int amount = is.getAmount() + stack.getAmount(); if (amount > is.getType().getMaxStackSize()) { @@ -179,16 +124,56 @@ public final class CargoManager { stack = null; } - inv.setItem(slot, ChestManipulator.trigger(target, slot, prev, is)); + menu.replaceExistingItem(slot, is); return stack; } } } + else { + BlockState state = target.getState(); + if (state instanceof InventoryHolder) { + Inventory inv = ((InventoryHolder) state).getInventory(); + + for (int slot = 0; slot < inv.getContents().length; slot++) { + ItemStack is = inv.getContents()[slot]; + + if (is == null) { + inv.setItem(slot, ChestManipulator.trigger(target, slot, null, stack.clone())); + return null; + } + else if (SlimefunManager.isItemSimilar(new CustomItem(is, 1), new CustomItem(stack, 1), true) && is.getAmount() < is.getType().getMaxStackSize()) { + int amount = is.getAmount() + stack.getAmount(); + ItemStack prev = is.clone(); + + if (amount > is.getType().getMaxStackSize()) { + is.setAmount(is.getType().getMaxStackSize()); + stack.setAmount(amount - is.getType().getMaxStackSize()); + } + else { + is.setAmount(amount); + stack = null; + } + + inv.setItem(slot, ChestManipulator.trigger(target, slot, prev, is)); + return stack; + } + } + } + } return stack; } - //Whitelist or blacklist slots - private static int[] slots = new int[] {19, 20, 21, 28, 29, 30, 37, 38, 39}; + + public static DirtyChestMenu getChestMenu(Block block) { + if (BlockStorage.hasInventory(block)) { + return BlockStorage.getInventory(block); + } + + UniversalBlockMenu universalMenu = BlockStorage.getUniversalInventory(block); + if (universalMenu != null) return universalMenu; + + return null; + } public static boolean matchesFilter(Block block, ItemStack item, int index) { if (item == null) return false; @@ -205,7 +190,7 @@ public final class CargoManager { if ("whitelist".equals(blockInfo.getString("filter-type"))) { List items = new ArrayList<>(); - for (int slot: slots) { + for (int slot : SLOTS) { ItemStack template = menu.getItemInSlot(slot); if (template != null) items.add(new CustomItem(template, 1)); } @@ -223,14 +208,14 @@ public final class CargoManager { return SlimefunManager.isItemSimilar(item, items.get(index), lore); } else { - for (ItemStack stack: items) { + for (ItemStack stack : items) { if (SlimefunManager.isItemSimilar(item, stack, lore)) return true; } return false; } } else { - for (int slot: slots) { + for (int slot : SLOTS) { if (menu.getItemInSlot(slot) != null && SlimefunManager.isItemSimilar(item, new CustomItem(menu.getItemInSlot(slot), 1), lore)) { return false; } diff --git a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java index 4083b5d6e..20ce5d31c 100644 --- a/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java +++ b/src/main/java/me/mrCookieSlime/Slimefun/api/item_transport/CargoNet.java @@ -11,11 +11,11 @@ import java.util.Map; import java.util.Set; import java.util.logging.Level; -import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; +import org.bukkit.block.BlockState; import org.bukkit.block.data.Directional; import org.bukkit.inventory.Inventory; import org.bukkit.inventory.InventoryHolder; @@ -23,6 +23,7 @@ import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.meta.ItemMeta; import io.github.thebusybiscuit.cscorelib2.math.DoubleHandler; +import me.mrCookieSlime.CSCoreLibPlugin.Configuration.Config; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.ChestMenu.MenuClickHandler; import me.mrCookieSlime.CSCoreLibPlugin.general.Inventory.Item.CustomItem; import me.mrCookieSlime.Slimefun.SlimefunPlugin; @@ -30,6 +31,7 @@ import me.mrCookieSlime.Slimefun.Setup.SlimefunManager; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.Slimefun; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; +import me.mrCookieSlime.Slimefun.api.inventory.DirtyChestMenu; import me.mrCookieSlime.Slimefun.api.inventory.UniversalBlockMenu; import me.mrCookieSlime.Slimefun.api.network.Network; import me.mrCookieSlime.Slimefun.api.network.NetworkComponent; @@ -51,16 +53,26 @@ public class CargoNet extends Network { private static final ItemStack terminal_noitem_item = new CustomItem(new ItemStack(Material.BARRIER), "&4No Item cached"); private static final MenuClickHandler terminal_noitem_handler = (p, slot, item, action) -> false; + private Set inputNodes = new HashSet<>(); + private Set outputNodes = new HashSet<>(); + + //Chest Terminal Stuff + private final Set terminals = new HashSet<>(); + private final Set imports = new HashSet<>(); + private final Set exports = new HashSet<>(); + public static CargoNet getNetworkFromLocation(Location l) { return getNetworkFromLocation(l, CargoNet.class); } public static CargoNet getNetworkFromLocationOrCreate(Location l) { CargoNet cargoNetwork = getNetworkFromLocation(l); + if (cargoNetwork == null) { cargoNetwork = new CargoNet(l); registerNetwork(cargoNetwork); } + return cargoNetwork; } @@ -69,15 +81,6 @@ public class CargoNet extends Network { return getNetworkFromLocation(b.getLocation()) != null; } - private Set inputNodes = new HashSet<>(); - private Set outputNodes = new HashSet<>(); - - - //Chest Terminal Stuff - private final Set terminals = new HashSet<>(); - private final Set imports = new HashSet<>(); - private final Set exports = new HashSet<>(); - protected CargoNet(Location l) { super(l); } @@ -89,6 +92,7 @@ public class CargoNet extends Network { public NetworkComponent classifyLocation(Location l) { String id = BlockStorage.checkID(l); if (id == null) return null; + switch(id) { case "CARGO_MANAGER": return NetworkComponent.REGULATOR; @@ -143,18 +147,20 @@ public class CargoNet extends Network { SimpleHologram.update(b, "&4Multiple Cargo Regulators connected"); return; } + super.tick(); + if (connectorNodes.isEmpty() && terminusNodes.isEmpty()) { - SimpleHologram.update(b, "&7Status: &4&lOFFLINE"); + SimpleHologram.update(b, "&cNo Cargo Nodes found"); } else { SimpleHologram.update(b, "&7Status: &a&lONLINE"); - final Map> output = new HashMap<>(); + Map> output = new HashMap<>(); List list = new LinkedList<>(); int lastFrequency = -1; - for (Location outputNode: outputNodes) { + for (Location outputNode : outputNodes) { int frequency = getFrequency(outputNode); if (frequency != lastFrequency && lastFrequency != -1) { @@ -178,26 +184,24 @@ public class CargoNet extends Network { } //Chest Terminal Stuff - final Set providers = new HashSet<>(); - final Set destinations = new HashSet<>(); + Set providers = new HashSet<>(); + Set destinations = new HashSet<>(); List output16 = output.get(16); if (output16 != null) destinations.addAll(output16); - for (Location inputNode: inputNodes) { + for (Location inputNode : inputNodes) { int frequency = getFrequency(inputNode); + if (frequency == 16) { providers.add(inputNode); } } - - CargoNet self = this; - final BlockStorage storage = BlockStorage.getStorage(b.getWorld()); - Bukkit.getScheduler().scheduleSyncDelayedTask(SlimefunPlugin.instance, () -> { + Slimefun.runSync(() -> { if (BlockStorage.getLocationInfo(b.getLocation(), "visualizer") == null) { - self.display(); + display(); } //Chest Terminal Code @@ -207,7 +211,7 @@ public class CargoNet extends Network { if (menu.getItemInSlot(17) == null) { Block target = getAttachedBlock(bus.getBlock()); - ItemSlot stack = CargoManager.withdraw(bus.getBlock(), storage, target, -1); + ItemSlot stack = CargoManager.withdraw(bus.getBlock(), target, -1); if (stack != null) { menu.replaceExistingItem(17, stack.getItem()); @@ -225,12 +229,12 @@ public class CargoNet extends Network { if (menu.getItemInSlot(17) != null) { Block target = getAttachedBlock(bus.getBlock()); - menu.replaceExistingItem(17, CargoManager.insert(bus.getBlock(), storage, target, menu.getItemInSlot(17), -1)); + menu.replaceExistingItem(17, CargoManager.insert(bus.getBlock(), target, menu.getItemInSlot(17), -1)); } if (menu.getItemInSlot(17) == null) { List items = new ArrayList<>(); - for (int slot: slots) { + for (int slot : slots) { ItemStack template = menu.getItemInSlot(slot); if (template != null) items.add(new CustomItem(template, 1)); } @@ -247,7 +251,7 @@ public class CargoNet extends Network { } } - for (final Location terminal : terminals) { + for (Location terminal : terminals) { BlockMenu menu = BlockStorage.getInventory(terminal); ItemStack sendingItem = menu.getItemInSlot(TERMINAL_OUT_SLOT); @@ -267,9 +271,10 @@ public class CargoNet extends Network { case INSERT: ItemStack requestedItem = request.getItem(); - for (Location l: destinations) { + for (Location l : destinations) { Block target = getAttachedBlock(l.getBlock()); - requestedItem = CargoManager.insert(l.getBlock(), storage, target, requestedItem, -1); + requestedItem = CargoManager.insert(l.getBlock(), target, requestedItem, -1); + if (requestedItem == null) { menu.replaceExistingItem(request.getSlot(), null); break; @@ -296,7 +301,8 @@ public class CargoNet extends Network { for (Location l : providers) { Block target = getAttachedBlock(l.getBlock()); - ItemStack is = CargoManager.withdraw(l.getBlock(), storage, target, requested); + ItemStack is = CargoManager.withdraw(l.getBlock(), target, requested); + if (is != null) { if (stack == null) { stack = is; @@ -331,7 +337,7 @@ public class CargoNet extends Network { } // All operations happen here: Everything gets iterated from the Input Nodes. (Apart from ChestTerminal Buses) - for (Location input: inputNodes) { + for (Location input : inputNodes) { int frequency = getFrequency(input); if (frequency < 0 || frequency > 15) { @@ -342,10 +348,12 @@ public class CargoNet extends Network { ItemStack stack = null; int previousSlot = -1; - boolean roundrobin = "true".equals(BlockStorage.getLocationInfo(input, "round-robin")); + Config cfg = BlockStorage.getLocationInfo(input); + boolean roundrobin = "true".equals(cfg.getString("round-robin")); if (inputTarget != null) { - ItemSlot slot = CargoManager.withdraw(input.getBlock(), storage, inputTarget, Integer.parseInt(BlockStorage.getLocationInfo(input, "index"))); + ItemSlot slot = CargoManager.withdraw(input.getBlock(), inputTarget, Integer.parseInt(cfg.getString("index"))); + if (slot != null) { stack = slot.getItem(); previousSlot = slot.getSlot(); @@ -354,6 +362,7 @@ public class CargoNet extends Network { if (stack != null) { List outputs = output.get(frequency); + if (outputs != null) { List outputlist = new ArrayList<>(outputs); @@ -362,7 +371,7 @@ public class CargoNet extends Network { if (cIndex < outputlist.size()) { for (int i = 0; i < cIndex; i++) { - final Location temp = outputlist.get(0); + Location temp = outputlist.get(0); outputlist.remove(temp); outputlist.add(temp); } @@ -375,8 +384,9 @@ public class CargoNet extends Network { for (Location out : outputlist) { Block target = getAttachedBlock(out.getBlock()); + if (target != null) { - stack = CargoManager.insert(out.getBlock(), storage, target, stack, -1); + stack = CargoManager.insert(out.getBlock(), target, stack, -1); if (stack == null) break; } } @@ -384,41 +394,49 @@ public class CargoNet extends Network { } if (stack != null && previousSlot > -1) { - if (storage.hasUniversalInventory(inputTarget)) { - UniversalBlockMenu menu = storage.getUniversalInventory(inputTarget); + DirtyChestMenu menu = CargoManager.getChestMenu(inputTarget); + + if (menu != null) { menu.replaceExistingItem(previousSlot, stack); } - else if (storage.hasInventory(inputTarget.getLocation())) { - BlockMenu menu = BlockStorage.getInventory(inputTarget.getLocation()); - menu.replaceExistingItem(previousSlot, stack); - } - else if (inputTarget.getState() instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) inputTarget.getState()).getInventory(); - inv.setItem(previousSlot, stack); + else { + BlockState state = inputTarget.getState(); + if (state instanceof InventoryHolder) { + Inventory inv = ((InventoryHolder) state).getInventory(); + inv.setItem(previousSlot, stack); + } } } } + //Chest Terminal Code if (extraChannels) { List items = new ArrayList<>(); - for (Location l: providers) { + + for (Location l : providers) { Block target = getAttachedBlock(l.getBlock()); - if (storage.hasUniversalInventory(target)) { - UniversalBlockMenu menu = storage.getUniversalInventory(target); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { + UniversalBlockMenu menu = BlockStorage.getUniversalInventory(target); + + if (menu != null) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { ItemStack is = menu.getItemInSlot(slot); filter(is, items, l); } } - else if (storage.hasInventory(target.getLocation())) { - BlockMenu menu = BlockStorage.getInventory(target.getLocation()); - if (BlockStorage.checkID(target.getLocation()).startsWith("BARREL_") && BlockStorage.getLocationInfo(target.getLocation(), "storedItems") != null) { - int stored = Integer.parseInt(BlockStorage.getLocationInfo(target.getLocation(), "storedItems")); - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { - ItemStack is = menu.getItemInSlot(slot); + else if (BlockStorage.hasInventory(target)) { + BlockMenu blockMenu = BlockStorage.getInventory(target); + Config cfg = BlockStorage.getLocationInfo(target.getLocation()); + + if (cfg.getString("id").startsWith("BARREL_") && cfg.getString("storedItems") != null) { + int stored = Integer.parseInt(cfg.getString("storedItems")); + + for (int slot : blockMenu.getPreset().getSlotsAccessedByItemTransport(blockMenu, ItemTransportFlow.WITHDRAW, null)) { + ItemStack is = blockMenu.getItemInSlot(slot); + if (is != null && CargoManager.matchesFilter(l.getBlock(), is, -1)) { boolean add = true; - for (StoredItem item: items) { + + for (StoredItem item : items) { if (SlimefunManager.isItemSimilar(is, item.getItem(), true)) { add = false; item.add(is.getAmount() + stored); @@ -432,20 +450,25 @@ public class CargoNet extends Network { } } else { - handleWithdraw(menu, items, l); + handleWithdraw(blockMenu, items, l); } } - else if (target.getState() instanceof InventoryHolder) { - Inventory inv = ((InventoryHolder) target.getState()).getInventory(); - for (ItemStack is: inv.getContents()) { - filter(is, items, l); + else { + BlockState state = target.getState(); + + if (state instanceof InventoryHolder) { + Inventory inv = ((InventoryHolder) state).getInventory(); + + for (ItemStack is : inv.getContents()) { + filter(is, items, l); + } } } } Collections.sort(items, sorter); - for (final Location l: terminals) { + for (Location l : terminals) { BlockMenu menu = BlockStorage.getInventory(l); int page = Integer.parseInt(BlockStorage.getLocationInfo(l, "page")); @@ -456,6 +479,7 @@ public class CargoNet extends Network { for (int i = 0; i < terminal_slots.length; i++) { int slot = terminal_slots[i]; + if (items.size() > i + (terminal_slots.length * (page - 1))) { final StoredItem item = items.get(i + (terminal_slots.length * (page - 1))); @@ -512,7 +536,7 @@ public class CargoNet extends Network { } private void handleWithdraw(BlockMenu menu, List items, Location l) { - for (int slot: menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { + for (int slot : menu.getPreset().getSlotsAccessedByItemTransport(menu, ItemTransportFlow.WITHDRAW, null)) { filter(menu.getItemInSlot(slot), items, l); } } @@ -520,7 +544,8 @@ public class CargoNet extends Network { private void filter(ItemStack is, List items, Location l) { if (is != null && CargoManager.matchesFilter(l.getBlock(), is, -1)) { boolean add = true; - for (StoredItem item: items) { + + for (StoredItem item : items) { if (SlimefunManager.isItemSimilar(is, item.getItem(), true)) { add = false; item.add(is.getAmount());