From b04ab92a78a221e03940a5046a170f65a81807ab Mon Sep 17 00:00:00 2001 From: yoyosource Date: Sat, 5 Feb 2022 18:29:58 +0100 Subject: [PATCH] Update Laufbau Signed-off-by: yoyosource --- .../slaves/laufbau/BlockBoundingBox.java | 110 +++++++++--------- .../features/slaves/laufbau/Cuboid.java | 47 ++------ .../features/slaves/laufbau/Laufbau.java | 12 +- .../slaves/laufbau/LaufbauCommand.java | 1 + .../states/CreatingInnerBlocksState.java | 20 +++- .../states/CreatingOuterBlocksState.java | 29 ++++- .../laufbau/states/SplittingPointsState.java | 4 +- 7 files changed, 123 insertions(+), 100 deletions(-) diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java index f939d857..94c8158d 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/BlockBoundingBox.java @@ -46,21 +46,6 @@ public class BlockBoundingBox { addPixel(Material.GRASS_PATH.createBlockData(), 0, 0, 0, 16, 15, 16); addPixel(Material.SOUL_SAND.createBlockData(), 0, 0, 0, 16, 14, 16); - addPixel(Material.HONEY_BLOCK.createBlockData(), 1, 0, 1, 14, 15, 14); - - Grindstone floorGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); - floorGrindstone.setAttachedFace(FaceAttachable.AttachedFace.FLOOR); - addPixel(floorGrindstone, 2, 0, 2, 12, 16, 12); - - Grindstone northSouthGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); - northSouthGrindstone.setAttachedFace(FaceAttachable.AttachedFace.WALL); - northSouthGrindstone.setFacing(BlockFace.NORTH); - addPixel(northSouthGrindstone, 2, 2, 0, 12, 12, 16); - - Grindstone eastWestGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); - eastWestGrindstone.setAttachedFace(FaceAttachable.AttachedFace.WALL); - eastWestGrindstone.setFacing(BlockFace.EAST); - addPixel(eastWestGrindstone, 0, 2, 2, 16, 12, 12); Hopper hopper = (Hopper) Material.HOPPER.createBlockData(); hopper.setFacing(BlockFace.NORTH); @@ -96,48 +81,19 @@ public class BlockBoundingBox { doubleTurtleEgg.setHatch(0); addPixel(doubleTurtleEgg, 1, 0, 1, 14, 7, 14); - Bell doubleAttachedBellEast = (Bell) Material.BELL.createBlockData(); - doubleAttachedBellEast.setAttachment(Bell.Attachment.DOUBLE_WALL); - doubleAttachedBellEast.setFacing(BlockFace.EAST); - addPixel(doubleAttachedBellEast, 0, 4, 4, 16, 11, 8); + Grindstone floorGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); + floorGrindstone.setAttachedFace(FaceAttachable.AttachedFace.FLOOR); + addPixel(floorGrindstone, 2, 0, 2, 12, 16, 12); - Bell doubleAttachedBellNorth = (Bell) Material.BELL.createBlockData(); - doubleAttachedBellNorth.setAttachment(Bell.Attachment.DOUBLE_WALL); - doubleAttachedBellNorth.setFacing(BlockFace.NORTH); - addPixel(doubleAttachedBellNorth, 4, 4, 0, 8, 11, 16); + Grindstone northSouthGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); + northSouthGrindstone.setAttachedFace(FaceAttachable.AttachedFace.WALL); + northSouthGrindstone.setFacing(BlockFace.NORTH); + addPixel(northSouthGrindstone, 2, 2, 0, 12, 12, 16); - Bell floorBellNorth = (Bell) Material.BELL.createBlockData(); - floorBellNorth.setAttachment(Bell.Attachment.FLOOR); - addPixel(floorBellNorth, 0, 0, 4, 16, 16, 8); - - Bell floorBellEast = (Bell) Material.BELL.createBlockData(); - floorBellEast.setAttachment(Bell.Attachment.FLOOR); - floorBellEast.setFacing(BlockFace.EAST); - addPixel(floorBellEast, 4, 0, 0, 8, 16, 16); - - Bell ceilingBell = (Bell) Material.BELL.createBlockData(); - ceilingBell.setAttachment(Bell.Attachment.CEILING); - addPixel(ceilingBell, 4, 4, 4, 8, 12, 8); - - Bell singleAttachedBellNorth = (Bell) Material.BELL.createBlockData(); - singleAttachedBellNorth.setAttachment(Bell.Attachment.SINGLE_WALL); - singleAttachedBellNorth.setFacing(BlockFace.NORTH); - addPixel(singleAttachedBellNorth, 4, 4, 0, 8, 11, 13); - - Bell singleAttachedBellSouth = (Bell) Material.BELL.createBlockData(); - singleAttachedBellSouth.setAttachment(Bell.Attachment.SINGLE_WALL); - singleAttachedBellSouth.setFacing(BlockFace.SOUTH); - addPixel(singleAttachedBellSouth, 4, 4, 3, 8, 11, 13); - - Bell singleAttachedBellWest = (Bell) Material.BELL.createBlockData(); - singleAttachedBellWest.setAttachment(Bell.Attachment.SINGLE_WALL); - singleAttachedBellWest.setFacing(BlockFace.WEST); - addPixel(singleAttachedBellWest, 0, 4, 4, 13, 11, 8); - - Bell singleAttachedBellEast = (Bell) Material.BELL.createBlockData(); - singleAttachedBellEast.setAttachment(Bell.Attachment.SINGLE_WALL); - singleAttachedBellEast.setFacing(BlockFace.EAST); - addPixel(singleAttachedBellEast, 3, 4, 4, 13, 11, 8); + Grindstone eastWestGrindstone = (Grindstone) Material.GRINDSTONE.createBlockData(); + eastWestGrindstone.setAttachedFace(FaceAttachable.AttachedFace.WALL); + eastWestGrindstone.setFacing(BlockFace.EAST); + addPixel(eastWestGrindstone, 0, 2, 2, 16, 12, 12); addPixel(Material.CHEST.createBlockData(), 1, 0, 1, 14, 14, 14); @@ -210,6 +166,49 @@ public class BlockBoundingBox { singleSeaPickle.setPickles(1); addPixel(singleSeaPickle, 6, 0, 6, 4, 6, 4); + Bell doubleAttachedBellEast = (Bell) Material.BELL.createBlockData(); + doubleAttachedBellEast.setAttachment(Bell.Attachment.DOUBLE_WALL); + doubleAttachedBellEast.setFacing(BlockFace.EAST); + addPixel(doubleAttachedBellEast, 0, 4, 4, 16, 11, 8); + + Bell doubleAttachedBellNorth = (Bell) Material.BELL.createBlockData(); + doubleAttachedBellNorth.setAttachment(Bell.Attachment.DOUBLE_WALL); + doubleAttachedBellNorth.setFacing(BlockFace.NORTH); + addPixel(doubleAttachedBellNorth, 4, 4, 0, 8, 11, 16); + + Bell floorBellNorth = (Bell) Material.BELL.createBlockData(); + floorBellNorth.setAttachment(Bell.Attachment.FLOOR); + addPixel(floorBellNorth, 0, 0, 4, 16, 16, 8); + + Bell floorBellEast = (Bell) Material.BELL.createBlockData(); + floorBellEast.setAttachment(Bell.Attachment.FLOOR); + floorBellEast.setFacing(BlockFace.EAST); + addPixel(floorBellEast, 4, 0, 0, 8, 16, 16); + + Bell ceilingBell = (Bell) Material.BELL.createBlockData(); + ceilingBell.setAttachment(Bell.Attachment.CEILING); + addPixel(ceilingBell, 4, 4, 4, 8, 12, 8); + + Bell singleAttachedBellNorth = (Bell) Material.BELL.createBlockData(); + singleAttachedBellNorth.setAttachment(Bell.Attachment.SINGLE_WALL); + singleAttachedBellNorth.setFacing(BlockFace.NORTH); + addPixel(singleAttachedBellNorth, 4, 4, 0, 8, 11, 13); + + Bell singleAttachedBellSouth = (Bell) Material.BELL.createBlockData(); + singleAttachedBellSouth.setAttachment(Bell.Attachment.SINGLE_WALL); + singleAttachedBellSouth.setFacing(BlockFace.SOUTH); + addPixel(singleAttachedBellSouth, 4, 4, 3, 8, 11, 13); + + Bell singleAttachedBellWest = (Bell) Material.BELL.createBlockData(); + singleAttachedBellWest.setAttachment(Bell.Attachment.SINGLE_WALL); + singleAttachedBellWest.setFacing(BlockFace.WEST); + addPixel(singleAttachedBellWest, 0, 4, 4, 13, 11, 8); + + Bell singleAttachedBellEast = (Bell) Material.BELL.createBlockData(); + singleAttachedBellEast.setAttachment(Bell.Attachment.SINGLE_WALL); + singleAttachedBellEast.setFacing(BlockFace.EAST); + addPixel(singleAttachedBellEast, 3, 4, 4, 13, 11, 8); + addPixel(Material.FLOWER_POT.createBlockData(), 5, 0, 5, 6, 6, 6); addPixel(Material.DAYLIGHT_DETECTOR.createBlockData(), 0, 0, 0, 16, 6, 16); @@ -230,6 +229,7 @@ public class BlockBoundingBox { snowLayers2.setLayers(2); addPixel(snowLayers2, 0, 0, 0, 16, 2, 16); + addPixel(Material.LILY_PAD.createBlockData(), 1, 0, 1, 14, 1.5, 14); addPixel(Material.WHITE_CARPET.createBlockData(), 0, 0, 0, 16, 1, 16); Directional endRodBottomTop = (Directional) Material.END_ROD.createBlockData(); diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Cuboid.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Cuboid.java index fb8b8633..862c3af5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Cuboid.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Cuboid.java @@ -34,47 +34,18 @@ public class Cuboid { private double dz; public boolean intersects(Cuboid cuboid) { - Cuboid helpCuboid = helpIntersect(cuboid); - Cuboid c1 = helpIntersect(helpCuboid); - Cuboid c2 = cuboid.helpIntersect(c1); - - if (c1.dx == 0 && c2.dx == 0) { - return false; - } - if (c1.dy == 0 && c2.dy == 0) { - return false; - } - if (c1.dz == 0 && c2.dz == 0) { - return false; - } - return c1.equals(c2); - } - - private Cuboid helpIntersect(Cuboid cuboid) { - double minX = Math.max(x, cuboid.x); - double minY = Math.max(y, cuboid.y); - double minZ = Math.max(z, cuboid.z); - double maxX = Math.min(x + dx, cuboid.x + cuboid.dx); - double maxY = Math.min(y + dy, cuboid.y + cuboid.dy); - double maxZ = Math.min(z + dz, cuboid.z + cuboid.dz); - - double nx = round(Math.min(minX, maxX)); - double ny = round(Math.min(minY, maxY)); - double nz = round(Math.min(minZ, maxZ)); - double dx = round(Math.max(minX, maxX) - nx); - double dy = round(Math.max(minY, maxY) - ny); - double dz = round(Math.max(minZ, maxZ) - nz); - return new Cuboid(nx, ny, nz, dx, dy, dz); - } - - private static double round(double value) { - value *= 100000000000000L; - value = Math.round(value); - value /= 100000000000000L; - return value; + return expand(cuboid).hasInside(cuboid); } public Cuboid add(Point point) { return new Cuboid(x + point.getX(), y + point.getY(), z + point.getZ(), dx, dy, dz); } + + public Cuboid expand(Cuboid cuboid) { + return new Cuboid(x - cuboid.dx, y - cuboid.dy, z - cuboid.dz, dx + cuboid.dx, dy + cuboid.dy, dz + cuboid.dz); + } + + public boolean hasInside(Cuboid cuboid) { + return x <= cuboid.x && x + dx >= cuboid.x && y <= cuboid.y && y + dy >= cuboid.y && z <= cuboid.z && z + dz >= cuboid.z; + } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Laufbau.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Laufbau.java index 074e5c27..afb17a26 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Laufbau.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/Laufbau.java @@ -19,7 +19,10 @@ package de.steamwar.bausystem.features.slaves.laufbau; +import com.sk89q.worldedit.EditSession; +import de.steamwar.bausystem.features.slaves.WorldEditUtils; import de.steamwar.bausystem.features.slaves.laufbau.states.*; +import lombok.Getter; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -41,6 +44,9 @@ public class Laufbau { private CreatingInnerBlocksState creatingInnerBlocksState = null; private CreatingOuterBlocksState creatingOuterBlocksState = null; + @Getter + private EditSession editSession; + public Laufbau(Location pos1, Location pos2, boolean preferingBlastResistance) { this.world = pos1.getWorld(); this.pos1 = new Location(world, Math.min(pos1.getBlockX(), pos2.getBlockX()), Math.min(pos1.getBlockY(), pos2.getBlockY()), Math.min(pos1.getBlockZ(), pos2.getBlockZ())); @@ -49,6 +55,8 @@ public class Laufbau { this.preferingBlastResistance = preferingBlastResistance; filteringTracesState = new FilteringTracesState(world, this::inRegion); + + editSession = WorldEditUtils.getEditSession(world); } private LaufbauState getActive() { @@ -78,11 +86,11 @@ public class Laufbau { return; } if (creatingInnerBlocksState != null) { - creatingOuterBlocksState = new CreatingOuterBlocksState(shrinkingOuterPointsState.getShrunkOuterPoints(), world); + creatingOuterBlocksState = new CreatingOuterBlocksState(shrinkingOuterPointsState.getShrunkOuterPoints(), world, editSession); return; } if (shrinkingOuterPointsState != null) { - creatingInnerBlocksState = new CreatingInnerBlocksState(splittingPointsState.getInnerPoints(), world, processingTracesState.getCuboidList(), splittingPointsState.getIntersectedCuboid(), preferingBlastResistance); + creatingInnerBlocksState = new CreatingInnerBlocksState(splittingPointsState.getInnerPoints(), world, processingTracesState.getCuboidList(), splittingPointsState.getIntersectedCuboid(), editSession, preferingBlastResistance); return; } if (splittingPointsState != null) { diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java index 7c438be1..933beb42 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/LaufbauCommand.java @@ -80,6 +80,7 @@ public class LaufbauCommand extends SWCommand { while (true) { if (!laufbau.hasNext()) { BauSystem.MESSAGE.send("LAUFBAU_DONE", player); + WorldEditUtils.addToPlayer(player, laufbau.getEditSession()); cancel(); return; } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingInnerBlocksState.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingInnerBlocksState.java index 5ef5f6aa..ef43cafd 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingInnerBlocksState.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingInnerBlocksState.java @@ -19,11 +19,13 @@ package de.steamwar.bausystem.features.slaves.laufbau.states; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.features.slaves.laufbau.BlockBoundingBox; import de.steamwar.bausystem.features.slaves.laufbau.Cuboid; import de.steamwar.bausystem.region.Point; -import org.bukkit.Bukkit; import org.bukkit.Location; import org.bukkit.World; import org.bukkit.block.data.BlockData; @@ -41,13 +43,15 @@ public class CreatingInnerBlocksState implements LaufbauState { private World world; private List cuboidList; private Map> intersectedCuboid; + private EditSession editSession; private boolean preferingBlastResistance; - public CreatingInnerBlocksState(List innerBlocks, World world, List cuboidList, Map> intersectedCuboid, boolean preferingBlastResistance) { + public CreatingInnerBlocksState(List innerBlocks, World world, List cuboidList, Map> intersectedCuboid, EditSession editSession, boolean preferingBlastResistance) { this.innerBlocks = innerBlocks; this.world = world; this.cuboidList = cuboidList; this.intersectedCuboid = intersectedCuboid; + this.editSession = editSession; this.preferingBlastResistance = preferingBlastResistance; } @@ -112,9 +116,21 @@ public class CreatingInnerBlocksState implements LaufbauState { } } Location location = new Location(world, point.getX(), point.getY(), point.getZ()); + if (!location.getBlock().getType().isAir()) { + return; + } + try { + editSession.setBlock(BukkitAdapter.asBlockVector(location), BukkitAdapter.adapt(highestBlockData)); + location.getBlock().setBlockData(highestBlockData, false); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + // ignored + } + /* BlockData finalHighestBlockData = highestBlockData; Bukkit.getOnlinePlayers().forEach(player -> { player.sendBlockChange(location, finalHighestBlockData); }); + */ } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingOuterBlocksState.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingOuterBlocksState.java index 799a709f..60454b02 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingOuterBlocksState.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/CreatingOuterBlocksState.java @@ -19,6 +19,11 @@ package de.steamwar.bausystem.features.slaves.laufbau.states; +import com.sk89q.worldedit.EditSession; +import com.sk89q.worldedit.MaxChangedBlocksException; +import com.sk89q.worldedit.bukkit.BukkitAdapter; +import com.sk89q.worldedit.world.block.BaseBlock; +import com.sk89q.worldedit.world.block.BlockTypes; import de.steamwar.bausystem.BauSystem; import de.steamwar.bausystem.region.Point; import org.bukkit.Bukkit; @@ -32,14 +37,22 @@ import java.util.List; public class CreatingOuterBlocksState implements LaufbauState { + private static final BaseBlock STONE; + + static { + STONE = BlockTypes.get("minecraft:stone").getDefaultState().toBaseBlock(); + } + private List outerBlocks; private int index = 0; private World world; + private EditSession editSession; - public CreatingOuterBlocksState(List outerBlocks, World world) { + public CreatingOuterBlocksState(List outerBlocks, World world, EditSession editSession) { this.outerBlocks = outerBlocks; this.world = world; + this.editSession = editSession; } @Override @@ -57,10 +70,22 @@ public class CreatingOuterBlocksState implements LaufbauState { Point point = outerBlocks.get(index); index++; - BlockData fullBlock = Material.STONE.createBlockData(); Location location = new Location(world, point.getX(), point.getY(), point.getZ()); + if (!location.getBlock().getType().isAir()) { + return; + } + try { + editSession.setBlock(BukkitAdapter.asBlockVector(location), STONE); + location.getBlock().setType(Material.STONE, false); + } catch (MaxChangedBlocksException e) { + e.printStackTrace(); + // ingored + } + /* + BlockData fullBlock = Material.STONE.createBlockData(); Bukkit.getOnlinePlayers().forEach(player -> { player.sendBlockChange(location, fullBlock); }); + */ } } diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/SplittingPointsState.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/SplittingPointsState.java index 199d9135..b86586d5 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/SplittingPointsState.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/SplittingPointsState.java @@ -29,6 +29,8 @@ import java.util.*; public class SplittingPointsState implements LaufbauState { + private static final Cuboid ONE = new Cuboid(0, 0, 0, 1, 1, 1); + private List blocks; private int totalBlocks; private List cuboidList; @@ -62,7 +64,7 @@ public class SplittingPointsState implements LaufbauState { public void next() { Point point = blocks.remove(0); boolean isInCuboid = false; - Cuboid tempCuboid = new Cuboid(0, 0, 0, 1, 1, 1).add(point); + Cuboid tempCuboid = ONE.add(point); List intersectedCuboids = new ArrayList<>(); for (Cuboid cuboid : cuboidList) { if (cuboid.intersects(tempCuboid)) {