added ocean monument finder

This commit is contained in:
Unknown
2019-11-13 19:22:54 -05:00
parent 85f9072b9a
commit 1f219ef92d
4 changed files with 153 additions and 8 deletions
@@ -17,13 +17,7 @@ public class FinderQueue {
private List<Finder> 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);
}
}
@@ -31,7 +31,7 @@ public abstract class AbstractTempleFinder extends Finder {
});
buildStructure(finder);
finders.add(finder);
this.finders.add(finder);
});
this.size = size;
@@ -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<PieceFinder> 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<BlockPos> findInChunk() {
Map<PieceFinder, List<BlockPos>> result = this.findInChunkPieces();
List<BlockPos> 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<PieceFinder, List<BlockPos>> findInChunkPieces() {
Map<PieceFinder, List<BlockPos>> 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<Finder> create(World world, ChunkPos chunkPos) {
List<Finder> 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;
}
}
@@ -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;