From 10bb559a1e7ec95a71a256367a3755a5b5d23ed0 Mon Sep 17 00:00:00 2001 From: Unknown Date: Sat, 14 Dec 2019 16:45:19 -0500 Subject: [PATCH] updated mansion finder --- .../finder/structure/MansionFinder.java | 36 +++++++++++++------ .../finder/structure/PieceFinder.java | 14 ++++---- 2 files changed, 34 insertions(+), 16 deletions(-) diff --git a/src/main/java/kaptainwutax/seedcracker/finder/structure/MansionFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/structure/MansionFinder.java index e51b59f..d2be6b0 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/structure/MansionFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/structure/MansionFinder.java @@ -13,7 +13,9 @@ import net.minecraft.util.math.ChunkPos; import net.minecraft.util.math.Direction; import net.minecraft.util.math.Vec3i; import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; import net.minecraft.world.dimension.DimensionType; +import net.minecraft.world.gen.feature.Feature; import java.util.ArrayList; import java.util.HashMap; @@ -23,7 +25,6 @@ import java.util.Map; public class MansionFinder extends Finder { protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { - if(pos.getY() != 64)return true; if((pos.getX() & 15) != 0)return true; if((pos.getZ() & 15) != 0)return true; return false; @@ -35,27 +36,28 @@ public class MansionFinder extends Finder { public MansionFinder(World world, ChunkPos chunkPos) { super(world, chunkPos); - Direction.Type.HORIZONTAL.forEach(direction -> { - PieceFinder finder = new PieceFinder(world, chunkPos, direction, size); + for(Direction direction: Direction.values()) { + PieceFinder finder = new PieceFinder(world, chunkPos, direction, this.size); finder.searchPositions = SEARCH_POSITIONS; buildStructure(finder); this.finders.add(finder); - }); + } } @Override public List findInChunk() { + Biome biome = this.world.getBiome(this.chunkPos.getCenterBlockPos().add(9, 0, 9)); + + if(!biome.hasStructureFeature(Feature.WOODLAND_MANSION)) { + return new ArrayList<>(); + } + Map> result = this.findInChunkPieces(); List combinedResult = new ArrayList<>(); result.forEach((pieceFinder, positions) -> { - positions.removeIf(pos -> { - //Figure this out, it's not a trivial task. - return false; - }); - combinedResult.addAll(positions); positions.forEach(pos -> { @@ -80,12 +82,26 @@ public class MansionFinder extends Finder { } public void buildStructure(PieceFinder finder) { + BlockState air = Blocks.AIR.getDefaultState(); BlockState cobblestone = Blocks.COBBLESTONE.getDefaultState(); BlockState birchPlanks = Blocks.BIRCH_PLANKS.getDefaultState(); BlockState redCarpet = Blocks.RED_CARPET.getDefaultState(); BlockState whiteCarpet = Blocks.WHITE_CARPET.getDefaultState(); - //TODO: Finish this. + finder.fillWithOutline(0, 0, 0, 15, 0, 15, birchPlanks, birchPlanks, false); + finder.fillWithOutline(0, 0, 8, 6, 0, 12, null, null, false); + finder.fillWithOutline(0, 0, 12, 9, 0, 15, null, null, false); + finder.fillWithOutline(15, 0, 0, 15, 0, 15, cobblestone, cobblestone, false); + finder.addBlock(Blocks.DARK_OAK_LOG.getDefaultState(), 15, 0, 15); + finder.addBlock(Blocks.DARK_OAK_LOG.getDefaultState(), 15, 0, 7); + finder.addBlock(Blocks.DARK_OAK_LOG.getDefaultState(), 14, 0, 7); + + finder.fillWithOutline(9, 1, 0, 9, 1, 8, whiteCarpet, whiteCarpet, false); + finder.addBlock(whiteCarpet, 8,1, 8); + finder.fillWithOutline(13, 1, 0, 13, 1, 8, whiteCarpet, whiteCarpet, false); + finder.addBlock(whiteCarpet, 14,1, 8); + + finder.fillWithOutline(10, 1, 0, 12, 1, 15, redCarpet, redCarpet, false); } @Override diff --git a/src/main/java/kaptainwutax/seedcracker/finder/structure/PieceFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/structure/PieceFinder.java index 166f316..b6df258 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/structure/PieceFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/structure/PieceFinder.java @@ -71,7 +71,7 @@ public class PieceFinder extends Finder { //FOR DEBUGGING PIECES. if(this.debug) { MinecraftClient.getInstance().execute(() -> { - int y = this.rotation.ordinal() * 10 + this.mirror.ordinal() * 20 + 100; + int y = this.rotation.ordinal() * 10 + this.mirror.ordinal() * 20 + 120; if (this.chunkPos.x % 2 == 0 && this.chunkPos.z % 2 == 0) { this.structure.forEach((pos, state) -> { @@ -89,7 +89,7 @@ public class PieceFinder extends Finder { BlockState state = this.world.getBlockState(pos); //Blockstate may change when it gets placed in the world, that's why it's using the block here. - if(!state.getBlock().equals(entry.getValue().getBlock())) { + if(entry.getValue() != null && !state.getBlock().equals(entry.getValue().getBlock())) { found = false; break; } @@ -200,10 +200,6 @@ public class PieceFinder extends Finder { } protected void addBlock(BlockState state, int x, int y, int z) { - if(state == null) { - return; - } - BlockPos pos = new BlockPos( this.applyXTransform(x, z), this.applyYTransform(y), @@ -211,6 +207,11 @@ public class PieceFinder extends Finder { ); if(this.boundingBox.contains(pos)) { + if(state == null) { + this.structure.remove(pos); + return; + } + if (this.mirror != BlockMirror.NONE) { state = state.mirror(this.mirror); } @@ -219,6 +220,7 @@ public class PieceFinder extends Finder { state = state.rotate(this.rotation); } + this.structure.put(pos, state); } }