diff --git a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java index f1427b0..e5e8e26 100644 --- a/src/main/java/kaptainwutax/seedcracker/SeedCracker.java +++ b/src/main/java/kaptainwutax/seedcracker/SeedCracker.java @@ -1,11 +1,15 @@ package kaptainwutax.seedcracker; +import kaptainwutax.seedcracker.finder.BlockFinder; import net.fabricmc.api.ModInitializer; +import net.minecraft.block.Blocks; public class SeedCracker implements ModInitializer { @Override public void onInitialize() { + BlockFinder finder1 = new BlockFinder(Blocks.CHEST.getDefaultState()); + BlockFinder finder2 = new BlockFinder(Blocks.CHEST); } } diff --git a/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java new file mode 100644 index 0000000..d6137f1 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/BlockFinder.java @@ -0,0 +1,46 @@ +package kaptainwutax.seedcracker.finder; + +import kaptainwutax.seedcracker.world.ChunkWrapper; +import net.minecraft.block.Block; +import net.minecraft.block.BlockState; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; +import net.minecraft.world.chunk.ChunkSection; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + +public class BlockFinder extends Finder { + + private Set targetBlockStates = new HashSet<>(); + + public BlockFinder(Block block) { + this.targetBlockStates.addAll(block.getStateFactory().getStates()); + } + + public BlockFinder(BlockState blockState) { + this.targetBlockStates.add(blockState); + } + + @Override + public List findInChunk(World world, ChunkPos chunkPos) { + List result = new ArrayList<>(); + ChunkWrapper chunkWrapper = new ChunkWrapper(world, chunkPos); + Chunk chunk = chunkWrapper.getChunk(); + + for(BlockPos pos: CHUNK_POSITIONS) { + BlockState currentState = chunk.getBlockState(pos); + + if(this.targetBlockStates.contains(currentState)) { + result.add(chunkPos.getCenterBlockPos().add(pos)); + } + } + + return result; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java new file mode 100644 index 0000000..7336687 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/BuriedTreasureFinder.java @@ -0,0 +1,56 @@ +package kaptainwutax.seedcracker.finder; + +import net.minecraft.block.BlockState; +import net.minecraft.block.Blocks; +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.Feature; + +import java.util.ArrayList; +import java.util.List; + +public class BuriedTreasureFinder extends BlockFinder { + + protected static final List CHEST_HOLDERS = new ArrayList<>(); + + static { + CHEST_HOLDERS.add(Blocks.SANDSTONE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.STONE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.ANDESITE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.GRANITE.getDefaultState()); + CHEST_HOLDERS.add(Blocks.DIORITE.getDefaultState()); + } + + public BuriedTreasureFinder() { + super(Blocks.CHEST); + } + + @Override + public List findInChunk(World world, ChunkPos chunkPos) { + //Gets all the positions with a chest in the chunk. + List result = super.findInChunk(world, chunkPos); + + result.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; + + //Only so many blocks can hold a treasure chest. + BlockState chestHolder = world.getBlockState(pos.down()); + if(!CHEST_HOLDERS.contains(chestHolder))return true; + + //Check if the biome contains the buried treasure feature. + Biome biome = world.getBiome(pos); + if(!biome.hasStructureFeature(Feature.BURIED_TREASURE))return true; + + //Damn that chest be lucky! + return true; + }); + + return result; + } + +} diff --git a/src/main/java/kaptainwutax/seedcracker/finder/Finder.java b/src/main/java/kaptainwutax/seedcracker/finder/Finder.java new file mode 100644 index 0000000..711ff88 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/finder/Finder.java @@ -0,0 +1,33 @@ +package kaptainwutax.seedcracker.finder; + +import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Finder { + + protected static final List CHUNK_POSITIONS = new ArrayList<>(); + protected static final List SUB_CHUNK_POSITIONS = new ArrayList<>(); + + static { + for(int x = 0; x < 16; x++) { + for(int z = 0; z < 16; z++) { + for(int y = 0; y < 256; y++) { + BlockPos pos = new BlockPos(x, y, z); + if(y < 16)SUB_CHUNK_POSITIONS.add(pos); + CHUNK_POSITIONS.add(pos); + } + } + } + } + + public Finder() { + + } + + public abstract List findInChunk(World world, ChunkPos chunkPos); + +} diff --git a/src/main/java/kaptainwutax/seedcracker/world/ChunkWrapper.java b/src/main/java/kaptainwutax/seedcracker/world/ChunkWrapper.java new file mode 100644 index 0000000..c342a48 --- /dev/null +++ b/src/main/java/kaptainwutax/seedcracker/world/ChunkWrapper.java @@ -0,0 +1,25 @@ +package kaptainwutax.seedcracker.world; + +import net.minecraft.util.math.ChunkPos; +import net.minecraft.world.World; +import net.minecraft.world.chunk.Chunk; + +public class ChunkWrapper { + + private final World world; + private final ChunkPos chunkPos; + private final long chunkHash; + + public ChunkWrapper(World world, ChunkPos chunkPos) { + this.world = world; + this.chunkPos = chunkPos; + this.chunkHash = chunkPos.toLong(); + } + + public Chunk getChunk() { + return this.world.getChunk(this.chunkPos.getCenterBlockPos()); + } + +} + +