added MinecartBlocks

This commit is contained in:
2025-08-10 00:04:12 +02:00
parent 6e1ef4fd7c
commit 43ef28499b
2 changed files with 100 additions and 0 deletions

View File

@@ -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<MinecartBlocks> {
@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);
}
}

View File

@@ -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<Material> 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<Listener> listeners() {
return List.of(
new MinecartBlockChangeListener()
);
}
}