Java:
@EventHandler
public void onRightClick(PlayerInteractEvent event) {
if (event.getAction() != Action.RIGHT_CLICK_AIR && event.getAction() != Action.RIGHT_CLICK_BLOCK) {
return;
}
Player player = event.getPlayer();
if (player.getInventory().getItemInMainHand().equals(explosiveTrap)) {
if (cooldowns.containsKey(player.getUniqueId())) {
long secondsLeft = ((cooldowns.get(player.getUniqueId())/1000)+40) - (System.currentTimeMillis()/1000);
if (secondsLeft > 0) {
player.sendMessage(ChatColor.translateAlternateColorCodes('&', "&x&8&0&B&2&C&6[☄] &fПодождите " + "&a" + secondsLeft + "&f, чтобы использовать Трапку!"));
player.playSound(player.getLocation(),Sound.ENTITY_VILLAGER_NO, 1f, 1f);
return;
}
}
cooldowns.put(player.getUniqueId(), System.currentTimeMillis());
Location location = player.getLocation();
player.playSound(player.getLocation(), Sound.ENTITY_GENERIC_EXPLODE, 1f, 1f);
try {
pasteSchematic(location);
} catch (MaxChangedBlocksException | IOException e) {
e.printStackTrace();
}
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, () -> {
try {
removeSchematic();
} catch (MaxChangedBlocksException e) {
e.printStackTrace();
}
location.getWorld().getNearbyEntities(location, 5, 5, 5).forEach(entity -> {
if (entity instanceof Player) {
entity.setVelocity(new Vector(0, 2, 0));
}
});
}, 200L); // 10 seconds delay
}
}
private void pasteSchematic(Location location) throws MaxChangedBlocksException, IOException {
File schematic = new File(plugin.getDataFolder(), "trap.schem"); // Название схематики
ClipboardFormat format = ClipboardFormats.findByFile(schematic);
try (ClipboardReader reader = format.getReader(new FileInputStream(schematic))) {
Clipboard clipboard = reader.read();
// Создание нового EditSession
try (EditSession editSession = WorldEdit.getInstance().newEditSession(new BukkitWorld(location.getWorld()))) {
// Создание региона размером 15x15 блоков вокруг местоположения вставки
CuboidRegion region = new CuboidRegion(
BlockVector3.at(location.getX() - 7, location.getY() - 7, location.getZ() - 7),
BlockVector3.at(location.getX() + 7, location.getY() + 7, location.getZ() + 7)
);
// Копирование оригинальных блоков
BlockArrayClipboard original = new BlockArrayClipboard(region);
ForwardExtentCopy copy = new ForwardExtentCopy(editSession, region, original, region.getMinimumPoint());
Operations.complete(copy);
originalBlocks = original;
// Вставка схематики
Operation operation = new ClipboardHolder(clipboard)
.createPaste(editSession)
.to(BlockVector3.at(location.getX(), location.getY(), location.getZ()))
.ignoreAirBlocks(false)
.build();
Operations.complete(operation);
} catch (WorldEditException e) {
e.printStackTrace();
}
}
}
private void removeSchematic() throws MaxChangedBlocksException {
// Восстановление оригинальных блоков
try (EditSession editSession = WorldEdit.getInstance().newEditSession(new BukkitWorld(pasteLocation.getWorld()))) {
Operation operation = new ClipboardHolder(originalBlocks)
.createPaste(editSession)
.to(originalBlocks.getOrigin())
.ignoreAirBlocks(false)
.build();
Operations.complete(operation);
} catch (WorldEditException e) {
e.printStackTrace();
}
}
как прописать метод для удаления схематики? текущий не работает