diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java new file mode 100644 index 0000000..2a577dd --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlockChangeListener.java @@ -0,0 +1,60 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.minecartBlocks; + +import eu.mhsl.craftattack.spawn.core.appliance.ApplianceListener; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.entity.Minecart; +import org.bukkit.event.EventHandler; +import org.bukkit.event.player.PlayerInteractEntityEvent; +import org.bukkit.event.vehicle.VehicleDestroyEvent; +import org.bukkit.event.vehicle.VehicleEnterEvent; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; + +class MinecartBlockChangeListener extends ApplianceListener { + @EventHandler + public void onInteract(PlayerInteractEntityEvent event) { + if(!event.getPlayer().isSneaking()) return; + if(!(event.getRightClicked() instanceof Minecart minecart)) return; + if(!this.isBasicMinecart(minecart)) return; + if(this.minecartContainsBlock(minecart)) return; + + PlayerInventory playerInv = event.getPlayer().getInventory(); + Material heldBlock = playerInv.getItemInMainHand().getType(); + + if(!heldBlock.isBlock() || !heldBlock.isSolid()) return; + if(!this.getAppliance().isAllowedMaterial(heldBlock)) return; + + minecart.setDisplayBlockData(heldBlock.createBlockData()); + playerInv.removeItem(ItemStack.of(heldBlock)); + } + + @EventHandler + public void onDestroy(VehicleDestroyEvent event) { + if(!(event.getVehicle() instanceof Minecart minecart)) return; + if(!this.isBasicMinecart(minecart)) return; + + Material containingMaterial = minecart.getDisplayBlockData().getMaterial(); + if(containingMaterial.equals(Material.AIR)) return; + + Location vehicleLocation = event.getVehicle().getLocation(); + vehicleLocation.getWorld().dropItem(vehicleLocation, ItemStack.of(containingMaterial)); + minecart.setDisplayBlockData(null); + } + + @EventHandler + public void onEnter(VehicleEnterEvent event) { + if(!(event.getVehicle() instanceof Minecart minecart)) return; + if(!this.minecartContainsBlock(minecart)) return; + event.setCancelled(true); + } + + @SuppressWarnings("BooleanMethodIsAlwaysInverted") + private boolean isBasicMinecart(Minecart minecart) { + return minecart.getMinecartMaterial().equals(Material.MINECART); + } + + private boolean minecartContainsBlock(Minecart minecart) { + return !minecart.getDisplayBlockData().getMaterial().equals(Material.AIR); + } +} diff --git a/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java new file mode 100644 index 0000000..8746a46 --- /dev/null +++ b/craftattack/src/main/java/eu/mhsl/craftattack/spawn/craftattack/appliances/gameplay/minecartBlocks/MinecartBlocks.java @@ -0,0 +1,40 @@ +package eu.mhsl.craftattack.spawn.craftattack.appliances.gameplay.minecartBlocks; + +import eu.mhsl.craftattack.spawn.core.appliance.Appliance; +import org.bukkit.Material; +import org.bukkit.block.data.Bisected; +import org.bukkit.block.data.BlockData; +import org.bukkit.block.data.Directional; +import org.bukkit.block.data.Waterlogged; +import org.bukkit.event.Listener; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public class MinecartBlocks extends Appliance { + private final List blackListedMaterials = List.of( + Material.COMMAND_BLOCK, + Material.FURNACE, + Material.HOPPER, + Material.TNT, + Material.CHEST, + Material.TRAPPED_CHEST + ); + + public boolean isAllowedMaterial(Material material) { + if(this.blackListedMaterials.contains(material)) return false; + BlockData blockData = material.createBlockData(); + return !( + (blockData instanceof Directional) + || (blockData instanceof Bisected) + || (blockData instanceof Waterlogged) + ); + } + + @Override + protected @NotNull List listeners() { + return List.of( + new MinecartBlockChangeListener() + ); + } +}