package fbbh.maxlego08.fr; import java.util.UUID; import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.Block; import org.bukkit.block.data.BlockData; import org.primesoft.blockshub.IBlocksHubApi; import org.primesoft.blockshub.api.IBlockData; import org.primesoft.blockshub.api.platform.BukkitBlockData; import com.sk89q.worldedit.EditSession.Stage; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.WorldEditException; import com.sk89q.worldedit.event.extent.EditSessionEvent; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.util.eventbus.EventBus; import com.sk89q.worldedit.util.eventbus.Subscribe; import com.sk89q.worldedit.world.block.BlockStateHolder; public class FastAsyncWorldEditHandler implements Handler { private final EventBus eventBus; private final FbbhPlugin plugin; public FastAsyncWorldEditHandler(FbbhPlugin plugin) { super(); this.eventBus = WorldEdit.getInstance().getEventBus(); this.plugin = plugin; } @Subscribe public void onEditSession(EditSessionEvent event) { Stage stage = event.getStage(); if (stage.equals(Stage.BEFORE_CHANGE)) { final IBlocksHubApi api = plugin.getIBlock(); UUID uuid = event.getActor().getUniqueId(); World world = Bukkit.getWorld(event.getWorld().getName()); event.setExtent(new AbstractDelegateExtent(event.getExtent()) { @SuppressWarnings({ "rawtypes", "unchecked", "deprecation" }) @Override public boolean setBlock(BlockVector3 pos, BlockStateHolder blockStateHolder) throws WorldEditException { final double x = pos.getBlockX(); final double y = pos.getBlockY(); final double z = pos.getBlockZ(); final Location location = new Location(world, x, y, z); final Block blockBefore = location.getBlock(); final IBlockData blockDataBefore = convert(blockBefore.getBlockData().clone()); Bukkit.getScheduler().runTaskLaterAsynchronously(plugin, () -> { final Block blockAfter = location.getBlock(); final IBlockData blockDataAfter = convert(blockAfter.getBlockData().clone()); System.out.println(String.format("Je vais remplacer le block %s en %s %s %s par le block %s", blockDataBefore.getData(BlockData.class), x, y, z, blockDataAfter.getData(BlockData.class))); api.logBlock(uuid, world.getUID(), x, y, z, blockDataBefore, blockDataAfter); }, 7); return getExtent().setBlock(pos, blockStateHolder); } }); } } public void enable() { this.eventBus.register(this); } public void disable() { this.eventBus.unregister(this); } private IBlockData convert(BlockData blockData) { return blockData == null ? null : new BukkitBlockData(blockData); } }