diff --git a/PlotSquared/pom.xml b/PlotSquared/pom.xml index fcf4b9978..feb9f887b 100644 --- a/PlotSquared/pom.xml +++ b/PlotSquared/pom.xml @@ -8,7 +8,7 @@ UTF-8 PlotSquared - 2.11.25 + 2.11.27 PlotSquared jar diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java index 93bc05698..cde1ac371 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/BukkitMain.java @@ -112,6 +112,7 @@ import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.ConsoleColors; import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EventUtil; +import com.intellectualcrafters.plot.util.InventoryUtil; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.PlayerManager; import com.intellectualcrafters.plot.util.SetupUtils; @@ -119,6 +120,7 @@ import com.intellectualcrafters.plot.util.TaskManager; import com.intellectualcrafters.plot.util.bukkit.BukkitChunkManager; import com.intellectualcrafters.plot.util.bukkit.BukkitEconHandler; import com.intellectualcrafters.plot.util.bukkit.BukkitEventUtil; +import com.intellectualcrafters.plot.util.bukkit.BukkitInventoryUtil; import com.intellectualcrafters.plot.util.bukkit.BukkitPlayerManager; import com.intellectualcrafters.plot.util.bukkit.BukkitSetBlockManager; import com.intellectualcrafters.plot.util.bukkit.BukkitSetupUtils; @@ -579,4 +581,9 @@ public class BukkitMain extends JavaPlugin implements Listener, IPlotMain { public PlayerManager initPlayerManager() { return new BukkitPlayerManager(); } + + @Override + public InventoryUtil initInventoryUtil() { + return new BukkitInventoryUtil(); + } } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/IPlotMain.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/IPlotMain.java index 5938f0041..4ea64b9d3 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/IPlotMain.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/IPlotMain.java @@ -13,6 +13,7 @@ import com.intellectualcrafters.plot.util.BlockManager; import com.intellectualcrafters.plot.util.ChunkManager; import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EventUtil; +import com.intellectualcrafters.plot.util.InventoryUtil; import com.intellectualcrafters.plot.util.PlayerManager; import com.intellectualcrafters.plot.util.SetupUtils; import com.intellectualcrafters.plot.util.TaskManager; @@ -60,6 +61,8 @@ public interface IPlotMain { public HybridUtils initHybridUtils(); public UUIDWrapper initUUIDHandler(); + + public InventoryUtil initInventoryUtil(); public boolean initPlotMeConverter(); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java index fa04ac76d..5a6d32a36 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/PlotSquared.java @@ -62,6 +62,7 @@ import com.intellectualcrafters.plot.util.ClusterManager; import com.intellectualcrafters.plot.util.EconHandler; import com.intellectualcrafters.plot.util.EventUtil; import com.intellectualcrafters.plot.util.ExpireManager; +import com.intellectualcrafters.plot.util.InventoryUtil; import com.intellectualcrafters.plot.util.Logger; import com.intellectualcrafters.plot.util.Logger.LogLevel; import com.intellectualcrafters.plot.util.MainUtil; @@ -555,6 +556,8 @@ public class PlotSquared { EventUtil.manager = IMP.initEventUtil(); // create Hybrid utility class HybridUtils.manager = IMP.initHybridUtils(); + // Inventory utility class + InventoryUtil.manager = IMP.initInventoryUtil(); // create setup util class SetupUtils.manager = IMP.initSetupUtils(); // Set block @@ -720,6 +723,7 @@ public class PlotSquared { FlagManager.addFlag(new AbstractFlag(flag, new FlagValue.UnsignedIntegerValue())); } FlagManager.addFlag(new AbstractFlag("modified-blocks", new FlagValue.IntegerValue()), true); + FlagManager.addFlag(new AbstractFlag("analysis", new FlagValue.DoubleListValue()), true); FlagManager.addFlag(new AbstractFlag("disable-physics", new FlagValue.BooleanValue())); FlagManager.addFlag(new AbstractFlag("fly", new FlagValue.BooleanValue())); FlagManager.addFlag(new AbstractFlag("explosion", new FlagValue.BooleanValue())); @@ -925,6 +929,10 @@ public class PlotSquared { Settings.PERMISSION_CACHING = config.getBoolean("cache.permissions"); Settings.CACHE_RATINGS = config.getBoolean("cache.ratings"); + // Rating system + Settings.RATING_CATEGORIES = config.getStringList("ratings.categories"); + + // Titles Settings.TITLES = config.getBoolean("titles"); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java index 1b8e7d77d..71dfe6766 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/DebugExec.java @@ -35,7 +35,10 @@ import org.bukkit.Bukkit; import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.config.C; +import com.intellectualcrafters.plot.flag.Flag; import com.intellectualcrafters.plot.flag.FlagManager; +import com.intellectualcrafters.plot.flag.FlagValue; +import com.intellectualcrafters.plot.flag.FlagValue.IntegerListValue; import com.intellectualcrafters.plot.generator.BukkitHybridUtils; import com.intellectualcrafters.plot.generator.HybridUtils; import com.intellectualcrafters.plot.object.ChunkLoc; @@ -62,23 +65,20 @@ public class DebugExec extends SubCommand { final String arg = args[0].toLowerCase(); switch (arg) { case "analyze": { - Plot plot = MainUtil.getPlot(player.getLocation()); + final Plot plot = MainUtil.getPlot(player.getLocation()); HybridUtils.manager.analyzePlot(plot, new RunnableVal() { @Override public void run() { - System.out.print("changes_sd: " + this.value.changes_sd); - System.out.print("changes_total: " + this.value.changes_total); - System.out.print("data_sd: " + this.value.data_sd); - System.out.print("data_total: " + this.value.data_total); - System.out.print("height_sd: " + this.value.height_sd); - System.out.print("height_total: " + this.value.height_total); - System.out.print("rotations_sd: " + this.value.rotations_sd); - System.out.print("rotations_total: " + this.value.rotations_total); - System.out.print("uniformity_sd: " + this.value.uniformity_sd); - System.out.print("variety_sd: " + this.value.variety_sd); - System.out.print("variety_total: " + this.value.variety_total); - System.out.print("verticies_sd: " + this.value.verticies_sd); - System.out.print("verticies_total: " + this.value.verticies_total); + List result = new ArrayList<>(); + result.add((double) (Math.round(value.air * 100) / 100d)); + result.add((double) (Math.round(value.changes * 100) / 100d)); + result.add((double) (Math.round(value.complexity * 100) / 100d)); + result.add((double) (Math.round(value.data * 100) / 100d)); + result.add((double) (Math.round(value.faces * 100) / 100d)); + result.add((double) (Math.round(value.air * 100) / 100d)); + result.add((double) (Math.round(value.variety * 100) / 100d)); + Flag flag = new Flag(FlagManager.getFlag("analysis"), result); + FlagManager.addPlotFlag(plot, flag); } }); return true; diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Info.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Info.java index 4cd2bb4d0..b0288d3bd 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Info.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Info.java @@ -30,6 +30,7 @@ import org.apache.commons.lang.StringUtils; import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.config.C; +import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.database.DBFunc; import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.object.InfoInventory; @@ -55,6 +56,7 @@ public class Info extends SubCommand { @Override public boolean execute(final PlotPlayer player, String... args) { String arg = null; + Plot plot; if (args.length > 0) arg = args[0] + ""; if (arg != null) { switch (arg) { @@ -69,10 +71,27 @@ public class Info extends SubCommand { case "members": case "owner": case "rating": - arg = null; + plot = MainUtil.getPlotFromString(player, null, player == null); + break; + default: + System.out.print("CHECKING: " + arg); + plot = MainUtil.getPlotFromString(player, arg, player == null); + System.out.print(plot); + if (args.length == 2) { + arg = args[1]; + } + else { + arg = null; + } + break; } } - Plot plot = MainUtil.getPlotFromString(player, arg, player == null); + else { + plot = MainUtil.getPlotFromString(player, null, player == null); + } + if (plot == null && arg != null) { + plot = MainUtil.getPlotFromString(player, null, player == null); + } if (plot == null) { if (player == null) { return false; @@ -113,14 +132,17 @@ public class Info extends SubCommand { owner = getPlayerList(plot.getOwners()); } String info = C.PLOT_INFO.s(); - if (args.length == 1) { - info = getCaption(args[0].toLowerCase()); + if (arg != null) { + info = getCaption(arg); if (info == null) { MainUtil.sendMessage(player, "&6Categories&7: &amembers&7, &aalias&7, &abiome&7, &adenied&7, &aflags&7, &aid&7, &asize&7, &atrusted&7, &aowner&7, &arating"); return false; } + formatAndSend(info, plot.world, plot, player, true); + } + else { + formatAndSend(info, plot.world, plot, player, false); } - formatAndSend(info, plot.world, plot, player); return true; } @@ -151,7 +173,7 @@ public class Info extends SubCommand { } } - private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player) { + private void formatAndSend(String info, final String world, final Plot plot, final PlotPlayer player, final boolean full) { final PlotId id = plot.id; final PlotId id2 = MainUtil.getTopPlot(plot).id; final int num = MainUtil.getPlotSelectionIds(id, id2).size(); @@ -191,7 +213,24 @@ public class Info extends SubCommand { TaskManager.runTaskAsync(new Runnable() { @Override public void run() { - String info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot))); + int max = 10; + if (Settings.RATING_CATEGORIES != null && Settings.RATING_CATEGORIES.size() > 0) { + max = 8; + } + String info; + if (full && Settings.RATING_CATEGORIES != null && Settings.RATING_CATEGORIES.size() > 1) { + String rating = ""; + String prefix = ""; + double[] ratings = MainUtil.getAverageRatings(plot); + for (int i = 0; i < ratings.length; i++) { + rating += prefix + Settings.RATING_CATEGORIES.get(i) + "=" + String.format("%.1f", ratings[i]); + prefix = ","; + } + info = newInfo.replaceAll("%rating%", rating); + } + else { + info = newInfo.replaceAll("%rating%", String.format("%.1f", MainUtil.getAverageRating(plot)) + "/" + max); + } MainUtil.sendMessage(player, C.PLOT_INFO_HEADER); MainUtil.sendMessage(player, info, false); } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/MusicSubcommand.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/MusicSubcommand.java index 665574b2e..ef012b036 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/MusicSubcommand.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/MusicSubcommand.java @@ -20,19 +20,17 @@ //////////////////////////////////////////////////////////////////////////////////////////////////// package com.intellectualcrafters.plot.commands; -import java.util.Arrays; - -import org.bukkit.Bukkit; -import org.bukkit.ChatColor; -import org.bukkit.inventory.ItemStack; -import org.bukkit.inventory.meta.ItemMeta; - import com.intellectualcrafters.plot.config.C; -import com.intellectualcrafters.plot.listeners.PlotPlusListener; -import com.intellectualcrafters.plot.object.BukkitPlayer; +import com.intellectualcrafters.plot.flag.Flag; +import com.intellectualcrafters.plot.flag.FlagManager; +import com.intellectualcrafters.plot.listeners.PlotListener; import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Plot; +import com.intellectualcrafters.plot.object.PlotBlock; +import com.intellectualcrafters.plot.object.PlotInventory; +import com.intellectualcrafters.plot.object.PlotItemStack; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.util.BlockManager; import com.intellectualcrafters.plot.util.MainUtil; public class MusicSubcommand extends SubCommand { @@ -51,17 +49,24 @@ public class MusicSubcommand extends SubCommand { sendMessage(player, C.NO_PLOT_PERMS); return true; } - final org.bukkit.inventory.Inventory inventory = Bukkit.createInventory(null, 9, ChatColor.RED + "Plot Jukebox"); - for (final PlotPlusListener.RecordMeta meta : PlotPlusListener.RecordMeta.metaList) { - final ItemStack stack = new ItemStack(meta.getMaterial()); - final ItemMeta itemMeta = stack.getItemMeta(); - itemMeta.setDisplayName(ChatColor.GOLD + meta.toString()); - itemMeta.setLore(Arrays.asList(ChatColor.GRAY + "Click to play the record")); - stack.setItemMeta(itemMeta); - inventory.addItem(stack); + PlotInventory inv = new PlotInventory(player, 2, "Plot Jukebox") { + public boolean onClick(int index) { + PlotItemStack item = getItem(index); + FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("music"), item.id)); + PlotListener.manager.plotEntry(player, plot); + close(); + return false; + } + }; + int index = 0; + for (int i = 2256; i < 2268; i++) { + String name = "&r&6" + BlockManager.manager.getClosestMatchingName(new PlotBlock((short) i, (byte) 0)); + String[] lore = {"&r&aClick to play!"}; + PlotItemStack item = new PlotItemStack(i, (byte) 0, 1, name, lore); + inv.setItem(index, item); + index++; } - // FIXME unchecked casting - ((BukkitPlayer) player).player.openInventory(inventory); + inv.openInventory(); return true; } } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Rate.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Rate.java index 192eaf4c5..c4f3418c5 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Rate.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/Rate.java @@ -29,13 +29,22 @@ import java.util.Set; import java.util.UUID; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.mutable.MutableInt; import com.intellectualcrafters.plot.PlotSquared; import com.intellectualcrafters.plot.config.C; +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.listeners.PlotListener; import com.intellectualcrafters.plot.object.Location; import com.intellectualcrafters.plot.object.Plot; +import com.intellectualcrafters.plot.object.PlotBlock; +import com.intellectualcrafters.plot.object.PlotInventory; +import com.intellectualcrafters.plot.object.PlotItemStack; import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.util.BlockManager; import com.intellectualcrafters.plot.util.MainUtil; import com.intellectualcrafters.plot.util.TaskManager; @@ -49,81 +58,138 @@ public class Rate extends SubCommand { } @Override - public boolean execute(final PlotPlayer plr, final String... args) { - if (args.length < 1) { - sendMessage(plr, C.RATING_NOT_VALID); - return true; + public boolean execute(final PlotPlayer player, final String... args) { + if (args.length == 1) { + if (args[0].equalsIgnoreCase("next")) { + ArrayList plots = new ArrayList<>(PlotSquared.getPlots()); + Collections.sort(plots, new Comparator() { + @Override + public int compare(Plot p1, Plot p2) { + int v1 = 0; + int v2 = 0; + if (p1.settings.ratings != null) { + for (Entry entry : p1.settings.ratings.entrySet()) { + v1 -= 11 - entry.getValue(); + } + } + if (p2.settings.ratings != null) { + for (Entry entry : p2.settings.ratings.entrySet()) { + v2 -= 11 - entry.getValue(); + } + } + return v2 - v1; + } + }); + UUID uuid = player.getUUID(); + for (Plot p : plots) { + if (p.settings.ratings == null || !p.settings.ratings.containsKey(uuid)) { + MainUtil.teleportPlayer(player, player.getLocation(), p); + MainUtil.sendMessage(player, C.RATE_THIS); + return true; + } + } + MainUtil.sendMessage(player, C.FOUND_NO_PLOTS); + return false; + } } - final Location loc = plr.getLocation(); + final Location loc = player.getLocation(); final Plot plot = MainUtil.getPlot(loc); if (plot == null) { - return !sendMessage(plr, C.NOT_IN_PLOT); + return !sendMessage(player, C.NOT_IN_PLOT); } if (!plot.hasOwner()) { - sendMessage(plr, C.RATING_NOT_OWNED); + sendMessage(player, C.RATING_NOT_OWNED); return true; } - if (plot.isOwner(plr.getUUID())) { - sendMessage(plr, C.RATING_NOT_YOUR_OWN); + if (plot.isOwner(player.getUUID())) { + sendMessage(player, C.RATING_NOT_YOUR_OWN); + return true; + } + if (Settings.RATING_CATEGORIES != null && Settings.RATING_CATEGORIES.size() != 0) { + final Runnable run = new Runnable() { + @Override + public void run() { + if (plot.settings.ratings.containsKey(player.getUUID())) { + sendMessage(player, C.RATING_ALREADY_EXISTS, plot.getId().toString()); + return; + } + final MutableInt index = new MutableInt(0); + final MutableInt rating = new MutableInt(0); + String title = Settings.RATING_CATEGORIES.get(0); + PlotInventory inventory = new PlotInventory(player, 1, title) { + public boolean onClick(int i) { + rating.add((i + 1) * Math.pow(10, index.intValue())); + index.increment(); + if (index.intValue() >= Settings.RATING_CATEGORIES.size()) { + close(); + // set rating! + plot.settings.ratings.put(player.getUUID(), rating.intValue()); + DBFunc.setRating(plot, player.getUUID(), rating.intValue()); + sendMessage(player, C.RATING_APPLIED, plot.getId().toString()); + sendMessage(player, C.RATING_APPLIED, plot.getId().toString()); + return false; + } + setTitle(Settings.RATING_CATEGORIES.get(index.intValue())); + return false; + } + }; + inventory.setItem(0, new PlotItemStack(35, (short) 12, 0, "0/8", null)); + inventory.setItem(1, new PlotItemStack(35, (short) 14, 1, "1/8", null)); + inventory.setItem(2, new PlotItemStack(35, (short) 1, 2, "2/8", null)); + inventory.setItem(3, new PlotItemStack(35, (short) 4, 3, "3/8", null)); + inventory.setItem(4, new PlotItemStack(35, (short) 5, 4, "4/8", null)); + inventory.setItem(5, new PlotItemStack(35, (short) 9, 5, "5/8", null)); + inventory.setItem(6, new PlotItemStack(35, (short) 11, 6, "6/8", null)); + inventory.setItem(7, new PlotItemStack(35, (short) 10, 7, "7/8", null)); + inventory.setItem(8, new PlotItemStack(35, (short) 2, 8, "8/8", null)); + inventory.openInventory(); + } + }; + if (plot.settings.ratings == null) { + TaskManager.runTaskAsync(new Runnable() { + @Override + public void run() { + plot.settings.ratings = DBFunc.getRatings(plot); + run.run(); + } + }); + return true; + } + run.run(); + return true; + } + if (args.length < 1) { + sendMessage(player, C.RATING_NOT_VALID); return true; } final String arg = args[0]; if (arg.equalsIgnoreCase("next")) { - ArrayList plots = new ArrayList<>(PlotSquared.getPlots()); - Collections.sort(plots, new Comparator() { - @Override - public int compare(Plot p1, Plot p2) { - int v1 = 0; - int v2 = 0; - if (p1.settings.ratings != null) { - for (Entry entry : p1.settings.ratings.entrySet()) { - v1 -= 11 - entry.getValue(); - } - } - if (p2.settings.ratings != null) { - for (Entry entry : p2.settings.ratings.entrySet()) { - v2 -= 11 - entry.getValue(); - } - } - return v2 - v1; - } - }); - UUID uuid = plr.getUUID(); - for (Plot p : plots) { - if (plot.settings.ratings == null || !plot.settings.ratings.containsKey(uuid)) { - MainUtil.teleportPlayer(plr, plr.getLocation(), p); - MainUtil.sendMessage(plr, C.RATE_THIS); - return true; - } - } - MainUtil.sendMessage(plr, C.FOUND_NO_PLOTS); - return false; + } - final int rating; if (StringUtils.isNumeric(arg) && arg.length() < 3 && arg.length() > 0) { rating = Integer.parseInt(arg); if (rating > 10) { - sendMessage(plr, C.RATING_NOT_VALID); + sendMessage(player, C.RATING_NOT_VALID); return false; } } else { - sendMessage(plr, C.RATING_NOT_VALID); + sendMessage(player, C.RATING_NOT_VALID); return false; } - final UUID uuid = plr.getUUID(); + final UUID uuid = player.getUUID(); final Runnable run = new Runnable() { @Override public void run() { if (plot.settings.ratings.containsKey(uuid)) { - sendMessage(plr, C.RATING_ALREADY_EXISTS, plot.getId().toString()); + sendMessage(player, C.RATING_ALREADY_EXISTS, plot.getId().toString()); return; } plot.settings.ratings.put(uuid, rating); DBFunc.setRating(plot, uuid, rating); - sendMessage(plr, C.RATING_APPLIED, plot.getId().toString()); + sendMessage(player, C.RATING_APPLIED, plot.getId().toString()); } }; if (plot.settings.ratings == null) { diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/SchematicCmd.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/SchematicCmd.java index 8babfbdfa..e258227c1 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/SchematicCmd.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/commands/SchematicCmd.java @@ -77,7 +77,7 @@ public class SchematicCmd extends SubCommand { final Plot plot = MainUtil.getPlot(loc); if (plot == null) { sendMessage(plr, C.NOT_IN_PLOT); - break; + return false; } if (this.running) { MainUtil.sendMessage(plr, "&cTask is already running."); @@ -168,18 +168,22 @@ public class SchematicCmd extends SubCommand { } if (args.length < 2) { sendMessage(plr, C.SCHEMATIC_MISSING_ARG); - break; + return false; + } + final Location loc = plr.getLocation(); + final Plot plot = MainUtil.getPlot(loc); + if (plot == null) { + sendMessage(plr, C.NOT_IN_PLOT); + return false; } file = args[1]; schematic = SchematicHandler.manager.getSchematic(file); if (schematic == null) { sendMessage(plr, C.SCHEMATIC_INVALID, "non-existent"); - break; + return false; } - final Location loc = plr.getLocation(); final int l1 = schematic.getSchematicDimension().getX(); final int l2 = schematic.getSchematicDimension().getZ(); - final Plot plot = MainUtil.getPlot(loc); final int length = MainUtil.getPlotWidth(loc.getWorld(), plot.id); if ((l1 < length) || (l2 < length)) { sendMessage(plr, C.SCHEMATIC_INVALID, String.format("Wrong size (x: %s, z: %d) vs %d ", l1, l2, length)); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/C.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/C.java index 4a672e7c9..cba885309 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/C.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/C.java @@ -350,7 +350,7 @@ public enum C { PLOT_UNOWNED("$2The current plot must have an owner to perform this action", "Info"), PLOT_INFO_UNCLAIMED("$2Plot $1%s$2 is not yet claimed", "Info"), PLOT_INFO_HEADER("$3====== $1INFO $3======", false, "Info"), - PLOT_INFO("$1ID: $2%id%$1\n" + "$1Alias: $2%alias%$1\n" + "$1Owner: $2%owner%$1\n" + "$1Biome: $2%biome%$1\n" + "$1Can Build: $2%build%$1\n" + "$1Rating: $2%rating%$1/$210$1\n" + "$1Trusted: $2%trusted%$1\n" + "$1Members: $2%members%$1\n" + "$1Denied: $2%denied%$1\n" + "$1Flags: $2%flags%", "Info"), + PLOT_INFO("$1ID: $2%id%$1\n" + "$1Alias: $2%alias%$1\n" + "$1Owner: $2%owner%$1\n" + "$1Biome: $2%biome%$1\n" + "$1Can Build: $2%build%$1\n" + "$1Rating: $2%rating%\n" + "$1Trusted: $2%trusted%$1\n" + "$1Members: $2%members%$1\n" + "$1Denied: $2%denied%$1\n" + "$1Flags: $2%flags%", "Info"), PLOT_INFO_TRUSTED("$1Trusted:$2 %trusted%", "Info"), PLOT_INFO_MEMBERS("$1Members:$2 %members%", "Info"), PLOT_INFO_DENIED("$1Denied:$2 %denied%", "Info"), diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java index d1c19b2e0..135a10c42 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/config/Settings.java @@ -38,6 +38,10 @@ public class Settings { public static boolean PERMISSION_CACHING = false; public static boolean CACHE_RATINGS = true; public static boolean UUID_FROM_DISK = false; + /** + * Ratings + */ + public static List RATING_CATEGORIES = null; /** * PlotMe settings */ diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/flag/FlagValue.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/flag/FlagValue.java index 92ac85edf..a851fdfd3 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/flag/FlagValue.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/flag/FlagValue.java @@ -1,6 +1,9 @@ package com.intellectualcrafters.plot.flag; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashSet; +import java.util.List; import org.apache.commons.lang.StringUtils; @@ -349,6 +352,100 @@ public abstract class FlagValue { } } } + + public static class IntegerListValue extends FlagValue> implements ListValue { + @SuppressWarnings("unchecked") + @Override + public String toString(final Object t) { + return StringUtils.join((List) t, ","); + } + + @SuppressWarnings("unchecked") + @Override + public List getValue(final Object t) { + return (List) t; + } + + @Override + public List parse(final String t) { + String[] split = (t.split(",")); + ArrayList numbers = new ArrayList(); + for (String element : split) { + numbers.add(Integer.parseInt(element)); + } + return numbers; + } + + @Override + public String getDescription() { + return "Flag value must be a integer list"; + } + + @Override + public void add(final Object t, final String value) { + try { + ((List) t).addAll(parse(value)); + } catch (final Exception e) { + } + } + + @Override + public void remove(final Object t, final String value) { + try { + for (final Integer item : parse(value)) { + ((List) t).remove(item); + } + } catch (final Exception e) { + } + } + } + + public static class DoubleListValue extends FlagValue> implements ListValue { + @SuppressWarnings("unchecked") + @Override + public String toString(final Object t) { + return StringUtils.join((List) t, ","); + } + + @SuppressWarnings("unchecked") + @Override + public List getValue(final Object t) { + return (List) t; + } + + @Override + public List parse(final String t) { + String[] split = (t.split(",")); + ArrayList numbers = new ArrayList(); + for (String element : split) { + numbers.add(Double.parseDouble(element)); + } + return numbers; + } + + @Override + public String getDescription() { + return "Flag value must be a integer list"; + } + + @Override + public void add(final Object t, final String value) { + try { + ((List) t).addAll(parse(value)); + } catch (final Exception e) { + } + } + + @Override + public void remove(final Object t, final String value) { + try { + for (final Double item : parse(value)) { + ((List) t).remove(item); + } + } catch (final Exception e) { + } + } + } public static class StringValue extends FlagValue { @Override diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java index 6636b78c3..e62ca9018 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/generator/BukkitHybridUtils.java @@ -10,6 +10,7 @@ import java.util.Random; import org.apache.commons.lang.mutable.MutableInt; import org.bukkit.Bukkit; import org.bukkit.Chunk; +import org.bukkit.Material; import org.bukkit.World; import org.bukkit.block.Biome; import org.bukkit.block.Block; @@ -54,8 +55,7 @@ public class BukkitHybridUtils extends HybridUtils { return count / array.length; } - public double getSD(double[] array) { - double av = getMean(array); + public double getSD(double[] array, double av) { double sd = 0; for (int i=0; i> 4; - final int bz = bot.getZ() >> 4; - final int tx = top.getX() >> 4; - final int tz = top.getZ() >> 4; + 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(); AugmentedPopulator.initCache(); - final PlotAnalysis analysis = new PlotAnalysis(); + final int width = tx - bx + 1; + final int length = tz - bz + 1; - int num_chunks = (tx - bx + 1) * (tz - bz + 1); - - short[][][] oldblocks = new short[256][top.getX() - bot.getX() + 1][top.getZ() - bot.getZ() + 1]; - short[][][] newblocks = new short[256][top.getX() - bot.getX() + 1][top.getZ() - bot.getZ() + 1]; + 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 = bx; X <= tx; X++) { - for (int Z = bz; Z <= tz; Z++) { + for (int X = cbx; X <= ctx; X++) { + for (int Z = cbz; Z <= ctz; Z++) { Chunk chunk = world.getChunkAt(X, Z); chunks.add(chunk); } } - final double[] changes_sd = new double[num_chunks]; - final double[] rotations_sd = new double[num_chunks]; - final double[] data_sd = new double[num_chunks]; - final double[] variety_sd = new double[num_chunks]; - final double[] uniformity_sd = new double[num_chunks]; - final double[] verticies_sd = new double[num_chunks]; - final double[] height_sd = new double[num_chunks]; + final Runnable run = new Runnable() { + @Override + public void run() { + int t = 0; + for (Chunk chunk : processed_chunks) { + short[][] result = gen.generateExtBlockSections(world, r, chunk.getX(), chunk.getZ(), base); + int X = chunk.getX(); + int Z = chunk.getZ(); + int xb = ((X - cbx) << 4) - bx; + int zb = ((Z - cbz) << 4) - bz; + for (int i = 0; i < result.length; i++) { + if (result[i] == null) { + for (int j = 0; j < 4096; j++) { + int x = AugmentedPopulator.x_loc[i][j] + xb; + if (x < 0 || x >= width) continue; + int z = AugmentedPopulator.z_loc[i][j] + zb; + if (z < 0 || z >= length) continue; + int y = AugmentedPopulator.y_loc[i][j]; + oldblocks[y][x][z] = 0; + } + continue; + } + for (int j = 0; j < result[i].length; j++) { + int x = AugmentedPopulator.x_loc[i][j] + xb; + if (x < 0 || x >= width) continue; + int z = AugmentedPopulator.z_loc[i][j] + zb; + if (z < 0 || z >= length) continue; + int y = AugmentedPopulator.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) { + t++; + 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 (oldblocks[y - 1][x][z] == 0) faces[i]++; + if (oldblocks[y][x - 1][z] == 0) faces[i]++; + if (oldblocks[y][x][z - 1] == 0) faces[i]++; + if (oldblocks[y + 1][x][z] == 0) faces[i]++; + if (oldblocks[y][x + 1][z] == 0) faces[i]++; + if (oldblocks[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 = getMean(changes); + analysis.faces = getMean(faces); + analysis.data = getMean(data); + analysis.air = getMean(air); + analysis.variety = getMean(variety); + analysis.complexity = getSD(changes, analysis.changes) + getSD(faces, analysis.faces) + getSD(data, analysis.data) + getSD(air, analysis.air) + getSD(variety, analysis.variety); + whenDone.value = analysis; + whenDone.run(); + } + }; - final HashSet variety = new HashSet<>(); + System.gc(); + AugmentedPopulator.initCache(); TaskManager.index.increment(); final Integer currentIndex = TaskManager.index.toInteger(); @@ -146,117 +240,41 @@ public class BukkitHybridUtils extends HybridUtils { public void run() { int index = chunks.size() - 1; if (index == -1) { - TaskManager.runTaskAsync(new Runnable() { - @Override - public void run() { - PlotSquared.TASK.cancelTask(TaskManager.tasks.get(currentIndex)); - analysis.variety_total = variety.size(); - analysis.changes_sd = getSD(changes_sd); - analysis.rotations_sd = getSD(rotations_sd); - analysis.data_sd = getSD(data_sd); - analysis.uniformity_sd = getSD(uniformity_sd); - analysis.variety_sd = getSD(variety_sd); - analysis.verticies_sd = getSD(verticies_sd); - analysis.height_sd = getSD(height_sd); - whenDone.value = analysis; - whenDone.run(); - } - }); + PlotSquared.TASK.cancelTask(TaskManager.tasks.get(currentIndex)); + TaskManager.runTaskAsync(run); return; } Chunk chunk = chunks.remove(0); + processed_chunks.add(chunk); int X = chunk.getX(); int Z = chunk.getZ(); - short[][] result = gen.generateExtBlockSections(world, r, chunk.getX(), chunk.getZ(), base); short[][] current = new short[16][]; int minX; int minZ; int maxX; int maxZ; - if (X == bx) minX = mod(bot.getX()); + if (X == cbx) minX = mod(bx); else minX = 0; - if (Z == bz) minZ = mod(bot.getZ()); + if (Z == cbz) minZ = mod(bz); else minZ = 0; - if (X == tx) maxX = mod(top.getX()); + if (X == ctx) maxX = mod(tx); else maxX = 16; - if (Z == tz) maxZ = mod(top.getZ()); + if (Z == ctz) maxZ = mod(tz); else maxZ = 16; - long changes = 0; - long rotations = 0; - long materialdata = 0; - int[] height = new int[256]; - int collumn_index = 0; - for (int x = minX; x < maxX; x++) { - for (int z = minZ; z < maxZ; z++) { - int max = 0; + int xb = ((X - cbx) << 4) - bx; + int zb = ((Z - cbz) << 4) - bz; + + for (int x = minX; x <= maxX; x++) { + for (int z = minZ; z <= maxZ; z++) { for (int y = 0; y < 256; y++) { Block block = chunk.getBlock(x, y, z); - int i = y >> 4; - int j = ((y & 0xF) << 8) | (z << 4) | x; - short id = (short) block.getTypeId(); - if (id != 0) { - if (y > max) { - max = y; - } - BlockState state = block.getState(); - MaterialData data = state.getData(); - if (data instanceof Directional) { - rotations++; - } - else if (!data.getClass().equals(MaterialData.class)) { - materialdata++; - } - else { - variety.add(id); - } - } - if (current[i] == null) { - current[i] = new short[4096]; - } - current[i][j] = id; - if (result[i] == null && id != 0 || result[i] != null && result[i][j] != id) { - changes++; - } + int xx = xb + x; + int zz = zb + z; + newblocks[y][xx][zz] = (short) block.getTypeId(); } - height[collumn_index] = max; - collumn_index++; } } - long verticies = 0; - int[] uniformity = new int[254]; - for (int y = 1; y < 255; y++) { - HashSet blocks = new HashSet<>(); - for (int x = minX + 1; x < maxX - 1; x++) { - for (int z = minZ + 1; z < maxZ - 1; z++) { - short id = current[y >> 4][((y & 0xF) << 8) | (z << 4) | x]; - if (id == 0) continue; - blocks.add((int) id); - if (current[(y + 1) >> 4][(((y + 1) & 0xF) << 8) | (z << 4) | x] != 0) verticies--; - if (current[(y - 1) >> 4][(((y - 1) & 0xF) << 8) | (z << 4) | x] != 0) verticies--; - if (current[y >> 4][((y & 0xF) << 8) | ((z + 1) << 4) | x] != 0) verticies--; - if (current[y >> 4][((y & 0xF) << 8) | ((z - 1) << 4) | x] != 0) verticies--; - if (current[y >> 4][((y & 0xF) << 8) | (z << 4) | (x + 1)] != 0) verticies--; - if (current[y >> 4][((y & 0xF) << 8) | (z << 4) | (x - 1)] != 0) verticies--; - verticies += 6; - } - } - uniformity[y-1] = blocks.size(); - } - analysis.changes_total += changes; - analysis.rotations_total += rotations; - analysis.data_total += materialdata; - analysis.verticies_total += verticies; - double tmp = getSD(height); - analysis.height_total += tmp; - - changes_sd[index] = changes; - rotations_sd[index] = rotations; - data_sd[index] = materialdata; - uniformity_sd[index] = getSD(uniformity); - variety_sd[index] = variety.size(); - verticies_sd[index] = verticies; - height_sd[index] = tmp; }; }, 1); TaskManager.tasks.put(currentIndex, task); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlayerEvents.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlayerEvents.java index 36d75d120..d618381f1 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlayerEvents.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlayerEvents.java @@ -1,5 +1,6 @@ package com.intellectualcrafters.plot.listeners; +import java.util.Arrays; import java.util.Collection; import java.util.HashSet; import java.util.Iterator; @@ -7,6 +8,7 @@ import java.util.List; import java.util.Set; import java.util.UUID; +import org.apache.commons.lang.StringUtils; import org.bukkit.Bukkit; import org.bukkit.ChatColor; import org.bukkit.Chunk; @@ -22,6 +24,7 @@ import org.bukkit.entity.Creature; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; import org.bukkit.entity.FallingBlock; +import org.bukkit.entity.HumanEntity; import org.bukkit.entity.ItemFrame; import org.bukkit.entity.Monster; import org.bukkit.entity.Player; @@ -56,6 +59,7 @@ import org.bukkit.event.entity.ProjectileHitEvent; import org.bukkit.event.hanging.HangingBreakByEntityEvent; import org.bukkit.event.hanging.HangingPlaceEvent; import org.bukkit.event.inventory.InventoryClickEvent; +import org.bukkit.event.inventory.InventoryCloseEvent; import org.bukkit.event.player.AsyncPlayerChatEvent; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; @@ -72,6 +76,7 @@ import org.bukkit.event.vehicle.VehicleCreateEvent; import org.bukkit.event.vehicle.VehicleDestroyEvent; import org.bukkit.event.world.ChunkLoadEvent; import org.bukkit.event.world.StructureGrowEvent; +import org.bukkit.inventory.InventoryView; import org.bukkit.material.MaterialData; import org.bukkit.material.Tree; import org.bukkit.material.Wool; @@ -94,6 +99,7 @@ import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotBlock; import com.intellectualcrafters.plot.object.PlotHandler; import com.intellectualcrafters.plot.object.PlotId; +import com.intellectualcrafters.plot.object.PlotInventory; import com.intellectualcrafters.plot.object.PlotManager; import com.intellectualcrafters.plot.object.PlotPlayer; import com.intellectualcrafters.plot.object.PlotWorld; @@ -292,7 +298,7 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi if (split[0].equals("plotme") || split[0].equals("ap")) { final Player player = event.getPlayer(); if (Settings.USE_PLOTME_ALIAS) { - player.performCommand(message.replace("/plotme", "plots")); + player.performCommand("plots " + StringUtils.join(Arrays.copyOfRange(split, 1, split.length), " ")); } else { MainUtil.sendMessage(BukkitUtil.getPlayer(player), C.NOT_USING_PLOTME); } @@ -1158,12 +1164,31 @@ public class PlayerEvents extends com.intellectualcrafters.plot.listeners.PlotLi @EventHandler(priority = EventPriority.HIGHEST) public void onInventoryClick(final InventoryClickEvent event) { - if (event.getInventory().getName().equalsIgnoreCase("PlotSquared Commands")) { - event.setCancelled(true); + HumanEntity clicker = event.getWhoClicked(); + if (!(clicker instanceof Player) ) { return; } + Player player = (Player) clicker; + PlotPlayer pp = BukkitUtil.getPlayer(player); + PlotInventory inv = (PlotInventory) pp.getMeta("inventory"); + if (inv != null && event.getRawSlot() == event.getSlot()) { + if (!inv.onClick(event.getSlot())) { + event.setCancelled(true); + } + } } - + + @EventHandler(priority = EventPriority.HIGHEST) + public void onInventoryClose(final InventoryCloseEvent event) { + HumanEntity closer = event.getPlayer(); + if (!(closer instanceof Player)) { + return; + } + Player player = (Player) closer; + BukkitUtil.getPlayer(player).deleteMeta("inventory"); + } + + @EventHandler(priority= EventPriority.MONITOR) public void onLeave(final PlayerQuitEvent event) { PlotPlayer pp = BukkitUtil.getPlayer(event.getPlayer()); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlotPlusListener.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlotPlusListener.java index 4363dcaac..b30f24be1 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlotPlusListener.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/listeners/PlotPlusListener.java @@ -22,10 +22,8 @@ package com.intellectualcrafters.plot.listeners; import java.util.ArrayList; import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; -import java.util.Set; import java.util.UUID; import org.bukkit.Bukkit; @@ -40,18 +38,14 @@ import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.event.block.BlockDamageEvent; import org.bukkit.event.entity.EntityDamageEvent; -import org.bukkit.event.inventory.InventoryClickEvent; import org.bukkit.event.player.PlayerDropItemEvent; import org.bukkit.event.player.PlayerPickupItemEvent; import org.bukkit.event.player.PlayerQuitEvent; -import org.bukkit.inventory.Inventory; -import org.bukkit.inventory.ItemStack; import org.bukkit.plugin.java.JavaPlugin; import com.intellectualcrafters.plot.config.C; import com.intellectualcrafters.plot.events.PlayerEnterPlotEvent; import com.intellectualcrafters.plot.events.PlayerLeavePlotEvent; -import com.intellectualcrafters.plot.flag.Flag; import com.intellectualcrafters.plot.flag.FlagManager; import com.intellectualcrafters.plot.object.Plot; import com.intellectualcrafters.plot.object.PlotHandler; @@ -103,58 +97,6 @@ public class PlotPlusListener extends PlotListener implements Listener { }, 0l, 20l); } - @EventHandler - public void onInventoryClick(final InventoryClickEvent event) { - final Player player = (Player) event.getWhoClicked(); - Inventory inv = event.getInventory(); - if (inv == null) { - return; - } - if (!event.getInventory().getName().equals(ChatColor.RED + "Plot Jukebox")) { - return; - } - event.setCancelled(true); - final Plot plot = MainUtil.getPlot(BukkitUtil.getLocation(player)); - final PlotPlayer pp = BukkitUtil.getPlayer(player); - if (plot == null) { - MainUtil.sendMessage(pp, C.NOT_IN_PLOT); - return; - } - final UUID uuid = pp.getUUID(); - if (!plot.isAdded(uuid)) { - MainUtil.sendMessage(pp, C.NO_PLOT_PERMS); - return; - } - final Set plotPlayers = new HashSet<>(); - for (final Player p : player.getWorld().getPlayers()) { - final Plot newPlot = MainUtil.getPlot(BukkitUtil.getLocation(player)); - if (plot.equals(newPlot)) { - plotPlayers.add(p); - } - } - RecordMeta meta = null; - for (final RecordMeta m : RecordMeta.metaList) { - ItemStack item = event.getCurrentItem(); - if (item != null && m.getMaterial() == item.getType()) { - meta = m; - break; - } - } - if (meta == null) { - return; - } - if (meta != null) { - int id = meta.getMaterial().getId(); - FlagManager.addPlotFlag(plot, new Flag(FlagManager.getFlag("music"), id)); - player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); - for (final Player p : plotPlayers) { - player.playEffect(player.getLocation(), Effect.RECORD_PLAY, 0); - player.playEffect(player.getLocation(), Effect.RECORD_PLAY, id); - APlotListener.manager.plotEntry(BukkitUtil.getPlayer(p), plot); - } - } - } - @EventHandler(priority = EventPriority.HIGH) public void onInteract(final BlockDamageEvent event) { final Player player = event.getPlayer(); diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotAnalysis.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotAnalysis.java index 531cd6703..873f3daaf 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotAnalysis.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotAnalysis.java @@ -1,18 +1,10 @@ package com.intellectualcrafters.plot.object; public class PlotAnalysis { - public int changes_total; - public int rotations_total; - public int data_total; - public int variety_total; - public int verticies_total; - public double height_total; - - public double changes_sd; - public double rotations_sd; - public double data_sd; - public double variety_sd; - public double uniformity_sd; - public double verticies_sd; - public double height_sd; + public double changes; + public double faces; + public double data; + public double air; + public double variety; + public double complexity; } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java index a631e41e6..d180af79b 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotGenerator.java @@ -42,9 +42,29 @@ public abstract class PlotGenerator extends ChunkGenerator { public int X; public int Z; private PseudoRandom random = new PseudoRandom(); + public static short[][][] CACHE_I = null; + public static short[][][] CACHE_J = null; public PlotGenerator(String world) { WorldEvents.lastWorld = world; + initCache(); + } + + public void initCache() { + if (CACHE_I == null) { + CACHE_I = new short[256][16][16]; + CACHE_J = new short[256][16][16]; + for (int x = 0; x < 16; x++) { + for (int z = 0; z < 16; z++) { + for (int y = 0; y < 256; y++) { + short i = (short) (y >> 4); + short j = (short) (((y & 0xF) << 8) | (z << 4) | x); + CACHE_I[y][x][z] = i; + CACHE_J[y][x][z] = j; + } + } + } + } } @SuppressWarnings("unchecked") @@ -136,10 +156,10 @@ public abstract class PlotGenerator extends ChunkGenerator { } public void setBlock(final int x, final int y, final int z, final short blkid) { - if (result[y >> 4] == null) { - result[y >> 4] = new short[4096]; + if (result[CACHE_I[y][x][z]] == null) { + result[CACHE_I[y][x][z]] = new short[4096]; } - result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = blkid; + result[CACHE_I[y][x][z]][CACHE_J[y][x][z]] = blkid; } public void setBlock(final int x, final int y, final int z, final short[] blkid) { @@ -147,10 +167,10 @@ public abstract class PlotGenerator extends ChunkGenerator { setBlock(x, y, z, blkid[0]); } short id = blkid[random.random(blkid.length)]; - if (result[y >> 4] == null) { - result[y >> 4] = new short[4096]; + if (result[CACHE_I[y][x][z]] == null) { + result[CACHE_I[y][x][z]] = new short[4096]; } - result[y >> 4][((y & 0xF) << 8) | (z << 4) | x] = id; + result[CACHE_I[y][x][z]][CACHE_J[y][x][z]] = id; } /** diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotInventory.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotInventory.java new file mode 100644 index 000000000..73106dc4b --- /dev/null +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotInventory.java @@ -0,0 +1,81 @@ +package com.intellectualcrafters.plot.object; + +import com.intellectualcrafters.plot.util.InventoryUtil; + +public class PlotInventory { + + public final PlotPlayer player; + public final int size; + private String title; + private final PlotItemStack[] items; + + private boolean open = false; + + public PlotInventory(PlotPlayer player) { + this.size = 4; + this.title = null; + this.player = player; + items = InventoryUtil.manager.getItems(player); + } + + public PlotInventory(PlotPlayer player, int size, String name) { + this.size = size; + this.title = name == null ? "" : name; + this.player = player; + items = new PlotItemStack[size * 9]; + } + + public boolean onClick(int index) { + return true; + } + + public void openInventory() { + if (title == null) { + return; + } + open = true; + InventoryUtil.manager.open(this); + } + + public void close() { + if (title == null) { + return; + } + InventoryUtil.manager.close(this); + open = false; + } + + public void setItem(int index, PlotItemStack item) { + items[index] = item; + InventoryUtil.manager.setItem(this, index, item); + } + + public PlotItemStack getItem(int index) { + return items[index]; + } + + public void setTitle(String title) { + if (title == null) { + return; + } + boolean tmp = open; + close(); + this.title = title; + if (tmp) { + openInventory(); + } + } + + public PlotItemStack[] getItems() { + return items; + } + + public String getTitle() { + return this.title; + } + + public boolean isOpen() { + return open; + } + +} diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotItemStack.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotItemStack.java new file mode 100644 index 000000000..1f7d6cbde --- /dev/null +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/object/PlotItemStack.java @@ -0,0 +1,17 @@ +package com.intellectualcrafters.plot.object; + +public class PlotItemStack { + public final int id; + public final short data; + public final int amount; + public final String name; + public final String[] lore; + + public PlotItemStack(int id, short data, int amount, String name, String[] lore) { + this.id = id; + this.data = data; + this.amount = amount; + this.name = name; + this.lore = lore; + } +} diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/InventoryUtil.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/InventoryUtil.java new file mode 100644 index 000000000..093c5969e --- /dev/null +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/InventoryUtil.java @@ -0,0 +1,21 @@ +package com.intellectualcrafters.plot.util; + +import com.intellectualcrafters.plot.object.PlotInventory; +import com.intellectualcrafters.plot.object.PlotItemStack; +import com.intellectualcrafters.plot.object.PlotPlayer; + +/** + * This class is only used by internal functions, for most cases use the PlotInventory class + */ +public abstract class InventoryUtil { + + /** + * This class is only used by internal functions, for most cases use the PlotInventory class + */ + public static InventoryUtil manager = null; + public abstract void open(PlotInventory inv); + public abstract void close(PlotInventory inv); + public abstract void setItem(PlotInventory plotInventory, int index, PlotItemStack item); + public abstract PlotItemStack[] getItems(PlotPlayer player); + public abstract boolean isOpen(PlotInventory plotInventory); +} diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java index 676837b5f..8d9360ed5 100644 --- a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/MainUtil.java @@ -78,6 +78,7 @@ public class MainUtil { if (arg == null) { if (player == null) { if (message) MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD); + System.out.print(1); return null; } return getPlot(player.getLocation()); @@ -87,7 +88,10 @@ public class MainUtil { if (player != null) { worldname = player.getLocation().getWorld(); } + System.out.print(arg); String[] split = arg.split(";|,"); + System.out.print(split[0]); + System.out.print(split[1]); if (split.length == 3) { worldname = split[0]; id = PlotId.fromString(split[1] + ";" + split[2]); @@ -122,12 +126,15 @@ public class MainUtil { } if (worldname == null || !PlotSquared.isPlotWorld(worldname)) { if (message) MainUtil.sendMessage(player, C.NOT_VALID_PLOT_WORLD); + System.out.print("INVALID WORLD: "); return null; } if (id == null) { + System.out.print("INVALID ID: "); if (message) MainUtil.sendMessage(player, C.NOT_VALID_PLOT_ID); return null; } + System.out.print("VALID PLOT: "); return getPlot(worldname, id); } @@ -1566,9 +1573,55 @@ public class MainUtil { return 0; } double val = 0; + int size = 0; for (Entry entry : rating.entrySet()) { - val += entry.getValue(); + int current = entry.getValue(); + if (Settings.RATING_CATEGORIES == null || Settings.RATING_CATEGORIES.size() == 0) { + val += current; + size++; + } + else { + for (int i = 0 ; i < Settings.RATING_CATEGORIES.size(); i++) { + val += (current % 10) - 1; + current /= 10; + size++; + } + } } - return val / (double) rating.size(); + return val / (double) size; + } + + public static double[] getAverageRatings(Plot plot) { + HashMap rating; + if (plot.settings.ratings != null) { + rating = plot.settings.ratings; + } + else { + rating = DBFunc.getRatings(plot); + } + int size = 1; + if (Settings.RATING_CATEGORIES != null) { + size = Math.max(1, Settings.RATING_CATEGORIES.size()); + } + double[] ratings = new double[size]; + if (rating == null || rating.size() == 0) { + return ratings; + } + for (Entry entry : rating.entrySet()) { + int current = entry.getValue(); + if (Settings.RATING_CATEGORIES == null || Settings.RATING_CATEGORIES.size() == 0) { + ratings[0] += current; + } + else { + for (int i = 0 ; i < Settings.RATING_CATEGORIES.size(); i++) { + ratings[i] += (current % 10) - 1; + current /= 10; + } + } + } + for (int i = 0; i < size; i++) { + ratings[i] /= (double) rating.size(); + } + return ratings; } } diff --git a/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/bukkit/BukkitInventoryUtil.java b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/bukkit/BukkitInventoryUtil.java new file mode 100644 index 000000000..313e7a6c4 --- /dev/null +++ b/PlotSquared/src/main/java/com/intellectualcrafters/plot/util/bukkit/BukkitInventoryUtil.java @@ -0,0 +1,127 @@ +package com.intellectualcrafters.plot.util.bukkit; + +import java.util.ArrayList; +import java.util.List; + +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.event.inventory.InventoryType; +import org.bukkit.inventory.Inventory; +import org.bukkit.inventory.InventoryView; +import org.bukkit.inventory.ItemStack; +import org.bukkit.inventory.PlayerInventory; +import org.bukkit.inventory.meta.ItemMeta; + +import com.intellectualcrafters.plot.object.PlotInventory; +import com.intellectualcrafters.plot.object.PlotItemStack; +import com.intellectualcrafters.plot.object.BukkitPlayer; +import com.intellectualcrafters.plot.object.PlotPlayer; +import com.intellectualcrafters.plot.util.InventoryUtil; + +public class BukkitInventoryUtil extends InventoryUtil { + + @Override + public void open(PlotInventory inv) { + BukkitPlayer bp = ((BukkitPlayer) inv.player); + Inventory inventory = Bukkit.createInventory(null, inv.size * 9, inv.getTitle()); + PlotItemStack[] items = inv.getItems(); + for (int i = 0; i < inv.size * 9; i++) { + PlotItemStack item = items[i]; + if (item != null) { + inventory.setItem(i, getItem(item)); + } + } + inv.player.setMeta("inventory", inv); + bp.player.openInventory(inventory); + } + + @Override + public void close(PlotInventory inv) { + if (!inv.isOpen()) { + return; + } + inv.player.deleteMeta("inventory"); + BukkitPlayer bp = ((BukkitPlayer) inv.player); + bp.player.closeInventory(); + } + + @Override + public void setItem(PlotInventory inv, int index, PlotItemStack item) { + BukkitPlayer bp = ((BukkitPlayer) inv.player); + InventoryView opened = bp.player.getOpenInventory(); + if (!inv.isOpen()) { + return; + } + opened.setItem(index, getItem(item)); + bp.player.updateInventory(); + } + + public PlotItemStack getItem(ItemStack item ) { + if (item == null) { + return null; + } + int id = item.getTypeId(); + short data = item.getDurability(); + int amount = item.getAmount(); + String name = null; + String[] lore = null; + if (item.hasItemMeta()) { + ItemMeta meta = item.getItemMeta(); + if (meta.hasDisplayName()) { + name = meta.getDisplayName(); + } + if (meta.hasLore()) { + List itemLore = meta.getLore(); + lore = itemLore.toArray(new String[itemLore.size()]); + } + } + return new PlotItemStack(id, data, amount, name, lore); + } + + public static ItemStack getItem(PlotItemStack item) { + if (item == null) { + return null; + } + ItemStack stack = new ItemStack(item.id, item.amount, item.data); + ItemMeta meta = null; + if (item.name != null) { + meta = stack.getItemMeta(); + meta.setDisplayName(ChatColor.translateAlternateColorCodes('&', item.name)); + } + if (item.lore != null) { + if (meta == null) { + meta = stack.getItemMeta(); + } + List lore = new ArrayList<>(); + for (String entry : item.lore) { + lore.add(ChatColor.translateAlternateColorCodes('&', entry)); + } + meta.setLore(lore); + } + if (meta != null) { + stack.setItemMeta(meta); + } + return stack; + } + + @Override + public PlotItemStack[] getItems(PlotPlayer player) { + BukkitPlayer bp = ((BukkitPlayer) player); + PlayerInventory inv = bp.player.getInventory(); + PlotItemStack[] items = new PlotItemStack[36]; + for (int i = 0; i < 36; i++) { + items[i] = getItem(inv.getItem(i)); + } + return items; + } + + @Override + public boolean isOpen(PlotInventory inv) { + if (!inv.isOpen()) { + return false; + } + BukkitPlayer bp = ((BukkitPlayer) inv.player); + InventoryView opened = bp.player.getOpenInventory(); + return (inv.isOpen() && opened.getType() == InventoryType.CRAFTING && opened.getTitle() == null); + } +}