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 233e25f1..9ce54018 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 @@ -241,7 +241,7 @@ public class BlockBoundingBox { addPixel(endRodNorthSouth, 6, 6, 0, 4, 4, 16); Directional endRodEastWest = (Directional) Material.END_ROD.createBlockData(); - endRodNorthSouth.setFacing(BlockFace.EAST); + endRodEastWest.setFacing(BlockFace.EAST); addPixel(endRodEastWest, 0, 6, 6, 16, 4, 4); Waterlogged conduit = (Waterlogged) Material.CONDUIT.createBlockData(); 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 afb17a26..4f957289 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 @@ -28,6 +28,10 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.util.Vector; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; + public class Laufbau { private World world; @@ -44,6 +48,8 @@ public class Laufbau { private CreatingInnerBlocksState creatingInnerBlocksState = null; private CreatingOuterBlocksState creatingOuterBlocksState = null; + private List elements = new ArrayList<>(BlockBoundingBox.elements); + @Getter private EditSession editSession; @@ -57,6 +63,23 @@ public class Laufbau { filteringTracesState = new FilteringTracesState(world, this::inRegion); editSession = WorldEditUtils.getEditSession(world); + + if (preferingBlastResistance) { + elements.sort(Comparator.comparing(blockBoundingBox -> { + double element = 1; + if (blockBoundingBox.cuboid.getDx() != 0) { + element *= blockBoundingBox.cuboid.getDx(); + } + if (blockBoundingBox.cuboid.getDy() != 0) { + element *= blockBoundingBox.cuboid.getDy(); + } + if (blockBoundingBox.cuboid.getDz() != 0) { + element *= blockBoundingBox.cuboid.getDz(); + } + element *= blockBoundingBox.blockData.getMaterial().getBlastResistance(); + return -element; + })); + } } private LaufbauState getActive() { @@ -90,7 +113,7 @@ public class Laufbau { return; } if (shrinkingOuterPointsState != null) { - creatingInnerBlocksState = new CreatingInnerBlocksState(splittingPointsState.getInnerPoints(), world, processingTracesState.getCuboidList(), splittingPointsState.getIntersectedCuboid(), editSession, preferingBlastResistance); + creatingInnerBlocksState = new CreatingInnerBlocksState(splittingPointsState.getInnerPoints(), world, processingTracesState.getCuboidList(), splittingPointsState.getIntersectedCuboid(), editSession, elements, preferingBlastResistance); return; } if (splittingPointsState != null) { 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 ef43cafd..33ea8410 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 @@ -31,9 +31,7 @@ import org.bukkit.World; import org.bukkit.block.data.BlockData; import org.bukkit.entity.Player; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; +import java.util.*; public class CreatingInnerBlocksState implements LaufbauState { @@ -44,14 +42,16 @@ public class CreatingInnerBlocksState implements LaufbauState { private List cuboidList; private Map> intersectedCuboid; private EditSession editSession; + private List elements; private boolean preferingBlastResistance; - public CreatingInnerBlocksState(List innerBlocks, World world, List cuboidList, Map> intersectedCuboid, EditSession editSession, boolean preferingBlastResistance) { + public CreatingInnerBlocksState(List innerBlocks, World world, List cuboidList, Map> intersectedCuboid, EditSession editSession, List elements, boolean preferingBlastResistance) { this.innerBlocks = innerBlocks; this.world = world; this.cuboidList = cuboidList; this.intersectedCuboid = intersectedCuboid; this.editSession = editSession; + this.elements = elements; this.preferingBlastResistance = preferingBlastResistance; } @@ -72,7 +72,7 @@ public class CreatingInnerBlocksState implements LaufbauState { List neededCuboids = intersectedCuboid.get(point); List blockDataWithBoundingBoxList = new ArrayList<>(); - for (BlockBoundingBox blockDataWithBoundingBox : BlockBoundingBox.elements) { + for (BlockBoundingBox blockDataWithBoundingBox : elements) { Cuboid tempCuboid = blockDataWithBoundingBox.cuboid.add(point); List extendedCuboids = null; diff --git a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/ExpandingTracesState.java b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/ExpandingTracesState.java index f8d9e3fd..073965ba 100644 --- a/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/ExpandingTracesState.java +++ b/BauSystem_Main/src/de/steamwar/bausystem/features/slaves/laufbau/states/ExpandingTracesState.java @@ -28,10 +28,7 @@ import org.bukkit.World; import org.bukkit.entity.Player; import org.bukkit.util.Vector; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; +import java.util.*; import java.util.function.BiPredicate; public class ExpandingTracesState implements LaufbauState { @@ -70,7 +67,8 @@ public class ExpandingTracesState implements LaufbauState { for (double z = cuboid.getZ() - 2; z < cuboid.getZ() + cuboid.getDz() + 2; z++) { Location location = new Location(world, x, y, z); if (inRegionCheck.test(new Vector(location.getBlockX(), location.getBlockY(), location.getBlockZ()), 0)) { - blocks.add(new Point(location.getBlockX(), location.getBlockY(), location.getBlockZ())); + Point point = new Point(location.getBlockX(), location.getBlockY(), location.getBlockZ()); + blocks.add(point); } } }