diff --git a/src/main/java/kaptainwutax/seedcracker/FinderQueue.java b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java index 576ddbc..b9e8ec0 100644 --- a/src/main/java/kaptainwutax/seedcracker/FinderQueue.java +++ b/src/main/java/kaptainwutax/seedcracker/FinderQueue.java @@ -17,13 +17,7 @@ public class FinderQueue { private List activeFinders = new ArrayList<>(); private FinderQueue() { - this.finderBuilders.add(DungeonFinder::create); - this.finderBuilders.add(BuriedTreasureFinder::create); - this.finderBuilders.add(SwampHutFinder::create); - this.finderBuilders.add(DesertTempleFinder::create); - this.finderBuilders.add(JungleTempleFinder::create); - this.finderBuilders.add(EndPillarsFinder::create); - this.finderBuilders.add(BiomeFinder::create); + this.clear(); } public static FinderQueue get() { @@ -63,6 +57,16 @@ public class FinderQueue { public void clear() { this.activeFinders.clear(); + this.finderBuilders.clear(); + + this.finderBuilders.add(DungeonFinder::create); + this.finderBuilders.add(BuriedTreasureFinder::create); + this.finderBuilders.add(SwampHutFinder::create); + this.finderBuilders.add(DesertTempleFinder::create); + this.finderBuilders.add(JungleTempleFinder::create); + this.finderBuilders.add(EndPillarsFinder::create); + this.finderBuilders.add(BiomeFinder::create); + this.finderBuilders.add(OceanMonumentFinder::create); } } diff --git a/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java index 73c27d9..b129679 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java @@ -31,7 +31,7 @@ public abstract class AbstractTempleFinder extends Finder { }); buildStructure(finder); - finders.add(finder); + this.finders.add(finder); }); this.size = size; diff --git a/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java new file mode 100644 index 0000000..0f81e0e --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java @@ -0,0 +1,131 @@ +package kaptainwutax.seedcracker.finder; + +import kaptainwutax.seedcracker.SeedCracker; +import kaptainwutax.seedcracker.cracker.StructureData; +import kaptainwutax.seedcracker.render.Cube; +import kaptainwutax.seedcracker.render.Cuboid; +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.client.util.math.Vector4f; +import net.minecraft.util.math.BlockPos; +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.dimension.DimensionType; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class OceanMonumentFinder extends Finder { + + protected List finders = new ArrayList<>(); + protected final Vec3i size = new Vec3i(8, 5, 8); + + public OceanMonumentFinder(World world, ChunkPos chunkPos) { + super(world, chunkPos); + + PieceFinder finder = new PieceFinder(world, chunkPos, Direction.NORTH, size); + + finder.searchPositions.removeIf(pos -> { + if(pos.getY() != 56)return true; + return false; + }); + + buildStructure(finder); + this.finders.add(finder); + } + + @Override + public List findInChunk() { + 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 -> { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(0.0f, 0.0f, 1.0f, 1.0f))); + ChunkPos monumentStart = new ChunkPos(this.chunkPos.x + 1, this.chunkPos.z + 1); + this.renderers.add(new Cube(monumentStart.getCenterBlockPos().add(0, pos.getY(), 0), new Vector4f(0.0f, 0.0f, 1.0f, 1.0f))); + SeedCracker.get().onStructureData(new StructureData(monumentStart, StructureData.OCEAN_MONUMENT)); + }); + }); + + return combinedResult; + } + + public Map> findInChunkPieces() { + Map> result = new HashMap<>(); + + this.finders.forEach(pieceFinder -> { + result.put(pieceFinder, pieceFinder.findInChunk()); + }); + + return result; + } + + @Override + public boolean isValidDimension(DimensionType dimension) { + return dimension == DimensionType.OVERWORLD; + } + + public void buildStructure(PieceFinder finder) { + BlockState prismarine = Blocks.PRISMARINE.getDefaultState(); + BlockState prismarineBricks = Blocks.PRISMARINE_BRICKS.getDefaultState(); + BlockState darkPrismarine = Blocks.DARK_PRISMARINE.getDefaultState(); + BlockState seaLantern = Blocks.SEA_LANTERN.getDefaultState(); + BlockState water = Blocks.WATER.getDefaultState(); + + //4 bottom pillars. + for(int i = 0; i < 4; i++) { + int x = i >= 2 ? 7 : 0; + int z = i % 2 == 0 ? 0 : 7; + + for(int y = 0; y < 3; y++) { + finder.addBlock(prismarineBricks, x, y, z); + } + } + + //First bend. + for(int i = 0; i < 4; i++) { + int x = i >= 2 ? 6 : 1; + int z = i % 2 == 0 ? 1 : 6; + finder.addBlock(prismarineBricks, x, 3, z); + } + + //Prismarine ring. + for(int x = 2; x <= 5; x++) { + for(int z = 2; z <= 5; z++) { + if(x == 2 || x == 5 || z == 2 || z == 5) { + finder.addBlock(prismarine, x, 4, z); + } + } + } + + //Second bend. + for(int i = 0; i < 4; i++) { + int x = i >= 2 ? 5 : 2; + int z = i % 2 == 0 ? 2 : 5; + finder.addBlock(prismarineBricks, x, 4, z); + finder.addBlock(seaLantern, x, 3, z); + } + } + + public static List create(World world, ChunkPos chunkPos) { + List finders = new ArrayList<>(); + finders.add(new OceanMonumentFinder(world, chunkPos)); + finders.add(new OceanMonumentFinder(world, new ChunkPos(chunkPos.x - 1, chunkPos.z))); + finders.add(new OceanMonumentFinder(world, new ChunkPos(chunkPos.x, chunkPos.z - 1))); + finders.add(new OceanMonumentFinder(world, new ChunkPos(chunkPos.x - 1, chunkPos.z - 1))); + return finders; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/finder/PieceFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/PieceFinder.java index 286e239..eddadd7 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/PieceFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/PieceFinder.java @@ -64,6 +64,16 @@ public class PieceFinder extends Finder { Chunk chunk = this.world.getChunk(this.chunkPos.getCenterBlockPos()); + // FOR DEBUGGING PIECES. + int y = this.rotation.ordinal() * 10 + this.mirror.ordinal() * 20 + 60; + + if(this.chunkPos.x % 2 == 0 && this.chunkPos.z % 2 == 0) { + this.structure.forEach((pos, state) -> { + //this.world.setBlockState(this.chunkPos.getCenterBlockPos().add(pos).add(0, y, 0), state); + }); + } + + for(BlockPos center: this.searchPositions) { boolean found = true;