Signed-off-by: yoyosource <yoyosource@nidido.de>
Dieser Commit ist enthalten in:
Ursprung
6a08e5c378
Commit
8f06dcfc85
@ -1122,8 +1122,15 @@ LAUFBAU_PREPARE1 = §71. Trace die Kanonen so oft wie nötig, in allen Modi.
|
||||
LAUFBAU_PREPARE2 = §72. Versuche alle Fails aus dem Trace zu löschen.
|
||||
LAUFBAU_NO_PERM = §cDu darfst hier nicht das Laufbau System verwenden
|
||||
LAUFBAU_NO_WORLDEDIT = §cDu hast keine WorldEdit Selection
|
||||
LAUFBAU_PROGRESS = §e{0} §7Blöcke übrig, §e{1} §7Blöcke pro Sekunde, §e{2} §7Block Delta
|
||||
LAUFBAU_DONE = §aZuende gepanzert
|
||||
LAUFBAU_STATE_FILTERING_TRACES = Traces filtern
|
||||
LAUFBAU_STATE_PROCESSING_TRACES = Traces verbinden
|
||||
LAUFBAU_STATE_EXPANDING_TRACES = Traces aufblähen
|
||||
LAUFBAU_STATE_SPLITTING_POINTS = Punkte aufteilen
|
||||
LAUFBAU_STATE_SHRINKING_POINTS = Punkte ausdünnen
|
||||
LAUFBAU_STATE_CREATING_INNER_BLOCKS = Innenraum füllen
|
||||
LAUFBAU_STATE_CREATING_OUTER_BLOCKS = Mantel bauen
|
||||
LAUFBAU_SIMPLE_PROGRESS = §e{0}§8: §e{1}§8/§7{2}
|
||||
LAUFBAU_DONE = §aZuende gebaut
|
||||
|
||||
# UTILS
|
||||
SELECT_HELP = §8/§eselect §8[§7RegionsTyp§8] §8- §7Wähle einen RegionsTyp aus
|
||||
|
@ -0,0 +1,292 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau;
|
||||
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.data.*;
|
||||
import org.bukkit.block.data.type.*;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
@Getter
|
||||
public class BlockBoundingBox {
|
||||
|
||||
public static List<BlockBoundingBox> elements = new ArrayList<>();
|
||||
|
||||
public BlockData blockData;
|
||||
public Cuboid cuboid;
|
||||
|
||||
static {
|
||||
addPixel(Material.AIR.createBlockData(), 0, 0, 0, 0, 0, 0);
|
||||
addPixel(Material.END_STONE.createBlockData(), 0, 0, 0, 16, 16, 16);
|
||||
|
||||
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);
|
||||
addPixel(hopper, 0, 4, 0, 16, 12, 16);
|
||||
|
||||
Cocoa cocoaNorth = (Cocoa) Material.COCOA.createBlockData();
|
||||
cocoaNorth.setAge(2);
|
||||
cocoaNorth.setFacing(BlockFace.NORTH);
|
||||
addPixel(cocoaNorth, 4, 3, 1, 8, 9, 8);
|
||||
|
||||
Cocoa cocoaSouth = (Cocoa) Material.COCOA.createBlockData();
|
||||
cocoaSouth.setAge(2);
|
||||
cocoaSouth.setFacing(BlockFace.SOUTH);
|
||||
addPixel(cocoaSouth, 4, 3, 7, 8, 9, 8);
|
||||
|
||||
Cocoa cocoaWest = (Cocoa) Material.COCOA.createBlockData();
|
||||
cocoaWest.setAge(2);
|
||||
cocoaWest.setFacing(BlockFace.WEST);
|
||||
addPixel(cocoaWest, 1, 3, 4, 8, 9, 8);
|
||||
|
||||
Cocoa cocoaEast = (Cocoa) Material.COCOA.createBlockData();
|
||||
cocoaEast.setAge(2);
|
||||
cocoaEast.setFacing(BlockFace.EAST);
|
||||
addPixel(cocoaEast, 7, 3, 4, 8, 9, 8);
|
||||
|
||||
TurtleEgg singleTurtleEgg = (TurtleEgg) Material.TURTLE_EGG.createBlockData();
|
||||
singleTurtleEgg.setEggs(1);
|
||||
singleTurtleEgg.setHatch(0);
|
||||
addPixel(singleTurtleEgg, 4, 0, 3, 9, 7, 9);
|
||||
|
||||
TurtleEgg doubleTurtleEgg = (TurtleEgg) Material.TURTLE_EGG.createBlockData();
|
||||
doubleTurtleEgg.setEggs(2);
|
||||
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);
|
||||
|
||||
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.CHEST.createBlockData(), 1, 0, 1, 14, 14, 14);
|
||||
|
||||
Snow snowLayers8 = (Snow) Material.SNOW.createBlockData();
|
||||
snowLayers8.setLayers(8);
|
||||
addPixel(snowLayers8, 0, 0, 0, 16, 14, 16);
|
||||
|
||||
addPixel(Material.CHORUS_PLANT.createBlockData(), 3, 3, 3, 10, 10, 10);
|
||||
|
||||
Directional headNorth = (Directional) Material.PLAYER_WALL_HEAD.createBlockData();
|
||||
headNorth.setFacing(BlockFace.NORTH);
|
||||
addPixel(headNorth, 4, 4, 8, 8, 8, 8);
|
||||
|
||||
Directional headSouth = (Directional) Material.PLAYER_WALL_HEAD.createBlockData();
|
||||
headSouth.setFacing(BlockFace.SOUTH);
|
||||
addPixel(headSouth, 4, 4, 0, 8, 8, 8);
|
||||
|
||||
Directional headWest = (Directional) Material.PLAYER_WALL_HEAD.createBlockData();
|
||||
headWest.setFacing(BlockFace.WEST);
|
||||
addPixel(headWest, 8, 4, 4, 8, 8, 8);
|
||||
|
||||
Directional headEast = (Directional) Material.PLAYER_WALL_HEAD.createBlockData();
|
||||
headEast.setFacing(BlockFace.EAST);
|
||||
addPixel(headEast, 0, 4, 4, 8, 8, 8);
|
||||
|
||||
Snow snowLayers7 = (Snow) Material.SNOW.createBlockData();
|
||||
snowLayers7.setLayers(7);
|
||||
addPixel(snowLayers7, 0, 0, 0, 16, 12, 16);
|
||||
|
||||
Snow snowLayers6 = (Snow) Material.SNOW.createBlockData();
|
||||
snowLayers6.setLayers(6);
|
||||
addPixel(snowLayers6, 0, 0, 0, 16, 10, 16);
|
||||
|
||||
addPixel(Material.STONECUTTER.createBlockData(), 0, 0, 0, 16, 9, 16);
|
||||
|
||||
addPixel(Material.PLAYER_HEAD.createBlockData(), 4, 0, 4, 8, 8, 8);
|
||||
|
||||
addPixel(Material.CAKE.createBlockData(), 1, 0, 1, 14, 8, 14);
|
||||
|
||||
Slab bottomSlab = (Slab) Material.END_STONE_BRICK_SLAB.createBlockData();
|
||||
bottomSlab.setType(Slab.Type.BOTTOM);
|
||||
addPixel(bottomSlab, 0, 0, 0, 16, 8, 16);
|
||||
|
||||
Slab topSlab = (Slab) Material.END_STONE_BRICK_SLAB.createBlockData();
|
||||
topSlab.setType(Slab.Type.TOP);
|
||||
addPixel(topSlab, 0, 8, 0, 16, 8, 16);
|
||||
|
||||
SeaPickle quadSeaPickle = (SeaPickle) Material.SEA_PICKLE.createBlockData();
|
||||
quadSeaPickle.setWaterlogged(false);
|
||||
quadSeaPickle.setPickles(4);
|
||||
addPixel(quadSeaPickle, 2, 0, 2, 12, 7, 12);
|
||||
|
||||
Campfire campfire = (Campfire) Material.CAMPFIRE.createBlockData();
|
||||
campfire.setSignalFire(false);
|
||||
campfire.setLit(false);
|
||||
addPixel(campfire, 0, 0, 0, 16, 7, 16);
|
||||
|
||||
SeaPickle trippleSeaPickle = (SeaPickle) Material.SEA_PICKLE.createBlockData();
|
||||
trippleSeaPickle.setWaterlogged(false);
|
||||
trippleSeaPickle.setPickles(3);
|
||||
addPixel(trippleSeaPickle, 2, 0, 2, 12, 6, 12);
|
||||
|
||||
SeaPickle doubleSeaPickle = (SeaPickle) Material.SEA_PICKLE.createBlockData();
|
||||
doubleSeaPickle.setWaterlogged(false);
|
||||
doubleSeaPickle.setPickles(2);
|
||||
addPixel(doubleSeaPickle, 3, 0, 3, 10, 6, 10);
|
||||
|
||||
SeaPickle singleSeaPickle = (SeaPickle) Material.SEA_PICKLE.createBlockData();
|
||||
singleSeaPickle.setWaterlogged(false);
|
||||
singleSeaPickle.setPickles(1);
|
||||
addPixel(singleSeaPickle, 6, 0, 6, 4, 6, 4);
|
||||
|
||||
addPixel(Material.FLOWER_POT.createBlockData(), 5, 0, 5, 6, 6, 6);
|
||||
|
||||
addPixel(Material.DAYLIGHT_DETECTOR.createBlockData(), 0, 0, 0, 16, 6, 16);
|
||||
|
||||
Snow snowLayers3 = (Snow) Material.SNOW.createBlockData();
|
||||
snowLayers3.setLayers(3);
|
||||
addPixel(snowLayers3, 0, 0, 0, 16, 4, 16);
|
||||
|
||||
TrapDoor bottomTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
bottomTrapDoor.setHalf(Bisected.Half.BOTTOM);
|
||||
addPixel(bottomTrapDoor, 0, 0, 0, 16, 3, 16);
|
||||
|
||||
TrapDoor topTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
topTrapDoor.setHalf(Bisected.Half.TOP);
|
||||
addPixel(topTrapDoor, 0, 13, 0, 16, 3, 16);
|
||||
|
||||
Snow snowLayers2 = (Snow) Material.SNOW.createBlockData();
|
||||
snowLayers2.setLayers(2);
|
||||
addPixel(snowLayers2, 0, 0, 0, 16, 2, 16);
|
||||
|
||||
addPixel(Material.WHITE_CARPET.createBlockData(), 0, 0, 0, 16, 1, 16);
|
||||
|
||||
Directional endRodBottomTop = (Directional) Material.END_ROD.createBlockData();
|
||||
endRodBottomTop.setFacing(BlockFace.UP);
|
||||
addPixel(endRodBottomTop, 6, 0, 6, 4, 16, 4);
|
||||
|
||||
Directional endRodNorthSouth = (Directional) Material.END_ROD.createBlockData();
|
||||
endRodNorthSouth.setFacing(BlockFace.NORTH);
|
||||
addPixel(endRodNorthSouth, 6, 6, 0, 4, 4, 16);
|
||||
|
||||
Directional endRodEastWest = (Directional) Material.END_ROD.createBlockData();
|
||||
endRodNorthSouth.setFacing(BlockFace.EAST);
|
||||
addPixel(endRodEastWest, 0, 6, 6, 16, 4, 4);
|
||||
|
||||
Waterlogged conduit = (Waterlogged) Material.CONDUIT.createBlockData();
|
||||
conduit.setWaterlogged(false);
|
||||
addPixel(conduit, 5, 5, 5, 6, 6, 6);
|
||||
|
||||
Lantern floorLantern = (Lantern) Material.LANTERN.createBlockData();
|
||||
addPixel(floorLantern, 5, 0, 5, 6, 9, 6);
|
||||
|
||||
Lantern ceilingLantern = (Lantern) Material.LANTERN.createBlockData();
|
||||
ceilingLantern.setHanging(true);
|
||||
addPixel(ceilingLantern, 5, 1, 5, 6, 15, 6);
|
||||
|
||||
addPixel(Material.END_STONE_BRICK_WALL.createBlockData(),4, 0, 4, 8, 24, 8);
|
||||
|
||||
addPixel(Material.NETHER_BRICK_FENCE.createBlockData(),6, 0, 6, 4, 24, 4);
|
||||
|
||||
addPixel(Material.IRON_BARS.createBlockData(), 7, 0, 7, 2, 16, 2);
|
||||
|
||||
TrapDoor northTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
northTrapDoor.setFacing(BlockFace.NORTH);
|
||||
northTrapDoor.setOpen(true);
|
||||
addPixel(northTrapDoor, 0, 0, 13, 16, 16, 3);
|
||||
|
||||
TrapDoor southTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
southTrapDoor.setFacing(BlockFace.SOUTH);
|
||||
southTrapDoor.setOpen(true);
|
||||
addPixel(southTrapDoor, 0, 0, 0, 16, 16, 3);
|
||||
|
||||
TrapDoor westTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
westTrapDoor.setFacing(BlockFace.WEST);
|
||||
westTrapDoor.setOpen(true);
|
||||
addPixel(westTrapDoor, 13, 0, 0, 3, 16, 16);
|
||||
|
||||
TrapDoor eastTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
eastTrapDoor.setFacing(BlockFace.EAST);
|
||||
eastTrapDoor.setOpen(true);
|
||||
addPixel(eastTrapDoor, 0, 0, 0, 3, 16, 16);
|
||||
}
|
||||
|
||||
private static void addPixel(BlockData blockData, double xPixel, double yPixel, double zPixel, double dxPixel, double dyPixel, double dzPixel) {
|
||||
elements.add(new BlockBoundingBox(blockData, new Cuboid(pixelToBlock(xPixel), pixelToBlock(yPixel), pixelToBlock(zPixel), pixelToBlock(dxPixel), pixelToBlock(dyPixel), pixelToBlock(dzPixel))));
|
||||
}
|
||||
|
||||
private static double pixelToBlock(double pixel) {
|
||||
return 1.0 / 16 * pixel;
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau;
|
||||
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
public class Cuboid {
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private double dx;
|
||||
private double dy;
|
||||
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;
|
||||
}
|
||||
|
||||
public Cuboid add(Point point) {
|
||||
return new Cuboid(x + point.getX(), y + point.getY(), z + point.getZ(), dx, dy, dz);
|
||||
}
|
||||
}
|
@ -19,253 +19,101 @@
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau;
|
||||
|
||||
import de.steamwar.bausystem.features.tracer.TNTPosition;
|
||||
import de.steamwar.bausystem.features.tracer.show.StoredRecords;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||
import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
import lombok.Getter;
|
||||
import lombok.ToString;
|
||||
import org.bukkit.Bukkit;
|
||||
import de.steamwar.bausystem.features.slaves.laufbau.states.*;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.BlockFace;
|
||||
import org.bukkit.block.data.Bisected;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.block.data.type.Campfire;
|
||||
import org.bukkit.block.data.type.Fence;
|
||||
import org.bukkit.block.data.type.Slab;
|
||||
import org.bukkit.block.data.type.TrapDoor;
|
||||
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;
|
||||
|
||||
public class Laufbau {
|
||||
|
||||
@AllArgsConstructor
|
||||
@ToString
|
||||
@Getter
|
||||
private static class BlockDataWithBoundingBox {
|
||||
private BlockData blockData;
|
||||
private Cuboid cuboid;
|
||||
}
|
||||
|
||||
private static List<BlockDataWithBoundingBox> elements = new ArrayList<>();
|
||||
|
||||
static {
|
||||
elements.add(new BlockDataWithBoundingBox(Material.AIR.createBlockData(), new Cuboid(0, 0, 0, 0, 0, 0)));
|
||||
elements.add(new BlockDataWithBoundingBox(Material.END_STONE.createBlockData(), new Cuboid(0, 0, 0, 1, 1, 1)));
|
||||
|
||||
BlockData soulSand = Material.SOUL_SAND.createBlockData();
|
||||
elements.add(new BlockDataWithBoundingBox(soulSand, new Cuboid(0, 0, 0, 1, 0.9375, 1)));
|
||||
|
||||
BlockData stoneCutter = Material.STONECUTTER.createBlockData();
|
||||
elements.add(new BlockDataWithBoundingBox(stoneCutter, new Cuboid(0, 0, 0, 1, 0.5625, 1)));
|
||||
|
||||
Slab bottomSlab = (Slab) Material.END_STONE_BRICK_SLAB.createBlockData();
|
||||
bottomSlab.setType(Slab.Type.BOTTOM);
|
||||
elements.add(new BlockDataWithBoundingBox(bottomSlab, new Cuboid(0, 0, 0, 1, 0.5, 1)));
|
||||
|
||||
Campfire campfire = (Campfire) Material.CAMPFIRE.createBlockData();
|
||||
campfire.setSignalFire(false);
|
||||
campfire.setLit(false);
|
||||
elements.add(new BlockDataWithBoundingBox(campfire, new Cuboid(0, 0, 0, 1, 0.4375, 1)));
|
||||
|
||||
Slab topSlab = (Slab) Material.END_STONE_BRICK_SLAB.createBlockData();
|
||||
topSlab.setType(Slab.Type.TOP);
|
||||
elements.add(new BlockDataWithBoundingBox(topSlab, new Cuboid(0, 0.5, 0, 1, 0.5, 1)));
|
||||
|
||||
TrapDoor bottomTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
bottomTrapDoor.setHalf(Bisected.Half.BOTTOM);
|
||||
elements.add(new BlockDataWithBoundingBox(bottomTrapDoor, new Cuboid(0, 0, 0, 1, 0.1875, 1)));
|
||||
|
||||
TrapDoor topTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
topTrapDoor.setHalf(Bisected.Half.TOP);
|
||||
elements.add(new BlockDataWithBoundingBox(topTrapDoor, new Cuboid(0, 0.8125, 0, 1, 0.1875, 1)));
|
||||
|
||||
Fence endStoneBrickWall = (Fence) Material.END_STONE_BRICK_WALL.createBlockData();
|
||||
elements.add(new BlockDataWithBoundingBox(endStoneBrickWall, new Cuboid(0.25, 0, 0.25, 0.5, 1.5, 0.5)));
|
||||
|
||||
Fence fence = (Fence) Material.NETHER_BRICK_FENCE.createBlockData();
|
||||
elements.add(new BlockDataWithBoundingBox(fence, new Cuboid(0.375, 0, 0.375, 0.25, 1.5, 0.25)));
|
||||
|
||||
Fence ironBars = (Fence) Material.IRON_BARS.createBlockData();
|
||||
elements.add(new BlockDataWithBoundingBox(ironBars, new Cuboid(0.4375, 0, 0.4375, 0.125, 1, 0.125)));
|
||||
|
||||
TrapDoor northTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
northTrapDoor.setFacing(BlockFace.NORTH);
|
||||
northTrapDoor.setOpen(true);
|
||||
elements.add(new BlockDataWithBoundingBox(northTrapDoor, new Cuboid(0, 0, 0.8125, 1, 1, 0.1875)));
|
||||
|
||||
TrapDoor southTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
southTrapDoor.setFacing(BlockFace.SOUTH);
|
||||
southTrapDoor.setOpen(true);
|
||||
elements.add(new BlockDataWithBoundingBox(southTrapDoor, new Cuboid(0, 0, 0, 1, 1, 0.1875)));
|
||||
|
||||
TrapDoor westTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
westTrapDoor.setFacing(BlockFace.WEST);
|
||||
westTrapDoor.setOpen(true);
|
||||
elements.add(new BlockDataWithBoundingBox(westTrapDoor, new Cuboid(0.8125, 0, 0, 0.1875, 1, 1)));
|
||||
|
||||
TrapDoor eastTrapDoor = (TrapDoor) Material.IRON_TRAPDOOR.createBlockData();
|
||||
eastTrapDoor.setFacing(BlockFace.EAST);
|
||||
eastTrapDoor.setOpen(true);
|
||||
elements.add(new BlockDataWithBoundingBox(eastTrapDoor, new Cuboid(0, 0, 0, 0.1875, 1, 1)));
|
||||
}
|
||||
|
||||
private Set<TNTPosition> tntPositions = new HashSet<>();
|
||||
private Set<Cuboid> cuboidList = new HashSet<>();
|
||||
|
||||
private World world;
|
||||
private Location pos1;
|
||||
private Location pos2;
|
||||
|
||||
public Laufbau(Location pos1, Location pos2, Material blockMaterial, Material slabMaterial) {
|
||||
private boolean preferingBlastResistance;
|
||||
|
||||
private FilteringTracesState filteringTracesState = null;
|
||||
private ProcessingTracesState processingTracesState = null;
|
||||
private ExpandingTracesState expandingTracesState = null;
|
||||
private SplittingPointsState splittingPointsState = null;
|
||||
private ShrinkingOuterPointsState shrinkingOuterPointsState = null;
|
||||
private CreatingInnerBlocksState creatingInnerBlocksState = null;
|
||||
private CreatingOuterBlocksState creatingOuterBlocksState = null;
|
||||
|
||||
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()));
|
||||
this.pos2 = new Location(world, Math.max(pos1.getBlockX(), pos2.getBlockX()), Math.max(pos1.getBlockY(), pos2.getBlockY()), Math.max(pos1.getBlockZ(), pos2.getBlockZ()));
|
||||
|
||||
StoredRecords.getRecords().forEach(record -> {
|
||||
record.getTnt().forEach(tntRecord -> {
|
||||
tntRecord.getPositions().forEach(tntPosition -> {
|
||||
if (FlatteningWrapper.impl.inWater(world, tntPosition.getLocation())) {
|
||||
this.preferingBlastResistance = preferingBlastResistance;
|
||||
|
||||
filteringTracesState = new FilteringTracesState(world, this::inRegion);
|
||||
}
|
||||
|
||||
private LaufbauState getActive() {
|
||||
if (creatingOuterBlocksState != null) {
|
||||
return creatingOuterBlocksState;
|
||||
}
|
||||
if (creatingInnerBlocksState != null) {
|
||||
return creatingInnerBlocksState;
|
||||
}
|
||||
if (shrinkingOuterPointsState != null) {
|
||||
return shrinkingOuterPointsState;
|
||||
}
|
||||
if (splittingPointsState != null) {
|
||||
return splittingPointsState;
|
||||
}
|
||||
if (expandingTracesState != null) {
|
||||
return expandingTracesState;
|
||||
}
|
||||
if (processingTracesState != null) {
|
||||
return processingTracesState;
|
||||
}
|
||||
return filteringTracesState;
|
||||
}
|
||||
|
||||
private void createNextState() {
|
||||
if (creatingOuterBlocksState != null) {
|
||||
return;
|
||||
}
|
||||
if (inRegion(tntPosition.getLocation().toLocation(world), 1)) {
|
||||
tntPositions.add(tntPosition);
|
||||
}
|
||||
if (tntPosition.getPreviousLocation() != null && inRegion(tntPosition.getPreviousLocation().toLocation(world), 1)) {
|
||||
tntPositions.add(tntPosition);
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
for (TNTPosition tntPosition : tntPositions) {
|
||||
Vector location = tntPosition.getLocation();
|
||||
Vector previousLocation = tntPosition.getPreviousLocation();
|
||||
|
||||
if (previousLocation == null) {
|
||||
cuboidList.add(new Cuboid(location.getX() - 0.49, location.getY(), location.getZ() - 0.49, 0.98, 0.98, 0.98));
|
||||
} else {
|
||||
Vector movement = location.clone().subtract(previousLocation);
|
||||
cuboidList.add(new Cuboid(previousLocation.getX() - 0.49, Math.min(previousLocation.getY(), location.getY()), previousLocation.getZ() - 0.49, 0.98, Math.abs(movement.getY()) + 0.98, 0.98));
|
||||
if (Math.abs(movement.getX()) > Math.abs(movement.getZ())) {
|
||||
cuboidList.add(new Cuboid(Math.min(previousLocation.getX(), location.getX()) - 0.49, location.getY(), previousLocation.getZ() - 0.49, Math.abs(movement.getX()) + 0.98, 0.98, 0.98));
|
||||
cuboidList.add(new Cuboid(location.getX() - 0.49, location.getY(), Math.min(previousLocation.getZ(), location.getZ()) - 0.49, 0.98, 0.98, Math.abs(movement.getZ()) + 0.98));
|
||||
} else {
|
||||
cuboidList.add(new Cuboid(previousLocation.getX() - 0.49, location.getY(), Math.min(previousLocation.getZ(), location.getZ()) - 0.49, 0.98, 0.98, Math.abs(movement.getZ()) + 0.98));
|
||||
cuboidList.add(new Cuboid(Math.min(previousLocation.getX(), location.getX()) - 0.49, location.getY(), location.getZ() - 0.49, Math.abs(movement.getX()) + 0.98, 0.98, 0.98));
|
||||
}
|
||||
}
|
||||
}
|
||||
// System.out.println(cuboidList);
|
||||
// System.out.println(cuboidList.size());
|
||||
|
||||
Set<Point> blockMap = new HashSet<>();
|
||||
cuboidList.forEach(cuboid -> {
|
||||
for (double x = cuboid.getX() - 2; x < cuboid.getX() + cuboid.getDx() + 2; x++) {
|
||||
for (double y = cuboid.getY() - 2; y < cuboid.getY() + cuboid.getDy() + 2; y++) {
|
||||
for (double z = cuboid.getZ() - 2; z < cuboid.getZ() + cuboid.getDz() + 2; z++) {
|
||||
Location location = new Location(world, x, y, z);
|
||||
if (inRegion(new Vector(location.getBlockX(), location.getBlockY(), location.getBlockZ()), 0)) {
|
||||
blockMap.add(new Point(location.getBlockX(), location.getBlockY(), location.getBlockZ()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
Set<Point> blockMap2 = new HashSet<>();
|
||||
Set<Point> blockMap3 = new HashSet<>();
|
||||
for (Point point : blockMap) {
|
||||
boolean isInCuboid = false;
|
||||
Cuboid tempCuboid = new Cuboid(0, 0, 0, 1, 1, 1).add(point);
|
||||
for (Cuboid cuboid : cuboidList) {
|
||||
if (cuboid.intersects(tempCuboid)) {
|
||||
isInCuboid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!isInCuboid) {
|
||||
blockMap2.add(point);
|
||||
} else {
|
||||
blockMap3.add(point);
|
||||
}
|
||||
}
|
||||
|
||||
blockMap2.removeIf(point -> {
|
||||
Point p1 = new Point(point.getX() - 1, point.getY(), point.getZ());
|
||||
Point p2 = new Point(point.getX() + 1, point.getY(), point.getZ());
|
||||
Point p3 = new Point(point.getX(), point.getY() - 1, point.getZ());
|
||||
Point p4 = new Point(point.getX(), point.getY() + 1, point.getZ());
|
||||
Point p5 = new Point(point.getX(), point.getY(), point.getZ() - 1);
|
||||
Point p6 = new Point(point.getX(), point.getY(), point.getZ() + 1);
|
||||
|
||||
return !blockMap3.contains(p1) && !blockMap3.contains(p2) && !blockMap3.contains(p3) && !blockMap3.contains(p4) && !blockMap3.contains(p5) && !blockMap3.contains(p6);
|
||||
});
|
||||
|
||||
blockMap3.forEach(point -> {
|
||||
List<BlockDataWithBoundingBox> blockDataWithBoundingBoxList = new ArrayList<>();
|
||||
for (BlockDataWithBoundingBox blockDataWithBoundingBox : elements) {
|
||||
Cuboid tempCuboid = blockDataWithBoundingBox.cuboid.add(point);
|
||||
// Bukkit.getLogger().info(tempCuboid.toString());
|
||||
boolean isInCuboid = false;
|
||||
for (Cuboid cuboid : cuboidList) {
|
||||
if (cuboid.intersects(tempCuboid)) {
|
||||
isInCuboid = true;
|
||||
}
|
||||
}
|
||||
if (!isInCuboid) {
|
||||
blockDataWithBoundingBoxList.add(blockDataWithBoundingBox);
|
||||
}
|
||||
}
|
||||
if (blockDataWithBoundingBoxList.isEmpty()) {
|
||||
if (creatingInnerBlocksState != null) {
|
||||
creatingOuterBlocksState = new CreatingOuterBlocksState(shrinkingOuterPointsState.getShrunkOuterPoints(), world);
|
||||
return;
|
||||
}
|
||||
|
||||
Cuboid currentHighest = blockDataWithBoundingBoxList.get(0).cuboid;
|
||||
BlockData highestBlockData = blockDataWithBoundingBoxList.get(0).blockData;
|
||||
|
||||
for (BlockDataWithBoundingBox blockDataWithBoundingBox : blockDataWithBoundingBoxList) {
|
||||
if (currentHighest.getDx() < blockDataWithBoundingBox.cuboid.getDx() &&
|
||||
currentHighest.getDy() < blockDataWithBoundingBox.cuboid.getDy() &&
|
||||
currentHighest.getDz() < blockDataWithBoundingBox.cuboid.getDz()) {
|
||||
currentHighest = blockDataWithBoundingBox.cuboid;
|
||||
highestBlockData = blockDataWithBoundingBox.blockData;
|
||||
if (shrinkingOuterPointsState != null) {
|
||||
creatingInnerBlocksState = new CreatingInnerBlocksState(splittingPointsState.getInnerPoints(), world, processingTracesState.getCuboidList(), splittingPointsState.getIntersectedCuboid(), preferingBlastResistance);
|
||||
return;
|
||||
}
|
||||
if (highestBlockData.getMaterial().getBlastResistance() < blockDataWithBoundingBox.blockData.getMaterial().getBlastResistance() &&
|
||||
(currentHighest.getDx() < blockDataWithBoundingBox.cuboid.getDx() ||
|
||||
currentHighest.getDy() < blockDataWithBoundingBox.cuboid.getDy() ||
|
||||
currentHighest.getDz() < blockDataWithBoundingBox.cuboid.getDz())) {
|
||||
currentHighest = blockDataWithBoundingBox.cuboid;
|
||||
highestBlockData = blockDataWithBoundingBox.blockData;
|
||||
if (splittingPointsState != null) {
|
||||
shrinkingOuterPointsState = new ShrinkingOuterPointsState(splittingPointsState.getOuterPoints(), splittingPointsState.getInnerPoints());
|
||||
return;
|
||||
}
|
||||
if (expandingTracesState != null) {
|
||||
splittingPointsState = new SplittingPointsState(expandingTracesState.getBlocks(), processingTracesState.getCuboidList());
|
||||
return;
|
||||
}
|
||||
// blockDataMap.put(point, new BlockDataWithBoundingBox(highestBlockData, currentHighest));
|
||||
Location location = new Location(world, point.getX(), point.getY(), point.getZ());
|
||||
BlockData finalHighestBlockData = highestBlockData;
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
player.sendBlockChange(location, finalHighestBlockData);
|
||||
});
|
||||
});
|
||||
|
||||
display(blockMap2);
|
||||
if (processingTracesState != null) {
|
||||
expandingTracesState = new ExpandingTracesState(processingTracesState.getCuboidList(), world, this::inRegion);
|
||||
return;
|
||||
}
|
||||
processingTracesState = new ProcessingTracesState(filteringTracesState.getTntPositions());
|
||||
}
|
||||
|
||||
private void display(Set<Point> blockMap) {
|
||||
BlockData fullBlock = Material.STONE.createBlockData();
|
||||
blockMap.forEach(point -> {
|
||||
Location location = new Location(world, point.getX(), point.getY(), point.getZ());
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
player.sendBlockChange(location, fullBlock);
|
||||
});
|
||||
});
|
||||
public String actionBarMessage(Player p) {
|
||||
return getActive().actionBarMessage(p);
|
||||
}
|
||||
|
||||
public boolean hasNext() {
|
||||
return getActive().hasNext();
|
||||
}
|
||||
|
||||
public void next() {
|
||||
LaufbauState state = getActive();
|
||||
state.next();
|
||||
if (!state.hasNext()) {
|
||||
createNextState();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean inRegion(Location location, int expansion) {
|
||||
@ -288,60 +136,4 @@ public class Laufbau {
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
private static class Cuboid {
|
||||
private double x;
|
||||
private double y;
|
||||
private double z;
|
||||
private double dx;
|
||||
private double dy;
|
||||
private double dz;
|
||||
|
||||
private 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;
|
||||
}
|
||||
|
||||
public Cuboid add(Point point) {
|
||||
return new Cuboid(x + point.getX(), y + point.getY(), z + point.getZ(), dx, dy, dz);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -21,8 +21,8 @@ package de.steamwar.bausystem.features.slaves.laufbau;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.Permission;
|
||||
import de.steamwar.bausystem.SWUtils;
|
||||
import de.steamwar.bausystem.features.slaves.WorldEditUtils;
|
||||
import de.steamwar.bausystem.features.slaves.panzern.Panzern;
|
||||
import de.steamwar.bausystem.linkage.LinkageType;
|
||||
import de.steamwar.bausystem.linkage.Linked;
|
||||
import de.steamwar.bausystem.shared.Pair;
|
||||
@ -32,6 +32,7 @@ import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.command.CommandSender;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.scheduler.BukkitRunnable;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
@ -62,7 +63,7 @@ public class LaufbauCommand extends SWCommand {
|
||||
}
|
||||
|
||||
@Register
|
||||
public void laufbauSelection(Player player, @Mapper("block") Material blockMaterial, @Mapper("slab") Material slabMaterial) {
|
||||
public void laufbauSelection(Player player, /*@Mapper("block") Material blockMaterial, @Mapper("slab") Material slabMaterial*/ boolean preferingBlastResistance) {
|
||||
if (!permissionCheck(player, Permission.WORLDEDIT)) {
|
||||
return;
|
||||
}
|
||||
@ -71,7 +72,27 @@ public class LaufbauCommand extends SWCommand {
|
||||
BauSystem.MESSAGE.send("LAUFBAU_NO_WORLDEDIT", player);
|
||||
return;
|
||||
}
|
||||
Laufbau laufbau = new Laufbau(selection.getKey(), selection.getValue(), blockMaterial, slabMaterial);
|
||||
Laufbau laufbau = new Laufbau(selection.getKey(), selection.getValue(), preferingBlastResistance);
|
||||
new BukkitRunnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
long totalTime = 0;
|
||||
while (true) {
|
||||
if (!laufbau.hasNext()) {
|
||||
BauSystem.MESSAGE.send("LAUFBAU_DONE", player);
|
||||
cancel();
|
||||
return;
|
||||
}
|
||||
long time = System.currentTimeMillis();
|
||||
laufbau.next();
|
||||
totalTime += System.currentTimeMillis() - time;
|
||||
if (totalTime > 40) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
SWUtils.sendToActionbar(player, laufbau.actionBarMessage(player));
|
||||
}
|
||||
}.runTaskTimer(BauSystem.getInstance(), 1, 1);
|
||||
}
|
||||
|
||||
@Mapper(value = "block", local = true)
|
||||
|
@ -0,0 +1,120 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
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;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
public class CreatingInnerBlocksState implements LaufbauState {
|
||||
|
||||
private List<Point> innerBlocks;
|
||||
private int index = 0;
|
||||
|
||||
private World world;
|
||||
private List<Cuboid> cuboidList;
|
||||
private Map<Point, List<Cuboid>> intersectedCuboid;
|
||||
private boolean preferingBlastResistance;
|
||||
|
||||
public CreatingInnerBlocksState(List<Point> innerBlocks, World world, List<Cuboid> cuboidList, Map<Point, List<Cuboid>> intersectedCuboid, boolean preferingBlastResistance) {
|
||||
this.innerBlocks = innerBlocks;
|
||||
this.world = world;
|
||||
this.cuboidList = cuboidList;
|
||||
this.intersectedCuboid = intersectedCuboid;
|
||||
this.preferingBlastResistance = preferingBlastResistance;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_CREATING_INNER_BLOCKS", p), index, innerBlocks.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return index < innerBlocks.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
Point point = innerBlocks.get(index);
|
||||
index++;
|
||||
|
||||
List<Cuboid> neededCuboids = intersectedCuboid.get(point);
|
||||
List<BlockBoundingBox> blockDataWithBoundingBoxList = new ArrayList<>();
|
||||
for (BlockBoundingBox blockDataWithBoundingBox : BlockBoundingBox.elements) {
|
||||
Cuboid tempCuboid = blockDataWithBoundingBox.cuboid.add(point);
|
||||
|
||||
List<Cuboid> extendedCuboids = null;
|
||||
if (tempCuboid.getDy() > 1) {
|
||||
extendedCuboids = cuboidList;
|
||||
}
|
||||
|
||||
boolean isInCuboid = false;
|
||||
for (Cuboid cuboid : extendedCuboids == null ? neededCuboids : extendedCuboids) {
|
||||
if (cuboid.intersects(tempCuboid)) {
|
||||
isInCuboid = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!isInCuboid) {
|
||||
blockDataWithBoundingBoxList.add(blockDataWithBoundingBox);
|
||||
}
|
||||
}
|
||||
if (blockDataWithBoundingBoxList.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Cuboid currentHighest = blockDataWithBoundingBoxList.get(0).cuboid;
|
||||
BlockData highestBlockData = blockDataWithBoundingBoxList.get(0).blockData;
|
||||
|
||||
for (BlockBoundingBox blockDataWithBoundingBox : blockDataWithBoundingBoxList) {
|
||||
if (currentHighest.getDx() < blockDataWithBoundingBox.cuboid.getDx() &&
|
||||
currentHighest.getDy() < blockDataWithBoundingBox.cuboid.getDy() &&
|
||||
currentHighest.getDz() < blockDataWithBoundingBox.cuboid.getDz()) {
|
||||
currentHighest = blockDataWithBoundingBox.cuboid;
|
||||
highestBlockData = blockDataWithBoundingBox.blockData;
|
||||
}
|
||||
if (preferingBlastResistance) {
|
||||
if (highestBlockData.getMaterial().getBlastResistance() < blockDataWithBoundingBox.blockData.getMaterial().getBlastResistance() &&
|
||||
(currentHighest.getDx() >= blockDataWithBoundingBox.cuboid.getDx() ||
|
||||
currentHighest.getDy() >= blockDataWithBoundingBox.cuboid.getDy() ||
|
||||
currentHighest.getDz() >= blockDataWithBoundingBox.cuboid.getDz())) {
|
||||
currentHighest = blockDataWithBoundingBox.cuboid;
|
||||
highestBlockData = blockDataWithBoundingBox.blockData;
|
||||
}
|
||||
}
|
||||
}
|
||||
Location location = new Location(world, point.getX(), point.getY(), point.getZ());
|
||||
BlockData finalHighestBlockData = highestBlockData;
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
player.sendBlockChange(location, finalHighestBlockData);
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,66 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.Material;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.block.data.BlockData;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
public class CreatingOuterBlocksState implements LaufbauState {
|
||||
|
||||
private List<Point> outerBlocks;
|
||||
private int index = 0;
|
||||
|
||||
private World world;
|
||||
|
||||
public CreatingOuterBlocksState(List<Point> outerBlocks, World world) {
|
||||
this.outerBlocks = outerBlocks;
|
||||
this.world = world;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_CREATING_OUTER_BLOCKS", p), index, outerBlocks.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return index < outerBlocks.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
Point point = outerBlocks.get(index);
|
||||
index++;
|
||||
|
||||
BlockData fullBlock = Material.STONE.createBlockData();
|
||||
Location location = new Location(world, point.getX(), point.getY(), point.getZ());
|
||||
Bukkit.getOnlinePlayers().forEach(player -> {
|
||||
player.sendBlockChange(location, fullBlock);
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,79 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.slaves.laufbau.Cuboid;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Location;
|
||||
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.function.BiPredicate;
|
||||
|
||||
public class ExpandingTracesState implements LaufbauState {
|
||||
|
||||
private List<Cuboid> cuboidList;
|
||||
private int totalCuboids;
|
||||
|
||||
private World world;
|
||||
private BiPredicate<Vector, Integer> inRegionCheck;
|
||||
|
||||
@Getter
|
||||
private Set<Point> blocks = new HashSet<>();
|
||||
|
||||
public ExpandingTracesState(List<Cuboid> cuboidList, World world, BiPredicate<Vector, Integer> inRegionCheck) {
|
||||
this.cuboidList = new ArrayList<>(cuboidList);
|
||||
this.totalCuboids = cuboidList.size();
|
||||
this.world = world;
|
||||
this.inRegionCheck = inRegionCheck;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_EXPANDING_TRACES", p), totalCuboids - cuboidList.size(), totalCuboids);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !cuboidList.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
Cuboid cuboid = cuboidList.remove(0);
|
||||
for (double x = cuboid.getX() - 2; x < cuboid.getX() + cuboid.getDx() + 2; x++) {
|
||||
for (double y = cuboid.getY() - 2; y < cuboid.getY() + cuboid.getDy() + 2; y++) {
|
||||
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()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,89 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.tracer.TNTPosition;
|
||||
import de.steamwar.bausystem.features.tracer.show.Record;
|
||||
import de.steamwar.bausystem.features.tracer.show.StoredRecords;
|
||||
import de.steamwar.bausystem.utils.FlatteningWrapper;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.Location;
|
||||
import org.bukkit.World;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.function.BiPredicate;
|
||||
|
||||
public class FilteringTracesState implements LaufbauState {
|
||||
|
||||
private World world;
|
||||
private BiPredicate<Location, Integer> inRegionCheck;
|
||||
|
||||
private int totalRecord;
|
||||
private List<Record> recordList;
|
||||
private List<Record.TNTRecord> tntRecords = new ArrayList<>();
|
||||
|
||||
@Getter
|
||||
private List<TNTPosition> tntPositions = new ArrayList<>();
|
||||
|
||||
public FilteringTracesState(World world, BiPredicate<Location, Integer> inRegionCheck) {
|
||||
recordList = new ArrayList<>(StoredRecords.getRecords());
|
||||
totalRecord = recordList.size();
|
||||
|
||||
this.world = world;
|
||||
this.inRegionCheck = inRegionCheck;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_FILTERING_TRACES", p), totalRecord - recordList.size(), totalRecord);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !recordList.isEmpty() || !tntRecords.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
if (tntRecords.isEmpty()) {
|
||||
Record record = recordList.remove(0);
|
||||
tntRecords.addAll(record.getTnt());
|
||||
}
|
||||
if (tntRecords.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Record.TNTRecord tntRecord = tntRecords.remove(0);
|
||||
tntRecord.getPositions().forEach(tntPosition -> {
|
||||
if (FlatteningWrapper.impl.inWater(world, tntPosition.getLocation())) {
|
||||
return;
|
||||
}
|
||||
if (inRegionCheck.test(tntPosition.getLocation().toLocation(world), 1)) {
|
||||
tntPositions.add(tntPosition);
|
||||
}
|
||||
if (tntPosition.getPreviousLocation() != null && inRegionCheck.test(tntPosition.getPreviousLocation().toLocation(world), 1)) {
|
||||
tntPositions.add(tntPosition);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
public interface LaufbauState {
|
||||
|
||||
String actionBarMessage(Player p);
|
||||
|
||||
boolean hasNext();
|
||||
|
||||
void next();
|
||||
}
|
@ -0,0 +1,75 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.slaves.laufbau.Cuboid;
|
||||
import de.steamwar.bausystem.features.tracer.TNTPosition;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
import org.bukkit.util.Vector;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ProcessingTracesState implements LaufbauState {
|
||||
|
||||
private int totalTNTPositions;
|
||||
private List<TNTPosition> tntPositionList;
|
||||
|
||||
@Getter
|
||||
private List<Cuboid> cuboidList = new ArrayList<>();
|
||||
|
||||
public ProcessingTracesState(List<TNTPosition> tntPositionList) {
|
||||
this.tntPositionList = tntPositionList;
|
||||
this.totalTNTPositions = tntPositionList.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_PROCESSING_TRACES", p), totalTNTPositions - tntPositionList.size(), totalTNTPositions);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !tntPositionList.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
TNTPosition tntPosition = tntPositionList.remove(0);
|
||||
Vector location = tntPosition.getLocation();
|
||||
Vector previousLocation = tntPosition.getPreviousLocation();
|
||||
|
||||
if (previousLocation == null) {
|
||||
cuboidList.add(new Cuboid(location.getX() - 0.49, location.getY(), location.getZ() - 0.49, 0.98, 0.98, 0.98));
|
||||
} else {
|
||||
Vector movement = location.clone().subtract(previousLocation);
|
||||
cuboidList.add(new Cuboid(previousLocation.getX() - 0.49, Math.min(previousLocation.getY(), location.getY()), previousLocation.getZ() - 0.49, 0.98, Math.abs(movement.getY()) + 0.98, 0.98));
|
||||
if (Math.abs(movement.getX()) > Math.abs(movement.getZ())) {
|
||||
cuboidList.add(new Cuboid(Math.min(previousLocation.getX(), location.getX()) - 0.49, location.getY(), previousLocation.getZ() - 0.49, Math.abs(movement.getX()) + 0.98, 0.98, 0.98));
|
||||
cuboidList.add(new Cuboid(location.getX() - 0.49, location.getY(), Math.min(previousLocation.getZ(), location.getZ()) - 0.49, 0.98, 0.98, Math.abs(movement.getZ()) + 0.98));
|
||||
} else {
|
||||
cuboidList.add(new Cuboid(previousLocation.getX() - 0.49, location.getY(), Math.min(previousLocation.getZ(), location.getZ()) - 0.49, 0.98, 0.98, Math.abs(movement.getZ()) + 0.98));
|
||||
cuboidList.add(new Cuboid(Math.min(previousLocation.getX(), location.getX()) - 0.49, location.getY(), location.getZ() - 0.49, Math.abs(movement.getX()) + 0.98, 0.98, 0.98));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,70 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
public class ShrinkingOuterPointsState implements LaufbauState {
|
||||
|
||||
private List<Point> outerPoints;
|
||||
private List<Point> innerPoints;
|
||||
private int index = 0;
|
||||
|
||||
@Getter
|
||||
private List<Point> shrunkOuterPoints = new ArrayList<>();
|
||||
|
||||
public ShrinkingOuterPointsState(List<Point> outerPoints, List<Point> innerPoints) {
|
||||
this.outerPoints = outerPoints;
|
||||
this.innerPoints = innerPoints;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_SHRINKING_POINTS", p), index, outerPoints.size());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return index < outerPoints.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
Point point = outerPoints.get(index);
|
||||
index++;
|
||||
|
||||
Point p1 = new Point(point.getX() - 1, point.getY(), point.getZ());
|
||||
Point p2 = new Point(point.getX() + 1, point.getY(), point.getZ());
|
||||
Point p3 = new Point(point.getX(), point.getY() - 1, point.getZ());
|
||||
Point p4 = new Point(point.getX(), point.getY() + 1, point.getZ());
|
||||
Point p5 = new Point(point.getX(), point.getY(), point.getZ() - 1);
|
||||
Point p6 = new Point(point.getX(), point.getY(), point.getZ() + 1);
|
||||
|
||||
if (!(!innerPoints.contains(p1) && !innerPoints.contains(p2) && !innerPoints.contains(p3) && !innerPoints.contains(p4) && !innerPoints.contains(p5) && !innerPoints.contains(p6))) {
|
||||
shrunkOuterPoints.add(point);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,80 @@
|
||||
/*
|
||||
* This file is a part of the SteamWar software.
|
||||
*
|
||||
* Copyright (C) 2022 SteamWar.de-Serverteam
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Affero General Public License as published by
|
||||
* the Free Software Foundation, either version 3 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU Affero General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package de.steamwar.bausystem.features.slaves.laufbau.states;
|
||||
|
||||
import de.steamwar.bausystem.BauSystem;
|
||||
import de.steamwar.bausystem.features.slaves.laufbau.Cuboid;
|
||||
import de.steamwar.bausystem.region.Point;
|
||||
import lombok.Getter;
|
||||
import org.bukkit.entity.Player;
|
||||
|
||||
import java.util.*;
|
||||
|
||||
public class SplittingPointsState implements LaufbauState {
|
||||
|
||||
private List<Point> blocks;
|
||||
private int totalBlocks;
|
||||
private List<Cuboid> cuboidList;
|
||||
|
||||
@Getter
|
||||
private List<Point> innerPoints = new ArrayList<>();
|
||||
|
||||
@Getter
|
||||
private List<Point> outerPoints = new ArrayList<>();
|
||||
|
||||
@Getter
|
||||
private Map<Point, List<Cuboid>> intersectedCuboid = new HashMap<>();
|
||||
|
||||
public SplittingPointsState(Set<Point> blocks, List<Cuboid> cuboidList) {
|
||||
this.blocks = new ArrayList<>(blocks);
|
||||
this.totalBlocks = blocks.size();
|
||||
this.cuboidList = cuboidList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String actionBarMessage(Player p) {
|
||||
return BauSystem.MESSAGE.parse("LAUFBAU_SIMPLE_PROGRESS", p, BauSystem.MESSAGE.parse("LAUFBAU_STATE_SPLITTING_POINTS", p), totalBlocks - blocks.size(), totalBlocks);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean hasNext() {
|
||||
return !blocks.isEmpty();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void next() {
|
||||
Point point = blocks.remove(0);
|
||||
boolean isInCuboid = false;
|
||||
Cuboid tempCuboid = new Cuboid(0, 0, 0, 1, 1, 1).add(point);
|
||||
List<Cuboid> intersectedCuboids = new ArrayList<>();
|
||||
for (Cuboid cuboid : cuboidList) {
|
||||
if (cuboid.intersects(tempCuboid)) {
|
||||
isInCuboid = true;
|
||||
intersectedCuboids.add(cuboid);
|
||||
}
|
||||
}
|
||||
if (!isInCuboid) {
|
||||
outerPoints.add(point);
|
||||
} else {
|
||||
innerPoints.add(point);
|
||||
intersectedCuboid.put(point, intersectedCuboids);
|
||||
}
|
||||
}
|
||||
}
|
In neuem Issue referenzieren
Einen Benutzer sperren