From 76e037492b9f7ea37b2266df65ffbe69678fddbe Mon Sep 17 00:00:00 2001 From: Jesse Boyd Date: Fri, 23 Dec 2016 02:31:00 +1100 Subject: [PATCH] Add speicifying biome/seed for regen command //regen //regen forest //regen desert 5336 --- .../boydti/fawe/bukkit/v0/BukkitQueue_0.java | 3 +- .../fawe/bukkit/v1_10/BukkitQueue_1_10.java | 101 +++++++++++++++++- .../fawe/bukkit/v1_10/MutableGenLayer.java | 26 +++++ .../fawe/bukkit/v1_11/BukkitQueue_1_11.java | 73 +++++++++++++ .../fawe/bukkit/v1_11/MutableGenLayer.java | 26 +++++ .../fawe/bukkit/v1_7/BukkitQueue17.java | 97 +++++++++++++++-- .../fawe/bukkit/v1_7/MutableGenLayer.java | 26 +++++ .../fawe/bukkit/v1_8/BukkitQueue18R3.java | 98 +++++++++++++++-- .../fawe/bukkit/v1_8/MutableGenLayer.java | 26 +++++ .../fawe/bukkit/v1_9/BukkitQueue_1_9_R1.java | 71 ++++++++++++ .../fawe/bukkit/v1_9/MutableGenLayer.java | 26 +++++ .../com/boydti/fawe/command/LongBinding.java | 46 ++++++++ .../boydti/fawe/example/MappedFaweQueue.java | 6 +- .../com/boydti/fawe/jnbt/anvil/MCAQueue.java | 3 +- .../com/boydti/fawe/object/FaweQueue.java | 8 +- .../regions/general/plot/PlotSetBiome.java | 96 +++++++++++++++++ .../general/plot/PlotSquaredFeature.java | 4 + .../boydti/fawe/util/DelegateFaweQueue.java | 5 +- .../java/com/sk89q/worldedit/EditSession.java | 87 ++++++++++++--- .../command/parametric/ParametricBuilder.java | 2 + .../boydti/fawe/forge/v0/ForgeQueue_All.java | 3 +- .../boydti/fawe/forge/v0/ForgeQueue_All.java | 3 +- .../boydti/fawe/forge/v0/ForgeQueue_All.java | 3 +- .../boydti/fawe/forge/v0/ForgeQueue_All.java | 3 +- .../boydti/fawe/forge/v0/ForgeQueue_All.java | 5 +- 25 files changed, 802 insertions(+), 45 deletions(-) create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/MutableGenLayer.java create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/v1_11/MutableGenLayer.java create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/v1_7/MutableGenLayer.java create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/v1_8/MutableGenLayer.java create mode 100644 bukkit/src/main/java/com/boydti/fawe/bukkit/v1_9/MutableGenLayer.java create mode 100644 core/src/main/java/com/boydti/fawe/command/LongBinding.java create mode 100644 core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSetBiome.java diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java index 049caf1e..1fda7bf5 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v0/BukkitQueue_0.java @@ -13,6 +13,7 @@ import com.boydti.fawe.util.MathMan; import com.boydti.fawe.util.TaskManager; import com.sk89q.worldedit.bukkit.WorldEditPlugin; import com.sk89q.worldedit.bukkit.adapter.BukkitImplAdapter; +import com.sk89q.worldedit.world.biome.BaseBiome; import java.io.File; import java.lang.reflect.Field; import java.lang.reflect.Method; @@ -169,7 +170,7 @@ public abstract class BukkitQueue_0 extends NMSMa public void refreshChunk(FaweChunk fs) {} @Override - public boolean regenerateChunk(World world, int x, int z) { + public boolean regenerateChunk(World world, int x, int z, BaseBiome biome, Long seed) { return world.regenerateChunk(x, z); } diff --git a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java index 3a408e8a..cb895ebc 100644 --- a/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java +++ b/bukkit/src/main/java/com/boydti/fawe/bukkit/v1_10/BukkitQueue_1_10.java @@ -13,6 +13,7 @@ import com.boydti.fawe.util.TaskManager; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.world.biome.BaseBiome; import java.io.File; import java.lang.reflect.Constructor; import java.lang.reflect.Field; @@ -24,11 +25,38 @@ import java.util.Map; import java.util.Set; import java.util.UUID; import java.util.concurrent.ExecutorCompletionService; -import net.minecraft.server.v1_10_R1.*; +import net.minecraft.server.v1_10_R1.Block; +import net.minecraft.server.v1_10_R1.BlockPosition; +import net.minecraft.server.v1_10_R1.ChunkSection; +import net.minecraft.server.v1_10_R1.DataBits; +import net.minecraft.server.v1_10_R1.DataPaletteBlock; +import net.minecraft.server.v1_10_R1.Entity; +import net.minecraft.server.v1_10_R1.EntityPlayer; +import net.minecraft.server.v1_10_R1.EntityTracker; +import net.minecraft.server.v1_10_R1.EntityTypes; +import net.minecraft.server.v1_10_R1.EnumDifficulty; +import net.minecraft.server.v1_10_R1.EnumGamemode; +import net.minecraft.server.v1_10_R1.EnumSkyBlock; +import net.minecraft.server.v1_10_R1.IBlockData; +import net.minecraft.server.v1_10_R1.IDataManager; +import net.minecraft.server.v1_10_R1.MinecraftServer; +import net.minecraft.server.v1_10_R1.NBTTagCompound; +import net.minecraft.server.v1_10_R1.NibbleArray; +import net.minecraft.server.v1_10_R1.PacketPlayOutMapChunk; +import net.minecraft.server.v1_10_R1.PlayerChunk; +import net.minecraft.server.v1_10_R1.PlayerChunkMap; +import net.minecraft.server.v1_10_R1.ServerNBTManager; +import net.minecraft.server.v1_10_R1.TileEntity; +import net.minecraft.server.v1_10_R1.WorldData; +import net.minecraft.server.v1_10_R1.WorldManager; +import net.minecraft.server.v1_10_R1.WorldServer; +import net.minecraft.server.v1_10_R1.WorldSettings; +import net.minecraft.server.v1_10_R1.WorldType; import org.bukkit.Bukkit; import org.bukkit.Chunk; import org.bukkit.World; import org.bukkit.WorldCreator; +import org.bukkit.block.Biome; import org.bukkit.craftbukkit.v1_10_R1.CraftChunk; import org.bukkit.craftbukkit.v1_10_R1.CraftServer; import org.bukkit.craftbukkit.v1_10_R1.CraftWorld; @@ -44,6 +72,14 @@ public class BukkitQueue_1_10 extends BukkitQueue_0 range.max()) { + throw new ParameterException( + String.format( + "A valid value is less than or equal to %s " + + "(you entered %s)", range.max(), number)); + } + } + } + } +} diff --git a/core/src/main/java/com/boydti/fawe/example/MappedFaweQueue.java b/core/src/main/java/com/boydti/fawe/example/MappedFaweQueue.java index 1c3805ed..90a861b1 100644 --- a/core/src/main/java/com/boydti/fawe/example/MappedFaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/example/MappedFaweQueue.java @@ -104,7 +104,7 @@ public abstract class MappedFaweQueue extends FaweQueue { public abstract boolean isChunkLoaded(WORLD world, int x, int z); - public abstract boolean regenerateChunk(WORLD world, int x, int z); + public abstract boolean regenerateChunk(WORLD world, int x, int z, BaseBiome biome, Long seed); @Override public abstract FaweChunk getFaweChunk(int x, int z); @@ -126,8 +126,8 @@ public abstract class MappedFaweQueue extends FaweQueue { } @Override - public boolean regenerateChunk(int x, int z) { - return regenerateChunk(getWorld(), x, z); + public boolean regenerateChunk(int x, int z, BaseBiome biome, Long seed) { + return regenerateChunk(getWorld(), x, z, biome, seed); } @Override diff --git a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java index a7ff2228..d5a282a7 100644 --- a/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java +++ b/core/src/main/java/com/boydti/fawe/jnbt/anvil/MCAQueue.java @@ -7,6 +7,7 @@ import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.object.FaweQueue; import com.boydti.fawe.object.RunnableVal4; import com.sk89q.jnbt.CompoundTag; +import com.sk89q.worldedit.world.biome.BaseBiome; import java.io.File; import java.util.Collection; import java.util.Map; @@ -144,7 +145,7 @@ public class MCAQueue extends NMSMappedFaweQueue confirm, RunnableVal2 whenDone) throws CommandException { + final Plot plot = check(player.getCurrentPlot(), C.NOT_IN_PLOT); + checkTrue(plot.isOwner(player.getUUID()) || Permissions.hasPermission(player, "plots.admin.command.generatebiome"), C.NO_PLOT_PERMS); + if (plot.getRunning() != 0) { + C.WAIT_FOR_TIMER.send(player); + return; + } + checkTrue(args.length == 1, C.COMMAND_SYNTAX, getUsage()); + final HashSet regions = plot.getRegions(); + final BiomeRegistry biomeRegistry = FaweAPI.getWorld(plot.getArea().worldname).getWorldData().getBiomeRegistry(); + List knownBiomes = biomeRegistry.getBiomes(); + final BaseBiome biome = Biomes.findBiomeByName(knownBiomes, args[0], biomeRegistry); + if (biome == null) { + String biomes = StringMan.join(WorldUtil.IMP.getBiomeList(), C.BLOCK_LIST_SEPARATER.s()); + C.NEED_BIOME.send(player); + MainUtil.sendMessage(player, C.SUBCOMMAND_SET_OPTIONS_HEADER.s() + biomes); + return; + } + confirm.run(this, new Runnable() { + @Override + public void run() { + if (plot.getRunning() != 0) { + C.WAIT_FOR_TIMER.send(player); + return; + } + plot.addRunning(); + TaskManager.IMP.async(new Runnable() { + @Override + public void run() { + EditSession session = new EditSessionBuilder(plot.getArea().worldname) + .autoQueue(false) + .checkMemory(false) + .allowedRegionsEverywhere() + .changeSetNull() + .limitUnlimited() + .fastmode(true) + .build(); + long seed = PseudoRandom.random.nextLong(); + for (RegionWrapper region : regions) { + CuboidRegion cuboid = new CuboidRegion(new Vector(region.minX, 0, region.minZ), new Vector(region.maxX, 256, region.maxZ)); + session.regenerate(cuboid, biome, seed); + } + session.flushQueue(); + plot.removeRunning(); + } + }); + } + }, null); + + } +} diff --git a/core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSquaredFeature.java b/core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSquaredFeature.java index 6cdd35a8..646b7ebe 100644 --- a/core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSquaredFeature.java +++ b/core/src/main/java/com/boydti/fawe/regions/general/plot/PlotSquaredFeature.java @@ -5,6 +5,7 @@ import com.boydti.fawe.object.FawePlayer; import com.boydti.fawe.regions.FaweMask; import com.boydti.fawe.regions.FaweMaskManager; import com.intellectualcrafters.plot.PS; +import com.intellectualcrafters.plot.commands.MainCommand; import com.intellectualcrafters.plot.config.Settings; import com.intellectualcrafters.plot.generator.HybridPlotManager; import com.intellectualcrafters.plot.object.Plot; @@ -30,6 +31,9 @@ public class PlotSquaredFeature extends FaweMaskManager { if (Settings.PLATFORM.equals("Bukkit")) { new FaweTrim(); } + if (MainCommand.getInstance().getCommand("generatebiome") == null) { + new PlotSetBiome(); + } } private void setupBlockQueue() { diff --git a/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java b/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java index 881ad679..e3df0dcf 100644 --- a/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java +++ b/core/src/main/java/com/boydti/fawe/util/DelegateFaweQueue.java @@ -15,6 +15,7 @@ import java.util.Set; import java.util.UUID; import java.util.concurrent.ConcurrentLinkedDeque; import java.util.concurrent.ExecutorCompletionService; +import javax.annotation.Nullable; public class DelegateFaweQueue extends FaweQueue { private FaweQueue parent; @@ -149,8 +150,8 @@ public class DelegateFaweQueue extends FaweQueue { } @Override - public boolean regenerateChunk(int x, int z) { - return parent.regenerateChunk(x, z); + public boolean regenerateChunk(int x, int z, @Nullable BaseBiome biome, Long seed) { + return parent.regenerateChunk(x, z, biome, seed); } @Override diff --git a/core/src/main/java/com/sk89q/worldedit/EditSession.java b/core/src/main/java/com/sk89q/worldedit/EditSession.java index 27f355df..79328327 100644 --- a/core/src/main/java/com/sk89q/worldedit/EditSession.java +++ b/core/src/main/java/com/sk89q/worldedit/EditSession.java @@ -3057,38 +3057,71 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting @Override public boolean regenerate(final Region region, final EditSession session) { - final FaweQueue queue = session.getQueue(); + return session.regenerate(region, null, null); + } + + private void setExistingBlocks(Vector pos1, Vector pos2) { + for (int x = (int) pos1.x; x <= (int) pos2.x; x++) { + for (int z = (int) pos1.z; z <= (int) pos2.z; z++) { + for (int y = (int) pos1.y; y <= (int) pos2.y; y++) { + int from = queue.getCombinedId4Data(x, y, z); + short id = (short) (from >> 4); + byte data = (byte) (from & 0xf); + queue.setBlock(x, y, z, id, data); + if (FaweCache.hasNBT(id)) { + CompoundTag tile = queue.getTileEntity(x, y, z); + if (tile != null) { + queue.setTile(x, y, z, tile); + } + } + } + } + } + } + + public boolean regenerate(final Region region, final BaseBiome biome, final Long seed) { + final FaweQueue queue = this.getQueue(); queue.setChangeTask(null); - final FaweChangeSet fcs = (FaweChangeSet) session.getChangeSet(); - final FaweRegionExtent fe = session.getRegionExtent(); - session.setSize(1); + final FaweChangeSet fcs = (FaweChangeSet) this.getChangeSet(); + final FaweRegionExtent fe = this.getRegionExtent(); final boolean cuboid = region instanceof CuboidRegion; - Set chunks = region.getChunks(); + if (fe != null && cuboid) { + Vector max = region.getMaximumPoint(); + Vector min = region.getMinimumPoint(); + if (!fe.contains(max.getBlockX(), max.getBlockY(), max.getBlockZ()) && !fe.contains(min.getBlockX(), min.getBlockY(), min.getBlockZ())) { + throw new FaweException(BBC.WORLDEDIT_CANCEL_REASON_MAX_FAILS); + } + } + final Set chunks = region.getChunks(); for (Vector2D chunk : chunks) { final int cx = chunk.getBlockX(); final int cz = chunk.getBlockZ(); final int bx = cx << 4; final int bz = cz << 4; - Vector cmin = new Vector(bx, 0, bz); - Vector cmax = cmin.add(15, getMaxY(), 15); + final Vector cmin = new Vector(bx, 0, bz); + final Vector cmax = cmin.add(15, getMaxY(), 15); final boolean containsBot1 = (fe == null || fe.contains(cmin.getBlockX(), cmin.getBlockY(), cmin.getBlockZ())); final boolean containsBot2 = region.contains(cmin); final boolean containsTop1 = (fe == null || fe.contains(cmax.getBlockX(), cmax.getBlockY(), cmax.getBlockZ())); final boolean containsTop2 = region.contains(cmax); - if ((containsBot2 && containsTop2 && !containsBot1 && !containsTop1)) { + if (((containsBot2 && containsTop2)) && !containsBot1 && !containsTop1) { continue; } RunnableVal r = new RunnableVal() { @Override public void run(Vector2D chunk) { - if (cuboid && containsBot1 && containsBot2 && containsTop1 && containsTop2) { + boolean conNextX = chunks.contains(new Vector2D(cx + 1, cz)); + boolean conNextZ = chunks.contains(new Vector2D(cx, cz + 1)); + boolean containsAny = false; + if (cuboid && containsBot1 && containsBot2 && containsTop1 && containsTop2 && conNextX && conNextZ) { + containsAny = true; if (fcs != null) { for (int x = 0; x < 16; x++) { int xx = x + bx; for (int z = 0; z < 16; z++) { int zz = z + bz; for (int y = 0; y < getMaxY() + 1; y++) { - int from = queue.getCombinedId4DataDebug(xx, y, zz, 0, session); + int from = queue.getCombinedId4DataDebug(xx, y, zz, 0, EditSession.this); if (!FaweCache.hasNBT(from >> 4)) { fcs.add(xx, y, zz, from, 0); } else { @@ -3105,11 +3138,22 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting } } } else { + int tx = 16; + int tz = 16; + if (!conNextX) { + setExistingBlocks(new Vector(bx + 16, 0, bz), new Vector(bx + 31, getMaxY(), bz + 15)); + } + if (!conNextZ) { + setExistingBlocks(new Vector(bx, 0, bz + 16), new Vector(bx + 15, getMaxY(), bz + 31)); + } + if (!chunks.contains(new Vector2D(cx + 1, cz + 1)) && !conNextX && !conNextZ) { + setExistingBlocks(new Vector(bx + 16, 0, bz + 16), new Vector(bx + 31, getMaxY(), bz + 31)); + } Vector mutable = new Vector(0,0,0); - for (int x = 0; x < 16; x++) { + for (int x = 0; x < tx; x++) { int xx = x + bx; mutable.x = xx; - for (int z = 0; z < 16; z++) { + for (int z = 0; z < tz; z++) { int zz = z + bz; mutable.z = zz; for (int y = 0; y < getMaxY() + 1; y++) { @@ -3117,6 +3161,7 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting int from = queue.getCombinedId4Data(xx, y, zz); boolean contains = (fe == null || fe.contains(xx, y, zz)) && region.contains(mutable); if (contains) { + containsAny = true; if (fcs != null) { if (!FaweCache.hasNBT(from >> 4)) { fcs.add(xx, y, zz, from, 0); @@ -3134,9 +3179,9 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting byte data = (byte) (from & 0xf); queue.setBlock(xx, y, zz, id, data); if (FaweCache.hasNBT(id)) { - BaseBlock block = getBlock(new Vector(xx, y, zz)); - if (block.hasNbtData()) { - queue.setTile(xx, y, zz, block.getNbtData()); + CompoundTag tile = queue.getTileEntity(xx, y, zz); + if (tile != null) { + queue.setTile(xx, y, zz, tile); } } } @@ -3144,13 +3189,21 @@ public class EditSession extends AbstractWorld implements HasFaweQueue, Lighting } } } - queue.regenerateChunk(cx, cz); + if (containsAny) { + changes++; + queue.regenerateChunk(cx, cz, biome, seed); + } } }; r.value = chunk; TaskManager.IMP.sync(r); } - session.flushQueue(); + if (changes != 0) { + flushQueue(); + return true; + } else { + this.queue.clear(); + } return false; } diff --git a/core/src/main/java/com/sk89q/worldedit/util/command/parametric/ParametricBuilder.java b/core/src/main/java/com/sk89q/worldedit/util/command/parametric/ParametricBuilder.java index 566f0ab7..e8ba1ad0 100644 --- a/core/src/main/java/com/sk89q/worldedit/util/command/parametric/ParametricBuilder.java +++ b/core/src/main/java/com/sk89q/worldedit/util/command/parametric/ParametricBuilder.java @@ -19,6 +19,7 @@ package com.sk89q.worldedit.util.command.parametric; +import com.boydti.fawe.command.LongBinding; import com.boydti.fawe.config.Commands; import com.google.common.collect.ImmutableBiMap.Builder; import com.sk89q.minecraft.util.commands.Command; @@ -71,6 +72,7 @@ public class ParametricBuilder { */ public ParametricBuilder() { addBinding(new PrimitiveBindings()); + addBinding(new LongBinding()); addBinding(new StandardBindings()); } diff --git a/forge110/src/main/java/com/boydti/fawe/forge/v0/ForgeQueue_All.java b/forge110/src/main/java/com/boydti/fawe/forge/v0/ForgeQueue_All.java index 2a5098eb..2c2c88e9 100644 --- a/forge110/src/main/java/com/boydti/fawe/forge/v0/ForgeQueue_All.java +++ b/forge110/src/main/java/com/boydti/fawe/forge/v0/ForgeQueue_All.java @@ -12,6 +12,7 @@ import com.boydti.fawe.util.ReflectionUtils; import com.sk89q.jnbt.CompoundTag; import com.sk89q.jnbt.StringTag; import com.sk89q.jnbt.Tag; +import com.sk89q.worldedit.world.biome.BaseBiome; import io.netty.buffer.ByteBuf; import io.netty.buffer.ByteBufAllocator; import java.io.File; @@ -168,7 +169,7 @@ public class ForgeQueue_All extends NMSMappedFaweQueue