diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 5926f3a57..bee920ea9 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -40,3 +40,27 @@ jobs: env: ORG_GRADLE_PROJECT_sonatypeUsername: ${{ secrets.SONATYPE_USERNAME }} ORG_GRADLE_PROJECT_sonatypePassword: ${{ secrets.SONATYPE_PASSWORD }} + - name: Publish core javadoc + if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}} + uses: cpina/github-action-push-to-another-repository@main + env: + SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} + with: + source-directory: 'Core/build/docs/javadoc' + destination-github-username: 'IntellectualSites' + destination-repository-name: 'plotsquared-javadocs' + user-email: ${{ secrets.USER_EMAIL }} + target-branch: main + target-directory: core + - name: Publish bukkit javadoc + if: ${{ runner.os == 'Linux' && env.STATUS == 'release' && github.event_name == 'push' && github.ref == 'refs/heads/v6'}} + uses: cpina/github-action-push-to-another-repository@main + env: + SSH_DEPLOY_KEY: ${{ secrets.SSH_DEPLOY_KEY }} + with: + source-directory: 'Bukkit/build/docs/javadoc' + destination-github-username: 'IntellectualSites' + destination-repository-name: 'plotsquared-javadocs' + user-email: ${{ secrets.USER_EMAIL }} + target-branch: main + target-directory: bukkit diff --git a/Bukkit/build.gradle.kts b/Bukkit/build.gradle.kts index 3f8edbfc5..e0163a17f 100644 --- a/Bukkit/build.gradle.kts +++ b/Bukkit/build.gradle.kts @@ -99,7 +99,7 @@ tasks { val opt = options as StandardJavadocDocletOptions opt.links("https://jd.papermc.io/paper/1.18/") opt.links("https://docs.enginehub.org/javadoc/com.sk89q.worldedit/worldedit-bukkit/" + libs.worldeditBukkit.get().versionConstraint.toString()) - opt.links("https://javadoc.io/doc/com.plotsquared/PlotSquared-Core/latest/") + opt.links("https://intellectualsites.github.io/plotsquared-javadocs/core/") opt.links("https://jd.adventure.kyori.net/api/4.9.3/") opt.links("https://google.github.io/guice/api-docs/" + libs.guice.get().versionConstraint.toString() + "/javadoc/") opt.links("https://checkerframework.org/api/") diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java index d75adc2cc..3a41fb84a 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener.java @@ -108,11 +108,20 @@ import org.checkerframework.checker.nullness.qual.NonNull; import java.util.Iterator; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.UUID; @SuppressWarnings("unused") public class BlockEventListener implements Listener { + private static final Set PISTONS = Set.of( + Material.PISTON, + Material.STICKY_PISTON + ); + private static final Set PHYSICS_BLOCKS = Set.of( + Material.TURTLE_EGG, + Material.TURTLE_SPAWN_EGG + ); private final PlotAreaManager plotAreaManager; private final WorldEdit worldEdit; @@ -218,48 +227,31 @@ public class BlockEventListener implements Listener { plot.debug("Prevented block physics and resent block change because disable-physics = true"); return; } - switch (event.getChangedType()) { - case COMPARATOR: { - if (!plot.getFlag(RedstoneFlag.class)) { - event.setCancelled(true); - plot.debug("Prevented comparator update because redstone = false"); - } - return; + if (event.getChangedType() == Material.COMPARATOR) { + if (!plot.getFlag(RedstoneFlag.class)) { + event.setCancelled(true); + plot.debug("Prevented comparator update because redstone = false"); } - case ANVIL: - case DRAGON_EGG: - case GRAVEL: - case SAND: - case TURTLE_EGG: - case TURTLE_HELMET: - case TURTLE_SPAWN_EGG: { - if (plot.getFlag(DisablePhysicsFlag.class)) { - event.setCancelled(true); - plot.debug("Prevented block physics because disable-physics = true"); - } - return; + return; + } + if (PHYSICS_BLOCKS.contains(event.getChangedType())) { + if (plot.getFlag(DisablePhysicsFlag.class)) { + event.setCancelled(true); + plot.debug("Prevented block physics because disable-physics = true"); } - default: - if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { - switch (block.getType()) { - case PISTON, STICKY_PISTON -> { - org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); - switch (piston.getFacing()) { - case EAST -> location = location.add(1, 0, 0); - case SOUTH -> location = location.add(-1, 0, 0); - case WEST -> location = location.add(0, 0, 1); - case NORTH -> location = location.add(0, 0, -1); - } - Plot newPlot = area.getOwnedPlotAbs(location); - if (!plot.equals(newPlot)) { - event.setCancelled(true); - plot.debug("Prevented piston update because of invalid edge piston detection"); - return; - } - } - } + return; + } + if (Settings.Redstone.DETECT_INVALID_EDGE_PISTONS) { + if (PISTONS.contains(block.getType())) { + org.bukkit.block.data.Directional piston = (org.bukkit.block.data.Directional) block.getBlockData(); + final BlockFace facing = piston.getFacing(); + location = location.add(facing.getModX(), facing.getModY(), facing.getModZ()); + Plot newPlot = area.getOwnedPlotAbs(location); + if (!plot.equals(newPlot)) { + event.setCancelled(true); + plot.debug("Prevented piston update because of invalid edge piston detection"); } - break; + } } } @@ -572,21 +564,18 @@ public class BlockEventListener implements Listener { event.setCancelled(true); return; } - switch (event.getNewState().getType()) { - case SNOW: - case SNOW_BLOCK: - if (!plot.getFlag(SnowFormFlag.class)) { - plot.debug("Snow could not form because snow-form = false"); - event.setCancelled(true); - } - return; - case ICE: - case FROSTED_ICE: - case PACKED_ICE: - if (!plot.getFlag(IceFormFlag.class)) { - plot.debug("Ice could not form because ice-form = false"); - event.setCancelled(true); - } + if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) { + if (!plot.getFlag(SnowFormFlag.class)) { + plot.debug("Snow could not form because snow-form = false"); + event.setCancelled(true); + } + return; + } + if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) { + if (!plot.getFlag(IceFormFlag.class)) { + plot.debug("Ice could not form because ice-form = false"); + event.setCancelled(true); + } } } @@ -607,18 +596,12 @@ public class BlockEventListener implements Listener { return; } Class> flag; - switch (event.getNewState().getType()) { - case SNOW: - case SNOW_BLOCK: - flag = SnowFormFlag.class; - break; - case ICE: - case FROSTED_ICE: - case PACKED_ICE: - flag = IceFormFlag.class; - break; - default: - return; // other blocks are ignored by this event + if (org.bukkit.Tag.SNOW.isTagged(event.getNewState().getType())) { + flag = SnowFormFlag.class; + } else if (org.bukkit.Tag.ICE.isTagged(event.getNewState().getType())) { + flag = IceFormFlag.class; + } else { + return; } boolean allowed = plot.getFlag(flag); Entity entity = event.getEntity(); @@ -722,50 +705,33 @@ public class BlockEventListener implements Listener { event.setCancelled(true); return; } - switch (block.getType()) { - case ICE: - if (!plot.getFlag(IceMeltFlag.class)) { - plot.debug("Ice could not melt because ice-melt = false"); - event.setCancelled(true); - } - break; - case SNOW: - if (!plot.getFlag(SnowMeltFlag.class)) { - plot.debug("Snow could not melt because snow-melt = false"); - event.setCancelled(true); - } - break; - case FARMLAND: - if (!plot.getFlag(SoilDryFlag.class)) { - plot.debug("Soil could not dry because soil-dry = false"); - event.setCancelled(true); - } - break; - case TUBE_CORAL_BLOCK: - case BRAIN_CORAL_BLOCK: - case BUBBLE_CORAL_BLOCK: - case FIRE_CORAL_BLOCK: - case HORN_CORAL_BLOCK: - case TUBE_CORAL: - case BRAIN_CORAL: - case BUBBLE_CORAL: - case FIRE_CORAL: - case HORN_CORAL: - case TUBE_CORAL_FAN: - case BRAIN_CORAL_FAN: - case BUBBLE_CORAL_FAN: - case FIRE_CORAL_FAN: - case HORN_CORAL_FAN: - case BRAIN_CORAL_WALL_FAN: - case BUBBLE_CORAL_WALL_FAN: - case FIRE_CORAL_WALL_FAN: - case HORN_CORAL_WALL_FAN: - case TUBE_CORAL_WALL_FAN: - if (!plot.getFlag(CoralDryFlag.class)) { - plot.debug("Coral could not dry because coral-dry = false"); - event.setCancelled(true); - } - break; + Material blockType = block.getType(); + if (org.bukkit.Tag.ICE.isTagged(blockType)) { + if (!plot.getFlag(IceMeltFlag.class)) { + plot.debug("Ice could not melt because ice-melt = false"); + event.setCancelled(true); + } + return; + } + if (org.bukkit.Tag.SNOW.isTagged(blockType)) { + if (!plot.getFlag(SnowMeltFlag.class)) { + plot.debug("Snow could not melt because snow-melt = false"); + event.setCancelled(true); + } + return; + } + if (blockType == Material.FARMLAND) { + if (!plot.getFlag(SoilDryFlag.class)) { + plot.debug("Soil could not dry because soil-dry = false"); + event.setCancelled(true); + } + return; + } + if (org.bukkit.Tag.CORAL_BLOCKS.isTagged(blockType) || org.bukkit.Tag.CORALS.isTagged(blockType)) { + if (!plot.getFlag(CoralDryFlag.class)) { + plot.debug("Coral could not dry because coral-dry = false"); + event.setCancelled(true); + } } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java index a4e672959..ccefb86fa 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/BlockEventListener117.java @@ -26,6 +26,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.flag.implementations.CopperOxideFlag; import com.plotsquared.core.plot.flag.implementations.MiscInteractFlag; +import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.entity.Entity; import org.bukkit.entity.Item; @@ -39,11 +40,31 @@ import org.bukkit.event.block.BlockReceiveGameEvent; import java.util.List; import java.util.Objects; +import java.util.Set; import java.util.UUID; @SuppressWarnings("unused") public class BlockEventListener117 implements Listener { + private static final Set COPPER_OXIDIZING = Set.of( + Material.COPPER_BLOCK, + Material.EXPOSED_COPPER, + Material.WEATHERED_COPPER, + Material.OXIDIZED_COPPER, + Material.CUT_COPPER, + Material.EXPOSED_CUT_COPPER, + Material.WEATHERED_CUT_COPPER, + Material.OXIDIZED_CUT_COPPER, + Material.CUT_COPPER_STAIRS, + Material.EXPOSED_CUT_COPPER_STAIRS, + Material.WEATHERED_CUT_COPPER_STAIRS, + Material.OXIDIZED_CUT_COPPER_STAIRS, + Material.CUT_COPPER_SLAB, + Material.EXPOSED_CUT_COPPER_SLAB, + Material.WEATHERED_CUT_COPPER_SLAB, + Material.OXIDIZED_CUT_COPPER_SLAB + ); + @Inject public BlockEventListener117() { } @@ -148,27 +169,11 @@ public class BlockEventListener117 implements Listener { if (plot == null) { return; } - switch (event.getNewState().getType()) { - case COPPER_BLOCK: - case EXPOSED_COPPER: - case WEATHERED_COPPER: - case OXIDIZED_COPPER: - case CUT_COPPER: - case EXPOSED_CUT_COPPER: - case WEATHERED_CUT_COPPER: - case OXIDIZED_CUT_COPPER: - case CUT_COPPER_STAIRS: - case EXPOSED_CUT_COPPER_STAIRS: - case WEATHERED_CUT_COPPER_STAIRS: - case OXIDIZED_CUT_COPPER_STAIRS: - case CUT_COPPER_SLAB: - case EXPOSED_CUT_COPPER_SLAB: - case WEATHERED_CUT_COPPER_SLAB: - case OXIDIZED_CUT_COPPER_SLAB: - if (!plot.getFlag(CopperOxideFlag.class)) { - plot.debug("Copper could not oxide because copper-oxide = false"); - event.setCancelled(true); - } + if (COPPER_OXIDIZING.contains(event.getNewState().getType())) { + if (!plot.getFlag(CopperOxideFlag.class)) { + plot.debug("Copper could not oxide because copper-oxide = false"); + event.setCancelled(true); + } } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java index 72dca3031..77d694379 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/EntitySpawnListener.java @@ -124,17 +124,17 @@ public class EntitySpawnListener implements Listener { return; } Plot plot = location.getOwnedPlotAbs(); + EntityType type = entity.getType(); if (plot == null) { - EntityType type = entity.getType(); if (!area.isMobSpawning()) { - switch (type) { - case DROPPED_ITEM: - if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { - event.setCancelled(true); - return; - } - case PLAYER: - return; + if (type == EntityType.PLAYER) { + return; + } + if (type == EntityType.DROPPED_ITEM) { + if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { + event.setCancelled(true); + } + return; } if (type.isAlive()) { event.setCancelled(true); @@ -148,15 +148,16 @@ public class EntitySpawnListener implements Listener { if (Settings.Done.RESTRICT_BUILDING && DoneFlag.isDone(plot)) { event.setCancelled(true); } - switch (entity.getType()) { - case ENDER_CRYSTAL: - if (BukkitEntityUtil.checkEntity(entity, plot)) { - event.setCancelled(true); - } - case SHULKER: - if (!entity.hasMetadata("shulkerPlot")) { - entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); - } + if (type == EntityType.ENDER_CRYSTAL) { + if (BukkitEntityUtil.checkEntity(entity, plot)) { + event.setCancelled(true); + } + return; + } + if (type == EntityType.SHULKER) { + if (!entity.hasMetadata("shulkerPlot")) { + entity.setMetadata("shulkerPlot", new FixedMetadataValue((Plugin) PlotSquared.platform(), plot.getId())); + } } } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java index b652ca36e..c6187ba2f 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PaperListener.java @@ -232,15 +232,15 @@ public class PaperListener implements Listener { if (plot == null) { EntityType type = event.getType(); if (!area.isMobSpawning()) { - switch (type) { - case DROPPED_ITEM: - if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { - event.setShouldAbortSpawn(true); - event.setCancelled(true); - return; - } - case PLAYER: - return; + if (type == EntityType.PLAYER) { + return; + } + if (type == EntityType.DROPPED_ITEM) { + if (Settings.Enabled_Components.KILL_ROAD_ITEMS) { + event.setShouldAbortSpawn(true); + event.setCancelled(true); + } + return; } if (type.isAlive()) { event.setShouldAbortSpawn(true); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java index 6e61600e6..16ba1f2dc 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/listener/PlayerEventListener.java @@ -82,7 +82,6 @@ import net.kyori.adventure.text.minimessage.tag.Tag; import net.kyori.adventure.text.minimessage.tag.resolver.TagResolver; import net.kyori.adventure.text.minimessage.tag.standard.StandardTags; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.FluidCollisionMode; import org.bukkit.Material; import org.bukkit.block.Block; @@ -160,6 +159,20 @@ import java.util.UUID; @SuppressWarnings("unused") public class PlayerEventListener extends PlotListener implements Listener { + private static final Set MINECARTS = Set.of( + Material.MINECART, + Material.TNT_MINECART, + Material.CHEST_MINECART, + Material.COMMAND_BLOCK_MINECART, + Material.FURNACE_MINECART, + Material.HOPPER_MINECART + ); + private static final Set BOOKS = Set.of( + Material.BOOK, + Material.KNOWLEDGE_BOOK, + Material.WRITABLE_BOOK, + Material.WRITTEN_BOOK + ); private final EventDispatcher eventDispatcher; private final WorldEdit worldEdit; private final PlotAreaManager plotAreaManager; @@ -829,10 +842,10 @@ public class PlayerEventListener extends PlotListener implements Listener { if ((slot > 8) || !event.getEventName().equals("InventoryCreativeEvent")) { return; } - ItemStack current = inv.getItemInHand(); + ItemStack oldItem = inv.getItemInHand(); + ItemMeta oldMeta = oldItem.getItemMeta(); ItemStack newItem = event.getCursor(); ItemMeta newMeta = newItem.getItemMeta(); - ItemMeta oldMeta = newItem.getItemMeta(); if (event.getClick() == ClickType.CREATIVE) { final Plot plot = pp.getCurrentPlot(); @@ -872,34 +885,26 @@ public class PlayerEventListener extends PlotListener implements Listener { oldLore = lore.toString(); } } - if (!"[(+NBT)]".equals(newLore) || (current.equals(newItem) && newLore.equals(oldLore))) { - switch (newItem.getType()) { - case LEGACY_BANNER: - case PLAYER_HEAD: - if (newMeta != null) { - break; - } - default: - return; + Material itemType = newItem.getType(); + if (!"[(+NBT)]".equals(newLore) || (oldItem.equals(newItem) && newLore.equals(oldLore))) { + if (newMeta == null || (itemType != Material.LEGACY_BANNER && itemType != Material.PLAYER_HEAD)) { + return; } } Block block = player.getTargetBlock(null, 7); org.bukkit.block.BlockState state = block.getState(); Material stateType = state.getType(); - Material itemType = newItem.getType(); if (stateType != itemType) { - switch (stateType) { - case LEGACY_STANDING_BANNER: - case LEGACY_WALL_BANNER: - if (itemType == Material.LEGACY_BANNER) { - break; - } - case LEGACY_SKULL: - if (itemType == Material.LEGACY_SKULL_ITEM) { - break; - } - default: + if (stateType == Material.LEGACY_WALL_BANNER || stateType == Material.LEGACY_STANDING_BANNER) { + if (itemType != Material.LEGACY_BANNER) { return; + } + } else if (stateType == Material.LEGACY_SKULL) { + if (itemType != Material.LEGACY_SKULL_ITEM) { + return; + } + } else { + return; } } Location location = BukkitUtil.adapt(state.getLocation()); @@ -947,7 +952,7 @@ public class PlayerEventListener extends PlotListener implements Listener { } } if (cancelled) { - if ((current.getType() == newItem.getType()) && (current.getDurability() == newItem + if ((oldItem.getType() == newItem.getType()) && (oldItem.getDurability() == newItem .getDurability())) { event.setCursor( new ItemStack(newItem.getType(), newItem.getAmount(), newItem.getDurability())); @@ -1143,15 +1148,21 @@ public class PlayerEventListener extends PlotListener implements Listener { //Allow all players to eat while also allowing the block place event ot be fired return; } - switch (type) { - case ACACIA_BOAT, BIRCH_BOAT, CHEST_MINECART, COMMAND_BLOCK_MINECART, DARK_OAK_BOAT, FURNACE_MINECART, HOPPER_MINECART, JUNGLE_BOAT, MINECART, OAK_BOAT, SPRUCE_BOAT, TNT_MINECART -> - eventType = PlayerBlockEventType.PLACE_VEHICLE; - case FIREWORK_ROCKET, FIREWORK_STAR -> eventType = PlayerBlockEventType.SPAWN_MOB; - case BOOK, KNOWLEDGE_BOOK, WRITABLE_BOOK, WRITTEN_BOOK -> eventType = PlayerBlockEventType.READ; - case ARMOR_STAND -> { - location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); - eventType = PlayerBlockEventType.PLACE_MISC; - } + if (type == Material.ARMOR_STAND) { + location = BukkitUtil.adapt(block.getRelative(event.getBlockFace()).getLocation()); + eventType = PlayerBlockEventType.PLACE_MISC; + } + if (org.bukkit.Tag.ITEMS_BOATS.isTagged(type) || MINECARTS.contains(type)) { + eventType = PlayerBlockEventType.PLACE_VEHICLE; + break; + } + if (type == Material.FIREWORK_ROCKET || type == Material.FIREWORK_STAR) { + eventType = PlayerBlockEventType.SPAWN_MOB; + break; + } + if (BOOKS.contains(type)) { + eventType = PlayerBlockEventType.READ; + break; } break; } diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java index bbf4d3f25..3c5b8686c 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java @@ -74,6 +74,9 @@ public class HybridPlotWorld extends ClassicPlotWorld { public short PATH_WIDTH_UPPER; public HashMap G_SCH; public HashMap G_SCH_B; + /** + * The Y level at which schematic generation will start, lowest of either road or plot schematic generation. + */ public int SCHEM_Y; private Location SIGN_LOCATION; private File root = null; @@ -266,33 +269,57 @@ public class HybridPlotWorld extends ClassicPlotWorld { int oddshift = (this.ROAD_WIDTH & 1); SCHEM_Y = schematicStartHeight(); + + // plotY and roadY are important to allow plot and/or road schematic "overflow" into each other without causing AIOOB + // exceptions when attempting either to set blocks to, or get block from G_SCH + // Default plot schematic start height, normalized to the minimum height schematics are pasted from. int plotY = PLOT_HEIGHT - SCHEM_Y; int minRoadWall = Settings.Schematics.USE_WALL_IN_ROAD_SCHEM_HEIGHT ? Math.min(ROAD_HEIGHT, WALL_HEIGHT) : ROAD_HEIGHT; + // Default road schematic start height, normalized to the minimum height schematics are pasted from. int roadY = minRoadWall - SCHEM_Y; - int worldHeight = getMaxGenHeight() - getMinGenHeight() + 1; + int worldGenHeight = getMaxGenHeight() - getMinGenHeight() + 1; + + int maxSchematicHeight = 0; // SCHEM_Y should be normalised to the plot "start" height if (schematic3 != null) { - if (schematic3.getClipboard().getDimensions().getY() == worldHeight) { - SCHEM_Y = plotY = 0; + if ((maxSchematicHeight = schematic3.getClipboard().getDimensions().getY()) == worldGenHeight) { + SCHEM_Y = getMinGenHeight(); + plotY = 0; } else if (!Settings.Schematics.PASTE_ON_TOP) { - SCHEM_Y = plotY = getMinBuildHeight() - getMinGenHeight(); + SCHEM_Y = getMinBuildHeight(); + plotY = 0; } } if (schematic1 != null) { - if (schematic1.getClipboard().getDimensions().getY() == worldHeight) { - SCHEM_Y = roadY = getMinGenHeight(); - if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight - && !Settings.Schematics.PASTE_ON_TOP) { - plotY = PLOT_HEIGHT; + if ((maxSchematicHeight = Math.max( + schematic1.getClipboard().getDimensions().getY(), + maxSchematicHeight + )) == worldGenHeight) { + SCHEM_Y = getMinGenHeight(); + roadY = 0; // Road is the lowest schematic + if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldGenHeight) { + // Road is the lowest schematic. Normalize plotY to it. + if (Settings.Schematics.PASTE_ON_TOP) { + plotY = PLOT_HEIGHT - getMinGenHeight(); + } else { + plotY = getMinBuildHeight() - getMinGenHeight(); + } } } else if (!Settings.Schematics.PASTE_ROAD_ON_TOP) { - SCHEM_Y = roadY = getMinBuildHeight(); - if (schematic3 != null && schematic3.getClipboard().getDimensions().getY() != worldHeight - && !Settings.Schematics.PASTE_ON_TOP) { - plotY = PLOT_HEIGHT; + if (SCHEM_Y == getMinGenHeight()) { // Only possible if plot schematic is enabled + // Plot is still the lowest schematic, normalize roadY to it + roadY = getMinBuildHeight() - getMinGenHeight(); + } else if (schematic3 != null) { + SCHEM_Y = getMinBuildHeight(); + roadY = 0;// Road is the lowest schematic + if (Settings.Schematics.PASTE_ON_TOP) { + // Road is the lowest schematic. Normalize plotY to it. + plotY = PLOT_HEIGHT - getMinBuildHeight(); + } + // If plot schematic is not paste-on-top, it will be from min build height thus plotY = 0 as well already. } } } @@ -330,17 +357,15 @@ public class HybridPlotWorld extends ClassicPlotWorld { y + min.getBlockY(), z + min.getBlockZ() )); - if (!id.getBlockType().getMaterial().isAir()) { - schem3PopulationNeeded |= id.hasNbtData(); - addOverlayBlock( - (short) (x + shift + oddshift + centerShiftX), - (short) (y + plotY), - (short) (z + shift + oddshift + centerShiftZ), - id, - false, - h3 - ); - } + schem3PopulationNeeded |= id.hasNbtData(); + addOverlayBlock( + (short) (x + shift + oddshift + centerShiftX), + (short) (y + plotY), + (short) (z + shift + oddshift + centerShiftZ), + id, + false, + maxSchematicHeight + ); } if (blockArrayClipboard3.hasBiomes()) { BiomeType biome = blockArrayClipboard3.getBiome(BlockVector2.at( @@ -390,18 +415,23 @@ public class HybridPlotWorld extends ClassicPlotWorld { y + min.getBlockY(), z + min.getBlockZ() )); - if (!id.getBlockType().getMaterial().isAir()) { - schem1PopulationNeeded |= id.hasNbtData(); - addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z + shift + oddshift), id, false, h1); - addOverlayBlock( - (short) (z + shift + oddshift), - (short) (y + roadY), - (short) (shift - x + (oddshift - 1)), - id, - true, - h1 - ); - } + schem1PopulationNeeded |= id.hasNbtData(); + addOverlayBlock( + (short) (x - shift), + (short) (y + roadY), + (short) (z + shift + oddshift), + id, + false, + maxSchematicHeight + ); + addOverlayBlock( + (short) (z + shift + oddshift), + (short) (y + roadY), + (short) (shift - x + (oddshift - 1)), + id, + true, + maxSchematicHeight + ); } if (blockArrayClipboard1.hasBiomes()) { BiomeType biome = blockArrayClipboard1.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); @@ -429,10 +459,15 @@ public class HybridPlotWorld extends ClassicPlotWorld { y + min.getBlockY(), z + min.getBlockZ() )); - if (!id.getBlockType().getMaterial().isAir()) { - schem2PopulationNeeded |= id.hasNbtData(); - addOverlayBlock((short) (x - shift), (short) (y + roadY), (short) (z - shift), id, false, h2); - } + schem2PopulationNeeded |= id.hasNbtData(); + addOverlayBlock( + (short) (x - shift), + (short) (y + roadY), + (short) (z - shift), + id, + false, + maxSchematicHeight + ); } if (blockArrayClipboard2.hasBiomes()) { BiomeType biome = blockArrayClipboard2.getBiome(BlockVector2.at(x + min.getBlockX(), z + min.getBlockZ())); @@ -442,6 +477,10 @@ public class HybridPlotWorld extends ClassicPlotWorld { } } + /** + * @deprecated This method should not be available for public API usage and will be made private. + */ + @Deprecated(forRemoval = true, since = "TODO") public void addOverlayBlock(short x, short y, short z, BaseBlock id, boolean rotate, int height) { if (z < 0) { z += this.SIZE; @@ -468,6 +507,10 @@ public class HybridPlotWorld extends ClassicPlotWorld { existing[y] = id; } + /** + * @deprecated This method should not be available for public API usage and will be made private. + */ + @Deprecated(forRemoval = true, since = "TODO") public void addOverlayBiome(short x, short z, BiomeType id) { if (z < 0) { z += this.SIZE; diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index fc7211dc5..402d84dc5 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,6 @@ [versions] # Platform expectations -paper = "1.18.2-R0.1-SNAPSHOT" -checker-qual = "3.22.0" +paper = "1.19-R0.1-SNAPSHOT" guice = "5.1.0" spotbugs = "4.7.0" @@ -15,7 +14,7 @@ mvdwapi = "3.1.1" # Third party prtree = "2.0.0" aopalliance = "1.0" -cloud-services = "1.6.2" +cloud-services = "1.7.0" arkitektonika = "2.1.1" squirrelid = "0.3.1" http4j = "1.3" @@ -29,7 +28,6 @@ nexus = "1.1.0" [libraries] # Platform expectations paper = { group = "io.papermc.paper", name = "paper-api", version.ref = "paper" } -checkerqual = { group = "org.checkerframework", name = "checker-qual", version.ref = "checker-qual" } # Platform expectations guice = { group = "com.google.inject", name = "guice", version.ref = "guice" }