added MinecartBlocks
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
@@ -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()
|
||||
);
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user