From f2fd58602ea5f3f18b8b26fdf4e10f766466ced3 Mon Sep 17 00:00:00 2001 From: Alexander Date: Thu, 20 Feb 2025 21:20:14 +0000 Subject: [PATCH] Remove MoreTags --- .../mc/citadel/listener/BlockListener.java | 73 ++-- .../mc/civmodcore/CivModCorePlugin.java | 2 - .../civmodcore/inventory/items/MoreTags.java | 342 ------------------ .../mc/civmodcore/world/WorldUtils.java | 19 +- 4 files changed, 53 insertions(+), 383 deletions(-) delete mode 100644 plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/MoreTags.java diff --git a/plugins/citadel-paper/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java b/plugins/citadel-paper/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java index bf87dce8d..19bafd974 100644 --- a/plugins/citadel-paper/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java +++ b/plugins/citadel-paper/src/main/java/vg/civcraft/mc/citadel/listener/BlockListener.java @@ -12,6 +12,7 @@ import org.bukkit.Tag; import org.bukkit.block.Block; import org.bukkit.block.BlockState; import org.bukkit.block.Container; +import org.bukkit.block.data.Brushable; import org.bukkit.block.data.Lightable; import org.bukkit.block.data.Openable; import org.bukkit.block.data.type.Comparator; @@ -46,13 +47,14 @@ import org.bukkit.event.player.PlayerTakeLecternBookEvent; import org.bukkit.event.world.StructureGrowEvent; import org.bukkit.inventory.EquipmentSlot; import org.bukkit.inventory.ItemStack; +import org.jetbrains.annotations.NotNull; import vg.civcraft.mc.citadel.Citadel; import vg.civcraft.mc.citadel.CitadelPermissionHandler; import vg.civcraft.mc.citadel.CitadelUtility; import vg.civcraft.mc.citadel.ReinforcementLogic; import vg.civcraft.mc.citadel.model.Reinforcement; +import vg.civcraft.mc.civmodcore.inventory.items.ItemUtils; import vg.civcraft.mc.civmodcore.inventory.items.MaterialUtils; -import vg.civcraft.mc.civmodcore.inventory.items.MoreTags; import vg.civcraft.mc.civmodcore.utilities.DoubleInteractFixer; import vg.civcraft.mc.civmodcore.world.WorldUtils; import vg.civcraft.mc.namelayer.group.Group; @@ -361,40 +363,51 @@ public class BlockListener implements Listener { } } - @EventHandler(priority = EventPriority.LOW, ignoreCancelled = true) - public void preventStrippingLogs(PlayerInteractEvent pie) { - if (!pie.hasBlock()) { + @EventHandler( + priority = EventPriority.LOW, + ignoreCancelled = true + ) + private void preventStrippingLogs( + final @NotNull PlayerInteractEvent event + ) { + if (event.getAction() != Action.RIGHT_CLICK_BLOCK) { return; } - if (pie.getAction() != Action.RIGHT_CLICK_BLOCK) { + final Block block = event.getClickedBlock(); + if (block == null) { // This shouldn't happen, but just in case return; } - Block block = pie.getClickedBlock(); - if (!MoreTags.LOGS.isTagged(block.getType())) { + switch (block.getType()) { + case ACACIA_LOG: + case BIRCH_LOG: + case CHERRY_LOG: + case DARK_OAK_LOG: + case JUNGLE_LOG: + case MANGROVE_LOG: + case OAK_LOG: + case SPRUCE_LOG: + break; + default: + return; + } + final Player player = event.getPlayer(); + final ItemStack tool = switch (event.getHand()) { + case HAND -> player.getInventory().getItemInMainHand(); + case OFF_HAND -> player.getInventory().getItemInOffHand(); + case null, default -> null; + }; + if (ItemUtils.isEmptyItem(tool) || !MaterialTags.AXES.isTagged(tool)) { return; } - EquipmentSlot hand = pie.getHand(); - if (hand != EquipmentSlot.HAND && hand != EquipmentSlot.OFF_HAND) { + final Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); + if (rein == null || rein.hasPermission(player, CitadelPermissionHandler.getModifyBlocks())) { return; } - ItemStack relevant; - Player p = pie.getPlayer(); - if (hand == EquipmentSlot.HAND) { - relevant = p.getInventory().getItemInMainHand(); - } else { - relevant = p.getInventory().getItemInOffHand(); - } - if (!MaterialTags.AXES.isTagged(relevant.getType())) { - return; - } - Reinforcement rein = Citadel.getInstance().getReinforcementManager().getReinforcement(block); - if (rein == null) { - return; - } - if (!rein.hasPermission(p, CitadelPermissionHandler.getModifyBlocks())) { - p.sendMessage(ChatColor.RED + "You do not have permission to modify this block"); - pie.setCancelled(true); - } + event.setCancelled(true); + player.sendMessage(Component.text( + "You do not have permission to modify this block", + NamedTextColor.RED + )); } @EventHandler(priority = EventPriority.NORMAL) @@ -417,7 +430,7 @@ public class BlockListener implements Listener { */ @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void preventWaxingCopper(BlockPlaceEvent event) { - if (!MoreTags.COPPER_BLOCKS.isTagged(event.getBlockPlaced().getType())) { + if (!MaterialTags.COPPER_BLOCKS.isTagged(event.getBlockPlaced().getType())) { return; } Reinforcement reinforcement = Citadel.getInstance().getReinforcementManager().getReinforcement(event.getBlockPlaced()); @@ -552,7 +565,7 @@ public class BlockListener implements Listener { } Block block = pie.getClickedBlock(); Material type = block.getType(); - if (!MoreTags.LIGHTABLE_CANDLES.isTagged(type)) { + if (!Tag.CANDLES.isTagged(type) && !Tag.CANDLE_CAKES.isTagged(type)) { return; } if (!pie.hasItem()) { @@ -774,7 +787,7 @@ public class BlockListener implements Listener { } Block block = pie.getClickedBlock(); Material type = block.getType(); - if (!MoreTags.DUSTABLE.isTagged(type)) { + if (!(block.getBlockData() instanceof Brushable)) { return; } EquipmentSlot hand = pie.getHand(); diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/CivModCorePlugin.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/CivModCorePlugin.java index de12bfa96..4ea3bf45f 100644 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/CivModCorePlugin.java +++ b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/CivModCorePlugin.java @@ -15,7 +15,6 @@ import vg.civcraft.mc.civmodcore.dao.DatabaseCredentials; import vg.civcraft.mc.civmodcore.dao.ManagedDatasource; import vg.civcraft.mc.civmodcore.inventory.gui.ClickableInventoryListener; import vg.civcraft.mc.civmodcore.inventory.items.EnchantUtils; -import vg.civcraft.mc.civmodcore.inventory.items.MoreTags; import vg.civcraft.mc.civmodcore.inventory.items.SpawnEggUtils; import vg.civcraft.mc.civmodcore.inventory.items.TreeTypeUtils; import vg.civcraft.mc.civmodcore.players.PlayerNames; @@ -99,7 +98,6 @@ public class CivModCorePlugin extends ACivMod { this.commands.registerCommand(new ChunkMetaCommand()); // Load APIs EnchantUtils.loadEnchantAbbreviations(); - MoreTags.init(); SpawnEggUtils.init(); TreeTypeUtils.init(); BottomLineAPI.init(); diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/MoreTags.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/MoreTags.java deleted file mode 100644 index 9015600f4..000000000 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/inventory/items/MoreTags.java +++ /dev/null @@ -1,342 +0,0 @@ -package vg.civcraft.mc.civmodcore.inventory.items; - -import com.destroystokyo.paper.MaterialTags; -import com.google.common.collect.ImmutableSet; -import java.util.HashSet; -import java.util.Set; -import java.util.stream.Collectors; -import org.apache.commons.collections4.CollectionUtils; -import org.bukkit.Bukkit; -import org.bukkit.Keyed; -import org.bukkit.Material; -import org.bukkit.NamespacedKey; -import org.bukkit.Tag; -import org.bukkit.block.data.Ageable; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; -import vg.civcraft.mc.civmodcore.utilities.CivLogger; -import vg.civcraft.mc.civmodcore.utilities.KeyedUtils; - -/** - * Fills in the gaps between {@link Tag} and {@link MaterialTags}. - */ -public final class MoreTags { - - /** - * This differs from {@link Tag#LOGS} as that includes every type of wood, - * including stripped logs and all planks. - */ - public static final Tag LOGS = new BetterTag<>("logs", - ImmutableSet.builder() - .add(Material.ACACIA_LOG) - .add(Material.BIRCH_LOG) - .add(Material.CHERRY_LOG) - .add(Material.DARK_OAK_LOG) - .add(Material.JUNGLE_LOG) - .add(Material.MANGROVE_LOG) - .add(Material.OAK_LOG) - .add(Material.SPRUCE_LOG) - .build()); - - public static final Tag STRIPPED_LOGS = new BetterTag<>("stripped_logs", - ImmutableSet.builder() - .add(Material.STRIPPED_ACACIA_LOG) - .add(Material.STRIPPED_BIRCH_LOG) - .add(Material.STRIPPED_CHERRY_LOG) - .add(Material.STRIPPED_DARK_OAK_LOG) - .add(Material.STRIPPED_JUNGLE_LOG) - .add(Material.STRIPPED_MANGROVE_LOG) - .add(Material.STRIPPED_OAK_LOG) - .add(Material.STRIPPED_SPRUCE_LOG) - .build()); - - public static final Tag STRIPPED_PLANKS = new BetterTag<>("stripped_planks", - ImmutableSet.builder() - .add(Material.STRIPPED_ACACIA_WOOD) - .add(Material.STRIPPED_BIRCH_WOOD) - .add(Material.STRIPPED_CHERRY_WOOD) - .add(Material.STRIPPED_DARK_OAK_WOOD) - .add(Material.STRIPPED_JUNGLE_WOOD) - .add(Material.STRIPPED_MANGROVE_WOOD) - .add(Material.STRIPPED_OAK_WOOD) - .add(Material.STRIPPED_SPRUCE_WOOD) - .build()); - - public static final Tag STRIPPED_ALL = new BetterTag<>("stripped_all", - ImmutableSet.builder() - .addAll(STRIPPED_LOGS.getValues()) - .addAll(STRIPPED_PLANKS.getValues()) - .build()); - - public static final Tag DIRT = new BetterTag<>("dirt", - ImmutableSet.builder() - .add(Material.FARMLAND) - .add(Material.DIRT_PATH) - .add(Material.GRASS_BLOCK) - .add(Material.DIRT) - .add(Material.COARSE_DIRT) - .add(Material.PODZOL) - .add(Material.ROOTED_DIRT) - .build()); - - public static final Tag POTIONS = new BetterTag<>("potion", - ImmutableSet.builder() - .add(Material.POTION) - .add(Material.SPLASH_POTION) - .add(Material.LINGERING_POTION) - .build()); - - public static final Tag DUSTABLE = new BetterTag<>("dustable", - ImmutableSet.builder() - .add(Material.SUSPICIOUS_GRAVEL) - .add(Material.SUSPICIOUS_SAND) - .build()); - - /** - * Materials of items that can apply potion effects. - */ - public static final Tag EFFECTORS = new BetterTag<>("effectors", - ImmutableSet.builder() - .addAll(POTIONS.getValues()) - .add(Material.TIPPED_ARROW) - .build()); - - /** - * This is necessary as {@link Tag#CROPS} is crap and only has a few crops, and {@link Ageable} includes none-crop - * blocks like {@link Material#FIRE fire} and {@link Material#FROSTED_ICE frosted ice}. - */ - public static final Tag CROPS = new BetterTag<>("crops", - ImmutableSet.builder() - .add(Material.BAMBOO) - .add(Material.BAMBOO_SAPLING) - .add(Material.BEETROOTS) - .add(Material.CACTUS) - .add(Material.CARROTS) - .add(Material.CHORUS_FLOWER) - .add(Material.CHORUS_PLANT) - .add(Material.COCOA) - .add(Material.KELP) - .add(Material.MELON_STEM) - .add(Material.NETHER_WART) - .add(Material.PITCHER_CROP) - .add(Material.PITCHER_PLANT) - .add(Material.POTATOES) - .add(Material.PUMPKIN_STEM) - .add(Material.SUGAR_CANE) - .add(Material.SWEET_BERRY_BUSH) - .add(Material.TWISTING_VINES) - .add(Material.TORCHFLOWER_CROP) - .add(Material.TORCHFLOWER) - .add(Material.WEEPING_VINES) - .add(Material.WHEAT) - .add(Material.CAVE_VINES) - .build()); - - public static final Tag POTTABLE = new BetterTag<>("pottable", - ImmutableSet.builder() - .add(Material.ACACIA_SAPLING) - .add(Material.ALLIUM) - .add(Material.AZURE_BLUET) - .add(Material.BAMBOO) - .add(Material.BIRCH_SAPLING) - .add(Material.BLUE_ORCHID) - .add(Material.BROWN_MUSHROOM) - .add(Material.CACTUS) - .add(Material.CHERRY_SAPLING) - .add(Material.CORNFLOWER) - .add(Material.CRIMSON_FUNGUS) - .add(Material.CRIMSON_ROOTS) - .add(Material.DANDELION) - .add(Material.DARK_OAK_SAPLING) - .add(Material.DEAD_BUSH) - .add(Material.FERN) - .add(Material.JUNGLE_SAPLING) - .add(Material.LILY_OF_THE_VALLEY) - .add(Material.MANGROVE_PROPAGULE) - .add(Material.OAK_SAPLING) - .add(Material.ORANGE_TULIP) - .add(Material.OXEYE_DAISY) - .add(Material.PINK_TULIP) - .add(Material.POPPY) - .add(Material.RED_MUSHROOM) - .add(Material.RED_TULIP) - .add(Material.SPRUCE_SAPLING) - .add(Material.WARPED_FUNGUS) - .add(Material.WARPED_ROOTS) - .add(Material.WHITE_TULIP) - .add(Material.WITHER_ROSE) - .build()); - - public static final Tag NETHERITE_ARMOUR = new BetterTag<>("netherite_armour", - ImmutableSet.builder() - .add(Material.NETHERITE_HELMET) - .add(Material.NETHERITE_CHESTPLATE) - .add(Material.NETHERITE_LEGGINGS) - .add(Material.NETHERITE_BOOTS) - .build()); - - /** - * Includes {@link Material#NETHERITE_SWORD} as while it's not strictly a tool, it's likely to be included in - * similar checks for handheld usable items, and best to support that and not be awkward for the sake of - * technical correctness. - */ - public static final Tag NETHERITE_TOOLS = new BetterTag<>("netherite_tools", - ImmutableSet.builder() - .add(Material.NETHERITE_SWORD) - .add(Material.NETHERITE_PICKAXE) - .add(Material.NETHERITE_AXE) - .add(Material.NETHERITE_SHOVEL) - .add(Material.NETHERITE_HOE) - .build()); - - public static final Tag NETHERITE_ITEMS = new BetterTag<>("netherite_items", - ImmutableSet.builder() - .addAll(NETHERITE_ARMOUR.getValues()) - .addAll(NETHERITE_TOOLS.getValues()) - .add(Material.NETHERITE_INGOT) - .add(Material.NETHERITE_BLOCK) - .add(Material.NETHERITE_SCRAP) - .build()); - - public static final Tag LIGHTABLE_CANDLES = new BetterTag<>("lightable_candles", - ImmutableSet.builder() - .add(Material.CANDLE) - .add(Material.CANDLE_CAKE) - .add(Material.CYAN_CANDLE) - .add(Material.CYAN_CANDLE_CAKE) - .add(Material.BLACK_CANDLE) - .add(Material.BLACK_CANDLE_CAKE) - .add(Material.BLUE_CANDLE) - .add(Material.BLUE_CANDLE_CAKE) - .add(Material.BROWN_CANDLE) - .add(Material.BROWN_CANDLE_CAKE) - .add(Material.GRAY_CANDLE) - .add(Material.GRAY_CANDLE_CAKE) - .add(Material.GREEN_CANDLE) - .add(Material.GREEN_CANDLE_CAKE) - .add(Material.LIGHT_BLUE_CANDLE) - .add(Material.LIGHT_BLUE_CANDLE_CAKE) - .add(Material.LIGHT_GRAY_CANDLE) - .add(Material.LIGHT_GRAY_CANDLE_CAKE) - .add(Material.LIME_CANDLE) - .add(Material.LIME_CANDLE_CAKE) - .add(Material.MAGENTA_CANDLE) - .add(Material.MAGENTA_CANDLE_CAKE) - .add(Material.ORANGE_CANDLE) - .add(Material.ORANGE_CANDLE_CAKE) - .add(Material.PINK_CANDLE) - .add(Material.PINK_CANDLE_CAKE) - .add(Material.PURPLE_CANDLE) - .add(Material.PURPLE_CANDLE_CAKE) - .add(Material.RED_CANDLE) - .add(Material.RED_CANDLE_CAKE) - .add(Material.WHITE_CANDLE) - .add(Material.WHITE_CANDLE_CAKE) - .add(Material.YELLOW_CANDLE) - .add(Material.YELLOW_CANDLE_CAKE) - .build()); - - public static final Tag COPPER_BLOCKS = new BetterTag<>("copper_blocks", - ImmutableSet.builder() - .add(Material.COPPER_BLOCK) - .add(Material.EXPOSED_COPPER) - .add(Material.WEATHERED_COPPER) - .add(Material.OXIDIZED_COPPER) - .add(Material.CUT_COPPER) - .add(Material.EXPOSED_CUT_COPPER) - .add(Material.WEATHERED_CUT_COPPER) - .add(Material.OXIDIZED_CUT_COPPER) - .add(Material.CUT_COPPER_STAIRS) - .add(Material.EXPOSED_CUT_COPPER_STAIRS) - .add(Material.WEATHERED_CUT_COPPER_STAIRS) - .add(Material.OXIDIZED_CUT_COPPER_STAIRS) - .add(Material.CUT_COPPER_SLAB) - .add(Material.EXPOSED_CUT_COPPER_SLAB) - .add(Material.WEATHERED_CUT_COPPER_SLAB) - .add(Material.OXIDIZED_CUT_COPPER_SLAB) - .add(Material.WAXED_COPPER_BLOCK) - .add(Material.WAXED_EXPOSED_COPPER) - .add(Material.WAXED_WEATHERED_COPPER) - .add(Material.WAXED_OXIDIZED_COPPER) - .add(Material.WAXED_CUT_COPPER) - .add(Material.WAXED_EXPOSED_CUT_COPPER) - .add(Material.WAXED_WEATHERED_CUT_COPPER) - .add(Material.WAXED_OXIDIZED_CUT_COPPER) - .add(Material.WAXED_CUT_COPPER_STAIRS) - .add(Material.WAXED_EXPOSED_CUT_COPPER_STAIRS) - .add(Material.WAXED_WEATHERED_CUT_COPPER_STAIRS) - .add(Material.WAXED_OXIDIZED_CUT_COPPER_STAIRS) - .add(Material.WAXED_CUT_COPPER_SLAB) - .add(Material.WAXED_EXPOSED_CUT_COPPER_SLAB) - .add(Material.WAXED_WEATHERED_CUT_COPPER_SLAB) - .add(Material.WAXED_OXIDIZED_CUT_COPPER_SLAB) - .build()); - - /** - * This is referring to materials that can exist in the world as blocks. - */ - public static final Tag LIQUID_BLOCKS = new BetterTag<>("liquid_blocks", - ImmutableSet.builder() - .add(Material.LAVA) - .add(Material.WATER) - .add(Material.POWDER_SNOW) - .build()); - - // ------------------------------------------------------------ - // Better Tag class to allow for easy Tag creation. - // ------------------------------------------------------------ - - private static class BetterTag implements Tag { - - private final NamespacedKey key; - - private final Set values; - - private BetterTag(final String key, final Set values) { - this.key = KeyedUtils.fromParts("civmodcore", key); - this.values = values; - } - - @Override - public boolean isTagged(@Nullable T value) { - return this.values.contains(value); - } - - @NotNull - @Override - public Set getValues() { - return this.values; - } - - @NotNull - @Override - public NamespacedKey getKey() { - return this.key; - } - - } - - // ------------------------------------------------------------ - // Initialise and check MoreTags - // ------------------------------------------------------------ - - public static void init() { - final var logger = CivLogger.getLogger(MoreTags.class); - // Determine if there's any crops missing - { - final Set missing = new HashSet<>(); - CollectionUtils.addAll(missing, Material.values()); - CollectionUtils.filter(missing, Material::isBlock); // Do this first to reduce amount of block data created - CollectionUtils.filter(missing, material -> Bukkit.createBlockData(material) instanceof Ageable); - missing.removeIf(Tag.ICE::isTagged); - missing.removeIf(Tag.FIRE::isTagged); - missing.removeIf(Tag.SAPLINGS::isTagged); - missing.removeIf(CROPS::isTagged); - if (!missing.isEmpty()) { - logger.warning("The following crops are missing: " + - missing.stream().map(Material::name).collect(Collectors.joining(",")) + "."); - } - } - } - -} diff --git a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/WorldUtils.java b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/WorldUtils.java index 531fa510f..4499f899c 100644 --- a/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/WorldUtils.java +++ b/plugins/civmodcore-paper/src/main/java/vg/civcraft/mc/civmodcore/world/WorldUtils.java @@ -23,8 +23,8 @@ import org.bukkit.block.data.Levelled; import org.bukkit.block.data.type.Chest; import org.bukkit.block.data.type.Switch; import org.bukkit.util.BlockIterator; +import org.jetbrains.annotations.Contract; import vg.civcraft.mc.civmodcore.inventory.items.MaterialUtils; -import vg.civcraft.mc.civmodcore.inventory.items.MoreTags; import vg.civcraft.mc.civmodcore.utilities.NullUtils; /** @@ -509,15 +509,16 @@ public final class WorldUtils { } /** - * Determines whether a given block is liquid source. - * - * @param block The block to check. - * @return Returns true if the block is a liquid source. + * Determines whether a given block is liquid source, meaning that it will spill out where possible and sustain the + * spill until the source-block is removed. */ - public static boolean isSourceBlock(final Block block) { + @Contract("null -> false") + public static boolean isSourceBlock( + final Block block + ) { return block != null - && MoreTags.LIQUID_BLOCKS.isTagged(block.getType()) - && ((Levelled) block.getBlockData()).getLevel() == 0; + && switch (block.getType()) { case WATER, LAVA -> true; default -> false; } + && block.getBlockData() instanceof final Levelled levelled + && levelled.getLevel() == 0; } - }