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