Remove MoreTags

This commit is contained in:
Alexander
2025-02-20 21:20:14 +00:00
parent f96133e149
commit f2fd58602e
4 changed files with 53 additions and 383 deletions

View File

@@ -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();

View File

@@ -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();

View File

@@ -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<Material> LOGS = new BetterTag<>("logs",
ImmutableSet.<Material>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<Material> STRIPPED_LOGS = new BetterTag<>("stripped_logs",
ImmutableSet.<Material>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<Material> STRIPPED_PLANKS = new BetterTag<>("stripped_planks",
ImmutableSet.<Material>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<Material> STRIPPED_ALL = new BetterTag<>("stripped_all",
ImmutableSet.<Material>builder()
.addAll(STRIPPED_LOGS.getValues())
.addAll(STRIPPED_PLANKS.getValues())
.build());
public static final Tag<Material> DIRT = new BetterTag<>("dirt",
ImmutableSet.<Material>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<Material> POTIONS = new BetterTag<>("potion",
ImmutableSet.<Material>builder()
.add(Material.POTION)
.add(Material.SPLASH_POTION)
.add(Material.LINGERING_POTION)
.build());
public static final Tag<Material> DUSTABLE = new BetterTag<>("dustable",
ImmutableSet.<Material>builder()
.add(Material.SUSPICIOUS_GRAVEL)
.add(Material.SUSPICIOUS_SAND)
.build());
/**
* Materials of items that can apply potion effects.
*/
public static final Tag<Material> EFFECTORS = new BetterTag<>("effectors",
ImmutableSet.<Material>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<Material> CROPS = new BetterTag<>("crops",
ImmutableSet.<Material>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<Material> POTTABLE = new BetterTag<>("pottable",
ImmutableSet.<Material>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<Material> NETHERITE_ARMOUR = new BetterTag<>("netherite_armour",
ImmutableSet.<Material>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<Material> NETHERITE_TOOLS = new BetterTag<>("netherite_tools",
ImmutableSet.<Material>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<Material> NETHERITE_ITEMS = new BetterTag<>("netherite_items",
ImmutableSet.<Material>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<Material> LIGHTABLE_CANDLES = new BetterTag<>("lightable_candles",
ImmutableSet.<Material>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<Material> COPPER_BLOCKS = new BetterTag<>("copper_blocks",
ImmutableSet.<Material>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<Material> LIQUID_BLOCKS = new BetterTag<>("liquid_blocks",
ImmutableSet.<Material>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<T extends Keyed> implements Tag<T> {
private final NamespacedKey key;
private final Set<T> values;
private BetterTag(final String key, final Set<T> 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<T> 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<Material> 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(",")) + ".");
}
}
}
}

View File

@@ -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;
}
}