package com.boydti.fawe.util; import java.lang.reflect.Field; import java.util.ArrayDeque; import java.util.HashSet; import com.boydti.fawe.bukkit.regions.FaweMask; import com.boydti.fawe.config.BBC; import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.object.NullExtent; import com.boydti.fawe.object.RegionWrapper; import com.boydti.fawe.regions.FaweMaskManager; import com.sk89q.worldedit.extent.AbstractDelegateExtent; import com.sk89q.worldedit.extent.Extent; public class WEManager { public final static WEManager IMP = new WEManager(); public final ArrayDeque managers = new ArrayDeque<>(); public void cancelEdit(Extent parent) { try { final Field field = AbstractDelegateExtent.class.getDeclaredField("extent"); field.setAccessible(true); field.set(parent, new NullExtent()); } catch (final Exception e) { e.printStackTrace(); } parent = null; } public boolean maskContains(final HashSet mask, final int x, final int z) { for (final RegionWrapper region : mask) { if ((x >= region.minX) && (x <= region.maxX) && (z >= region.minZ) && (z <= region.maxZ)) { return true; } } return false; } public HashSet getMask(final FawePlayer player) { final HashSet regions = new HashSet<>(); if (player.hasPermission("fawe.bypass")) { regions.add(new RegionWrapper(Integer.MIN_VALUE, Integer.MAX_VALUE, Integer.MIN_VALUE, Integer.MAX_VALUE)); return regions; } for (final FaweMaskManager manager : managers) { if (player.hasPermission("fawe." + manager.getKey())) { final FaweMask mask = manager.getMask(player); if (mask != null) { regions.addAll(mask.getRegions()); } } } return regions; } public boolean intersects(final RegionWrapper region1, final RegionWrapper region2) { return (region1.minX <= region2.maxX) && (region1.maxX >= region2.minX) && (region1.minZ <= region2.maxZ) && (region1.maxZ >= region2.minZ); } public boolean regionContains(final RegionWrapper selection, final HashSet mask) { for (final RegionWrapper region : mask) { if (intersects(region, selection)) { return true; } } return false; } public boolean delay(final FawePlayer player, final String command) { final long start = System.currentTimeMillis(); return delay(player, new Runnable() { @Override public void run() { try { if ((System.currentTimeMillis() - start) > 1000) { BBC.WORLDEDIT_RUN.send(FawePlayer.wrap(player)); } TaskManager.IMP.task(new Runnable() { @Override public void run() { final long start = System.currentTimeMillis(); player.executeCommand(command.substring(1)); TaskManager.IMP.later(new Runnable() { @Override public void run() { SetBlockQueue.IMP.addTask(new Runnable() { @Override public void run() { if ((System.currentTimeMillis() - start) > 1000) { BBC.WORLDEDIT_COMPLETE.send(FawePlayer.wrap(player)); } } }); } }, 2); } }); } catch (final Exception e) { e.printStackTrace(); } } }, false, false); } public boolean delay(final FawePlayer player, final Runnable whenDone, final boolean delayed, final boolean onlyDelayedExecution) { final boolean free = SetBlockQueue.IMP.addTask(null); if (free) { if (delayed) { if (whenDone != null) { whenDone.run(); } } else { if ((whenDone != null) && !onlyDelayedExecution) { whenDone.run(); } else { return false; } } } else { if (!delayed && (player != null)) { BBC.WORLDEDIT_DELAYED.send(player); } SetBlockQueue.IMP.addTask(whenDone); } return true; } }