diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/Slimefun.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/Slimefun.java index 1be851ba17..9e8289fa37 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/Slimefun.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/Slimefun.java @@ -14,6 +14,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; +import io.github.thebusybiscuit.slimefun4.implementation.listeners.BundlingListener; import io.github.thebusybiscuit.slimefun4.storage.Storage; import io.github.thebusybiscuit.slimefun4.storage.backend.legacy.LegacyStorage; @@ -655,6 +656,7 @@ private void registerListeners() { new PiglinListener(this); new SmithingTableListener(this); new JoinListener(this); + new BundlingListener(this); // Item-specific Listeners new CoolerListener(this, (Cooler) SlimefunItems.COOLER.getItem()); diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/backpacks/SlimefunBackpack.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/backpacks/SlimefunBackpack.java index 4f2a0e3500..61bbdb8e83 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/backpacks/SlimefunBackpack.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/items/backpacks/SlimefunBackpack.java @@ -69,6 +69,11 @@ public boolean isItemAllowed(@Nonnull ItemStack item, @Nullable SlimefunItem ite return false; } + // Bundles aren't allowed either + if (SlimefunTag.BUNDLES.isTagged(item.getType())) { + return false; + } + return !(itemAsSlimefunItem instanceof SlimefunBackpack); } diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BundlingListener.java b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BundlingListener.java new file mode 100644 index 0000000000..29baa3ca4d --- /dev/null +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/implementation/listeners/BundlingListener.java @@ -0,0 +1,64 @@ +package io.github.thebusybiscuit.slimefun4.implementation.listeners; + +import io.github.thebusybiscuit.slimefun4.api.items.SlimefunItem; +import io.github.thebusybiscuit.slimefun4.implementation.Slimefun; +import io.github.thebusybiscuit.slimefun4.implementation.items.backpacks.SlimefunBackpack; +import io.github.thebusybiscuit.slimefun4.utils.tags.SlimefunTag; +import org.bukkit.Material; +import org.bukkit.event.EventHandler; +import org.bukkit.event.Listener; +import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.inventory.ItemStack; + +import javax.annotation.Nonnull; + +public class BundlingListener implements Listener { + public BundlingListener(@Nonnull Slimefun plugin) { + plugin.getServer().getPluginManager().registerEvents(this, plugin); + } + + @EventHandler(ignoreCancelled = true) + public void onBundling(InventoryClickEvent event) { + ItemStack cursor = event.getCursor(); + ItemStack slot = event.getCurrentItem(); + + if (slot == null || cursor.isEmpty()) { + return; + } + + if (isBundle(cursor) && isBackpack(slot) || isBundle(slot) && isBackpack(cursor)) { + event.setCancelled(true); + } + } + + @EventHandler(ignoreCancelled = true) + public void onCreativeBundle(InventoryClickEvent event) { + ItemStack cursor = event.getCursor(); + ItemStack slot = event.getCurrentItem(); + + if (slot == null || cursor.isEmpty()) { + return; + } + + if (isBundle(cursor) && isBackpack(slot) || isBundle(slot) && isBackpack(cursor)) { + event.setCancelled(true); + } + } + + private boolean isBundle(ItemStack stack) { + return SlimefunTag.BUNDLES.isTagged(stack.getType()); + } + + private boolean isBackpack(ItemStack stack) { + if (stack.getType() != Material.PLAYER_HEAD) { + return false; + } + + SlimefunItem backpack = SlimefunItem.getByItem(stack); + if (backpack == null) { + return false; + } + + return backpack instanceof SlimefunBackpack; + } +} diff --git a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java index 7eab9b680f..d33c932f88 100644 --- a/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java +++ b/src/main/java/io/github/thebusybiscuit/slimefun4/utils/tags/SlimefunTag.java @@ -277,7 +277,12 @@ public enum SlimefunTag implements Tag { /** * All tile entities. */ - TILE_ENTITIES; + TILE_ENTITIES, + + /** + * All bundles. + */ + BUNDLES; /** * Lookup table for tag names. diff --git a/src/main/resources/tags/bundles.json b/src/main/resources/tags/bundles.json new file mode 100644 index 0000000000..68c929fcc4 --- /dev/null +++ b/src/main/resources/tags/bundles.json @@ -0,0 +1,72 @@ +{ + "values": [ + { + "id": "minecraft:bundle", + "required": false + }, + { + "id": "minecraft:white_bundle", + "required": false + }, + { + "id": "minecraft:orange_bundle", + "required": false + }, + { + "id": "minecraft:magenta_bundle", + "required": false + }, + { + "id": "minecraft:light_blue_bundle", + "required": false + }, + { + "id": "minecraft:yellow_bundle", + "required": false + }, + { + "id": "minecraft:lime_bundle", + "required": false + }, + { + "id": "minecraft:pink_bundle", + "required": false + }, + { + "id": "minecraft:gray_bundle", + "required": false + }, + { + "id": "minecraft:light_gray_bundle", + "required": false + }, + { + "id": "minecraft:cyan_bundle", + "required": false + }, + { + "id": "minecraft:purple_bundle", + "required": false + }, + { + "id": "minecraft:blue_bundle", + "required": false + }, + { + "id": "minecraft:brown_bundle", + "required": false + }, + { + "id": "minecraft:green_bundle", + "required": false + }, + { + "id": "minecraft:red_bundle", + "required": false + }, + { + "id": "minecraft:black_bundle", + "required": false + } + ] +} \ No newline at end of file