diff --git a/Bukkit/pom.xml b/Bukkit/pom.xml index 223190636..b12a2d969 100644 --- a/Bukkit/pom.xml +++ b/Bukkit/pom.xml @@ -27,7 +27,7 @@ com.plotsquared PlotSquared-Core - 5.12.5 + 6.0.0-SUPER-SNAPSHOT compile diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java index 23ed242d7..7309952a2 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java @@ -27,7 +27,6 @@ package com.plotsquared.bukkit.util; import com.google.inject.Inject; import com.google.inject.Singleton; -import com.plotsquared.bukkit.BukkitPlatform; import com.plotsquared.core.generator.AugmentedUtils; import com.plotsquared.core.location.Location; import com.plotsquared.core.location.PlotLoc; @@ -40,13 +39,10 @@ import com.plotsquared.core.queue.ScopedQueueCoordinator; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.RegionUtil; -import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.task.RunnableVal; import com.sk89q.worldedit.bukkit.BukkitAdapter; import com.sk89q.worldedit.bukkit.BukkitWorld; -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockTypes; @@ -62,9 +58,7 @@ import org.slf4j.LoggerFactory; import java.util.ArrayList; import java.util.HashSet; import java.util.List; -import java.util.Objects; import java.util.Set; -import java.util.concurrent.Semaphore; import static com.plotsquared.core.util.entity.EntityCategories.CAP_ANIMAL; import static com.plotsquared.core.util.entity.EntityCategories.CAP_ENTITY; @@ -78,38 +72,8 @@ public class BukkitRegionManager extends RegionManager { private static final Logger logger = LoggerFactory.getLogger("P2/" + BukkitRegionManager.class.getSimpleName()); - @Inject private WorldUtil worldUtil; @Inject private GlobalBlockQueue blockQueue; - @Override public Set getChunkChunks(String world) { - Set chunks = super.getChunkChunks(world); - if (Bukkit.isPrimaryThread()) { - for (Chunk chunk : Objects.requireNonNull(Bukkit.getWorld(world)).getLoadedChunks()) { - BlockVector2 loc = BlockVector2.at(chunk.getX() >> 5, chunk.getZ() >> 5); - chunks.add(loc); - } - } else { - final Semaphore semaphore = new Semaphore(1); - try { - semaphore.acquire(); - Bukkit.getScheduler() - .runTask(BukkitPlatform.getPlugin(BukkitPlatform.class), () -> { - for (Chunk chunk : Objects.requireNonNull(Bukkit.getWorld(world)) - .getLoadedChunks()) { - BlockVector2 loc = - BlockVector2.at(chunk.getX() >> 5, chunk.getZ() >> 5); - chunks.add(loc); - } - semaphore.release(); - }); - semaphore.acquireUninterruptibly(); - } catch (final Exception e) { - e.printStackTrace(); - } - } - return chunks; - } - @Override public boolean handleClear(Plot plot, Runnable whenDone, PlotManager manager) { return false; } @@ -189,7 +153,7 @@ public class BukkitRegionManager extends RegionManager { return count; } - @Override @Inject public boolean regenerateRegion(final Location pos1, final Location pos2, + @Override public boolean regenerateRegion(final Location pos1, final Location pos2, final boolean ignoreAugment, final Runnable whenDone) { final BukkitWorld world = new BukkitWorld((World) pos1.getWorld()); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java index 90e3bcff8..659b6a7d7 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitUtil.java @@ -25,7 +25,6 @@ */ package com.plotsquared.bukkit.util; -import com.google.inject.Inject; import com.google.inject.Singleton; import com.plotsquared.bukkit.BukkitPlatform; import com.plotsquared.bukkit.player.BukkitPlayer; @@ -36,7 +35,6 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.BlockUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.PlayerManager; -import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.task.TaskManager; @@ -102,6 +100,7 @@ import java.util.HashSet; import java.util.Objects; import java.util.Set; import java.util.UUID; +import java.util.concurrent.Semaphore; import java.util.function.Consumer; import java.util.function.IntConsumer; import java.util.stream.Stream; @@ -110,13 +109,10 @@ import java.util.stream.Stream; @Singleton public class BukkitUtil extends WorldUtil { - private static final Logger logger = LoggerFactory.getLogger("P2/" + BukkitUtil.class.getSimpleName()); + private static final Logger logger = + LoggerFactory.getLogger("P2/" + BukkitUtil.class.getSimpleName()); private final Collection tileEntityTypes = new HashSet<>(); - @Inject public BukkitUtil(@Nonnull final RegionManager regionManager) { - super(regionManager); - } - /** * Get a {@link PlotPlayer} from an {@link OfflinePlayer}. If the player is * online, it returns a complete player. If the player is offline, it creates @@ -156,7 +152,8 @@ public class BukkitUtil extends WorldUtil { */ @Nonnull public static Location adapt(@Nonnull final org.bukkit.Location location) { return Location.at(com.plotsquared.bukkit.util.BukkitWorld.of(location.getWorld()), - MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()), MathMan.roundInt(location.getZ())); + MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()), + MathMan.roundInt(location.getZ())); } /** @@ -168,8 +165,8 @@ public class BukkitUtil extends WorldUtil { */ @Nonnull public static Location adaptComplete(@Nonnull final org.bukkit.Location location) { return Location.at(com.plotsquared.bukkit.util.BukkitWorld.of(location.getWorld()), - MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()), MathMan.roundInt(location.getZ()), location.getYaw(), - location.getPitch()); + MathMan.roundInt(location.getX()), MathMan.roundInt(location.getY()), + MathMan.roundInt(location.getZ()), location.getYaw(), location.getPitch()); } /** @@ -180,8 +177,8 @@ public class BukkitUtil extends WorldUtil { * @return Bukkit location */ @Nonnull public static org.bukkit.Location adapt(@Nonnull final Location location) { - return new org.bukkit.Location((World) location.getWorld().getPlatformWorld(), location.getX(), - location.getY(), location.getZ()); + return new org.bukkit.Location((World) location.getWorld().getPlatformWorld(), + location.getX(), location.getY(), location.getZ()); } /** @@ -196,23 +193,23 @@ public class BukkitUtil extends WorldUtil { private static void ensureLoaded(@Nonnull final String world, final int x, final int z, @Nonnull final Consumer chunkConsumer) { - PaperLib.getChunkAtAsync(Objects.requireNonNull(getWorld(world)), - x >> 4, z >> 4, true) + PaperLib.getChunkAtAsync(Objects.requireNonNull(getWorld(world)), x >> 4, z >> 4, true) .thenAccept(chunk -> ensureMainThread(chunkConsumer, chunk)); } - private static void ensureLoaded(@Nonnull final Location location, @Nonnull final Consumer chunkConsumer) { + private static void ensureLoaded(@Nonnull final Location location, + @Nonnull final Consumer chunkConsumer) { PaperLib.getChunkAtAsync(adapt(location), true) .thenAccept(chunk -> ensureMainThread(chunkConsumer, chunk)); } private static void ensureMainThread(@Nonnull final Consumer consumer, - @Nonnull final T value) { + @Nonnull final T value) { if (Bukkit.isPrimaryThread()) { consumer.accept(value); } else { - Bukkit.getScheduler() - .runTask(BukkitPlatform.getPlugin(BukkitPlatform.class), () -> consumer.accept(value)); + Bukkit.getScheduler().runTask(BukkitPlatform.getPlugin(BukkitPlatform.class), + () -> consumer.accept(value)); } } @@ -228,8 +225,8 @@ public class BukkitUtil extends WorldUtil { return PlotPlayer.wrap(Bukkit.getOfflinePlayer(uuid)); } - @Override public boolean isBlockSame(@Nonnull final BlockState block1, - @Nonnull final BlockState block2) { + @Override + public boolean isBlockSame(@Nonnull final BlockState block1, @Nonnull final BlockState block2) { if (block1.equals(block2)) { return true; } @@ -242,19 +239,18 @@ public class BukkitUtil extends WorldUtil { return getWorld(worldName) != null; } - @Override public void getBiome(@Nonnull final String world, final int x, - final int z, @Nonnull final Consumer result) { + @Override public void getBiome(@Nonnull final String world, final int x, final int z, + @Nonnull final Consumer result) { ensureLoaded(world, x, z, chunk -> result.accept(BukkitAdapter.adapt(getWorld(world).getBiome(x, z)))); } - @Override @Nonnull public BiomeType getBiomeSynchronous(@Nonnull final String world, - final int x, final int z) { + @Override @Nonnull + public BiomeType getBiomeSynchronous(@Nonnull final String world, final int x, final int z) { return BukkitAdapter.adapt(Objects.requireNonNull(getWorld(world)).getBiome(x, z)); } - @Override - public void getHighestBlock(@Nonnull final String world, final int x, final int z, + @Override public void getHighestBlock(@Nonnull final String world, final int x, final int z, @Nonnull final IntConsumer result) { ensureLoaded(world, x, z, chunk -> { final World bukkitWorld = Objects.requireNonNull(getWorld(world)); @@ -282,8 +278,7 @@ public class BukkitUtil extends WorldUtil { } @Override @Nonnegative - public int getHighestBlockSynchronous(@Nonnull final String world, - final int x, final int z) { + public int getHighestBlockSynchronous(@Nonnull final String world, final int x, final int z) { final World bukkitWorld = Objects.requireNonNull(getWorld(world)); // Skip top and bottom block int air = 1; @@ -305,8 +300,7 @@ public class BukkitUtil extends WorldUtil { return bukkitWorld.getMaxHeight() - 1; } - @Override @Nonnull - public String[] getSignSynchronous(@Nonnull final Location location) { + @Override @Nonnull public String[] getSignSynchronous(@Nonnull final Location location) { Block block = Objects.requireNonNull(getWorld(location.getWorldName())) .getBlockAt(location.getX(), location.getY(), location.getZ()); try { @@ -323,8 +317,7 @@ public class BukkitUtil extends WorldUtil { return new String[0]; } - @Override @Nonnull - public Location getSpawn(@Nonnull final String world) { + @Override @Nonnull public Location getSpawn(@Nonnull final String world) { final org.bukkit.Location temp = getWorld(world).getSpawnLocation(); return Location .at(world, temp.getBlockX(), temp.getBlockY(), temp.getBlockZ(), temp.getYaw(), @@ -392,9 +385,8 @@ public class BukkitUtil extends WorldUtil { } @Override - public void setBiomes(@Nonnull final String worldName, - @Nonnull final CuboidRegion region, - @Nonnull final BiomeType biomeType) { + public void setBiomes(@Nonnull final String worldName, @Nonnull final CuboidRegion region, + @Nonnull final BiomeType biomeType) { final World world = getWorld(worldName); if (world == null) { logger.warn("[P2] An error occured while setting the biome because the world was null", @@ -412,7 +404,8 @@ public class BukkitUtil extends WorldUtil { } } - @Override @Nonnull public com.sk89q.worldedit.world.World getWeWorld(@Nonnull final String world) { + @Override @Nonnull + public com.sk89q.worldedit.world.World getWeWorld(@Nonnull final String world) { return new BukkitWorld(Bukkit.getWorld(world)); } @@ -420,15 +413,14 @@ public class BukkitUtil extends WorldUtil { Bukkit.getWorld(world).refreshChunk(x, z); } - @Override - public void getBlock(@Nonnull final Location location, - @Nonnull final Consumer result) { + @Override public void getBlock(@Nonnull final Location location, + @Nonnull final Consumer result) { ensureLoaded(location, chunk -> { final World world = getWorld(location.getWorldName()); final Block block = Objects.requireNonNull(world) .getBlockAt(location.getX(), location.getY(), location.getZ()); - result.accept(Objects.requireNonNull(BukkitAdapter - .asBlockType(block.getType())).getDefaultState()); + result.accept(Objects.requireNonNull(BukkitAdapter.asBlockType(block.getType())) + .getDefaultState()); }); } @@ -436,33 +428,28 @@ public class BukkitUtil extends WorldUtil { final World world = getWorld(location.getWorldName()); final Block block = Objects.requireNonNull(world) .getBlockAt(location.getX(), location.getY(), location.getZ()); - return Objects.requireNonNull(BukkitAdapter - .asBlockType(block.getType())).getDefaultState(); + return Objects.requireNonNull(BukkitAdapter.asBlockType(block.getType())).getDefaultState(); } @Override @Nonnegative public double getHealth(@Nonnull final PlotPlayer player) { - return Objects.requireNonNull(Bukkit - .getPlayer(player.getUUID())).getHealth(); + return Objects.requireNonNull(Bukkit.getPlayer(player.getUUID())).getHealth(); } @Override @Nonnegative public int getFoodLevel(@Nonnull final PlotPlayer player) { - return Objects.requireNonNull(Bukkit.getPlayer(player.getUUID())) - .getFoodLevel(); + return Objects.requireNonNull(Bukkit.getPlayer(player.getUUID())).getFoodLevel(); } - @Override public void setHealth(@Nonnull final PlotPlayer player, - @Nonnegative final double health) { - Objects.requireNonNull(Bukkit.getPlayer(player.getUUID())) - .setHealth(health); + @Override + public void setHealth(@Nonnull final PlotPlayer player, @Nonnegative final double health) { + Objects.requireNonNull(Bukkit.getPlayer(player.getUUID())).setHealth(health); } @Override public void setFoodLevel(@Nonnull final PlotPlayer player, - @Nonnegative final int foodLevel) { + @Nonnegative final int foodLevel) { Bukkit.getPlayer(player.getUUID()).setFoodLevel(foodLevel); } - @Override @Nonnull - public Set getTypesInCategory( + @Override @Nonnull public Set getTypesInCategory( @Nonnull final String category) { final Collection> allowedInterfaces = new HashSet<>(); switch (category) { @@ -567,11 +554,38 @@ public class BukkitUtil extends WorldUtil { } @Override @Nonnegative - public int getTileEntityCount(@Nonnull final String world, - @Nonnull final BlockVector2 chunk) { + public int getTileEntityCount(@Nonnull final String world, @Nonnull final BlockVector2 chunk) { return Objects.requireNonNull(getWorld(world)). - getChunkAt(chunk.getBlockX(), chunk.getBlockZ()) - .getTileEntities().length; + getChunkAt(chunk.getBlockX(), chunk.getBlockZ()).getTileEntities().length; + } + + @Override public Set getChunkChunks(String world) { + Set chunks = super.getChunkChunks(world); + if (Bukkit.isPrimaryThread()) { + for (Chunk chunk : Objects.requireNonNull(Bukkit.getWorld(world)).getLoadedChunks()) { + BlockVector2 loc = BlockVector2.at(chunk.getX() >> 5, chunk.getZ() >> 5); + chunks.add(loc); + } + } else { + final Semaphore semaphore = new Semaphore(1); + try { + semaphore.acquire(); + Bukkit.getScheduler() + .runTask(BukkitPlatform.getPlugin(BukkitPlatform.class), () -> { + for (Chunk chunk : Objects.requireNonNull(Bukkit.getWorld(world)) + .getLoadedChunks()) { + BlockVector2 loc = + BlockVector2.at(chunk.getX() >> 5, chunk.getZ() >> 5); + chunks.add(loc); + } + semaphore.release(); + }); + semaphore.acquireUninterruptibly(); + } catch (final Exception e) { + e.printStackTrace(); + } + } + return chunks; } } diff --git a/Core/src/main/java/com/plotsquared/core/command/Debug.java b/Core/src/main/java/com/plotsquared/core/command/Debug.java index d8e591313..3e1ef1204 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Debug.java +++ b/Core/src/main/java/com/plotsquared/core/command/Debug.java @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.StringMan; +import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.entity.EntityCategory; import com.plotsquared.core.util.query.PlotQuery; @@ -57,12 +58,12 @@ public class Debug extends SubCommand { private static final Logger logger = LoggerFactory.getLogger("P2/" + Debug.class.getSimpleName()); private final PlotAreaManager plotAreaManager; - private final RegionManager regionManager; + private final WorldUtil worldUtil; @Inject public Debug(@Nonnull final PlotAreaManager plotAreaManager, - @Nonnull final RegionManager regionManager) { + @Nonnull final WorldUtil worldUtil) { this.plotAreaManager = plotAreaManager; - this.regionManager = regionManager; + this.worldUtil = worldUtil; } @Override public boolean onCommand(PlotPlayer player, String[] args) { @@ -78,7 +79,7 @@ public class Debug extends SubCommand { final long start = System.currentTimeMillis(); MainUtil.sendMessage(player, "Fetching loaded chunks..."); TaskManager.runTaskAsync(() -> MainUtil.sendMessage(player, - "Loaded chunks: " + this.regionManager.getChunkChunks(player.getLocation().getWorldName()).size() + "(" + ( + "Loaded chunks: " + this.worldUtil.getChunkChunks(player.getLocation().getWorldName()).size() + "(" + ( System.currentTimeMillis() - start) + "ms) using thread: " + Thread .currentThread().getName())); return true; diff --git a/Core/src/main/java/com/plotsquared/core/command/Trim.java b/Core/src/main/java/com/plotsquared/core/command/Trim.java index 4a79d4098..02eda501c 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Trim.java +++ b/Core/src/main/java/com/plotsquared/core/command/Trim.java @@ -98,7 +98,7 @@ public class Trim extends SubCommand { if (ExpireManager.IMP != null) { plots.removeAll(ExpireManager.IMP.getPendingExpired()); } - result.value1 = new HashSet<>(PlotSquared.platform().getRegionManager().getChunkChunks(world)); + result.value1 = new HashSet<>(PlotSquared.platform().getWorldUtil().getChunkChunks(world)); result.value2 = new HashSet<>(); MainUtil.sendMessage(null, " - MCA #: " + result.value1.size()); MainUtil.sendMessage(null, " - CHUNKS: " + (result.value1.size() * 1024) + " (max)"); diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java b/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java index 11560e33c..34928a014 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridUtils.java @@ -406,7 +406,7 @@ public class HybridUtils { return false; } HybridUtils.UPDATE = true; - Set regions = this.regionManager.getChunkChunks(area.getWorldName()); + Set regions = this.worldUtil.getChunkChunks(area.getWorldName()); return scheduleRoadUpdate(area, regions, extend, new HashSet<>()); } diff --git a/Core/src/main/java/com/plotsquared/core/util/RegionManager.java b/Core/src/main/java/com/plotsquared/core/util/RegionManager.java index a4f5682cd..f16420021 100644 --- a/Core/src/main/java/com/plotsquared/core/util/RegionManager.java +++ b/Core/src/main/java/com/plotsquared/core/util/RegionManager.java @@ -78,31 +78,6 @@ public abstract class RegionManager { */ public abstract int[] countEntities(Plot plot); - public Set getChunkChunks(String world) { - File folder = - new File(PlotSquared.platform().getWorldContainer(), world + File.separator + "region"); - File[] regionFiles = folder.listFiles(); - if (regionFiles == null) { - throw new RuntimeException( - "Could not find worlds folder: " + folder + " ? (no read access?)"); - } - HashSet chunks = new HashSet<>(); - for (File file : regionFiles) { - String name = file.getName(); - if (name.endsWith("mca")) { - String[] split = name.split("\\."); - try { - int x = Integer.parseInt(split[1]); - int z = Integer.parseInt(split[2]); - BlockVector2 loc = BlockVector2.at(x, z); - chunks.add(loc); - } catch (NumberFormatException ignored) { - } - } - } - return chunks; - } - public void deleteRegionFiles(final String world, final Collection chunks, final Runnable whenDone) { TaskManager.runTaskAsync(() -> { diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index 03f6728ca..4d566aac9 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -53,6 +53,7 @@ import java.io.IOException; import java.io.OutputStream; import java.net.URL; import java.util.Collection; +import java.util.HashSet; import java.util.Map; import java.util.Set; import java.util.UUID; @@ -65,20 +66,14 @@ import java.util.zip.ZipOutputStream; public abstract class WorldUtil { - private final RegionManager regionManager; - - public WorldUtil(@Nonnull final RegionManager regionManager) { - this.regionManager = regionManager; - } - /** * Set the biome in a region * * @param world World name - * @param p1x Min X - * @param p1z Min Z - * @param p2x Max X - * @param p2z Max Z + * @param p1x Min X + * @param p1z Min Z + * @param p2x Max X + * @param p2z Max Z * @param biome Biome */ public static void setBiome(String world, int p1x, int p1z, int p2x, int p2z, BiomeType biome) { @@ -196,8 +191,8 @@ public abstract class WorldUtil { * @return Result * @deprecated Use {@link #getHighestBlock(String, int, int, IntConsumer)} */ - @Deprecated @Nonnegative - public abstract int getHighestBlockSynchronous(@Nonnull String world, int x, int z); + @Deprecated @Nonnegative public abstract int getHighestBlockSynchronous(@Nonnull String world, + int x, int z); /** * Set the text in a sign @@ -232,81 +227,82 @@ public abstract class WorldUtil { /** * Refresh (resend) chunk to player. Usually after setting the biome * - * @param x Chunk x location - * @param z Chunk z location + * @param x Chunk x location + * @param z Chunk z location * @param world World of the chunk */ public abstract void refreshChunk(int x, int z, String world); public void upload(@Nonnull final Plot plot, @Nullable final UUID uuid, @Nullable final String file, @Nonnull final RunnableVal whenDone) { - plot.getHome(home -> SchematicHandler.upload(uuid, file, "zip", new RunnableVal() { - @Override public void run(OutputStream output) { - try (final ZipOutputStream zos = new ZipOutputStream(output)) { - File dat = getDat(plot.getWorldName()); - Location spawn = getSpawn(plot.getWorldName()); - if (dat != null) { - ZipEntry ze = new ZipEntry("world" + File.separator + dat.getName()); - zos.putNextEntry(ze); - try (NBTInputStream nis = new NBTInputStream( - new GZIPInputStream(new FileInputStream(dat)))) { - CompoundTag tag = (CompoundTag) nis.readNamedTag().getTag(); - CompoundTag data = (CompoundTag) tag.getValue().get("Data"); - Map map = ReflectionUtils.getMap(data.getValue()); - map.put("SpawnX", new IntTag(home.getX())); - map.put("SpawnY", new IntTag(home.getY())); - map.put("SpawnZ", new IntTag(home.getZ())); - try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { - try (NBTOutputStream out = new NBTOutputStream( - new GZIPOutputStream(baos, true))) { - //TODO Find what this should be called - out.writeNamedTag("Schematic????", tag); - } - zos.write(baos.toByteArray()); - } - } - } - setSpawn(spawn); - byte[] buffer = new byte[1024]; - for (Plot current : plot.getConnectedPlots()) { - Location bot = current.getBottomAbs(); - Location top = current.getTopAbs(); - int brx = bot.getX() >> 9; - int brz = bot.getZ() >> 9; - int trx = top.getX() >> 9; - int trz = top.getZ() >> 9; - Set files = regionManager.getChunkChunks(bot.getWorldName()); - for (BlockVector2 mca : files) { - if (mca.getX() >= brx && mca.getX() <= trx && mca.getZ() >= brz - && mca.getZ() <= trz) { - final File file = - getMcr(plot.getWorldName(), mca.getX(), mca.getZ()); - if (file != null) { - //final String name = "r." + (x - cx) + "." + (z - cz) + ".mca"; - String name = file.getName(); - final ZipEntry ze = new ZipEntry( - "world" + File.separator + "region" + File.separator - + name); - zos.putNextEntry(ze); - try (FileInputStream in = new FileInputStream(file)) { - int len; - while ((len = in.read(buffer)) > 0) { - zos.write(buffer, 0, len); - } + plot.getHome( + home -> SchematicHandler.upload(uuid, file, "zip", new RunnableVal() { + @Override public void run(OutputStream output) { + try (final ZipOutputStream zos = new ZipOutputStream(output)) { + File dat = getDat(plot.getWorldName()); + Location spawn = getSpawn(plot.getWorldName()); + if (dat != null) { + ZipEntry ze = new ZipEntry("world" + File.separator + dat.getName()); + zos.putNextEntry(ze); + try (NBTInputStream nis = new NBTInputStream( + new GZIPInputStream(new FileInputStream(dat)))) { + CompoundTag tag = (CompoundTag) nis.readNamedTag().getTag(); + CompoundTag data = (CompoundTag) tag.getValue().get("Data"); + Map map = ReflectionUtils.getMap(data.getValue()); + map.put("SpawnX", new IntTag(home.getX())); + map.put("SpawnY", new IntTag(home.getY())); + map.put("SpawnZ", new IntTag(home.getZ())); + try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { + try (NBTOutputStream out = new NBTOutputStream( + new GZIPOutputStream(baos, true))) { + //TODO Find what this should be called + out.writeNamedTag("Schematic????", tag); } - zos.closeEntry(); + zos.write(baos.toByteArray()); } } } + setSpawn(spawn); + byte[] buffer = new byte[1024]; + for (Plot current : plot.getConnectedPlots()) { + Location bot = current.getBottomAbs(); + Location top = current.getTopAbs(); + int brx = bot.getX() >> 9; + int brz = bot.getZ() >> 9; + int trx = top.getX() >> 9; + int trz = top.getZ() >> 9; + Set files = getChunkChunks(bot.getWorldName()); + for (BlockVector2 mca : files) { + if (mca.getX() >= brx && mca.getX() <= trx && mca.getZ() >= brz + && mca.getZ() <= trz) { + final File file = + getMcr(plot.getWorldName(), mca.getX(), mca.getZ()); + if (file != null) { + //final String name = "r." + (x - cx) + "." + (z - cz) + ".mca"; + String name = file.getName(); + final ZipEntry ze = new ZipEntry( + "world" + File.separator + "region" + File.separator + + name); + zos.putNextEntry(ze); + try (FileInputStream in = new FileInputStream(file)) { + int len; + while ((len = in.read(buffer)) > 0) { + zos.write(buffer, 0, len); + } + } + zos.closeEntry(); + } + } + } + } + zos.closeEntry(); + zos.flush(); + zos.finish(); + } catch (IOException e) { + e.printStackTrace(); } - zos.closeEntry(); - zos.flush(); - zos.finish(); - } catch (IOException e) { - e.printStackTrace(); } - } - }, whenDone)); + }, whenDone)); } @Nullable final File getDat(@Nonnull final String world) { @@ -328,6 +324,32 @@ public abstract class WorldUtil { return null; } + + public Set getChunkChunks(String world) { + File folder = + new File(PlotSquared.platform().getWorldContainer(), world + File.separator + "region"); + File[] regionFiles = folder.listFiles(); + if (regionFiles == null) { + throw new RuntimeException( + "Could not find worlds folder: " + folder + " ? (no read access?)"); + } + HashSet chunks = new HashSet<>(); + for (File file : regionFiles) { + String name = file.getName(); + if (name.endsWith("mca")) { + String[] split = name.split("\\."); + try { + int x = Integer.parseInt(split[1]); + int z = Integer.parseInt(split[2]); + BlockVector2 loc = BlockVector2.at(x, z); + chunks.add(loc); + } catch (NumberFormatException ignored) { + } + } + } + return chunks; + } + /** * Check if two blocks are the same type) * diff --git a/build.gradle b/build.gradle index ebf5e7284..03e5159b7 100644 --- a/build.gradle +++ b/build.gradle @@ -31,7 +31,7 @@ ext { } def ver = "6.0.0" -def versuffix = "SUPER-SNAPSHOT" +def versuffix = "-SUPER-SNAPSHOT" ext { if (project.hasProperty("versionsuffix")) { versuffix = "-$versionsuffix" @@ -125,6 +125,8 @@ subprojects { subproject -> dependencies { include(dependency("org.json:json:20200518")) include(dependency("net.kyori:text-api:3.0.2")) + include(dependency("javax.inject:javax.inject:1")) + include(dependency("aopalliance:aopalliance:1.0")) } relocate("io.papermc.lib", "com.plotsquared.bukkit.paperlib") relocate("org.json", "com.plotsquared.json") {