From b238bdbd213eb7f607ebbcc290d77916b3741bb2 Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Mon, 13 Jun 2016 15:32:13 +1000 Subject: [PATCH] Fix armor stand / hangings being considered vehicles --- .../plot/api/PlotAPI.java | 2 + .../com/plotsquared/bukkit/BukkitMain.java | 3 +- .../com/intellectualcrafters/plot/PS.java | 102 ++++++++---------- .../plot/generator/HybridPlotManager.java | 4 +- fanciful-master.zip | Bin 23329 -> 0 bytes 5 files changed, 53 insertions(+), 58 deletions(-) delete mode 100644 fanciful-master.zip diff --git a/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java b/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java index 8b6014da8..a32508267 100644 --- a/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java +++ b/Bukkit/src/main/java/com/intellectualcrafters/plot/api/PlotAPI.java @@ -56,6 +56,8 @@ public class PlotAPI { @Deprecated public PlotAPI(JavaPlugin plugin) {} + public PlotAPI(){} + /** * Get all plots. * diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java index b418a2cb7..c3f9f9faa 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitMain.java @@ -231,7 +231,8 @@ public final class BukkitMain extends JavaPlugin implements Listener, IPlotMain case ARMOR_STAND: case ITEM_FRAME: case PAINTING: - // TEMPORARILY CLASSIFY AS VEHICLE + // Not vehicles + continue; case MINECART: case MINECART_CHEST: case MINECART_COMMAND: diff --git a/Core/src/main/java/com/intellectualcrafters/plot/PS.java b/Core/src/main/java/com/intellectualcrafters/plot/PS.java index ed42d2f9c..f5e877244 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/PS.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/PS.java @@ -84,45 +84,45 @@ import java.util.zip.ZipInputStream; * An implementation of the core, with a static getter for easy access. */ public class PS { - private static PS instance; + // Implementation public final IPlotMain IMP; - private final HashSet plotAreaHashCheck = new HashSet<>(); - /** - * All plot areas mapped by world (quick world access). - */ - private final HashMap plotAreaMap = new HashMap<>(); - /** - * All plot areas mapped by location (quick location based access). - */ - private final HashMap> plotAreaGrid = new HashMap<>(); - private final int[] version; - private final String platform; + // Implementation logger + private ILogger logger; + // Current thread private final Thread thread; - public HashMap> clusters_tmp; - public HashMap> plots_tmp; + // Platform / Version / Update URL + private final String platform; + private final int[] version; + private int[] lastVersion; + public URL update; + // WorldEdit instance + public WorldEdit worldedit; + // Files and configuration + private File jarFile = null; // This file public File styleFile; public File configFile; public File worldsFile; public File commandsFile; public File translationFile; + private File storageFile; public YamlConfiguration style; public YamlConfiguration config; public YamlConfiguration worlds; public YamlConfiguration storage; public YamlConfiguration commands; - public WorldEdit worldedit; - public URL update; - private ILogger logger; - private boolean plotAreaHasCollision = false; - /** - * All plot areas (quick global access). - */ + // Temporary hold the plots/clusters before the worlds load + public HashMap> clusters_tmp; + public HashMap> plots_tmp; + // All plot areas private PlotArea[] plotAreas = new PlotArea[0]; - private File storageFile; - private File file = null; // This file - private int[] lastVersion; - private Database database; + // All plot areas mapped by world + private final HashMap plotAreaMap = new HashMap<>(); + // All plot areas mapped by position + private final HashMap> plotAreaGrid = new HashMap<>(); + // Optimization if there are no hash collisions + private boolean plotAreaHasCollision = false; + private final HashSet plotAreaHashCheck = new HashSet<>(); /** * Initialize PlotSquared with the desired Implementation class. @@ -140,12 +140,12 @@ public class PS { new ReflectionUtils(this.IMP.getNMSPackage()); try { URL url = PS.class.getProtectionDomain().getCodeSource().getLocation(); - this.file = new File(new URL(url.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")).toURI().getPath()); + this.jarFile = new File(new URL(url.toURI().toString().split("\\!")[0].replaceAll("jar:file", "file")).toURI().getPath()); } catch (MalformedURLException | URISyntaxException | SecurityException e) { e.printStackTrace(); - this.file = new File(this.IMP.getDirectory().getParentFile(), "PlotSquared.jar"); - if (!this.file.exists()) { - this.file = new File(this.IMP.getDirectory().getParentFile(), "PlotSquared-" + platform + ".jar"); + this.jarFile = new File(this.IMP.getDirectory().getParentFile(), "PlotSquared.jar"); + if (!this.jarFile.exists()) { + this.jarFile = new File(this.IMP.getDirectory().getParentFile(), "PlotSquared-" + platform + ".jar"); } } if (getJavaVersion() < 1.8) { @@ -452,16 +452,6 @@ public class PS { return this.platform; } - /** - * Get the {@link Database} object. - * - * @return the database - * @see Database#getConnection() to get the database connection - */ - public Database getDatabase() { - return this.database; - } - /** * Get the relevant plot area for a specified location. *
    @@ -1701,7 +1691,7 @@ public class PS { public boolean update(PlotPlayer sender, URL url) { try { - String name = this.file.getName(); + String name = this.jarFile.getName(); File newJar = new File("plugins/update/" + name); MainUtil.sendMessage(sender, "$1Downloading from provided URL: &7" + url); URLConnection con = url.openConnection(); @@ -1748,7 +1738,7 @@ public class PS { try (InputStream stream = this.IMP.getClass().getResourceAsStream(file)) { byte[] buffer = new byte[2048]; if (stream == null) { - try (ZipInputStream zis = new ZipInputStream(new FileInputStream(this.file))) { + try (ZipInputStream zis = new ZipInputStream(new FileInputStream(this.jarFile))) { ZipEntry ze = zis.getNextEntry(); while (ze != null) { String name = ze.getName(); @@ -1801,8 +1791,6 @@ public class PS { */ public void disable() { try { - TaskManager.IMP = null; - this.database = null; // Validate that all data in the db is correct final HashSet plots = new HashSet<>(); foreachPlotRaw(new RunnableVal() { @@ -1826,20 +1814,22 @@ public class PS { */ public void setupDatabase() { try { - if (DBFunc.dbManager == null) { - if (Storage.MySQL.USE) { - this.database = new com.intellectualcrafters.plot.database.MySQL(Storage.MySQL.HOST, Storage.MySQL.PORT, Storage.MySQL.DATABASE, - Storage.MySQL.USER, Storage.MySQL.PASSWORD); - } else if (Storage.SQLite.USE) { - File file = MainUtil.getFile(IMP.getDirectory(), Storage.SQLite.DB + ".db"); - this.database = new com.intellectualcrafters.plot.database.SQLite(file); - } else { - PS.log(C.PREFIX + "&cNo storage type is set!"); - this.IMP.disable(); - return; - } + if (DBFunc.dbManager != null) { + DBFunc.dbManager.close(); } - DBFunc.dbManager = new SQLManager(this.database, Storage.PREFIX, false); + Database database; + if (Storage.MySQL.USE) { + database = new com.intellectualcrafters.plot.database.MySQL(Storage.MySQL.HOST, Storage.MySQL.PORT, Storage.MySQL.DATABASE, + Storage.MySQL.USER, Storage.MySQL.PASSWORD); + } else if (Storage.SQLite.USE) { + File file = MainUtil.getFile(IMP.getDirectory(), Storage.SQLite.DB + ".db"); + database = new com.intellectualcrafters.plot.database.SQLite(file); + } else { + PS.log(C.PREFIX + "&cNo storage type is set!"); + this.IMP.disable(); + return; + } + DBFunc.dbManager = new SQLManager(database, Storage.PREFIX, false); this.plots_tmp = DBFunc.getPlots(); this.clusters_tmp = DBFunc.getClusters(); } catch (ClassNotFoundException | SQLException e) { diff --git a/Core/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java b/Core/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java index 2a50df195..2037d2bd1 100644 --- a/Core/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java +++ b/Core/src/main/java/com/intellectualcrafters/plot/generator/HybridPlotManager.java @@ -25,6 +25,8 @@ import java.util.Map.Entry; public class HybridPlotManager extends ClassicPlotManager { + public static boolean REGENERATIVE_CLEAR = true; + @Override public void exportTemplate(PlotArea plotArea) throws IOException { HashSet files = new HashSet<>( @@ -146,7 +148,7 @@ public class HybridPlotManager extends ClassicPlotManager { Location pos1 = plot.getBottomAbs(); Location pos2 = plot.getExtendedTopAbs(); // If augmented - final boolean canRegen = (plotArea.TYPE == 0) && (plotArea.TERRAIN == 0); + final boolean canRegen = (plotArea.TYPE == 0) && (plotArea.TERRAIN == 0) && REGENERATIVE_CLEAR; // The component blocks final PlotBlock[] plotfloor = dpw.TOP_BLOCK; final PlotBlock[] filling = dpw.MAIN_BLOCK; diff --git a/fanciful-master.zip b/fanciful-master.zip deleted file mode 100644 index 7d00bd41ffcbf07ee51bbb9a0933e9a1ef785e26..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 23329 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