Use Tags for Materials in BukkitUtils (#883)

This commit is contained in:
KleinCrafter
2023-10-17 08:38:46 +02:00
committed by GitHub
parent f2e76a50cb
commit d7e458ad68
10 changed files with 249 additions and 486 deletions

View File

@ -160,7 +160,7 @@ public class BlockChange implements LookupCacheElement {
msg.addExtra(createTextComponentWithColor("dried ", DESTROY.getColor())); msg.addExtra(createTextComponentWithColor("dried ", DESTROY.getColor()));
msg.addExtra(prettyMaterial(type)); msg.addExtra(prettyMaterial(type));
} }
} else if (BukkitUtils.getContainerBlocks().contains(type.getMaterial())) { } else if (BukkitUtils.isContainerBlock(type.getMaterial())) {
msg.addExtra(createTextComponentWithColor("opened ", INTERACT.getColor())); msg.addExtra(createTextComponentWithColor("opened ", INTERACT.getColor()));
msg.addExtra(prettyMaterial(type)); msg.addExtra(prettyMaterial(type));
} else if (type instanceof Openable && ((Openable) type).isOpen() != ((Openable) replaced).isOpen()) { } else if (type instanceof Openable && ((Openable) type).isOpen() != ((Openable) replaced).isOpen()) {

View File

@ -16,7 +16,7 @@ import org.bukkit.inventory.ItemStack;
public class BlockStateCodecShulkerBox implements BlockStateCodec { public class BlockStateCodecShulkerBox implements BlockStateCodec {
@Override @Override
public Material[] getApplicableMaterials() { public Material[] getApplicableMaterials() {
return BukkitUtils.getShulkerBoxBlocks().toArray(new Material[BukkitUtils.getShulkerBoxBlocks().size()]); return BukkitUtils.getShulkerBoxBlocks().toArray(Material[]::new);
} }
@Override @Override

View File

@ -20,7 +20,7 @@ import org.bukkit.configuration.file.YamlConfiguration;
public class BlockStateCodecSign implements BlockStateCodec { public class BlockStateCodecSign implements BlockStateCodec {
@Override @Override
public Material[] getApplicableMaterials() { public Material[] getApplicableMaterials() {
return BukkitUtils.getAllSignMaterials().toArray(new Material[BukkitUtils.getAllSignMaterials().size()]); return BukkitUtils.getAllSignMaterials().toArray(Material[]::new);
} }
@Override @Override

View File

@ -39,7 +39,7 @@ public class BlockBreakLogging extends LoggingListener {
final Block origin = event.getBlock(); final Block origin = event.getBlock();
final Material type = origin.getType(); final Material type = origin.getType();
if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.isContainerBlock(type) && !BukkitUtils.isShulkerBoxBlock(type)) {
consumer.queueContainerBreak(actor, origin.getState()); consumer.queueContainerBreak(actor, origin.getState());
} else if (type == Material.ICE) { } else if (type == Material.ICE) {
// When in creative mode ice doesn't form water // When in creative mode ice doesn't form water

View File

@ -42,7 +42,7 @@ public class CreatureInteractLogging extends LoggingListener {
consumer.queueBlock(new Actor("CreatureTrample"), loc, type.createBlockData(), Material.DIRT.createBlockData()); consumer.queueBlock(new Actor("CreatureTrample"), loc, type.createBlockData(), Material.DIRT.createBlockData());
// Log the crop on top as being broken // Log the crop on top as being broken
Block trampledCrop = clicked.getRelative(BlockFace.UP); Block trampledCrop = clicked.getRelative(BlockFace.UP);
if (BukkitUtils.getCropBlocks().contains(trampledCrop.getType())) { if (BukkitUtils.isCropBlock(trampledCrop.getType())) {
consumer.queueBlockBreak(new Actor("CreatureTrample"), trampledCrop.getState()); consumer.queueBlockBreak(new Actor("CreatureTrample"), trampledCrop.getState());
} }
} }

View File

@ -25,7 +25,6 @@ import org.bukkit.scheduler.BukkitRunnable;
import static de.diddiz.LogBlock.config.Config.getWorldConfig; import static de.diddiz.LogBlock.config.Config.getWorldConfig;
import static de.diddiz.LogBlock.config.Config.logCreeperExplosionsAsPlayerWhoTriggeredThese; import static de.diddiz.LogBlock.config.Config.logCreeperExplosionsAsPlayerWhoTriggeredThese;
import static de.diddiz.LogBlock.util.BukkitUtils.getContainerBlocks;
import java.util.UUID; import java.util.UUID;
@ -117,7 +116,7 @@ public class ExplosionLogging extends LoggingListener {
} }
for (final Block block : event.blockList()) { for (final Block block : event.blockList()) {
final Material type = block.getType(); final Material type = block.getType();
if (wcfg.isLogging(Logging.CHESTACCESS) && getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.isContainerBlock(type) && !BukkitUtils.isShulkerBoxBlock(type)) {
consumer.queueContainerBreak(actor, block.getState()); consumer.queueContainerBreak(actor, block.getState());
} else { } else {
consumer.queueBlockBreak(actor, block.getState()); consumer.queueBlockBreak(actor, block.getState());
@ -218,7 +217,7 @@ public class ExplosionLogging extends LoggingListener {
} }
final Material type = block.getType(); final Material type = block.getType();
if (wcfg.isLogging(Logging.CHESTACCESS) && getContainerBlocks().contains(type) && !BukkitUtils.getShulkerBoxBlocks().contains(type)) { if (wcfg.isLogging(Logging.CHESTACCESS) && BukkitUtils.isContainerBlock(type) && !BukkitUtils.isShulkerBoxBlock(type)) {
consumer.queueContainerBreak(actor, block.getState()); consumer.queueContainerBreak(actor, block.getState());
} else { } else {
consumer.queueBlockBreak(actor, block.getState()); consumer.queueBlockBreak(actor, block.getState());

View File

@ -45,7 +45,7 @@ public class FluidFlowLogging extends LoggingListener {
final Block to = event.getToBlock(); final Block to = event.getToBlock();
final Material typeTo = to.getType(); final Material typeTo = to.getType();
boolean down = event.getFace() == BlockFace.DOWN; boolean down = event.getFace() == BlockFace.DOWN;
final boolean canFlow = BukkitUtils.isEmpty(typeTo) || BukkitUtils.getNonFluidProofBlocks().contains(typeTo); final boolean canFlow = BukkitUtils.isEmpty(typeTo) || BukkitUtils.isNonFluidProofBlock(typeTo);
if (typeFrom == Material.LAVA && wcfg.isLogging(Logging.LAVAFLOW)) { if (typeFrom == Material.LAVA && wcfg.isLogging(Logging.LAVAFLOW)) {
Levelled levelledFrom = (Levelled) blockDataFrom; Levelled levelledFrom = (Levelled) blockDataFrom;
if (canFlow) { if (canFlow) {
@ -73,7 +73,7 @@ public class FluidFlowLogging extends LoggingListener {
newBlock.setLevel(fromWaterlogged || down ? 1 : Math.min(levelledFrom.getLevel() + 1, levelledFrom.getMaximumLevel())); newBlock.setLevel(fromWaterlogged || down ? 1 : Math.min(levelledFrom.getLevel() + 1, levelledFrom.getMaximumLevel()));
if (BukkitUtils.isEmpty(typeTo)) { if (BukkitUtils.isEmpty(typeTo)) {
consumer.queueBlockPlace(new Actor("WaterFlow", source), to.getLocation(), newBlock); consumer.queueBlockPlace(new Actor("WaterFlow", source), to.getLocation(), newBlock);
} else if (BukkitUtils.getNonFluidProofBlocks().contains(typeTo)) { } else if (BukkitUtils.isNonFluidProofBlock(typeTo)) {
consumer.queueBlockReplace(new Actor("WaterFlow", source), to.getState(), newBlock); consumer.queueBlockReplace(new Actor("WaterFlow", source), to.getState(), newBlock);
} else if (typeTo == Material.LAVA) { } else if (typeTo == Material.LAVA) {
int toLevel = ((Levelled) to.getBlockData()).getLevel(); int toLevel = ((Levelled) to.getBlockData()).getLevel();
@ -83,7 +83,7 @@ public class FluidFlowLogging extends LoggingListener {
consumer.queueBlockReplace(new Actor("WaterFlow", source), to.getState(), Material.STONE.createBlockData()); consumer.queueBlockReplace(new Actor("WaterFlow", source), to.getState(), Material.STONE.createBlockData());
} }
} }
if (BukkitUtils.isEmpty(typeTo) || BukkitUtils.getNonFluidProofBlocks().contains(typeTo)) { if (BukkitUtils.isEmpty(typeTo) || BukkitUtils.isNonFluidProofBlock(typeTo)) {
for (final BlockFace face : new BlockFace[] { BlockFace.DOWN, BlockFace.NORTH, BlockFace.WEST, BlockFace.EAST, BlockFace.SOUTH }) { for (final BlockFace face : new BlockFace[] { BlockFace.DOWN, BlockFace.NORTH, BlockFace.WEST, BlockFace.EAST, BlockFace.SOUTH }) {
final Block lower = to.getRelative(face); final Block lower = to.getRelative(face);
if (lower.getType() == Material.LAVA) { if (lower.getType() == Material.LAVA) {

View File

@ -178,7 +178,7 @@ public class InteractLogging extends LoggingListener {
consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, Material.DIRT.createBlockData()); consumer.queueBlock(Actor.actorFromEntity(player), loc, blockData, Material.DIRT.createBlockData());
// Log the crop on top as being broken // Log the crop on top as being broken
Block trampledCrop = clicked.getRelative(BlockFace.UP); Block trampledCrop = clicked.getRelative(BlockFace.UP);
if (BukkitUtils.getCropBlocks().contains(trampledCrop.getType())) { if (BukkitUtils.isCropBlock(trampledCrop.getType())) {
consumer.queueBlockBreak(Actor.actorFromEntity(player), trampledCrop.getState()); consumer.queueBlockBreak(Actor.actorFromEntity(player), trampledCrop.getState());
} }
} }

View File

@ -6,7 +6,6 @@ import de.diddiz.LogBlock.LogBlock;
import java.io.File; import java.io.File;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
@ -28,6 +27,7 @@ import org.bukkit.Chunk;
import org.bukkit.DyeColor; import org.bukkit.DyeColor;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.Material; import org.bukkit.Material;
import org.bukkit.Tag;
import org.bukkit.World; import org.bukkit.World;
import org.bukkit.block.Block; import org.bukkit.block.Block;
import org.bukkit.block.BlockFace; import org.bukkit.block.BlockFace;
@ -57,253 +57,165 @@ import org.bukkit.inventory.InventoryHolder;
import org.bukkit.inventory.ItemStack; import org.bukkit.inventory.ItemStack;
public class BukkitUtils { public class BukkitUtils {
private static final Set<Set<Integer>> blockEquivalents;
private static final Map<Material, DyeColor> dyes;
private static final Map<EntityType, Material> projectileItems;
private static final Set<Material> alwaysWaterlogged;
private static final Set<Material> concreteBlocks;
private static final Set<Material> containerBlocks;
private static final Set<Material> doublePlants;
private static final Set<Material> fallingEntityKillers;
private static final Set<Material> nonFluidProofBlocks;
private static final Set<Material> relativeBreakable; private static final Set<Material> relativeBreakable;
private static final Set<Material> relativeTopBreakable; private static final Set<Material> relativeTopBreakable;
private static final Set<Material> fallingEntityKillers;
private static final Set<Material> cropBlocks;
private static final Set<Material> containerBlocks;
private static final Set<Material> shulkerBoxBlocks;
private static final Set<Material> singleBlockPlants; private static final Set<Material> singleBlockPlants;
private static final Set<Material> doublePlants;
private static final Set<Material> nonFluidProofBlocks; private static final Tag<Material> allSigns;
private static final Tag<Material> bedBlocks;
private static final Set<Material> bedBlocks; private static final Tag<Material> buttons;
private static final Tag<Material> candleCakes;
private static final Map<EntityType, Material> projectileItems; private static final Tag<Material> candles;
private static final HashSet<Material> signs; private static final Tag<Material> cropBlocks;
private static final HashSet<Material> wallSigns; private static final Tag<Material> fenceGates;
private static final HashSet<Material> hangingSigns; private static final Tag<Material> hangingSigns;
private static final HashSet<Material> hangingWallSigns; private static final Tag<Material> pressurePlates;
private static final HashSet<Material> allSigns; private static final Tag<Material> shulkerBoxBlocks;
private static final Set<Material> unmodifiableSigns; private static final Tag<Material> slabs;
private static final HashSet<Material> buttons; private static final Tag<Material> woodenDoors;
private static final HashSet<Material> pressurePlates; private static final Tag<Material> woodenTrapdoors;
private static final HashSet<Material> woodenDoors;
private static final HashSet<Material> slabs;
private static final HashSet<Material> concreteBlocks;
private static final HashMap<Material, DyeColor> dyes;
private static final HashSet<Material> alwaysWaterlogged;
private static final HashSet<Material> candles;
private static final HashSet<Material> candleCakes;
private static final HashSet<Material> fenceGates;
private static final HashSet<Material> woodenTrapdoors;
static { static {
fenceGates = new HashSet<>(); // Global Tags
fenceGates.add(Material.OAK_FENCE_GATE);
fenceGates.add(Material.SPRUCE_FENCE_GATE);
fenceGates.add(Material.BIRCH_FENCE_GATE);
fenceGates.add(Material.JUNGLE_FENCE_GATE);
fenceGates.add(Material.ACACIA_FENCE_GATE);
fenceGates.add(Material.DARK_OAK_FENCE_GATE);
fenceGates.add(Material.WARPED_FENCE_GATE);
fenceGates.add(Material.CRIMSON_FENCE_GATE);
fenceGates.add(Material.MANGROVE_FENCE_GATE);
fenceGates.add(Material.BAMBOO_FENCE_GATE);
fenceGates.add(Material.CHERRY_FENCE_GATE);
woodenTrapdoors = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_fence_gates
woodenTrapdoors.add(Material.OAK_TRAPDOOR); fenceGates = Tag.FENCE_GATES;
woodenTrapdoors.add(Material.SPRUCE_TRAPDOOR);
woodenTrapdoors.add(Material.BIRCH_TRAPDOOR);
woodenTrapdoors.add(Material.JUNGLE_TRAPDOOR);
woodenTrapdoors.add(Material.ACACIA_TRAPDOOR);
woodenTrapdoors.add(Material.DARK_OAK_TRAPDOOR);
woodenTrapdoors.add(Material.WARPED_TRAPDOOR);
woodenTrapdoors.add(Material.CRIMSON_TRAPDOOR);
woodenTrapdoors.add(Material.MANGROVE_TRAPDOOR);
woodenTrapdoors.add(Material.BAMBOO_TRAPDOOR);
woodenTrapdoors.add(Material.CHERRY_TRAPDOOR);
pressurePlates = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_wooden_trapdoors
pressurePlates.add(Material.OAK_PRESSURE_PLATE); woodenTrapdoors = Tag.WOODEN_TRAPDOORS;
pressurePlates.add(Material.SPRUCE_PRESSURE_PLATE);
pressurePlates.add(Material.BIRCH_PRESSURE_PLATE);
pressurePlates.add(Material.JUNGLE_PRESSURE_PLATE);
pressurePlates.add(Material.ACACIA_PRESSURE_PLATE);
pressurePlates.add(Material.DARK_OAK_PRESSURE_PLATE);
pressurePlates.add(Material.WARPED_PRESSURE_PLATE);
pressurePlates.add(Material.CRIMSON_PRESSURE_PLATE);
pressurePlates.add(Material.MANGROVE_PRESSURE_PLATE);
pressurePlates.add(Material.BAMBOO_PRESSURE_PLATE);
pressurePlates.add(Material.CHERRY_PRESSURE_PLATE);
pressurePlates.add(Material.STONE_PRESSURE_PLATE);
pressurePlates.add(Material.LIGHT_WEIGHTED_PRESSURE_PLATE);
pressurePlates.add(Material.HEAVY_WEIGHTED_PRESSURE_PLATE);
woodenDoors = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_pressure_plates
woodenDoors.add(Material.OAK_DOOR); pressurePlates = Tag.PRESSURE_PLATES;
woodenDoors.add(Material.SPRUCE_DOOR);
woodenDoors.add(Material.BIRCH_DOOR);
woodenDoors.add(Material.JUNGLE_DOOR);
woodenDoors.add(Material.ACACIA_DOOR);
woodenDoors.add(Material.DARK_OAK_DOOR);
woodenDoors.add(Material.WARPED_DOOR);
woodenDoors.add(Material.CRIMSON_DOOR);
woodenDoors.add(Material.MANGROVE_DOOR);
woodenDoors.add(Material.BAMBOO_DOOR);
woodenDoors.add(Material.CHERRY_DOOR);
HashSet<Material> saplings = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_wooden_doors
saplings.add(Material.OAK_SAPLING); woodenDoors = Tag.WOODEN_DOORS;
saplings.add(Material.SPRUCE_SAPLING);
saplings.add(Material.BIRCH_SAPLING);
saplings.add(Material.JUNGLE_SAPLING);
saplings.add(Material.ACACIA_SAPLING);
saplings.add(Material.DARK_OAK_SAPLING);
saplings.add(Material.CHERRY_SAPLING);
saplings.add(Material.WARPED_FUNGUS);
saplings.add(Material.CRIMSON_FUNGUS);
saplings.add(Material.MANGROVE_PROPAGULE);
HashSet<Material> carpets = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_slabs
carpets.add(Material.BLACK_CARPET); slabs = Tag.SLABS;
carpets.add(Material.BLUE_CARPET);
carpets.add(Material.LIGHT_GRAY_CARPET);
carpets.add(Material.BROWN_CARPET);
carpets.add(Material.CYAN_CARPET);
carpets.add(Material.GRAY_CARPET);
carpets.add(Material.GREEN_CARPET);
carpets.add(Material.LIGHT_BLUE_CARPET);
carpets.add(Material.MAGENTA_CARPET);
carpets.add(Material.LIME_CARPET);
carpets.add(Material.ORANGE_CARPET);
carpets.add(Material.PINK_CARPET);
carpets.add(Material.PURPLE_CARPET);
carpets.add(Material.RED_CARPET);
carpets.add(Material.WHITE_CARPET);
carpets.add(Material.YELLOW_CARPET);
slabs = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_buttons
slabs.add(Material.OAK_SLAB); buttons = Tag.BUTTONS;
slabs.add(Material.SPRUCE_SLAB);
slabs.add(Material.BIRCH_SLAB);
slabs.add(Material.JUNGLE_SLAB);
slabs.add(Material.ACACIA_SLAB);
slabs.add(Material.DARK_OAK_SLAB);
slabs.add(Material.WARPED_SLAB);
slabs.add(Material.CRIMSON_SLAB);
slabs.add(Material.STONE_SLAB);
slabs.add(Material.STONE_BRICK_SLAB);
slabs.add(Material.COBBLESTONE_SLAB);
slabs.add(Material.PETRIFIED_OAK_SLAB);
slabs.add(Material.SANDSTONE_SLAB);
slabs.add(Material.RED_SANDSTONE_SLAB);
slabs.add(Material.NETHER_BRICK_SLAB);
slabs.add(Material.PURPUR_SLAB);
slabs.add(Material.QUARTZ_SLAB);
slabs.add(Material.BRICK_SLAB);
slabs.add(Material.PRISMARINE_SLAB);
slabs.add(Material.DARK_PRISMARINE_SLAB);
slabs.add(Material.PRISMARINE_BRICK_SLAB);
slabs.add(Material.BLACKSTONE_SLAB);
slabs.add(Material.POLISHED_BLACKSTONE_SLAB);
slabs.add(Material.DEEPSLATE_BRICK_SLAB);
slabs.add(Material.DEEPSLATE_TILE_SLAB);
slabs.add(Material.COBBLED_DEEPSLATE_SLAB);
slabs.add(Material.POLISHED_DEEPSLATE_SLAB);
slabs.add(Material.MANGROVE_SLAB);
slabs.add(Material.BAMBOO_SLAB);
slabs.add(Material.CHERRY_SLAB);
buttons = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_ceiling_hanging_signs
buttons.add(Material.STONE_BUTTON); hangingSigns = Tag.CEILING_HANGING_SIGNS;
buttons.add(Material.OAK_BUTTON);
buttons.add(Material.SPRUCE_BUTTON);
buttons.add(Material.BIRCH_BUTTON);
buttons.add(Material.JUNGLE_BUTTON);
buttons.add(Material.ACACIA_BUTTON);
buttons.add(Material.DARK_OAK_BUTTON);
buttons.add(Material.WARPED_BUTTON);
buttons.add(Material.CRIMSON_BUTTON);
buttons.add(Material.MANGROVE_BUTTON);
buttons.add(Material.BAMBOO_BUTTON);
buttons.add(Material.CHERRY_BUTTON);
buttons.add(Material.POLISHED_BLACKSTONE_BUTTON);
signs = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_all_signs
signs.add(Material.OAK_SIGN); allSigns = Tag.ALL_SIGNS;
signs.add(Material.SPRUCE_SIGN);
signs.add(Material.BIRCH_SIGN);
signs.add(Material.JUNGLE_SIGN);
signs.add(Material.DARK_OAK_SIGN);
signs.add(Material.ACACIA_SIGN);
signs.add(Material.WARPED_SIGN);
signs.add(Material.CRIMSON_SIGN);
signs.add(Material.MANGROVE_SIGN);
signs.add(Material.BAMBOO_SIGN);
signs.add(Material.CHERRY_SIGN);
wallSigns = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_candles
wallSigns.add(Material.OAK_WALL_SIGN); candles = Tag.CANDLES;
wallSigns.add(Material.SPRUCE_WALL_SIGN);
wallSigns.add(Material.BIRCH_WALL_SIGN);
wallSigns.add(Material.JUNGLE_WALL_SIGN);
wallSigns.add(Material.DARK_OAK_WALL_SIGN);
wallSigns.add(Material.ACACIA_WALL_SIGN);
wallSigns.add(Material.WARPED_WALL_SIGN);
wallSigns.add(Material.CRIMSON_WALL_SIGN);
wallSigns.add(Material.MANGROVE_WALL_SIGN);
wallSigns.add(Material.BAMBOO_WALL_SIGN);
wallSigns.add(Material.CHERRY_WALL_SIGN);
hangingSigns = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_candle_cakes
hangingSigns.add(Material.OAK_HANGING_SIGN); candleCakes = Tag.CANDLE_CAKES;
hangingSigns.add(Material.SPRUCE_HANGING_SIGN);
hangingSigns.add(Material.BIRCH_HANGING_SIGN);
hangingSigns.add(Material.JUNGLE_HANGING_SIGN);
hangingSigns.add(Material.DARK_OAK_HANGING_SIGN);
hangingSigns.add(Material.ACACIA_HANGING_SIGN);
hangingSigns.add(Material.WARPED_HANGING_SIGN);
hangingSigns.add(Material.CRIMSON_HANGING_SIGN);
hangingSigns.add(Material.MANGROVE_HANGING_SIGN);
hangingSigns.add(Material.BAMBOO_HANGING_SIGN);
hangingSigns.add(Material.CHERRY_HANGING_SIGN);
hangingWallSigns = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_crops
hangingWallSigns.add(Material.OAK_WALL_HANGING_SIGN); cropBlocks = Tag.CROPS;
hangingWallSigns.add(Material.SPRUCE_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.BIRCH_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.JUNGLE_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.DARK_OAK_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.ACACIA_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.WARPED_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.CRIMSON_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.MANGROVE_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.BAMBOO_WALL_HANGING_SIGN);
hangingWallSigns.add(Material.CHERRY_WALL_HANGING_SIGN);
allSigns = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_shulker_boxes
allSigns.addAll(signs); shulkerBoxBlocks = Tag.SHULKER_BOXES;
allSigns.addAll(wallSigns);
allSigns.addAll(hangingSigns);
allSigns.addAll(hangingWallSigns);
unmodifiableSigns = Collections.unmodifiableSet(allSigns);
singleBlockPlants = new HashSet<>(); // https://minecraft.fandom.com/wiki/Tag#blocks_beds
bedBlocks = Tag.BEDS;
// Local Tags
// https://minecraft.fandom.com/wiki/Tag#blocks_standing_signs
Set<Material> signs = Tag.STANDING_SIGNS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_wall_signs
Set<Material> wallSigns = Tag.WALL_SIGNS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_wool_carpets
Set<Material> carpets = Tag.WOOL_CARPETS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_flower_pots
Set<Material> flowserPots = Tag.FLOWER_POTS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_saplings
Set<Material> saplings = Tag.SAPLINGS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_small_flowers
Set<Material> smallFlowers = Tag.SMALL_FLOWERS.getValues();
// https://minecraft.fandom.com/wiki/Tag#blocks_tall_flowers
Set<Material> tallFlowers = Tag.TALL_FLOWERS.getValues();
Set<Material> bannerStanding = Set.of(Material.WHITE_BANNER,
Material.ORANGE_BANNER,
Material.MAGENTA_BANNER,
Material.LIGHT_BLUE_BANNER,
Material.YELLOW_BANNER,
Material.LIME_BANNER,
Material.PINK_BANNER,
Material.GRAY_BANNER,
Material.LIGHT_GRAY_BANNER,
Material.CYAN_BANNER,
Material.PURPLE_BANNER,
Material.BLUE_BANNER,
Material.BROWN_BANNER,
Material.GREEN_BANNER,
Material.RED_BANNER,
Material.BLACK_BANNER);
Set<Material> bannerWall = Set.of(Material.WHITE_WALL_BANNER,
Material.ORANGE_WALL_BANNER,
Material.MAGENTA_WALL_BANNER,
Material.LIGHT_BLUE_WALL_BANNER,
Material.YELLOW_WALL_BANNER,
Material.LIME_WALL_BANNER,
Material.PINK_WALL_BANNER,
Material.GRAY_WALL_BANNER,
Material.LIGHT_GRAY_WALL_BANNER,
Material.CYAN_WALL_BANNER,
Material.PURPLE_WALL_BANNER,
Material.BLUE_WALL_BANNER,
Material.BROWN_WALL_BANNER,
Material.GREEN_WALL_BANNER,
Material.RED_WALL_BANNER,
Material.BLACK_WALL_BANNER);
Set<Material> bannerAll = Tag.BANNERS.getValues();
Set<Material> headAndSkulls = Set.of(Material.SKELETON_WALL_SKULL,
Material.PLAYER_HEAD,
Material.PLAYER_WALL_HEAD,
Material.CREEPER_HEAD,
Material.CREEPER_WALL_HEAD,
Material.DRAGON_HEAD,
Material.DRAGON_WALL_HEAD,
Material.ZOMBIE_HEAD,
Material.ZOMBIE_WALL_HEAD,
Material.SKELETON_SKULL,
Material.SKELETON_WALL_SKULL,
Material.WITHER_SKELETON_SKULL,
Material.WITHER_SKELETON_WALL_SKULL);
Set<Material> standingTorch = Set.of(Material.TORCH,
Material.SOUL_TORCH,
Material.REDSTONE_TORCH);
Set<Material> wallTorch = Set.of(Material.WALL_TORCH,
Material.SOUL_WALL_TORCH,
Material.REDSTONE_WALL_TORCH);
singleBlockPlants = new HashSet<Material>();
singleBlockPlants.addAll(smallFlowers);
singleBlockPlants.add(Material.GRASS); singleBlockPlants.add(Material.GRASS);
singleBlockPlants.add(Material.FERN); singleBlockPlants.add(Material.FERN);
singleBlockPlants.add(Material.DEAD_BUSH); singleBlockPlants.add(Material.DEAD_BUSH);
singleBlockPlants.add(Material.DANDELION);
singleBlockPlants.add(Material.POPPY);
singleBlockPlants.add(Material.BLUE_ORCHID);
singleBlockPlants.add(Material.ALLIUM);
singleBlockPlants.add(Material.AZURE_BLUET);
singleBlockPlants.add(Material.ORANGE_TULIP);
singleBlockPlants.add(Material.WHITE_TULIP);
singleBlockPlants.add(Material.PINK_TULIP);
singleBlockPlants.add(Material.RED_TULIP);
singleBlockPlants.add(Material.OXEYE_DAISY);
singleBlockPlants.add(Material.BROWN_MUSHROOM); singleBlockPlants.add(Material.BROWN_MUSHROOM);
singleBlockPlants.add(Material.RED_MUSHROOM); singleBlockPlants.add(Material.RED_MUSHROOM);
singleBlockPlants.add(Material.SWEET_BERRY_BUSH); singleBlockPlants.add(Material.SWEET_BERRY_BUSH);
singleBlockPlants.add(Material.LILY_OF_THE_VALLEY);
singleBlockPlants.add(Material.CORNFLOWER);
singleBlockPlants.add(Material.WITHER_ROSE);
singleBlockPlants.add(Material.CRIMSON_FUNGUS); singleBlockPlants.add(Material.CRIMSON_FUNGUS);
singleBlockPlants.add(Material.WARPED_FUNGUS); singleBlockPlants.add(Material.WARPED_FUNGUS);
singleBlockPlants.add(Material.CRIMSON_ROOTS); singleBlockPlants.add(Material.CRIMSON_ROOTS);
@ -312,37 +224,23 @@ public class BukkitUtils {
singleBlockPlants.add(Material.AZALEA); singleBlockPlants.add(Material.AZALEA);
singleBlockPlants.add(Material.FLOWERING_AZALEA); singleBlockPlants.add(Material.FLOWERING_AZALEA);
singleBlockPlants.add(Material.PINK_PETALS); singleBlockPlants.add(Material.PINK_PETALS);
singleBlockPlants.add(Material.TORCHFLOWER);
singleBlockPlants.add(Material.PITCHER_CROP); singleBlockPlants.add(Material.PITCHER_CROP);
doublePlants = new HashSet<>(); doublePlants = new HashSet<Material>();
doublePlants.addAll(tallFlowers);
doublePlants.add(Material.TALL_GRASS); doublePlants.add(Material.TALL_GRASS);
doublePlants.add(Material.LARGE_FERN); doublePlants.add(Material.LARGE_FERN);
doublePlants.add(Material.TALL_SEAGRASS); doublePlants.add(Material.TALL_SEAGRASS);
doublePlants.add(Material.ROSE_BUSH);
doublePlants.add(Material.LILAC);
doublePlants.add(Material.SUNFLOWER);
doublePlants.add(Material.PEONY);
doublePlants.add(Material.SMALL_DRIPLEAF); doublePlants.add(Material.SMALL_DRIPLEAF);
doublePlants.add(Material.PITCHER_PLANT);
blockEquivalents = new HashSet<>(7);
blockEquivalents.add(new HashSet<>(Arrays.asList(2, 3, 60)));
blockEquivalents.add(new HashSet<>(Arrays.asList(8, 9, 79)));
blockEquivalents.add(new HashSet<>(Arrays.asList(10, 11)));
blockEquivalents.add(new HashSet<>(Arrays.asList(61, 62)));
blockEquivalents.add(new HashSet<>(Arrays.asList(73, 74)));
blockEquivalents.add(new HashSet<>(Arrays.asList(75, 76)));
blockEquivalents.add(new HashSet<>(Arrays.asList(93, 94)));
// Blocks that break when they are attached to a block // Blocks that break when they are attached to a block
relativeBreakable = new HashSet<>(); relativeBreakable = new HashSet<Material>();
relativeBreakable.addAll(bannerWall);
relativeBreakable.addAll(buttons.getValues());
relativeBreakable.addAll(wallSigns); relativeBreakable.addAll(wallSigns);
relativeBreakable.addAll(wallTorch);
relativeBreakable.add(Material.LADDER); relativeBreakable.add(Material.LADDER);
relativeBreakable.addAll(buttons);
relativeBreakable.add(Material.REDSTONE_WALL_TORCH);
relativeBreakable.add(Material.LEVER); relativeBreakable.add(Material.LEVER);
relativeBreakable.add(Material.WALL_TORCH);
relativeBreakable.add(Material.TRIPWIRE_HOOK); relativeBreakable.add(Material.TRIPWIRE_HOOK);
relativeBreakable.add(Material.COCOA); relativeBreakable.add(Material.COCOA);
relativeBreakable.add(Material.BELL); relativeBreakable.add(Material.BELL);
@ -352,12 +250,20 @@ public class BukkitUtils {
relativeBreakable.add(Material.LARGE_AMETHYST_BUD); relativeBreakable.add(Material.LARGE_AMETHYST_BUD);
// Blocks that break when they are on top of a block // Blocks that break when they are on top of a block
relativeTopBreakable = new HashSet<>(); relativeTopBreakable = new HashSet<Material>();
relativeTopBreakable.addAll(bannerStanding);
relativeTopBreakable.addAll(candleCakes.getValues());
relativeTopBreakable.addAll(candles.getValues());
relativeTopBreakable.addAll(carpets);
relativeTopBreakable.addAll(cropBlocks.getValues());
relativeTopBreakable.addAll(doublePlants);
relativeTopBreakable.addAll(flowserPots);
relativeTopBreakable.addAll(pressurePlates.getValues());
relativeTopBreakable.addAll(saplings); relativeTopBreakable.addAll(saplings);
relativeTopBreakable.addAll(signs);
relativeTopBreakable.addAll(singleBlockPlants); relativeTopBreakable.addAll(singleBlockPlants);
relativeTopBreakable.add(Material.WHEAT); relativeTopBreakable.addAll(standingTorch);
relativeTopBreakable.add(Material.POTATO); relativeTopBreakable.addAll(woodenDoors.getValues());
relativeTopBreakable.add(Material.CARROT);
relativeTopBreakable.add(Material.LILY_PAD); relativeTopBreakable.add(Material.LILY_PAD);
relativeTopBreakable.add(Material.CACTUS); relativeTopBreakable.add(Material.CACTUS);
relativeTopBreakable.add(Material.SUGAR_CANE); relativeTopBreakable.add(Material.SUGAR_CANE);
@ -367,54 +273,36 @@ public class BukkitUtils {
relativeTopBreakable.add(Material.ACTIVATOR_RAIL); relativeTopBreakable.add(Material.ACTIVATOR_RAIL);
relativeTopBreakable.add(Material.RAIL); relativeTopBreakable.add(Material.RAIL);
relativeTopBreakable.add(Material.REDSTONE_WIRE); relativeTopBreakable.add(Material.REDSTONE_WIRE);
relativeTopBreakable.addAll(signs);
relativeTopBreakable.addAll(pressurePlates);
relativeTopBreakable.add(Material.SNOW); relativeTopBreakable.add(Material.SNOW);
relativeTopBreakable.add(Material.REPEATER); relativeTopBreakable.add(Material.REPEATER);
relativeTopBreakable.add(Material.COMPARATOR); relativeTopBreakable.add(Material.COMPARATOR);
relativeTopBreakable.add(Material.TORCH);
relativeTopBreakable.add(Material.SOUL_TORCH);
relativeTopBreakable.add(Material.REDSTONE_TORCH);
relativeTopBreakable.addAll(woodenDoors);
relativeTopBreakable.add(Material.IRON_DOOR); relativeTopBreakable.add(Material.IRON_DOOR);
relativeTopBreakable.addAll(carpets);
relativeTopBreakable.addAll(doublePlants);
relativeTopBreakable.add(Material.BAMBOO); relativeTopBreakable.add(Material.BAMBOO);
relativeTopBreakable.add(Material.BAMBOO_SAPLING); relativeTopBreakable.add(Material.BAMBOO_SAPLING);
relativeTopBreakable.add(Material.TWISTING_VINES); relativeTopBreakable.add(Material.TWISTING_VINES);
relativeTopBreakable.add(Material.TWISTING_VINES_PLANT); relativeTopBreakable.add(Material.TWISTING_VINES_PLANT);
relativeTopBreakable.add(Material.BIG_DRIPLEAF); relativeTopBreakable.add(Material.BIG_DRIPLEAF);
relativeTopBreakable.add(Material.BIG_DRIPLEAF_STEM); relativeTopBreakable.add(Material.BIG_DRIPLEAF_STEM);
for (Material m : Material.values()) {
if (m.name().startsWith("POTTED_")) {
relativeTopBreakable.add(m);
}
if (m.name().endsWith("CANDLE_CAKE")) {
relativeTopBreakable.add(m);
}
}
// Blocks that break falling entities // Blocks that break falling entities
fallingEntityKillers = new HashSet<>(); fallingEntityKillers = new HashSet<Material>();
fallingEntityKillers.addAll(signs); fallingEntityKillers.addAll(bannerAll);
fallingEntityKillers.addAll(wallSigns); fallingEntityKillers.addAll(candleCakes.getValues());
fallingEntityKillers.addAll(pressurePlates); fallingEntityKillers.addAll(candles.getValues());
fallingEntityKillers.addAll(saplings); fallingEntityKillers.addAll(carpets);
fallingEntityKillers.addAll(singleBlockPlants); fallingEntityKillers.addAll(cropBlocks.getValues());
fallingEntityKillers.remove(Material.GRASS);
fallingEntityKillers.remove(Material.NETHER_SPROUTS);
fallingEntityKillers.addAll(doublePlants); fallingEntityKillers.addAll(doublePlants);
fallingEntityKillers.add(Material.WHEAT); fallingEntityKillers.addAll(pressurePlates.getValues());
fallingEntityKillers.add(Material.CARROT); fallingEntityKillers.addAll(saplings);
fallingEntityKillers.add(Material.POTATO); fallingEntityKillers.addAll(signs);
fallingEntityKillers.add(Material.BEETROOT); fallingEntityKillers.addAll(singleBlockPlants);
fallingEntityKillers.addAll(headAndSkulls);
fallingEntityKillers.addAll(slabs.getValues());
fallingEntityKillers.addAll(standingTorch);
fallingEntityKillers.addAll(wallSigns);
fallingEntityKillers.addAll(wallTorch);
fallingEntityKillers.add(Material.NETHER_WART); fallingEntityKillers.add(Material.NETHER_WART);
fallingEntityKillers.add(Material.COCOA); fallingEntityKillers.add(Material.COCOA);
fallingEntityKillers.addAll(slabs);
fallingEntityKillers.add(Material.TORCH);
fallingEntityKillers.add(Material.WALL_TORCH);
fallingEntityKillers.add(Material.SOUL_TORCH);
fallingEntityKillers.add(Material.SOUL_WALL_TORCH);
fallingEntityKillers.add(Material.FLOWER_POT); fallingEntityKillers.add(Material.FLOWER_POT);
fallingEntityKillers.add(Material.POWERED_RAIL); fallingEntityKillers.add(Material.POWERED_RAIL);
fallingEntityKillers.add(Material.DETECTOR_RAIL); fallingEntityKillers.add(Material.DETECTOR_RAIL);
@ -422,62 +310,15 @@ public class BukkitUtils {
fallingEntityKillers.add(Material.RAIL); fallingEntityKillers.add(Material.RAIL);
fallingEntityKillers.add(Material.LEVER); fallingEntityKillers.add(Material.LEVER);
fallingEntityKillers.add(Material.REDSTONE_WIRE); fallingEntityKillers.add(Material.REDSTONE_WIRE);
fallingEntityKillers.add(Material.REDSTONE_TORCH);
fallingEntityKillers.add(Material.REDSTONE_WALL_TORCH);
fallingEntityKillers.add(Material.REPEATER); fallingEntityKillers.add(Material.REPEATER);
fallingEntityKillers.add(Material.COMPARATOR); fallingEntityKillers.add(Material.COMPARATOR);
fallingEntityKillers.add(Material.DAYLIGHT_DETECTOR); fallingEntityKillers.add(Material.DAYLIGHT_DETECTOR);
fallingEntityKillers.addAll(carpets); fallingEntityKillers.remove(Material.GRASS);
fallingEntityKillers.add(Material.PLAYER_HEAD); fallingEntityKillers.remove(Material.NETHER_SPROUTS);
fallingEntityKillers.add(Material.PLAYER_WALL_HEAD);
fallingEntityKillers.add(Material.CREEPER_HEAD);
fallingEntityKillers.add(Material.CREEPER_WALL_HEAD);
fallingEntityKillers.add(Material.DRAGON_HEAD);
fallingEntityKillers.add(Material.DRAGON_WALL_HEAD);
fallingEntityKillers.add(Material.ZOMBIE_HEAD);
fallingEntityKillers.add(Material.ZOMBIE_WALL_HEAD);
fallingEntityKillers.add(Material.SKELETON_SKULL);
fallingEntityKillers.add(Material.SKELETON_WALL_SKULL);
fallingEntityKillers.add(Material.WITHER_SKELETON_SKULL);
fallingEntityKillers.add(Material.WITHER_SKELETON_WALL_SKULL);
for (Material m : Material.values()) {
if (m.name().contains("CANDLE")) {
fallingEntityKillers.add(m);
}
}
// Crop Blocks
cropBlocks = new HashSet<>();
cropBlocks.add(Material.WHEAT);
cropBlocks.add(Material.MELON_STEM);
cropBlocks.add(Material.PUMPKIN_STEM);
cropBlocks.add(Material.CARROT);
cropBlocks.add(Material.POTATO);
cropBlocks.add(Material.BEETROOT);
cropBlocks.add(Material.TORCHFLOWER_CROP);
// Shulker Boxes
shulkerBoxBlocks = new HashSet<>();
shulkerBoxBlocks.add(Material.SHULKER_BOX);
shulkerBoxBlocks.add(Material.BLACK_SHULKER_BOX);
shulkerBoxBlocks.add(Material.BLUE_SHULKER_BOX);
shulkerBoxBlocks.add(Material.LIGHT_GRAY_SHULKER_BOX);
shulkerBoxBlocks.add(Material.BROWN_SHULKER_BOX);
shulkerBoxBlocks.add(Material.CYAN_SHULKER_BOX);
shulkerBoxBlocks.add(Material.GRAY_SHULKER_BOX);
shulkerBoxBlocks.add(Material.GREEN_SHULKER_BOX);
shulkerBoxBlocks.add(Material.LIGHT_BLUE_SHULKER_BOX);
shulkerBoxBlocks.add(Material.MAGENTA_SHULKER_BOX);
shulkerBoxBlocks.add(Material.LIME_SHULKER_BOX);
shulkerBoxBlocks.add(Material.ORANGE_SHULKER_BOX);
shulkerBoxBlocks.add(Material.PINK_SHULKER_BOX);
shulkerBoxBlocks.add(Material.PURPLE_SHULKER_BOX);
shulkerBoxBlocks.add(Material.RED_SHULKER_BOX);
shulkerBoxBlocks.add(Material.WHITE_SHULKER_BOX);
shulkerBoxBlocks.add(Material.YELLOW_SHULKER_BOX);
// Container Blocks // Container Blocks
containerBlocks = new HashSet<>(); containerBlocks = new HashSet<Material>();
containerBlocks.addAll(shulkerBoxBlocks.getValues());
containerBlocks.add(Material.CHEST); containerBlocks.add(Material.CHEST);
containerBlocks.add(Material.TRAPPED_CHEST); containerBlocks.add(Material.TRAPPED_CHEST);
containerBlocks.add(Material.DISPENSER); containerBlocks.add(Material.DISPENSER);
@ -485,7 +326,6 @@ public class BukkitUtils {
containerBlocks.add(Material.HOPPER); containerBlocks.add(Material.HOPPER);
containerBlocks.add(Material.BREWING_STAND); containerBlocks.add(Material.BREWING_STAND);
containerBlocks.add(Material.FURNACE); containerBlocks.add(Material.FURNACE);
containerBlocks.addAll(shulkerBoxBlocks);
containerBlocks.add(Material.BARREL); containerBlocks.add(Material.BARREL);
containerBlocks.add(Material.BLAST_FURNACE); containerBlocks.add(Material.BLAST_FURNACE);
containerBlocks.add(Material.SMOKER); containerBlocks.add(Material.SMOKER);
@ -507,24 +347,20 @@ public class BukkitUtils {
projectileItems.put(EntityType.WITHER_SKULL, Material.WITHER_SKELETON_SKULL); projectileItems.put(EntityType.WITHER_SKULL, Material.WITHER_SKELETON_SKULL);
projectileItems.put(EntityType.FIREWORK, Material.FIREWORK_ROCKET); projectileItems.put(EntityType.FIREWORK, Material.FIREWORK_ROCKET);
nonFluidProofBlocks = new HashSet<>(); nonFluidProofBlocks = new HashSet<Material>();
nonFluidProofBlocks.addAll(singleBlockPlants); nonFluidProofBlocks.addAll(carpets);
nonFluidProofBlocks.addAll(cropBlocks.getValues());
nonFluidProofBlocks.addAll(doublePlants); nonFluidProofBlocks.addAll(doublePlants);
nonFluidProofBlocks.add(Material.REDSTONE_WALL_TORCH); nonFluidProofBlocks.addAll(headAndSkulls);
nonFluidProofBlocks.addAll(pressurePlates.getValues());
nonFluidProofBlocks.addAll(saplings);
nonFluidProofBlocks.addAll(singleBlockPlants);
nonFluidProofBlocks.addAll(standingTorch);
nonFluidProofBlocks.addAll(wallTorch);
nonFluidProofBlocks.add(Material.LEVER); nonFluidProofBlocks.add(Material.LEVER);
nonFluidProofBlocks.add(Material.WALL_TORCH);
nonFluidProofBlocks.add(Material.SOUL_WALL_TORCH);
nonFluidProofBlocks.add(Material.TRIPWIRE_HOOK); nonFluidProofBlocks.add(Material.TRIPWIRE_HOOK);
nonFluidProofBlocks.add(Material.COCOA); nonFluidProofBlocks.add(Material.COCOA);
nonFluidProofBlocks.addAll(pressurePlates);
nonFluidProofBlocks.addAll(saplings);
nonFluidProofBlocks.add(Material.WHEAT);
nonFluidProofBlocks.add(Material.CARROT);
nonFluidProofBlocks.add(Material.POTATO);
nonFluidProofBlocks.add(Material.BEETROOT);
nonFluidProofBlocks.add(Material.NETHER_WART); nonFluidProofBlocks.add(Material.NETHER_WART);
nonFluidProofBlocks.add(Material.TORCH);
nonFluidProofBlocks.add(Material.SOUL_TORCH);
nonFluidProofBlocks.add(Material.FLOWER_POT); nonFluidProofBlocks.add(Material.FLOWER_POT);
// nonFluidProofBlocks.add(Material.POWERED_RAIL); // nonFluidProofBlocks.add(Material.POWERED_RAIL);
// nonFluidProofBlocks.add(Material.DETECTOR_RAIL); // nonFluidProofBlocks.add(Material.DETECTOR_RAIL);
@ -532,91 +368,31 @@ public class BukkitUtils {
// nonFluidProofBlocks.add(Material.RAIL); // nonFluidProofBlocks.add(Material.RAIL);
nonFluidProofBlocks.add(Material.LEVER); nonFluidProofBlocks.add(Material.LEVER);
nonFluidProofBlocks.add(Material.REDSTONE_WIRE); nonFluidProofBlocks.add(Material.REDSTONE_WIRE);
nonFluidProofBlocks.add(Material.REDSTONE_TORCH);
nonFluidProofBlocks.add(Material.REPEATER); nonFluidProofBlocks.add(Material.REPEATER);
nonFluidProofBlocks.add(Material.COMPARATOR); nonFluidProofBlocks.add(Material.COMPARATOR);
nonFluidProofBlocks.add(Material.DAYLIGHT_DETECTOR); nonFluidProofBlocks.add(Material.DAYLIGHT_DETECTOR);
nonFluidProofBlocks.addAll(carpets);
alwaysWaterlogged = new HashSet<>(); alwaysWaterlogged = Set.of(Material.SEAGRASS,
alwaysWaterlogged.add(Material.SEAGRASS); Material.TALL_SEAGRASS,
alwaysWaterlogged.add(Material.TALL_SEAGRASS); Material.KELP,
alwaysWaterlogged.add(Material.KELP); Material.KELP_PLANT);
alwaysWaterlogged.add(Material.KELP_PLANT);
bedBlocks = new HashSet<>(); concreteBlocks = Set.of(Material.BLACK_CONCRETE,
bedBlocks.add(Material.BLACK_BED); Material.BLUE_CONCRETE,
bedBlocks.add(Material.BLUE_BED); Material.LIGHT_GRAY_CONCRETE,
bedBlocks.add(Material.LIGHT_GRAY_BED); Material.BROWN_CONCRETE,
bedBlocks.add(Material.BROWN_BED); Material.CYAN_CONCRETE,
bedBlocks.add(Material.CYAN_BED); Material.GRAY_CONCRETE,
bedBlocks.add(Material.GRAY_BED); Material.GREEN_CONCRETE,
bedBlocks.add(Material.GREEN_BED); Material.LIGHT_BLUE_CONCRETE,
bedBlocks.add(Material.LIGHT_BLUE_BED); Material.MAGENTA_CONCRETE,
bedBlocks.add(Material.MAGENTA_BED); Material.LIME_CONCRETE,
bedBlocks.add(Material.LIME_BED); Material.ORANGE_CONCRETE,
bedBlocks.add(Material.ORANGE_BED); Material.PINK_CONCRETE,
bedBlocks.add(Material.PINK_BED); Material.PURPLE_CONCRETE,
bedBlocks.add(Material.PURPLE_BED); Material.RED_CONCRETE,
bedBlocks.add(Material.RED_BED); Material.WHITE_CONCRETE,
bedBlocks.add(Material.WHITE_BED); Material.YELLOW_CONCRETE);
bedBlocks.add(Material.YELLOW_BED);
concreteBlocks = new HashSet<>();
concreteBlocks.add(Material.BLACK_CONCRETE);
concreteBlocks.add(Material.BLUE_CONCRETE);
concreteBlocks.add(Material.LIGHT_GRAY_CONCRETE);
concreteBlocks.add(Material.BROWN_CONCRETE);
concreteBlocks.add(Material.CYAN_CONCRETE);
concreteBlocks.add(Material.GRAY_CONCRETE);
concreteBlocks.add(Material.GREEN_CONCRETE);
concreteBlocks.add(Material.LIGHT_BLUE_CONCRETE);
concreteBlocks.add(Material.MAGENTA_CONCRETE);
concreteBlocks.add(Material.LIME_CONCRETE);
concreteBlocks.add(Material.ORANGE_CONCRETE);
concreteBlocks.add(Material.PINK_CONCRETE);
concreteBlocks.add(Material.PURPLE_CONCRETE);
concreteBlocks.add(Material.RED_CONCRETE);
concreteBlocks.add(Material.WHITE_CONCRETE);
concreteBlocks.add(Material.YELLOW_CONCRETE);
candles = new HashSet<>();
candles.add(Material.CANDLE);
candles.add(Material.BLACK_CANDLE);
candles.add(Material.BLUE_CANDLE);
candles.add(Material.LIGHT_GRAY_CANDLE);
candles.add(Material.BROWN_CANDLE);
candles.add(Material.CYAN_CANDLE);
candles.add(Material.GRAY_CANDLE);
candles.add(Material.GREEN_CANDLE);
candles.add(Material.LIGHT_BLUE_CANDLE);
candles.add(Material.MAGENTA_CANDLE);
candles.add(Material.LIME_CANDLE);
candles.add(Material.ORANGE_CANDLE);
candles.add(Material.PINK_CANDLE);
candles.add(Material.PURPLE_CANDLE);
candles.add(Material.RED_CANDLE);
candles.add(Material.WHITE_CANDLE);
candles.add(Material.YELLOW_CANDLE);
candleCakes = new HashSet<>();
candleCakes.add(Material.CANDLE_CAKE);
candleCakes.add(Material.BLACK_CANDLE_CAKE);
candleCakes.add(Material.BLUE_CANDLE_CAKE);
candleCakes.add(Material.LIGHT_GRAY_CANDLE_CAKE);
candleCakes.add(Material.BROWN_CANDLE_CAKE);
candleCakes.add(Material.CYAN_CANDLE_CAKE);
candleCakes.add(Material.GRAY_CANDLE_CAKE);
candleCakes.add(Material.GREEN_CANDLE_CAKE);
candleCakes.add(Material.LIGHT_BLUE_CANDLE_CAKE);
candleCakes.add(Material.MAGENTA_CANDLE_CAKE);
candleCakes.add(Material.LIME_CANDLE_CAKE);
candleCakes.add(Material.ORANGE_CANDLE_CAKE);
candleCakes.add(Material.PINK_CANDLE_CAKE);
candleCakes.add(Material.PURPLE_CANDLE_CAKE);
candleCakes.add(Material.RED_CANDLE_CAKE);
candleCakes.add(Material.WHITE_CANDLE_CAKE);
candleCakes.add(Material.YELLOW_CANDLE_CAKE);
dyes = new HashMap<>(); dyes = new HashMap<>();
dyes.put(Material.BLACK_DYE, DyeColor.BLACK); dyes.put(Material.BLACK_DYE, DyeColor.BLACK);
@ -638,7 +414,7 @@ public class BukkitUtils {
} }
private static final BlockFace[] relativeBlockFaces = new BlockFace[] { private static final BlockFace[] relativeBlockFaces = new BlockFace[] {
BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.UP, BlockFace.DOWN BlockFace.EAST, BlockFace.WEST, BlockFace.NORTH, BlockFace.SOUTH, BlockFace.UP, BlockFace.DOWN
}; };
/** /**
@ -741,52 +517,40 @@ public class BukkitUtils {
return compressed.toArray(new ItemStack[compressed.size()]); return compressed.toArray(new ItemStack[compressed.size()]);
} }
public static boolean equalTypes(int type1, int type2) {
if (type1 == type2) {
return true;
}
for (final Set<Integer> equivalent : blockEquivalents) {
if (equivalent.contains(type1) && equivalent.contains(type2)) {
return true;
}
}
return false;
}
public static String friendlyWorldname(String worldName) { public static String friendlyWorldname(String worldName) {
return new File(worldName).getName(); return new File(worldName).getName();
} }
public static Set<Set<Integer>> getBlockEquivalents() {
return blockEquivalents;
}
public static Set<Material> getRelativeBreakables() { public static Set<Material> getRelativeBreakables() {
return relativeBreakable; return Collections.unmodifiableSet(relativeBreakable);
} }
public static Set<Material> getRelativeTopBreakabls() { public static boolean isRelativeTopBreakable(Material type) {
return relativeTopBreakable; return relativeTopBreakable.contains(type);
} }
public static Set<Material> getFallingEntityKillers() { public static boolean isFallingEntityKiller(Material type) {
return fallingEntityKillers; return fallingEntityKillers.contains(type);
} }
public static Set<Material> getNonFluidProofBlocks() { public static boolean isNonFluidProofBlock(Material type) {
return nonFluidProofBlocks; return nonFluidProofBlocks.contains(type);
} }
public static Set<Material> getCropBlocks() { public static boolean isCropBlock(Material type) {
return cropBlocks; return cropBlocks.isTagged(type);
} }
public static Set<Material> getContainerBlocks() { public static boolean isContainerBlock(Material type) {
return containerBlocks; return containerBlocks.contains(type);
} }
public static Set<Material> getShulkerBoxBlocks() { public static Set<Material> getShulkerBoxBlocks() {
return shulkerBoxBlocks; return shulkerBoxBlocks.getValues(); // Already an unmodifiable Set
}
public static boolean isShulkerBoxBlock(Material type) {
return shulkerBoxBlocks.isTagged(type);
} }
public static boolean isConcreteBlock(Material m) { public static boolean isConcreteBlock(Material m) {
@ -794,8 +558,8 @@ public class BukkitUtils {
} }
public static String entityName(Entity entity) { public static String entityName(Entity entity) {
if (entity instanceof Player) { if (entity instanceof Player player) {
return ((Player) entity).getName(); return player.getName();
} }
if (entity instanceof TNTPrimed) { if (entity instanceof TNTPrimed) {
return "TNT"; return "TNT";
@ -856,8 +620,8 @@ public class BukkitUtils {
Material mat = block.getType(); Material mat = block.getType();
if (canDirectlyFallIn(mat)) { if (canDirectlyFallIn(mat)) {
return true; return true;
} else if (getFallingEntityKillers().contains(mat) || singleBlockPlants.contains(mat) || mat == Material.VINE) { } else if (isFallingEntityKiller(mat) || singleBlockPlants.contains(mat) || mat == Material.VINE) {
if (slabs.contains(mat)) { if (slabs.isTagged(mat)) {
if (((Slab) block.getBlockData()).getType() != Type.BOTTOM) { if (((Slab) block.getBlockData()).getType() != Type.BOTTOM) {
return false; return false;
} }
@ -880,11 +644,11 @@ public class BukkitUtils {
} }
public static boolean isWoodenDoor(Material m) { public static boolean isWoodenDoor(Material m) {
return woodenDoors.contains(m); return woodenDoors.isTagged(m);
} }
public static boolean isButton(Material m) { public static boolean isButton(Material m) {
return buttons.contains(m); return buttons.isTagged(m);
} }
public static boolean isEmpty(Material m) { public static boolean isEmpty(Material m) {
@ -947,7 +711,7 @@ public class BukkitUtils {
} }
public static boolean isBed(Material type) { public static boolean isBed(Material type) {
return bedBlocks.contains(type); return bedBlocks.isTagged(type);
} }
public static boolean isDye(Material type) { public static boolean isDye(Material type) {
@ -1196,7 +960,7 @@ public class BukkitUtils {
} }
public static Set<Material> getAllSignMaterials() { public static Set<Material> getAllSignMaterials() {
return unmodifiableSigns; return allSigns.getValues();
} }
public static boolean isAlwaysWaterlogged(Material m) { public static boolean isAlwaysWaterlogged(Material m) {
@ -1204,31 +968,31 @@ public class BukkitUtils {
} }
public static boolean isCandle(Material m) { public static boolean isCandle(Material m) {
return candles.contains(m); return candles.isTagged(m);
} }
public static boolean isCandleCake(Material m) { public static boolean isCandleCake(Material m) {
return candleCakes.contains(m); return candleCakes.isTagged(m);
} }
public static boolean isHangingSign(Material m) { public static boolean isHangingSign(Material m) {
return hangingSigns.contains(m); return hangingSigns.isTagged(m);
} }
public static boolean isFenceGate(Material m) { public static boolean isFenceGate(Material m) {
return fenceGates.contains(m); return fenceGates.isTagged(m);
} }
public static boolean isWoodenTrapdoor(Material m) { public static boolean isWoodenTrapdoor(Material m) {
return woodenTrapdoors.contains(m); return woodenTrapdoors.isTagged(m);
} }
public static boolean isPressurePlate(Material m) { public static boolean isPressurePlate(Material m) {
return pressurePlates.contains(m); return pressurePlates.isTagged(m);
} }
public static boolean isSign(Material m) { public static boolean isSign(Material m) {
return allSigns.contains(m); return allSigns.isTagged(m);
} }
public static Side getFacingSignSide(Entity entity, Block sign) { public static Side getFacingSignSide(Entity entity, Block sign) {

View File

@ -65,7 +65,7 @@ public class LoggingUtil {
if (y > loc.getWorld().getMinHeight()) { if (y > loc.getWorld().getMinHeight()) {
// Run this check to avoid false positives // Run this check to avoid false positives
Location finalLoc = new Location(loc.getWorld(), x, y, z); Location finalLoc = new Location(loc.getWorld(), x, y, z);
if (y == initialy || !BukkitUtils.getFallingEntityKillers().contains(finalLoc.getBlock().getType())) { if (y == initialy || !BukkitUtils.isFallingEntityKiller(finalLoc.getBlock().getType())) {
if (BukkitUtils.isEmpty(finalLoc.getBlock().getType())) { if (BukkitUtils.isEmpty(finalLoc.getBlock().getType())) {
consumer.queueBlockPlace(actor, finalLoc, placed.getBlockData()); consumer.queueBlockPlace(actor, finalLoc, placed.getBlockData());
} else { } else {
@ -103,7 +103,7 @@ public class LoggingUtil {
if (y > loc.getWorld().getMinHeight()) { if (y > loc.getWorld().getMinHeight()) {
Location finalLoc = new Location(loc.getWorld(), x, y, z); Location finalLoc = new Location(loc.getWorld(), x, y, z);
// Run this check to avoid false positives // Run this check to avoid false positives
if (!BukkitUtils.getFallingEntityKillers().contains(finalLoc.getBlock().getType())) { if (!BukkitUtils.isFallingEntityKiller(finalLoc.getBlock().getType())) {
finalLoc.add(0, up, 0); // Add this here after checking for block breakers finalLoc.add(0, up, 0); // Add this here after checking for block breakers
if (BukkitUtils.isEmpty(finalLoc.getBlock().getType())) { if (BukkitUtils.isEmpty(finalLoc.getBlock().getType())) {
consumer.queueBlockPlace(actor, finalLoc, checkBlock.getBlockData()); consumer.queueBlockPlace(actor, finalLoc, checkBlock.getBlockData());
@ -155,7 +155,7 @@ public class LoggingUtil {
Block checkBlock = origin.getRelative(BlockFace.UP); Block checkBlock = origin.getRelative(BlockFace.UP);
Material typeAbove = checkBlock.getType(); Material typeAbove = checkBlock.getType();
if (BukkitUtils.getRelativeTopBreakabls().contains(typeAbove)) { if (BukkitUtils.isRelativeTopBreakable(typeAbove)) {
if (typeAbove == Material.IRON_DOOR || BukkitUtils.isWoodenDoor(typeAbove)) { if (typeAbove == Material.IRON_DOOR || BukkitUtils.isWoodenDoor(typeAbove)) {
Block doorBlock = checkBlock; Block doorBlock = checkBlock;
// If the doorBlock is the top half a door the player simply punched a door // If the doorBlock is the top half a door the player simply punched a door
@ -185,7 +185,7 @@ public class LoggingUtil {
// check next blocks above // check next blocks above
checkBlock = checkBlock.getRelative(BlockFace.UP); checkBlock = checkBlock.getRelative(BlockFace.UP);
typeAbove = checkBlock.getType(); typeAbove = checkBlock.getType();
while (BukkitUtils.getRelativeTopBreakabls().contains(typeAbove)) { while (BukkitUtils.isRelativeTopBreakable(typeAbove)) {
consumer.queueBlockBreak(actor, checkBlock.getState()); consumer.queueBlockBreak(actor, checkBlock.getState());
checkBlock = checkBlock.getRelative(BlockFace.UP); checkBlock = checkBlock.getRelative(BlockFace.UP);
typeAbove = checkBlock.getType(); typeAbove = checkBlock.getType();
@ -276,7 +276,7 @@ public class LoggingUtil {
} }
List<Location> relativeBreakables = BukkitUtils.getBlocksNearby(origin, BukkitUtils.getRelativeBreakables()); List<Location> relativeBreakables = BukkitUtils.getBlocksNearby(origin, BukkitUtils.getRelativeBreakables());
if (relativeBreakables.size() != 0) { if (!relativeBreakables.isEmpty()) {
for (Location location : relativeBreakables) { for (Location location : relativeBreakables) {
Block block = location.getBlock(); Block block = location.getBlock();
BlockData blockData = block.getBlockData(); BlockData blockData = block.getBlockData();