From b63aef5589d446804d16caac9d4bd06439bc2910 Mon Sep 17 00:00:00 2001 From: tastybento Date: Fri, 9 Feb 2024 17:40:58 -0800 Subject: [PATCH] Add support for older 1.20.x versions --- pom.xml | 18 +++++ .../database/yaml/YamlDatabaseHandler.java | 2 +- .../nms/v1_20_R1/PasteHandlerImpl.java | 74 +++++++++++++++++++ .../nms/v1_20_R1/WorldRegeneratorImpl.java | 31 ++++++++ .../nms/v1_20_R2/PasteHandlerImpl.java | 74 +++++++++++++++++++ .../nms/v1_20_R2/WorldRegeneratorImpl.java | 31 ++++++++ 6 files changed, 229 insertions(+), 1 deletion(-) create mode 100644 src/main/java/world/bentobox/bentobox/nms/v1_20_R1/PasteHandlerImpl.java create mode 100644 src/main/java/world/bentobox/bentobox/nms/v1_20_R1/WorldRegeneratorImpl.java create mode 100644 src/main/java/world/bentobox/bentobox/nms/v1_20_R2/PasteHandlerImpl.java create mode 100644 src/main/java/world/bentobox/bentobox/nms/v1_20_R2/WorldRegeneratorImpl.java diff --git a/pom.xml b/pom.xml index 0a1f53d01..0d3807310 100644 --- a/pom.xml +++ b/pom.xml @@ -224,6 +224,24 @@ ${spigot.version} provided + + org.spigotmc. + spigot + 1.20.3-R0.1-SNAPSHOT + provided + + + org.spigotmc.. + spigot + 1.20.2-R0.1-SNAPSHOT + provided + + + org.spigotmc... + spigot + 1.20.1-R0.1-SNAPSHOT + provided + io.papermc.paper diff --git a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java index 0f4bb83ee..5cfe753f5 100644 --- a/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java +++ b/src/main/java/world/bentobox/bentobox/database/yaml/YamlDatabaseHandler.java @@ -641,7 +641,7 @@ public class YamlDatabaseHandler extends AbstractDatabaseHandler { .or(Enums.getIfPresent(EntityType.class, "PIG_ZOMBIE").or(EntityType.PIG)); } // Backwards compatibility for upgrade to 1.20.4 - if (name.equals("GRASS")) { + if (name.equals("GRASS") && Enums.getIfPresent(EntityType.class, "SHORT_GRASS").isPresent()) { return Enums.getIfPresent(EntityType.class, "SHORT_GRASS"); } value = Enum.valueOf(enumClass, name); diff --git a/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/PasteHandlerImpl.java b/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/PasteHandlerImpl.java new file mode 100644 index 000000000..423574eec --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/PasteHandlerImpl.java @@ -0,0 +1,74 @@ +package world.bentobox.bentobox.nms.v1_20_R1; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; + +import net.minecraft.core.BlockPosition; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.chunk.Chunk; +import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBlock; +import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.nms.PasteHandler; +import world.bentobox.bentobox.util.DefaultPasteUtil; +import world.bentobox.bentobox.util.Util; + +public class PasteHandlerImpl implements PasteHandler { + + protected static final IBlockData AIR = ((CraftBlockData) Bukkit.createBlockData(Material.AIR)).getState(); + + @Override + public CompletableFuture pasteBlocks(Island island, World world, Map blockMap) { + return blockMap.entrySet().stream().map(entry -> setBlock(island, entry.getKey(), entry.getValue())) + .collect(Collectors.collectingAndThen(Collectors.toList(), + list -> CompletableFuture.allOf(list.toArray(new CompletableFuture[0])))); + } + + @Override + public CompletableFuture pasteEntities(Island island, World world, + Map> entityMap) { + return entityMap.entrySet().stream() + .map(entry -> DefaultPasteUtil.setEntity(island, entry.getKey(), entry.getValue())) + .collect(Collectors.collectingAndThen(Collectors.toList(), + list -> CompletableFuture.allOf(list.toArray(new CompletableFuture[0])))); + } + + /** + * Set the block to the location + * + * @param island - island + * @param location - location + * @param bpBlock - blueprint block + */ + public static CompletableFuture setBlock(Island island, Location location, BlueprintBlock bpBlock) { + return Util.getChunkAtAsync(location).thenRun(() -> { + Block block = location.getBlock(); + // Set the block data - default is AIR + BlockData bd = DefaultPasteUtil.createBlockData(bpBlock); + CraftBlockData craft = (CraftBlockData) bd; + net.minecraft.world.level.World nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); + Chunk nmsChunk = nmsWorld.d(location.getBlockX() >> 4, location.getBlockZ() >> 4); + BlockPosition bp = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + // Setting the block to air before setting to another state prevents some console errors + nmsChunk.a(bp, AIR, false); + nmsChunk.a(bp, craft.getState(), false); + block.setBlockData(bd, false); + DefaultPasteUtil.setBlockState(island, block, bpBlock); + // Set biome + if (bpBlock.getBiome() != null) { + block.setBiome(bpBlock.getBiome()); + } + }); + } +} diff --git a/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/WorldRegeneratorImpl.java b/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/WorldRegeneratorImpl.java new file mode 100644 index 000000000..1219ddc42 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/nms/v1_20_R1/WorldRegeneratorImpl.java @@ -0,0 +1,31 @@ +package world.bentobox.bentobox.nms.v1_20_R1; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R1.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; + +import net.minecraft.core.BlockPosition; +import net.minecraft.world.level.World; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.chunk.Chunk; +import world.bentobox.bentobox.nms.CopyWorldRegenerator; + +public class WorldRegeneratorImpl extends CopyWorldRegenerator { + + private static final IBlockData AIR = ((CraftBlockData) Bukkit.createBlockData(Material.AIR)).getState(); + + @Override + public void setBlockInNativeChunk(org.bukkit.Chunk chunk, int x, int y, int z, BlockData blockData, + boolean applyPhysics) { + CraftBlockData craft = (CraftBlockData) blockData; + World nmsWorld = ((CraftWorld) chunk.getWorld()).getHandle(); + Chunk nmsChunk = nmsWorld.d(chunk.getX(), chunk.getZ()); + BlockPosition bp = new BlockPosition((chunk.getX() << 4) + x, y, (chunk.getZ() << 4) + z); + // Setting the block to air before setting to another state prevents some console errors + nmsChunk.a(bp, AIR, applyPhysics); + nmsChunk.a(bp, craft.getState(), applyPhysics); + } + +} \ No newline at end of file diff --git a/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/PasteHandlerImpl.java b/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/PasteHandlerImpl.java new file mode 100644 index 000000000..a3c837f9c --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/PasteHandlerImpl.java @@ -0,0 +1,74 @@ +package world.bentobox.bentobox.nms.v1_20_R2; + +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.stream.Collectors; + +import org.bukkit.Bukkit; +import org.bukkit.Location; +import org.bukkit.Material; +import org.bukkit.World; +import org.bukkit.block.Block; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; + +import net.minecraft.core.BlockPosition; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.chunk.Chunk; +import world.bentobox.bentobox.blueprints.dataobjects.BlueprintBlock; +import world.bentobox.bentobox.blueprints.dataobjects.BlueprintEntity; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.nms.PasteHandler; +import world.bentobox.bentobox.util.DefaultPasteUtil; +import world.bentobox.bentobox.util.Util; + +public class PasteHandlerImpl implements PasteHandler { + + protected static final IBlockData AIR = ((CraftBlockData) Bukkit.createBlockData(Material.AIR)).getState(); + + @Override + public CompletableFuture pasteBlocks(Island island, World world, Map blockMap) { + return blockMap.entrySet().stream().map(entry -> setBlock(island, entry.getKey(), entry.getValue())) + .collect(Collectors.collectingAndThen(Collectors.toList(), + list -> CompletableFuture.allOf(list.toArray(new CompletableFuture[0])))); + } + + @Override + public CompletableFuture pasteEntities(Island island, World world, + Map> entityMap) { + return entityMap.entrySet().stream() + .map(entry -> DefaultPasteUtil.setEntity(island, entry.getKey(), entry.getValue())) + .collect(Collectors.collectingAndThen(Collectors.toList(), + list -> CompletableFuture.allOf(list.toArray(new CompletableFuture[0])))); + } + + /** + * Set the block to the location + * + * @param island - island + * @param location - location + * @param bpBlock - blueprint block + */ + public static CompletableFuture setBlock(Island island, Location location, BlueprintBlock bpBlock) { + return Util.getChunkAtAsync(location).thenRun(() -> { + Block block = location.getBlock(); + // Set the block data - default is AIR + BlockData bd = DefaultPasteUtil.createBlockData(bpBlock); + CraftBlockData craft = (CraftBlockData) bd; + net.minecraft.world.level.World nmsWorld = ((CraftWorld) location.getWorld()).getHandle(); + Chunk nmsChunk = nmsWorld.d(location.getBlockX() >> 4, location.getBlockZ() >> 4); + BlockPosition bp = new BlockPosition(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + // Setting the block to air before setting to another state prevents some console errors + nmsChunk.a(bp, AIR, false); + nmsChunk.a(bp, craft.getState(), false); + block.setBlockData(bd, false); + DefaultPasteUtil.setBlockState(island, block, bpBlock); + // Set biome + if (bpBlock.getBiome() != null) { + block.setBiome(bpBlock.getBiome()); + } + }); + } +} diff --git a/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/WorldRegeneratorImpl.java b/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/WorldRegeneratorImpl.java new file mode 100644 index 000000000..1646892f0 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/nms/v1_20_R2/WorldRegeneratorImpl.java @@ -0,0 +1,31 @@ +package world.bentobox.bentobox.nms.v1_20_R2; + +import org.bukkit.Bukkit; +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; +import org.bukkit.craftbukkit.v1_20_R2.CraftWorld; +import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; + +import net.minecraft.core.BlockPosition; +import net.minecraft.world.level.World; +import net.minecraft.world.level.block.state.IBlockData; +import net.minecraft.world.level.chunk.Chunk; +import world.bentobox.bentobox.nms.CopyWorldRegenerator; + +public class WorldRegeneratorImpl extends CopyWorldRegenerator { + + private static final IBlockData AIR = ((CraftBlockData) Bukkit.createBlockData(Material.AIR)).getState(); + + @Override + public void setBlockInNativeChunk(org.bukkit.Chunk chunk, int x, int y, int z, BlockData blockData, + boolean applyPhysics) { + CraftBlockData craft = (CraftBlockData) blockData; + World nmsWorld = ((CraftWorld) chunk.getWorld()).getHandle(); + Chunk nmsChunk = nmsWorld.d(chunk.getX(), chunk.getZ()); + BlockPosition bp = new BlockPosition((chunk.getX() << 4) + x, y, (chunk.getZ() << 4) + z); + // Setting the block to air before setting to another state prevents some console errors + nmsChunk.a(bp, AIR, applyPhysics); + nmsChunk.a(bp, craft.getState(), applyPhysics); + } + +} \ No newline at end of file