From e4d1698b859f5a44ea7118dc3a106fa92a41ea94 Mon Sep 17 00:00:00 2001 From: Unknown Date: Fri, 15 Nov 2019 07:41:53 -0500 Subject: [PATCH] fixed search positions overhead --- .../finder/AbstractTempleFinder.java | 14 +- .../finder/BuriedTreasureFinder.java | 34 +++-- .../finder/DesertTempleFinder.java | 5 +- .../seedcracker/finder/EndCityFinder.java | 121 ++++++++++++++++++ .../seedcracker/finder/EndPillarsFinder.java | 28 ++-- .../seedcracker/finder/IglooFinder.java | 119 +++++++++++++++++ .../finder/JungleTempleFinder.java | 5 +- .../finder/OceanMonumentFinder.java | 18 ++- .../seedcracker/finder/SwampHutFinder.java | 5 +- 9 files changed, 306 insertions(+), 43 deletions(-) create mode 100644 src/main/java/kaptainwutax/seedcracker/finder/EndCityFinder.java create mode 100644 src/main/java/kaptainwutax/seedcracker/finder/IglooFinder.java diff --git a/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java index b129679..1c99e79 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/AbstractTempleFinder.java @@ -14,6 +14,13 @@ import java.util.Map; public abstract class AbstractTempleFinder extends Finder { + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + if(pos.getX() != 0)return true; + if(pos.getY() < 63)return true; + if(pos.getZ() != 0)return true; + return false; + }); + protected List finders = new ArrayList<>(); protected final Vec3i size; @@ -23,12 +30,7 @@ public abstract class AbstractTempleFinder extends Finder { Direction.Type.HORIZONTAL.forEach(direction -> { PieceFinder finder = new PieceFinder(world, chunkPos, direction, size); - finder.searchPositions.removeIf(pos -> { - if(pos.getX() != 0)return true; - if(pos.getY() < 63)return true; - if(pos.getZ() != 0)return true; - return false; - }); + finder.searchPositions = SEARCH_POSITIONS; buildStructure(finder); this.finders.add(finder); diff --git a/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java index 0bd95cf..a781fb7 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java @@ -5,6 +5,7 @@ import kaptainwutax.seedcracker.cracker.StructureData; import kaptainwutax.seedcracker.render.Cube; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.ChestBlock; import net.minecraft.client.util.math.Vector4f; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.ChunkPos; @@ -18,6 +19,15 @@ import java.util.List; public class BuriedTreasureFinder extends BlockFinder { + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + //Buried treasure chests always generate at (9, 9) within a chunk. + int localX = pos.getX() & 15; + int localZ = pos.getZ() & 15; + if(localX != 9 || localZ != 9)return true; + + return false; + }); + protected static final List CHEST_HOLDERS = new ArrayList<>(); static { @@ -26,19 +36,16 @@ public class BuriedTreasureFinder extends BlockFinder { CHEST_HOLDERS.add(Blocks.ANDESITE.getDefaultState()); CHEST_HOLDERS.add(Blocks.GRANITE.getDefaultState()); CHEST_HOLDERS.add(Blocks.DIORITE.getDefaultState()); + + //Population can turn stone, andesite, granite and diorite into ores... + CHEST_HOLDERS.add(Blocks.COAL_ORE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.IRON_ORE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.GOLD_ORE.getDefaultState()); } public BuriedTreasureFinder(World world, ChunkPos chunkPos) { super(world, chunkPos, Blocks.CHEST); - - this.searchPositions.removeIf(pos -> { - //Buried treasure chests always generate at (9, 9) within a chunk. - int localX = pos.getX() & 15; - int localZ = pos.getZ() & 15; - if(localX != 9 || localZ != 9)return true; - - return false; - }); + this.searchPositions = SEARCH_POSITIONS; } @Override @@ -47,6 +54,10 @@ public class BuriedTreasureFinder extends BlockFinder { List result = super.findInChunk(); result.removeIf(pos -> { + //Chest can't be waterlogged! + BlockState chest = world.getBlockState(pos); + if(chest.get(ChestBlock.WATERLOGGED))return true; + //Only so many blocks can hold a treasure chest. BlockState chestHolder = world.getBlockState(pos.down()); if(!CHEST_HOLDERS.contains(chestHolder))return true; @@ -60,8 +71,9 @@ public class BuriedTreasureFinder extends BlockFinder { }); result.forEach(pos -> { - this.renderers.add(new Cube(pos, new Vector4f(1.0f, 1.0f, 0.0f, 1.0f))); - SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.BURIED_TREASURE)); + if(SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.BURIED_TREASURE))) { + this.renderers.add(new Cube(pos, new Vector4f(1.0f, 1.0f, 0.0f, 1.0f))); + } }); return result; diff --git a/src/main/java/kaptainwutax/seedcracker/finder/DesertTempleFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/DesertTempleFinder.java index 9d7d49b..941e459 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/DesertTempleFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/DesertTempleFinder.java @@ -41,8 +41,9 @@ public class DesertTempleFinder extends AbstractTempleFinder { combinedResult.addAll(positions); positions.forEach(pos -> { - this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); - SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.DESERT_PYRAMID)); + if( SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.DESERT_PYRAMID))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); + } }); }); diff --git a/src/main/java/kaptainwutax/seedcracker/finder/EndCityFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/EndCityFinder.java new file mode 100644 index 0000000..470c805 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/EndCityFinder.java @@ -0,0 +1,121 @@ +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 EndCityFinder extends Finder { + + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + return false; + }); + + protected List finders = new ArrayList<>(); + protected final Vec3i size = new Vec3i(8, 4, 8); + + public EndCityFinder(World world, ChunkPos chunkPos) { + super(world, chunkPos); + + Direction.Type.HORIZONTAL.forEach(direction -> { + PieceFinder finder = new PieceFinder(world, chunkPos, direction, size); + + finder.searchPositions = SEARCH_POSITIONS; + + buildStructure(finder); + this.finders.add(finder); + }); + } + + private void buildStructure(PieceFinder finder) { + BlockState air = Blocks.AIR.getDefaultState(); + BlockState endstoneBricks = Blocks.END_STONE_BRICKS.getDefaultState(); + BlockState purpur = Blocks.PURPUR_BLOCK.getDefaultState(); + BlockState purpurPillar = Blocks.PURPUR_PILLAR.getDefaultState(); + BlockState purpleGlass = Blocks.MAGENTA_STAINED_GLASS.getDefaultState(); + + //Walls + finder.fillWithOutline(0, 0, 0, 7, 4, 7, endstoneBricks, null, false); + + //Wall sides + finder.fillWithOutline(0, 0, 0, 0, 3, 0, purpurPillar, purpurPillar, false); + finder.fillWithOutline(7, 0, 0, 7, 3, 0, purpurPillar, purpurPillar, false); + finder.fillWithOutline(0, 0, 7, 0, 3, 7, purpurPillar, purpurPillar, false); + finder.fillWithOutline(7, 0, 7, 7, 3, 7, purpurPillar, purpurPillar, false); + + //Floor + finder.fillWithOutline(0, 0, 0, 7, 0, 7, purpur, purpur, false); + + //Doorway + finder.fillWithOutline(3, 1, 0, 4, 3, 0, air, air, false); + + //Windows + finder.fillWithOutline(0, 2, 2, 0, 3, 2, purpleGlass, purpleGlass, false); + finder.fillWithOutline(0, 2, 5, 0, 3, 5, purpleGlass, purpleGlass, false); + finder.fillWithOutline(7, 2, 2, 7, 3, 2, purpleGlass, purpleGlass, false); + finder.fillWithOutline(7, 2, 5, 7, 3, 5, purpleGlass, purpleGlass, false); + } + + @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 -> { + if(SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.END_CITY))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(0.6f, 0.0f, 0.6f, 1.0f))); + this.renderers.add(new Cube(pos, new Vector4f(0.6f, 0.0f, 0.6f, 1.0f))); + } + }); + }); + + 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.THE_END; + } + + public static List create(World world, ChunkPos chunkPos) { + List finders = new ArrayList<>(); + finders.add(new EndCityFinder(world, chunkPos)); + finders.add(new EndCityFinder(world, new ChunkPos(chunkPos.x - 1, chunkPos.z))); + finders.add(new EndCityFinder(world, new ChunkPos(chunkPos.x, chunkPos.z - 1))); + finders.add(new EndCityFinder(world, new ChunkPos(chunkPos.x - 1, chunkPos.z - 1))); + return finders; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/finder/EndPillarsFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/EndPillarsFinder.java index 4c23238..6e34d69 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/EndPillarsFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/EndPillarsFinder.java @@ -18,11 +18,15 @@ import java.util.stream.Collectors; public class EndPillarsFinder extends Finder { + private boolean alreadyFound; protected BedrockMarkerFinder[] bedrockMarkers = new BedrockMarkerFinder[10]; public EndPillarsFinder(World world, ChunkPos chunkPos) { super(world, chunkPos); + this.alreadyFound = SeedCracker.get().onPillarData(null); + if(this.alreadyFound)return; + for(int i = 0; i < this.bedrockMarkers.length; i++) { int x = MathHelper.floor(42.0D * Math.cos(2.0D * (-Math.PI + (Math.PI / 10.0D) * (double)i))); int z = MathHelper.floor(42.0D * Math.sin(2.0D * (-Math.PI + (Math.PI / 10.0D) * (double)i))); @@ -35,12 +39,14 @@ public class EndPillarsFinder extends Finder { List result = new ArrayList<>(); for(BedrockMarkerFinder bedrockMarker: this.bedrockMarkers) { + if(bedrockMarker == null)continue; result.addAll(bedrockMarker.findInChunk()); } if(result.size() == this.bedrockMarkers.length) { + PillarData pillarData = new PillarData(result.stream().map(Vec3i::getY).collect(Collectors.toList())); + SeedCracker.get().onPillarData(pillarData); result.forEach(pos -> this.renderers.add(new Cube(pos, new Vector4f(0.5f, 0.0f, 0.5f, 1.0f)))); - SeedCracker.get().onPillarData(new PillarData(result.stream().map(Vec3i::getY).collect(Collectors.toList()))); } return result; @@ -57,21 +63,17 @@ public class EndPillarsFinder extends Finder { return finders; } - public class BedrockMarkerFinder extends BlockFinder { + public static class BedrockMarkerFinder extends BlockFinder { + + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + if(pos.getY() < 76)return true; + if(pos.getY() > 76 + 3 * 10)return true; + return false; + }); public BedrockMarkerFinder(World world, ChunkPos chunkPos, BlockPos xz) { super(world, chunkPos, Blocks.BEDROCK); - - int localX = xz.getX() & 15; - int localZ = xz.getZ() & 15; - - this.searchPositions.removeIf(pos -> { - if(pos.getX() != localX)return true; - if(pos.getY() < 76)return true; - if(pos.getY() > 76 + 3 * 10)return true; - if(pos.getZ() != localZ)return true; - return false; - }); + this.searchPositions = SEARCH_POSITIONS; } @Override diff --git a/src/main/java/kaptainwutax/seedcracker/finder/IglooFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/IglooFinder.java new file mode 100644 index 0000000..c176927 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/IglooFinder.java @@ -0,0 +1,119 @@ +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 IglooFinder extends Finder { + + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + return false; + }); + + protected List finders = new ArrayList<>(); + protected final Vec3i size = new Vec3i(7, 5, 8); + + public IglooFinder(World world, ChunkPos chunkPos) { + super(world, chunkPos); + + Direction.Type.HORIZONTAL.forEach(direction -> { + PieceFinder finder = new PieceFinder(world, chunkPos, direction, size); + + finder.searchPositions = SEARCH_POSITIONS; + + buildStructure(finder); + this.finders.add(finder); + }); + } + + private void buildStructure(PieceFinder finder) { + BlockState air = Blocks.AIR.getDefaultState(); + BlockState snow = Blocks.SNOW_BLOCK.getDefaultState(); + BlockState ice = Blocks.ICE.getDefaultState(); + + for(int y = 0; y < 3; y++) { + finder.addBlock(snow, 2, y, 0); + finder.addBlock(snow, 2, y, 1); + finder.addBlock(snow, 1, y, 2); + finder.addBlock(snow, 0, y, 3); + finder.addBlock(snow, 0, y, 4); + finder.addBlock(ice, 0, 1, 4); + finder.addBlock(snow, 0, y, 5); + finder.addBlock(snow, 1, y, 6); + finder.addBlock(snow, 2, y, 7); + + finder.addBlock(snow, 3, y, 7); + + finder.addBlock(snow, 4, y, 0); + finder.addBlock(snow, 4, y, 1); + finder.addBlock(snow, 5, y, 2); + finder.addBlock(snow, 6, y, 3); + finder.addBlock(snow, 6, y, 4); + finder.addBlock(ice, 6, 1, 4); + finder.addBlock(snow, 6, y, 5); + finder.addBlock(snow, 5, y, 6); + finder.addBlock(snow, 4, y, 7); + } + } + + @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 -> { + if(SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.IGLOO))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(0.0f, 1.0f, 1.0f, 1.0f))); + this.renderers.add(new Cube(pos, new Vector4f(0.0f, 1.0f, 1.0f, 1.0f))); + } + }); + }); + + 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 static List create(World world, ChunkPos chunkPos) { + List finders = new ArrayList<>(); + finders.add(new IglooFinder(world, chunkPos)); + return finders; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/finder/JungleTempleFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/JungleTempleFinder.java index d8e6b17..09f2998 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/JungleTempleFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/JungleTempleFinder.java @@ -41,8 +41,9 @@ public class JungleTempleFinder extends AbstractTempleFinder { combinedResult.addAll(positions); positions.forEach(pos -> { - this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); - SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.JUNGLE_TEMPLE)); + if(SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.JUNGLE_TEMPLE))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); + } }); }); diff --git a/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java index 0f81e0e..6c4f186 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/OceanMonumentFinder.java @@ -21,6 +21,11 @@ import java.util.Map; public class OceanMonumentFinder extends Finder { + protected static List SEARCH_POSITIONS = buildSearchPositions(CHUNK_POSITIONS, pos -> { + if(pos.getY() != 56)return true; + return false; + }); + protected List finders = new ArrayList<>(); protected final Vec3i size = new Vec3i(8, 5, 8); @@ -29,10 +34,7 @@ public class OceanMonumentFinder extends Finder { PieceFinder finder = new PieceFinder(world, chunkPos, Direction.NORTH, size); - finder.searchPositions.removeIf(pos -> { - if(pos.getY() != 56)return true; - return false; - }); + finder.searchPositions = SEARCH_POSITIONS; buildStructure(finder); this.finders.add(finder); @@ -52,10 +54,12 @@ public class OceanMonumentFinder extends Finder { 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)); + + if(SeedCracker.get().onStructureData(new StructureData(monumentStart, StructureData.OCEAN_MONUMENT))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(0.0f, 0.0f, 1.0f, 1.0f))); + this.renderers.add(new Cube(monumentStart.getCenterBlockPos().add(0, pos.getY(), 0), new Vector4f(0.0f, 0.0f, 1.0f, 1.0f))); + } }); }); diff --git a/src/main/java/kaptainwutax/seedcracker/finder/SwampHutFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/SwampHutFinder.java index 7851a13..ce8c3c0 100644 --- a/src/main/java/kaptainwutax/seedcracker/finder/SwampHutFinder.java +++ b/src/main/java/kaptainwutax/seedcracker/finder/SwampHutFinder.java @@ -42,8 +42,9 @@ public class SwampHutFinder extends AbstractTempleFinder { combinedResult.addAll(positions); positions.forEach(pos -> { - this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); - SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.SWAMP_HUT)); + if(SeedCracker.get().onStructureData(new StructureData(this.chunkPos, StructureData.SWAMP_HUT))) { + this.renderers.add(new Cuboid(pos, pieceFinder.getLayout(), new Vector4f(1.0f, 0.0f, 1.0f, 1.0f))); + } }); });