diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java index e1d43bfc0..478d71bff 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractCargoNode.java @@ -1,5 +1,9 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.cargo; +import javax.annotation.Nonnull; +import javax.annotation.ParametersAreNonnullByDefault; + +import org.bukkit.Location; import org.bukkit.block.Block; import org.bukkit.entity.Player; import org.bukkit.event.block.BlockPlaceEvent; @@ -9,6 +13,7 @@ import io.github.thebusybiscuit.cscorelib2.item.CustomItem; import io.github.thebusybiscuit.cscorelib2.protection.ProtectableAction; import io.github.thebusybiscuit.slimefun4.core.handlers.BlockPlaceHandler; import io.github.thebusybiscuit.slimefun4.implementation.SlimefunPlugin; +import io.github.thebusybiscuit.slimefun4.implementation.items.SimpleSlimefunItem; import io.github.thebusybiscuit.slimefun4.utils.ChatUtils; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; import io.github.thebusybiscuit.slimefun4.utils.ColoredMaterials; @@ -16,7 +21,6 @@ import io.github.thebusybiscuit.slimefun4.utils.HeadTexture; import io.github.thebusybiscuit.slimefun4.utils.NumberUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; -import me.mrCookieSlime.Slimefun.Objects.SlimefunItem.SlimefunItem; import me.mrCookieSlime.Slimefun.api.BlockStorage; import me.mrCookieSlime.Slimefun.api.SlimefunItemStack; import me.mrCookieSlime.Slimefun.api.inventory.BlockMenu; @@ -29,28 +33,14 @@ import me.mrCookieSlime.Slimefun.api.item_transport.ItemTransportFlow; * @author TheBusyBiscuit * */ -abstract class AbstractCargoNode extends SlimefunItem { +abstract class AbstractCargoNode extends SimpleSlimefunItem { protected static final String FREQUENCY = "frequency"; + @ParametersAreNonnullByDefault public AbstractCargoNode(Category category, SlimefunItemStack item, RecipeType recipeType, ItemStack[] recipe, ItemStack recipeOutput) { super(category, item, recipeType, recipe, recipeOutput); - addItemHandler(new BlockPlaceHandler(false) { - - @Override - public void onPlayerPlace(BlockPlaceEvent e) { - Block b = e.getBlock(); - - // The owner and frequency are required by every node - BlockStorage.addBlockInfo(b, "owner", e.getPlayer().getUniqueId().toString()); - BlockStorage.addBlockInfo(b, FREQUENCY, "0"); - - onPlace(e); - } - - }); - new BlockMenuPreset(getId(), ChatUtils.removeColorCodes(item.getItemMeta().getDisplayName())) { @Override @@ -60,6 +50,7 @@ abstract class AbstractCargoNode extends SlimefunItem { @Override public void newInstance(BlockMenu menu, Block b) { + menu.addMenuCloseHandler(p -> markDirty(b.getLocation())); updateBlockMenu(menu, b); } @@ -75,6 +66,25 @@ abstract class AbstractCargoNode extends SlimefunItem { }; } + @Override + public BlockPlaceHandler getItemHandler() { + return new BlockPlaceHandler(false) { + + @Override + public void onPlayerPlace(BlockPlaceEvent e) { + Block b = e.getBlock(); + + // The owner and frequency are required by every node + BlockStorage.addBlockInfo(b, "owner", e.getPlayer().getUniqueId().toString()); + BlockStorage.addBlockInfo(b, FREQUENCY, "0"); + + onPlace(e); + } + + }; + } + + @ParametersAreNonnullByDefault protected void addChannelSelector(Block b, BlockMenu menu, int slotPrev, int slotCurrent, int slotNext) { boolean isChestTerminalInstalled = SlimefunPlugin.getThirdPartySupportService().isChestTerminalInstalled(); int channel = getSelectedChannel(b); @@ -122,7 +132,7 @@ abstract class AbstractCargoNode extends SlimefunItem { }); } - private int getSelectedChannel(Block b) { + private int getSelectedChannel(@Nonnull Block b) { if (!BlockStorage.hasBlockInfo(b)) { return 0; } else { @@ -137,10 +147,12 @@ abstract class AbstractCargoNode extends SlimefunItem { } } - protected abstract void onPlace(BlockPlaceEvent e); + protected abstract void onPlace(@Nonnull BlockPlaceEvent e); - protected abstract void createBorder(BlockMenuPreset preset); + protected abstract void createBorder(@Nonnull BlockMenuPreset preset); - protected abstract void updateBlockMenu(BlockMenu menu, Block b); + protected abstract void updateBlockMenu(@Nonnull BlockMenu menu, @Nonnull Block b); + + protected abstract void markDirty(@Nonnull Location loc); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractFilterNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractFilterNode.java index 2a45af496..bf486f1b9 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractFilterNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/AbstractFilterNode.java @@ -1,11 +1,15 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.cargo; +import javax.annotation.Nonnull; + +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.block.BlockPlaceEvent; import org.bukkit.inventory.ItemStack; import io.github.thebusybiscuit.cscorelib2.item.CustomItem; +import io.github.thebusybiscuit.slimefun4.core.networks.cargo.CargoNet; import io.github.thebusybiscuit.slimefun4.utils.ChestMenuUtils; import me.mrCookieSlime.Slimefun.Lists.RecipeType; import me.mrCookieSlime.Slimefun.Objects.Category; @@ -65,7 +69,8 @@ abstract class AbstractFilterNode extends AbstractCargoNode { @Override protected void updateBlockMenu(BlockMenu menu, Block b) { - String filterType = BlockStorage.getLocationInfo(b.getLocation(), FILTER_TYPE); + Location loc = b.getLocation(); + String filterType = BlockStorage.getLocationInfo(loc, FILTER_TYPE); if (!BlockStorage.hasBlockInfo(b) || filterType == null || filterType.equals("whitelist")) { menu.replaceExistingItem(15, new CustomItem(Material.WHITE_WOOL, "&7Type: &rWhitelist", "", "&e> Click to change it to Blacklist")); @@ -102,6 +107,16 @@ abstract class AbstractFilterNode extends AbstractCargoNode { } addChannelSelector(b, menu, 41, 42, 43); + markDirty(loc); + } + + @Override + protected void markDirty(@Nonnull Location loc) { + CargoNet network = CargoNet.getNetworkFromLocation(loc); + + if (network != null) { + network.markCargoNodeConfigurationDirty(loc); + } } } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java index 31ea4dcd8..6d33b69e2 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/cargo/CargoOutputNode.java @@ -1,5 +1,6 @@ package io.github.thebusybiscuit.slimefun4.implementation.items.cargo; +import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.event.block.BlockPlaceEvent; @@ -38,4 +39,9 @@ public class CargoOutputNode extends AbstractCargoNode { addChannelSelector(b, menu, 12, 13, 14); } + @Override + protected void markDirty(Location loc) { + // No need to mark anything as dirty, there is no item filter. + } + }