package com.boydti.fawe.bukkit; import java.util.Arrays; import java.util.HashSet; import java.util.List; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.event.Cancellable; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.player.PlayerCommandPreprocessEvent; import com.boydti.fawe.Fawe; import com.boydti.fawe.config.BBC; import com.boydti.fawe.config.Settings; import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.object.RegionWrapper; import com.boydti.fawe.util.MainUtil; import com.boydti.fawe.util.Perm; import com.boydti.fawe.util.WEManager; import com.sk89q.worldedit.BlockVector; import com.sk89q.worldedit.IncompleteRegionException; import com.sk89q.worldedit.LocalSession; import com.sk89q.worldedit.LocalWorld; import com.sk89q.worldedit.bukkit.BukkitUtil; import com.sk89q.worldedit.regions.Region; @Deprecated public class WEListener implements Listener { public final HashSet rad1 = new HashSet<>(Arrays.asList("forestgen", "pumpkins", "drain", "fixwater", "fixlava", "replacenear", "snow", "thaw", "ex", "butcher", "size")); public final HashSet rad2 = new HashSet<>(Arrays.asList("fill", "fillr", "removenear", "remove")); public final HashSet rad2_1 = new HashSet<>(Arrays.asList("hcyl", "cyl")); public final HashSet rad2_2 = new HashSet<>(Arrays.asList("sphere", "pyramid")); public final HashSet rad2_3 = new HashSet<>(Arrays.asList("brush smooth")); public final HashSet rad3_1 = new HashSet<>(Arrays.asList("brush gravity")); public final HashSet rad3_2 = new HashSet<>(Arrays.asList("brush sphere", "brush cylinder")); public final HashSet region = new HashSet<>(Arrays.asList("move", "set", "replace", "overlay", "walls", "outline", "deform", "hollow", "smooth", "naturalize", "paste", "count", "distr", "copy", "cut", "green", "setbiome")); public final HashSet regionExtend = new HashSet<>(Arrays.asList("stack")); public final HashSet unregioned = new HashSet<>(Arrays.asList("paste", "redo", "undo", "rotate", "flip", "generate", "schematic", "schem")); public final HashSet unsafe1 = new HashSet<>(Arrays.asList("cs", ".s", "restore", "snapshot", "delchunks", "listchunks")); public final HashSet restricted = new HashSet<>(Arrays.asList("up")); public final HashSet other = new HashSet<>(Arrays.asList("undo", "redo", "schematic", "schem", "count")); public boolean checkCommand(final List list, final String cmd) { for (final String identifier : list) { if (("/" + identifier).equals(cmd) || ("//" + identifier).equals(cmd) || ("/worldedit:/" + identifier).equals(cmd) || ("/worldedit:" + identifier).equals(cmd)) { return true; } } return false; } public String reduceCmd(final String cmd, final boolean single) { if (cmd.startsWith("/worldedit:/")) { return cmd.substring(12); } if (cmd.startsWith("/worldedit:")) { return cmd.substring(11); } if (cmd.startsWith("//")) { return cmd.substring(2); } if (single && cmd.startsWith("/")) { return cmd.substring(1); } return cmd; } public int getInt(final String s) { try { int max = 0; final String[] split = s.split(","); for (final String rad : split) { final int val = Integer.parseInt(rad); if (val > max) { max = val; } } return max; } catch (final NumberFormatException e) { return 0; } } public boolean checkVolume(final FawePlayer player, final long volume, final long max, final Cancellable e) { if (volume > max) { MainUtil.sendMessage(FawePlayer.wrap(player.getName()), BBC.WORLDEDIT_VOLUME.s().replaceAll("%current%", volume + "").replaceAll("%max%", max + "")); e.setCancelled(true); } if (Perm.hasPermission(player, "fawe.admin") && !Perm.hasPermission(player, "fawe.bypass")) { BBC.WORLDEDIT_BYPASS.send(player); } return true; } public boolean checkSelection(final FawePlayer player, final int modifier, final long max, final Cancellable e) { LocalSession session = Fawe.get().getWorldEdit().getSession(player.getName()); LocalWorld w = BukkitUtil.getLocalWorld(player.parent.getWorld()); Region selection = null; try { selection = session.getSelection(w); } catch (IncompleteRegionException e2) {} if (selection == null) { return true; } final BlockVector pos1 = selection.getMinimumPoint().toBlockVector(); final BlockVector pos2 = selection.getMaximumPoint().toBlockVector(); final HashSet mask = WEManager.IMP.getMask(player); final RegionWrapper region = new RegionWrapper(pos1.getBlockX(), pos2.getBlockX(), pos1.getBlockZ(), pos2.getBlockZ()); if (Settings.REQUIRE_SELECTION) { String arg = null; if (!WEManager.IMP.regionContains(region, mask)) { arg = "pos1 + pos2"; } else if (!WEManager.IMP.maskContains(mask, pos1.getBlockX(), pos1.getBlockZ())) { arg = "pos1"; } else if (!WEManager.IMP.maskContains(mask, pos2.getBlockX(), pos2.getBlockZ())) { arg = "pos2"; } if (arg != null) { BBC.REQUIRE_SELECTION_IN_MASK.send(player, arg); e.setCancelled(true); if (Perm.hasPermission(player, "fawe.admin") && !Perm.hasPermission(player, "fawe.bypass")) { BBC.WORLDEDIT_BYPASS.send(player); } return true; } if (!WEManager.IMP.regionContains(region, mask)) { BBC.REQUIRE_SELECTION_IN_MASK.send(player, "pos1 + pos2"); e.setCancelled(true); if (Perm.hasPermission(player, "fawe.admin") && !Perm.hasPermission(player, "fawe.bypass")) { BBC.WORLDEDIT_BYPASS.send(player); } return true; } } final long volume = Math.abs((pos1.getBlockX() - pos2.getBlockX()) * (pos1.getBlockY() - pos2.getBlockY()) * (pos1.getBlockZ() - pos2.getBlockZ())) * modifier; return checkVolume(player, volume, max, e); } @EventHandler(priority = EventPriority.LOWEST, ignoreCancelled = true) public boolean onPlayerCommand(final PlayerCommandPreprocessEvent e) { final FawePlayer player = FawePlayer.wrap(e.getPlayer()); final String message = e.getMessage(); final String cmd = message.toLowerCase(); final boolean single = true; final String[] split = cmd.split(" "); final long maxVolume = Settings.WE_MAX_VOLUME; final long maxIterations = Settings.WE_MAX_ITERATIONS; // if (player.hasPermission("fawe.bypass")) { // return true; // } if (split.length >= 2) { final String reduced = reduceCmd(split[0], single); final String reduced2 = reduceCmd(split[0] + " " + split[1], single); if (rad1.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } final long volume = getInt(split[1]) * 256; return checkVolume(player, volume, maxVolume, e); } if (rad2.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 3) { final long volume = getInt(split[2]) * 256; return checkVolume(player, volume, maxVolume, e); } return true; } if (rad2_1.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 4) { final long volume = getInt(split[2]) * getInt(split[3]); return checkVolume(player, volume, maxVolume, e); } return true; } if (rad2_2.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 3) { final long radius = getInt(split[2]); final long volume = radius * radius; return checkVolume(player, volume, maxVolume, e); } return true; } if (rad2_3.contains(reduced2)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 3) { if (split.length == 4) { final int iterations = getInt(split[3]); if (iterations > maxIterations) { MainUtil.sendMessage(player, BBC.WORLDEDIT_ITERATIONS.s().replaceAll("%current%", iterations + "").replaceAll("%max%", maxIterations + "")); e.setCancelled(true); if (Perm.hasPermission(player, "fawe.admin") && !Perm.hasPermission(player, "fawe.bypass")) { BBC.WORLDEDIT_BYPASS.send(player); } return true; } } final long radius = getInt(split[2]); final long volume = radius * radius; return checkVolume(player, volume, maxVolume, e); } return true; } if (rad3_1.contains(reduced2)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 3) { int i = 2; if (split[i].equalsIgnoreCase("-h")) { i = 3; } final long radius = getInt(split[i]); final long volume = radius * radius; return checkVolume(player, volume, maxVolume, e); } return true; } if (rad3_2.contains(reduced2)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } if (split.length >= 4) { int i = 3; if (split[i].equalsIgnoreCase("-h")) { i = 4; } final long radius = getInt(split[i]); final long volume = radius * radius; return checkVolume(player, volume, maxVolume, e); } return true; } if (regionExtend.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } return checkSelection(player, getInt(split[1]), maxVolume, e); } } final String reduced = reduceCmd(split[0], single); if (Settings.WE_BLACKLIST.contains(reduced)) { BBC.WORLDEDIT_UNSAFE.send(player); e.setCancelled(true); if (Perm.hasPermission(player, "fawe.admin") && !Perm.hasPermission(player, "fawe.bypass")) { BBC.WORLDEDIT_BYPASS.send(player); } } if (restricted.contains(reduced)) { final HashSet mask = WEManager.IMP.getMask(player); Location loc = player.parent.getLocation(); for (final RegionWrapper region : mask) { if (region.isIn(loc.getBlockX(), loc.getBlockZ())) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } return true; } } e.setCancelled(true); BBC.REQUIRE_SELECTION_IN_MASK.send(player); return true; } if (region.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } return checkSelection(player, 1, maxVolume, e); } if (unregioned.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } } if (other.contains(reduced)) { if (WEManager.IMP.delay(player, message)) { e.setCancelled(true); return true; } } return true; } }