Start of feature finders

This commit is contained in:
Unknown
2019-10-07 19:47:10 -04:00
parent 8a4e0bedc3
commit 3088fe091e
5 changed files with 164 additions and 0 deletions
@@ -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);
}
}
@@ -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<BlockState> targetBlockStates = new HashSet<>();
public BlockFinder(Block block) {
this.targetBlockStates.addAll(block.getStateFactory().getStates());
}
public BlockFinder(BlockState blockState) {
this.targetBlockStates.add(blockState);
}
@Override
public List<BlockPos> findInChunk(World world, ChunkPos chunkPos) {
List<BlockPos> 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;
}
}
@@ -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<BlockState> 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<BlockPos> findInChunk(World world, ChunkPos chunkPos) {
//Gets all the positions with a chest in the chunk.
List<BlockPos> 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;
}
}
@@ -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<BlockPos> CHUNK_POSITIONS = new ArrayList<>();
protected static final List<BlockPos> 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<BlockPos> findInChunk(World world, ChunkPos chunkPos);
}
@@ -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());
}
}