diff --git a/.gitignore b/.gitignore index bdc982a3c..10fb46bc4 100644 --- a/.gitignore +++ b/.gitignore @@ -3,7 +3,8 @@ *.bat ### Maven template -target/ +target/classes +target/maven-archiver pom.xml.tag pom.xml.releaseBackup pom.xml.versionsBackup @@ -123,7 +124,7 @@ local.properties .mtj.tmp/ # Package Files # -*.jar + *.war *.ear *.zip @@ -132,3 +133,6 @@ local.properties hs_err_pid* +*.java +target/PlotSquared-Null.jar +target/PlotSquared-Uber.jar diff --git a/pom.xml b/pom.xml index ade322dea..648642109 100644 --- a/pom.xml +++ b/pom.xml @@ -8,7 +8,7 @@ UTF-8 PlotSquared - 3.1.0 + 3.1.1 PlotSquared jar diff --git a/src/main/java/com/intellectualcrafters/plot/PS.java b/src/main/java/com/intellectualcrafters/plot/PS.java index ae485bab9..1b3460752 100644 --- a/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/src/main/java/com/intellectualcrafters/plot/PS.java @@ -109,6 +109,7 @@ public class PS { private File storageFile; private File FILE = null; // This file private int[] VERSION = null; + private String PLATFORM = null; private String LAST_VERSION; private boolean LOADING_WORLD = false; private ConcurrentHashMap> plots; @@ -120,7 +121,7 @@ public class PS { * Initialize PlotSquared with the desired Implementation class * @param imp_class */ - public PS(final IPlotMain imp_class) { + public PS(final IPlotMain imp_class, String platform) { try { instance = this; this.thread = Thread.currentThread(); @@ -135,13 +136,11 @@ public class PS { e.printStackTrace(); FILE = new File(IMP.getDirectory().getParentFile(), "PlotSquared.jar"); if (!FILE.exists()) { - FILE = new File(IMP.getDirectory().getParentFile(), "PlotSquared-Bukkit.jar"); - if (!FILE.exists()) { - FILE = new File(IMP.getDirectory().getParentFile(), "PlotSquared-Sponge.jar"); - } + FILE = new File(IMP.getDirectory().getParentFile(), "PlotSquared-" + platform + ".jar"); } } VERSION = IMP.getPluginVersion(); + PLATFORM = platform; EconHandler.manager = IMP.getEconomyHandler(); if (getJavaVersion() < 1.7) { log(C.PREFIX.s() + "&cYour java version is outdated. Please update to at least 1.7."); @@ -220,9 +219,6 @@ public class PS { URL url = getUpdate(); if (url != null) { update = url; - log("&6You are running an older version of PlotSquared..."); - log("&8 - &3Use: &7/plot update"); - log("&8 - &3Or: &7" + url); } else if (LAST_VERSION != null && !StringMan.join(VERSION,".").equals(LAST_VERSION)) { log("&aThanks for updating from: " + LAST_VERSION + " to " + StringMan.join(VERSION, ".")); @@ -324,6 +320,14 @@ public class PS { public int[] getVersion() { return VERSION; } + + /** + * Get the platform this is running on (Bukkit, Sponge) + * @return + */ + public String getPlatform() { + return PLATFORM; + } /** * Log a message to the IPlotMain logger @@ -1412,48 +1416,38 @@ public class PS { * @return */ public URL getUpdate() { - String resource = "plotsquared.1177"; - String url = "https://www.spigotmc.org/resources/" + resource + "/history"; - String download = ""; + String pom = "https://raw.githubusercontent.com/IntellectualSites/PlotSquared/master/pom.xml"; + String dl = "https://raw.githubusercontent.com/IntellectualSites/PlotSquared/master/target/PlotSquared-${PLATFORM}.jar"; + String agent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.112 Safari/535.1"; try { - URL history = new URL(url); - URLConnection con = history.openConnection(); - con.addRequestProperty("User-Agent", "Mozilla/5.0"); - InputStream stream = con.getInputStream(); - BufferedReader in = new BufferedReader(new InputStreamReader(stream)); - String l; - URL link = null; - String cur_ver = config.getString("version"); - String new_ver = null; - while ((l = in.readLine()) != null) { - if (l.length() > version.length() && l.startsWith(version)) { - new_ver = l.substring(version.length(), l.length() - 5); + URL page = new URL(pom); + URLConnection con = page.openConnection(); + con.addRequestProperty("User-Agent", agent); + BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream())); + String line = null; + while ((line = in.readLine()) != null) { + line = line.trim(); + if (line.startsWith("")) { + line = line.replaceAll("[^\\d.]", ""); break; } - if (link == null && l.length() > download.length() && l.startsWith(download)) { - String subString = l.substring(download.length()); - link = new URL("https://www.spigotmc.org/resources/" + resource + "/download?version=" + subString.substring(0, subString.indexOf("\""))); - continue; - } } - stream.close(); in.close(); - if (new_ver == null || !canUpdate(cur_ver, new_ver)) { + if (!canUpdate(config.getString("version"), line) ) { PS.debug("&7PlotSquared is already up to date!"); return null; } - if (link == null) { - PS.debug("&dCould not check for updates (1)"); - PS.debug("&7 - Manually check for updates: " + url); - return null; - } - return link; + dl = dl.replaceAll("${PLATFORM}", getPlatform()); + log("&6PlotSquared v" + line + " is available:"); + log("&8 - &3Use: &7/plot update"); + log("&8 - &3Or: &7" + dl); + return new URL(dl); } catch (Exception e) { - PS.debug("&dCould not check for updates (2)"); - PS.debug("&7 - Manually check for updates: " + url); - return null; + e.printStackTrace(); + log("&dCould not check for updates (0)"); + log("&7 - Manually check for updates: " + pom); } + return null; } public boolean update(PlotPlayer sender, URL url) { @@ -1505,7 +1499,6 @@ public class PS { */ public void copyFile(String file, String folder) { try { - byte[] buffer = new byte[2048]; File output = IMP.getDirectory(); if (!output.exists()) { output.mkdirs(); @@ -1514,26 +1507,39 @@ public class PS { if (newFile.exists()) { return; } - ZipInputStream zis = new ZipInputStream(new FileInputStream(FILE)); - ZipEntry ze = zis.getNextEntry(); - while (ze != null) { - String name = ze.getName(); - if (name.equals(file)) { - new File(newFile.getParent()).mkdirs(); - FileOutputStream fos = new FileOutputStream(newFile); - int len; - while ((len = zis.read(buffer)) > 0) { - fos.write(buffer, 0, len); + InputStream stream = IMP.getClass().getResourceAsStream(file); + byte[] buffer = new byte[2048]; + if (stream == null) { + ZipInputStream zis = new ZipInputStream(new FileInputStream(FILE)); + ZipEntry ze = zis.getNextEntry(); + while (ze != null) { + String name = ze.getName(); + if (name.equals(file)) { + new File(newFile.getParent()).mkdirs(); + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = zis.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + ze = null; + } + else { + ze = zis.getNextEntry(); } - fos.close(); - ze = null; - } - else { - ze = zis.getNextEntry(); } + zis.closeEntry(); + zis.close(); + return; } - zis.closeEntry(); - zis.close(); + newFile.createNewFile(); + FileOutputStream fos = new FileOutputStream(newFile); + int len; + while ((len = stream.read(buffer)) > 0) { + fos.write(buffer, 0, len); + } + fos.close(); + stream.close(); } catch (Exception e) { e.printStackTrace(); @@ -1726,6 +1732,7 @@ public class PS { public void setupConfig() { LAST_VERSION = config.getString("version"); config.set("version", StringMan.join(VERSION,".")); + config.set("platform", PLATFORM); final Map options = new HashMap<>(); // Command confirmation diff --git a/src/main/java/com/intellectualcrafters/plot/commands/Clear.java b/src/main/java/com/intellectualcrafters/plot/commands/Clear.java index 22d00915c..fdaf2ec9a 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/Clear.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/Clear.java @@ -88,7 +88,7 @@ public class Clear extends SubCommand { MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); return false; } - if (Settings.DONE_RESTRICTS_BUILDING && FlagManager.isPlotFlagTrue(plot, "done" ) && (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))) { + if (FlagManager.isPlotFlagTrue(plot, "done" ) && (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))) { MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE); return false; } diff --git a/src/main/java/com/intellectualcrafters/plot/commands/Continue.java b/src/main/java/com/intellectualcrafters/plot/commands/Continue.java index 1ef0b342c..392425eda 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/Continue.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/Continue.java @@ -60,6 +60,10 @@ public class Continue extends SubCommand { MainUtil.sendMessage(plr, C.DONE_NOT_DONE); return false; } + if (FlagManager.isPlotFlagTrue(plot, "done" ) && (!Permissions.hasPermission(plr, "plots.continue") || (Settings.DONE_COUNTS_TOWARDS_LIMIT && MainUtil.getAllowedPlots(plr) >= MainUtil.getPlayerPlotCount(plr)))) { + MainUtil.sendMessage(plr, C.DONE_ALREADY_DONE); + return false; + } if (MainUtil.runners.containsKey(plot)) { MainUtil.sendMessage(plr, C.WAIT_FOR_TIMER); return false; diff --git a/src/main/java/com/intellectualcrafters/plot/commands/FlagCmd.java b/src/main/java/com/intellectualcrafters/plot/commands/FlagCmd.java index 6009d2a30..cc197a42a 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/FlagCmd.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/FlagCmd.java @@ -124,11 +124,11 @@ public class FlagCmd extends SubCommand { MainUtil.sendMessage(player, C.NOT_VALID_FLAG); return false; } - if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { + final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); + if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase()) && !Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + value.toLowerCase())) { MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase()); return false; } - final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); final Object parsed = af.parseValueRaw(value); if (parsed == null) { MainUtil.sendMessage(player, "&c" + af.getValueDesc()); @@ -157,11 +157,15 @@ public class FlagCmd extends SubCommand { MainUtil.sendMessage(player, C.NOT_VALID_FLAG); return false; } - if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { - MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase()); - return false; - } final Flag flag = FlagManager.getPlotFlagAbs(plot, args[1].toLowerCase()); + if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { + for (String entry : args[2].split(",")) { + if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) { + MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase()); + return false; + } + } + } if (flag == null) { MainUtil.sendMessage(player, C.FLAG_NOT_IN_PLOT); return false; @@ -195,8 +199,12 @@ public class FlagCmd extends SubCommand { return false; } if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase())) { - MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase()); - return false; + for (String entry : args[2].split(",")) { + if (!Permissions.hasPermission(player, "plots.set.flag." + args[1].toLowerCase() + "." + entry)) { + MainUtil.sendMessage(player, C.NO_PERMISSION, "plots.set.flag." + args[1].toLowerCase()); + return false; + } + } } final String value = StringMan.join(Arrays.copyOfRange(args, 2, args.length), " "); final Object parsed = af.parseValueRaw(value); diff --git a/src/main/java/com/intellectualcrafters/plot/commands/Update.java b/src/main/java/com/intellectualcrafters/plot/commands/Update.java index f5a9e9467..6ea4fa419 100644 --- a/src/main/java/com/intellectualcrafters/plot/commands/Update.java +++ b/src/main/java/com/intellectualcrafters/plot/commands/Update.java @@ -34,7 +34,7 @@ import com.plotsquared.general.commands.CommandDeclaration; permission = "plots.admin", description = "Update PlotSquared", usage = "/plot update", - requiredType = RequiredType.PLAYER, + requiredType = RequiredType.NONE, aliases = {"updateplugin"}, category = CommandCategory.DEBUG ) diff --git a/src/main/java/com/intellectualcrafters/plot/config/C.java b/src/main/java/com/intellectualcrafters/plot/config/C.java index 4e716eeb7..3432fa728 100644 --- a/src/main/java/com/intellectualcrafters/plot/config/C.java +++ b/src/main/java/com/intellectualcrafters/plot/config/C.java @@ -213,7 +213,7 @@ public enum C { /* * Done */ - DONE_ALREADY_DONE("$2This plot is already marked as done.","Done"), + DONE_ALREADY_DONE("$2This plot is already marked as done, and you are not allowed to claim more plots","Done"), DONE_NOT_DONE("$2This plot is not marked as done.","Done"), DONE_INSUFFICIENT_COMPLEXITY("$2This plot is too simple. Please add more detail before using this command.","Done"), DONE_SUCCESS("$1Successfully marked this plot as done.","Done"), diff --git a/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java b/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java index ce7679b4d..e0cbbb355 100644 --- a/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java +++ b/src/main/java/com/intellectualcrafters/plot/database/SQLManager.java @@ -181,6 +181,7 @@ public class SQLManager implements AbstractDB { last = System.currentTimeMillis(); try { close(); + CLOSED = false; connection = database.forceConnection(); } catch (SQLException | ClassNotFoundException e) { e.printStackTrace(); @@ -2419,6 +2420,15 @@ public class SQLManager implements AbstractDB { @Override public void validateAllPlots(Set toValidate) { + try { + if (connection.isClosed() || CLOSED) { + CLOSED = false; + connection = database.forceConnection(); + } + } + catch (Exception e) { + e.printStackTrace(); + } PS.debug("$1All DB transactions during this session are being validated (This may take a while if corrections need to be made)"); commit(); while (true) { diff --git a/src/main/java/com/intellectualcrafters/plot/object/Plot.java b/src/main/java/com/intellectualcrafters/plot/object/Plot.java index f19560f55..c6f9ce2ea 100644 --- a/src/main/java/com/intellectualcrafters/plot/object/Plot.java +++ b/src/main/java/com/intellectualcrafters/plot/object/Plot.java @@ -37,6 +37,7 @@ import com.intellectualcrafters.plot.config.Configuration; import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.flag.Flag; +import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.util.BO3Handler; import com.intellectualcrafters.plot.util.BlockManager; import com.intellectualcrafters.plot.util.ChunkManager; @@ -118,12 +119,16 @@ public class Plot { public int temp; /** - * Session only plot metadata (session is until the server stops) + * Session only plot metadata (session is until the server stops)
+ *
+ * For persistent metadata use the flag system + * @see FlagManager */ private ConcurrentHashMap meta; /** - * Constructor for a new plot + * Constructor for a new plot
+ * (Only changes after plot.create() will be properly set in the database) * * @param world * @param id @@ -136,7 +141,9 @@ public class Plot { } /** - * Constructor for a temporary plot + * Constructor for a temporary plot (use -1 for temp)
+ * The database will ignore any queries regarding temporary plots. + * Please note that some bulk plot management functions may still affect temporary plots (TODO: fix this) * * @param world * @param id @@ -151,7 +158,7 @@ public class Plot { } /** - * Constructor for a saved plots + * Constructor for a saved plots (Used by the database manager when plots are fetched) * * @param id * @param owner @@ -180,7 +187,10 @@ public class Plot { } /** - * Set some session only metadata for the plot + * Session only plot metadata (session is until the server stops)
+ *
+ * For persistent metadata use the flag system + * @see FlagManager * @param key * @param value */ @@ -245,18 +255,18 @@ public class Plot { } /** - * Check if the player is either the owner or on the trusted list + * Check if the player is either the owner or on the trusted/added list * * @param uuid * - * @return true if the player is added as a helper or is the owner + * @return true if the player is added/trusted or is the owner */ public boolean isAdded(final UUID uuid) { return PlotHandler.isAdded(this, uuid); } /** - * Should the player be allowed to enter? + * Should the player be denied from entering? * * @param uuid * @@ -303,6 +313,10 @@ public class Plot { return !settings.getMerged(0) && !settings.getMerged(3); } + /** + * Check if the plot is merged + * @return + */ public boolean isMerged() { if (settings == null) { return false; @@ -310,6 +324,10 @@ public class Plot { return settings.getMerged(0) || settings.getMerged(2) || settings.getMerged(1) || settings.getMerged(3); } + /** + * Get the timestamp in milliseconds of when the plot was created (unreliable) + * @return + */ public long getTimestamp() { if (timestamp == 0) { timestamp = System.currentTimeMillis(); @@ -363,7 +381,7 @@ public class Plot { } /** - * Deny someone (use DBFunc.addDenied() as well) + * Deny someone (updates database as well) * * @param uuid */ @@ -372,7 +390,7 @@ public class Plot { } /** - * Add someone as a helper (use DBFunc as well) + * Add someone as a helper (updates database as well) * * @param uuid */ @@ -381,7 +399,7 @@ public class Plot { } /** - * Add someone as a trusted user (use DBFunc as well) + * Add someone as a trusted user (updates database as well) * * @param uuid */ @@ -390,7 +408,7 @@ public class Plot { } /** - * Set the plot owner + * Set the plot owner (and update the database) * @param owner */ public void setOwner(final UUID owner) { @@ -811,8 +829,7 @@ public class Plot { /** * Get the plot hashcode * - * @return integer. You can easily make this a character array
xI = c[0] x = c[1 -> xI...] yI = c[xI ... + 1] y - * = c[xI ... + 2 -> yI ...] + * @return integer. */ @Override public int hashCode() { diff --git a/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java b/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java index b1d3133c6..d018891b9 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java +++ b/src/main/java/com/intellectualcrafters/plot/util/ExpireManager.java @@ -66,7 +66,7 @@ public class ExpireManager { } public static void runTask() { - ExpireManager.task = TaskManager.runTaskRepeat(new Runnable() { + ExpireManager.task = TaskManager.runTaskRepeatAsync(new Runnable() { @Override public void run() { try { diff --git a/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java b/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java index d91052378..842e4034d 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java +++ b/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java @@ -526,8 +526,13 @@ public class MainUtil { public static int getBorder(final String worldname) { if (worldBorder.containsKey(worldname)) { - PS.get().getPlotWorld(worldname); - return worldBorder.get(worldname) + 16; + int border = worldBorder.get(worldname) + 16; + if (border == 0) { + return Integer.MAX_VALUE; + } + else { + return border; + } } return Integer.MAX_VALUE; } diff --git a/src/main/java/com/intellectualcrafters/plot/util/Permissions.java b/src/main/java/com/intellectualcrafters/plot/util/Permissions.java index c793823d5..9b819d0f4 100644 --- a/src/main/java/com/intellectualcrafters/plot/util/Permissions.java +++ b/src/main/java/com/intellectualcrafters/plot/util/Permissions.java @@ -20,14 +20,6 @@ public class Permissions { if (player.hasPermission(perm)) { return true; } - final String[] nodes = perm.split("\\."); - final StringBuilder n = new StringBuilder(); - for (int i = 0; i < (nodes.length - 1); i++) { - n.append(nodes[i] + (".")); - if (player.hasPermission(n + C.PERMISSION_STAR.s())) { - return true; - } - } return false; } diff --git a/src/main/java/com/plotsquared/bukkit/BukkitMain.java b/src/main/java/com/plotsquared/bukkit/BukkitMain.java index 6a860eee6..c43ec33ed 100644 --- a/src/main/java/com/plotsquared/bukkit/BukkitMain.java +++ b/src/main/java/com/plotsquared/bukkit/BukkitMain.java @@ -121,7 +121,7 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { @Override public void onEnable() { THIS = this; - PS.instance = new PS(this); + PS.instance = new PS(this, "Bukkit"); } @Override diff --git a/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java b/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java index 990f9faae..4fcdf5c7c 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/PlayerEvents.java @@ -105,6 +105,7 @@ import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotWorld; import com.intellectualcrafters.plot.object.StringWrapper; import com.intellectualcrafters.plot.util.ChunkManager; +import com.intellectualcrafters.plot.util.ClusterManager; import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.ExpireManager; import com.intellectualcrafters.plot.util.MainUtil; @@ -877,11 +878,20 @@ public class PlayerEvents extends com.plotsquared.listener.PlotListener implemen @EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true) public void onFade(final BlockFadeEvent e) { final Block b = e.getBlock(); - final Location loc = BukkitUtil.getLocation(b.getLocation()); - if (PS.get().isPlotWorld(loc.getWorld())) { - if (MainUtil.isPlotRoad(loc)) { - e.setCancelled(true); + String world = b.getWorld().getName(); + PlotWorld plotworld = PS.get().getPlotWorld(world); + if (plotworld == null) { + return; + } + PlotManager manager = PS.get().getPlotManager(world); + PlotId id = manager.getPlotId(plotworld, b.getX(), b.getY(), b.getZ()); + if (id == null) { + if (plotworld.TYPE == 2) { + if (ClusterManager.getClusterAbs(BukkitUtil.getLocation(b.getLocation())) != null) { + return; + } } + e.setCancelled(true); } } diff --git a/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java b/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java index 8f4d4d277..922d51ecb 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/PlotPlusListener.java @@ -171,8 +171,9 @@ public class PlotPlusListener extends PlotListener implements Listener { public void onPlotEnter(final PlayerEnterPlotEvent event) { Player player = event.getPlayer(); final Plot plot = event.getPlot(); - if (FlagManager.getPlotFlag(plot, "greeting") != null) { - event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', C.PREFIX_GREETING.s().replaceAll("%id%", plot.id + "") + FlagManager.getPlotFlag(plot, "greeting").getValueString())); + Flag greeting = FlagManager.getPlotFlag(plot, "greeting"); + if (greeting != null) { + event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', C.PREFIX_GREETING.s().replaceAll("%id%", plot.id + "") + greeting.getValueString())); } Flag feed = FlagManager.getPlotFlag(plot, "feed"); if (feed != null) { @@ -222,8 +223,9 @@ public class PlotPlusListener extends PlotListener implements Listener { if (!plot.hasOwner()) { return; } - if (FlagManager.getPlotFlag(plot, "farewell") != null) { - event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', C.PREFIX_FAREWELL.s().replaceAll("%id%", plot.id + "") + FlagManager.getPlotFlag(plot, "farewell").getValueString())); + Flag farewell = FlagManager.getPlotFlag(plot, "farewell"); + if (farewell != null) { + event.getPlayer().sendMessage(ChatColor.translateAlternateColorCodes('&', C.PREFIX_FAREWELL.s().replaceAll("%id%", plot.id + "") + farewell.getValueString())); } final PlotPlayer pl = BukkitUtil.getPlayer(leaver); String name = leaver.getName(); diff --git a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WEManager.java b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WEManager.java index 14a14fa30..9a80e04a5 100644 --- a/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WEManager.java +++ b/src/main/java/com/plotsquared/bukkit/listeners/worldedit/WEManager.java @@ -28,12 +28,13 @@ public class WEManager { HashSet regions = new HashSet<>(); UUID uuid = player.getUUID(); for (Plot plot : PS.get().getPlotsInWorld(player.getLocation().getWorld())) { - if (Settings.DONE_RESTRICTS_BUILDING && plot.isBasePlot() && FlagManager.getPlotFlag(plot, "done") == null) { - if (Settings.WE_ALLOW_HELPER ? plot.isAdded(uuid) : (plot.isOwner(uuid) || plot.getTrusted().contains(uuid))) { - Location pos1 = MainUtil.getPlotBottomLoc(plot.world, plot.id).add(1, 0, 1); - Location pos2 = MainUtil.getPlotTopLoc(plot.world, plot.id); - regions.add(new RegionWrapper(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ())); - } + if (!plot.isBasePlot() || Settings.DONE_RESTRICTS_BUILDING && FlagManager.getPlotFlag(plot, "done") != null) { + continue; + } + if (Settings.WE_ALLOW_HELPER ? plot.isAdded(uuid) : (plot.isOwner(uuid) || plot.getTrusted().contains(uuid))) { + Location pos1 = MainUtil.getPlotBottomLoc(plot.world, plot.id).add(1, 0, 1); + Location pos2 = MainUtil.getPlotTopLoc(plot.world, plot.id); + regions.add(new RegionWrapper(pos1.getX(), pos2.getX(), pos1.getZ(), pos2.getZ())); } } return regions; diff --git a/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java b/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java index d0396c6b3..7cd8ef525 100644 --- a/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java +++ b/src/main/java/com/plotsquared/bukkit/object/BukkitPlayer.java @@ -1,6 +1,7 @@ package com.plotsquared.bukkit.object; import java.util.HashSet; +import java.util.Map; import java.util.UUID; import org.bukkit.Bukkit; @@ -68,26 +69,45 @@ public class BukkitPlayer extends PlotPlayer { } @Override - public boolean hasPermission(final String perm) { + public boolean hasPermission(final String node) { if (Settings.PERMISSION_CACHING) { - if (this.noPerm.contains(perm)) { + if (this.noPerm.contains(node)) { return false; } - if (this.hasPerm.contains(perm)) { + if (this.hasPerm.contains(node)) { return true; } - final boolean result = this.player.hasPermission(perm); - if (!result) { - this.noPerm.add(perm); - return false; - } - this.hasPerm.add(perm); - return true; } if (offline && EconHandler.manager != null) { - return EconHandler.manager.hasPermission(getName(), perm); + return EconHandler.manager.hasPermission(getName(), node); } - return this.player.hasPermission(perm); + boolean value = this.player.hasPermission(node); + if (!value) { + Permission perm = Bukkit.getServer().getPluginManager().getPermission(node); + if (perm == null) { + perm = new Permission(node, PermissionDefault.FALSE); + Map children = perm.getChildren(); + + final String[] nodes = node.split("\\."); + final StringBuilder n = new StringBuilder(); + for (int i = 0; i < (nodes.length - 1); i++) { + n.append(nodes[i] + (".")); + children.put(n + C.PERMISSION_STAR.s(), true); + } + Bukkit.getServer().getPluginManager().addPermission(perm); + Bukkit.getServer().getPluginManager().recalculatePermissionDefaults(perm); + value = this.player.hasPermission(node); + } + } + if (Settings.PERMISSION_CACHING) { + if (value) { + this.hasPerm.add(node); + } + else { + this.noPerm.add(node); + } + } + return value; } @Override diff --git a/src/main/java/com/plotsquared/bukkit/util/BukkitHybridUtils.java b/src/main/java/com/plotsquared/bukkit/util/BukkitHybridUtils.java index 348cd0faa..b805f22d0 100644 --- a/src/main/java/com/plotsquared/bukkit/util/BukkitHybridUtils.java +++ b/src/main/java/com/plotsquared/bukkit/util/BukkitHybridUtils.java @@ -25,6 +25,7 @@ import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotAnalysis; import com.intellectualcrafters.plot.object.PlotBlock; import com.intellectualcrafters.plot.object.RunnableVal; +import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.MathMan; import com.intellectualcrafters.plot.util.TaskManager; @@ -34,7 +35,6 @@ public class BukkitHybridUtils extends HybridUtils { @Override public void analyzePlot(final Plot plot, final RunnableVal whenDone) { // int diff, int variety, int verticies, int rotation, int height_sd - /* * diff: compare to base by looping through all blocks * variety: add to hashset for each plotblock @@ -46,208 +46,213 @@ public class BukkitHybridUtils extends HybridUtils { * - recheck each block * */ - final World world = Bukkit.getWorld(plot.world); - final ChunkGenerator gen = world.getGenerator(); - if (gen == null) { - return; - } - final BiomeGrid base = new BiomeGrid() { @Override public void setBiome(int a, int b, Biome c) {} @Override public Biome getBiome(int a, int b) {return null;}}; - Location bot = MainUtil.getPlotBottomLoc(plot.world, plot.id).add(1, 0, 1); - Location top = MainUtil.getPlotTopLoc(plot.world, plot.id); - final int bx = bot.getX(); - final int bz = bot.getZ(); - final int tx = top.getX(); - final int tz = top.getZ(); - final int cbx = bx >> 4; - final int cbz = bz >> 4; - final int ctx = tx >> 4; - final int ctz = tz >> 4; - final Random r = new Random(); - MainUtil.initCache(); - final int width = tx - bx + 1; - final int length = tz - bz + 1; - - System.gc(); - System.gc(); - final short[][][] oldblocks = new short[256][width][length]; - final short[][][] newblocks = new short[256][width][length]; - - final List chunks = new ArrayList<>(); - final List processed_chunks = new ArrayList<>(); - - for (int X = cbx; X <= ctx; X++) { - for (int Z = cbz; Z <= ctz; Z++) { -// Chunk chunk = world.getChunkAt(X, Z); - chunks.add(new ChunkLoc(X, Z)); - } - } - final Runnable run = new Runnable() { + TaskManager.runTaskAsync(new Runnable() { @Override public void run() { - for (ChunkLoc chunk : processed_chunks) { - short[][] result = gen.generateExtBlockSections(world, r, chunk.x, chunk.z, base); - int X = chunk.x; - int Z = chunk.z; - int xb = ((X) << 4) - bx; - int zb = ((Z) << 4) - bz; - for (int i = 0; i < result.length; i++) { - if (result[i] == null) { - for (int j = 0; j < 4096; j++) { - int x = MainUtil.x_loc[i][j] + xb; - if (x < 0 || x >= width) continue; - int z = MainUtil.z_loc[i][j] + zb; - if (z < 0 || z >= length) continue; - int y = MainUtil.y_loc[i][j]; - oldblocks[y][x][z] = 0; - } - continue; - } - for (int j = 0; j < result[i].length; j++) { - int x = MainUtil.x_loc[i][j] + xb; - if (x < 0 || x >= width) continue; - int z = MainUtil.z_loc[i][j] + zb; - if (z < 0 || z >= length) continue; - int y = MainUtil.y_loc[i][j]; - oldblocks[y][x][z] = result[i][j]; - } - } - } - int size = width * length; - int[] changes = new int[size]; - int[] faces = new int[size]; - int[] data = new int[size]; - int[] air = new int[size]; - int[] variety = new int[size]; - - int i = 0; - for (int x = 0; x < width;x++) { - for (int z = 0; z < length;z++) { - HashSet types = new HashSet<>(); - for (int y = 0; y < 256; y++) { - short old = oldblocks[y][x][z]; - short now = newblocks[y][x][z]; - if (old != now) { - changes[i]++; - } - if (now == 0) { - air[i]++; - } - else { - // check verticies - // modifications_adjacent - if (x > 0 && z > 0 && y > 0 && x < width - 1 && z < length - 1 && y < 255) { - if (newblocks[y - 1][x][z] == 0) faces[i]++; - if (newblocks[y][x - 1][z] == 0) faces[i]++; - if (newblocks[y][x][z - 1] == 0) faces[i]++; - if (newblocks[y + 1][x][z] == 0) faces[i]++; - if (newblocks[y][x + 1][z] == 0) faces[i]++; - if (newblocks[y][x][z + 1] == 0) faces[i]++; - } - - Material material = Material.getMaterial(now); - Class md = material.getData(); - if (md.equals(Directional.class)) { - data[i] += 8; - } - else if (!md.equals(MaterialData.class)) { - data[i]++; - } - types.add(now); - } - } - variety[i] = types.size(); - i++; - } - } - // analyze plot - // put in analysis obj - - // run whenDone - PlotAnalysis analysis = new PlotAnalysis(); - analysis.changes = (int) (MathMan.getMean(changes) * 100); - analysis.faces = (int) (MathMan.getMean(faces) * 100); - analysis.data = (int) (MathMan.getMean(data) * 100); - analysis.air = (int) (MathMan.getMean(air) * 100); - analysis.variety = (int) (MathMan.getMean(variety) * 100); - - analysis.changes_sd = (int) (MathMan.getSD(changes, analysis.changes)); - analysis.faces_sd = (int) (MathMan.getSD(faces, analysis.faces)); - analysis.data_sd = (int) (MathMan.getSD(data, analysis.data)); - analysis.air_sd = (int) (MathMan.getSD(air, analysis.air)); - analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety)); - - List result = new ArrayList<>(); - result.add(analysis.changes); - result.add(analysis.faces); - result.add(analysis.data); - result.add(analysis.air); - result.add(analysis.variety); - - result.add(analysis.changes_sd); - result.add(analysis.faces_sd); - result.add(analysis.data_sd); - result.add(analysis.air_sd); - result.add(analysis.variety_sd); - Flag flag = new Flag(FlagManager.getFlag("analysis"), result); - FlagManager.addPlotFlag(plot, flag); - System.gc(); - System.gc(); - whenDone.value = analysis; - whenDone.run(); - } - }; - System.gc(); - MainUtil.initCache(); - TaskManager.index.incrementAndGet(); - final Integer currentIndex = TaskManager.index.get(); - final Integer task = TaskManager.runTaskRepeat(new Runnable() { - @Override - public void run() { - int index = chunks.size() - 1; - if (index == -1) { - PS.get().TASK.cancelTask(TaskManager.tasks.get(currentIndex)); - TaskManager.runTaskAsync(run); + final World world = Bukkit.getWorld(plot.world); + final ChunkGenerator gen = world.getGenerator(); + if (gen == null) { return; } - ChunkLoc chunk = chunks.remove(0); - world.loadChunk(chunk.x, chunk.z); - processed_chunks.add(chunk); - int X = chunk.x; - int Z = chunk.z; - int minX; - int minZ; - int maxX; - int maxZ; - if (X == cbx) minX = bx & 0x0f; - else minX = 0; - if (Z == cbz) minZ = bz & 0x0f; - else minZ = 0; - if (X == ctx) maxX = tx & 0x0f; - else maxX = 16; - if (Z == ctz) maxZ = tz & 0x0f; - else maxZ = 16; - - int cbx = X << 4; - int cbz = Z << 4; - - int xb = (cbx) - bx; - int zb = (cbz) - bz; - for (int x = minX; x <= maxX; x++) { - int xx = cbx + cbz; - for (int z = minZ; z <= maxZ; z++) { - int zz = cbz + z; - for (int y = 0; y < 256; y++) { - Block block = world.getBlockAt(xx, y, zz); - int xr = xb + x; - int zr = zb + z; - newblocks[y][xr][zr] = (short) block.getTypeId(); - } + final BiomeGrid base = new BiomeGrid() { @Override public void setBiome(int a, int b, Biome c) {} @Override public Biome getBiome(int a, int b) {return null;}}; + final Location bot = MainUtil.getPlotBottomLoc(plot.world, plot.id).add(1, 0, 1); + final Location top = MainUtil.getPlotTopLoc(plot.world, plot.id); + final int bx = bot.getX(); + final int bz = bot.getZ(); + final int tx = top.getX(); + final int tz = top.getZ(); + final int cbx = bx >> 4; + final int cbz = bz >> 4; + final int ctx = tx >> 4; + final int ctz = tz >> 4; + final Random r = new Random(); + MainUtil.initCache(); + final int width = tx - bx + 1; + final int length = tz - bz + 1; + + System.gc(); + System.gc(); + final short[][][] oldblocks = new short[256][width][length]; + final short[][][] newblocks = new short[256][width][length]; + + final Runnable run = new Runnable() { + @Override + public void run() { + ChunkManager.chunkTask(bot, top, new RunnableVal() { + @Override + public void run() { + // TODO [chunkx, chunkz, pos1x, pos1z, pos2x, pos2z, isedge] + int X = value[0]; + int Z = value[1]; + short[][] result = gen.generateExtBlockSections(world, r, X, Z, base); + int xb = ((X) << 4) - bx; + int zb = ((Z) << 4) - bz; + for (int i = 0; i < result.length; i++) { + if (result[i] == null) { + for (int j = 0; j < 4096; j++) { + int x = MainUtil.x_loc[i][j] + xb; + if (x < 0 || x >= width) continue; + int z = MainUtil.z_loc[i][j] + zb; + if (z < 0 || z >= length) continue; + int y = MainUtil.y_loc[i][j]; + oldblocks[y][x][z] = 0; + } + continue; + } + for (int j = 0; j < result[i].length; j++) { + int x = MainUtil.x_loc[i][j] + xb; + if (x < 0 || x >= width) continue; + int z = MainUtil.z_loc[i][j] + zb; + if (z < 0 || z >= length) continue; + int y = MainUtil.y_loc[i][j]; + oldblocks[y][x][z] = result[i][j]; + } + } + + } + }, new Runnable() { + @Override + public void run() { + TaskManager.runTaskAsync(new Runnable() { + @Override + public void run() { + int size = width * length; + int[] changes = new int[size]; + int[] faces = new int[size]; + int[] data = new int[size]; + int[] air = new int[size]; + int[] variety = new int[size]; + int i = 0; + for (int x = 0; x < width;x++) { + for (int z = 0; z < length;z++) { + HashSet types = new HashSet<>(); + for (int y = 0; y < 256; y++) { + short old = oldblocks[y][x][z]; + short now = newblocks[y][x][z]; + if (old != now) { + changes[i]++; + } + if (now == 0) { + air[i]++; + } + else { + // check verticies + // modifications_adjacent + if (x > 0 && z > 0 && y > 0 && x < width - 1 && z < length - 1 && y < 255) { + if (newblocks[y - 1][x][z] == 0) faces[i]++; + if (newblocks[y][x - 1][z] == 0) faces[i]++; + if (newblocks[y][x][z - 1] == 0) faces[i]++; + if (newblocks[y + 1][x][z] == 0) faces[i]++; + if (newblocks[y][x + 1][z] == 0) faces[i]++; + if (newblocks[y][x][z + 1] == 0) faces[i]++; + } + + Material material = Material.getMaterial(now); + Class md = material.getData(); + if (md.equals(Directional.class)) { + data[i] += 8; + } + else if (!md.equals(MaterialData.class)) { + data[i]++; + } + types.add(now); + } + } + variety[i] = types.size(); + i++; + } + } + // analyze plot + // put in analysis obj + + // run whenDone + PlotAnalysis analysis = new PlotAnalysis(); + analysis.changes = (int) (MathMan.getMean(changes) * 100); + analysis.faces = (int) (MathMan.getMean(faces) * 100); + analysis.data = (int) (MathMan.getMean(data) * 100); + analysis.air = (int) (MathMan.getMean(air) * 100); + analysis.variety = (int) (MathMan.getMean(variety) * 100); + + analysis.changes_sd = (int) (MathMan.getSD(changes, analysis.changes)); + analysis.faces_sd = (int) (MathMan.getSD(faces, analysis.faces)); + analysis.data_sd = (int) (MathMan.getSD(data, analysis.data)); + analysis.air_sd = (int) (MathMan.getSD(air, analysis.air)); + analysis.variety_sd = (int) (MathMan.getSD(variety, analysis.variety)); + + List result = new ArrayList<>(); + result.add(analysis.changes); + result.add(analysis.faces); + result.add(analysis.data); + result.add(analysis.air); + result.add(analysis.variety); + + result.add(analysis.changes_sd); + result.add(analysis.faces_sd); + result.add(analysis.data_sd); + result.add(analysis.air_sd); + result.add(analysis.variety_sd); + Flag flag = new Flag(FlagManager.getFlag("analysis"), result); + FlagManager.addPlotFlag(plot, flag); + System.gc(); + System.gc(); + whenDone.value = analysis; + whenDone.run(); + } + }); + } + }, 5); + } - } - world.unloadChunkRequest(chunk.x, chunk.z, true); + }; + System.gc(); + MainUtil.initCache(); + ChunkManager.chunkTask(bot, top, new RunnableVal() { + + @Override + public void run() { + int X = value[0]; + int Z = value[1]; + world.loadChunk(X, Z); + int minX; + int minZ; + int maxX; + int maxZ; + if (X == cbx) minX = bx & 15; + else minX = 0; + if (Z == cbz) minZ = bz & 15; + else minZ = 0; + if (X == ctx) maxX = tx & 15; + else maxX = 16; + if (Z == ctz) maxZ = tz & 15; + else maxZ = 16; + + int cbx = X << 4; + int cbz = Z << 4; + + int xb = (cbx) - bx; + int zb = (cbz) - bz; + for (int x = minX; x <= maxX; x++) { + int xx = cbx + x; + for (int z = minZ; z <= maxZ; z++) { + int zz = cbz + z; + for (int y = 0; y < 256; y++) { + Block block = world.getBlockAt(xx, y, zz); + int xr = xb + x; + int zr = zb + z; + newblocks[y][xr][zr] = (short) block.getTypeId(); + } + } + } + world.unloadChunkRequest(X, Z, true); + } + }, new Runnable() { + @Override + public void run() { + TaskManager.runTaskAsync(run); + } + }, 5); } - }, 1); - TaskManager.tasks.put(currentIndex, task); + }); } @Override diff --git a/src/main/java/com/plotsquared/sponge/SpongeMain.java b/src/main/java/com/plotsquared/sponge/SpongeMain.java index c337f00bf..ac78bb838 100644 --- a/src/main/java/com/plotsquared/sponge/SpongeMain.java +++ b/src/main/java/com/plotsquared/sponge/SpongeMain.java @@ -229,7 +229,7 @@ public class SpongeMain implements IPlotMain, PluginContainer { server = game.getServer(); // - PS.instance = new PS(this); + PS.instance = new PS(this, "Sponge"); // TODO Until P^2 has json chat stuff for sponge, disable this Settings.FANCY_CHAT = false; diff --git a/src/main/java/com/plotsquared/sponge/object/SpongePlayer.java b/src/main/java/com/plotsquared/sponge/object/SpongePlayer.java index f061d9d90..74318f339 100644 --- a/src/main/java/com/plotsquared/sponge/object/SpongePlayer.java +++ b/src/main/java/com/plotsquared/sponge/object/SpongePlayer.java @@ -2,13 +2,8 @@ package com.plotsquared.sponge.object; import java.util.Date; import java.util.HashSet; -import java.util.Set; import java.util.UUID; -import org.spongepowered.api.data.key.Keys; -import org.spongepowered.api.data.manipulator.mutable.TargetedLocationData; -import org.spongepowered.api.data.manipulator.mutable.entity.GameModeData; -import org.spongepowered.api.data.value.mutable.Value; import org.spongepowered.api.entity.player.Player; import org.spongepowered.api.entity.player.gamemode.GameMode; import org.spongepowered.api.entity.player.gamemode.GameModes; @@ -96,7 +91,11 @@ public class SpongePlayer extends PlotPlayer { this.hasPerm.add(perm); return true; } - return this.player.hasPermission(perm); + boolean value = this.player.hasPermission(perm); + + // TODO check children + + return value; } @Override diff --git a/target/PlotSquared-Bukkit.jar b/target/PlotSquared-Bukkit.jar new file mode 100644 index 000000000..054439eb9 Binary files /dev/null and b/target/PlotSquared-Bukkit.jar differ diff --git a/target/PlotSquared-Sponge.jar b/target/PlotSquared-Sponge.jar new file mode 100644 index 000000000..67ab0fbe8 Binary files /dev/null and b/target/PlotSquared-Sponge.jar differ