Skip to content

Instantly share code, notes, and snippets.

@hube12
Last active July 16, 2021 19:57
Show Gist options
  • Save hube12/527be5b0b8f02173a3d5f23a08e81b9b to your computer and use it in GitHub Desktop.
Save hube12/527be5b0b8f02173a3d5f23a08e81b9b to your computer and use it in GitHub Desktop.
simple Loot search function in java use hube12:SEED:master-snapshot
package kaptainwutax.featureutils;
import kaptainwutax.biomeutils.source.BiomeSource;
import kaptainwutax.featureutils.loot.ILoot;
import kaptainwutax.featureutils.loot.item.Item;
import kaptainwutax.featureutils.loot.item.Items;
import kaptainwutax.featureutils.structure.BuriedTreasure;
import kaptainwutax.featureutils.structure.DesertPyramid;
import kaptainwutax.featureutils.structure.RegionStructure;
import kaptainwutax.featureutils.structure.Shipwreck;
import kaptainwutax.featureutils.structure.generator.Generator;
import kaptainwutax.featureutils.structure.generator.Generators;
import kaptainwutax.mcutils.rand.ChunkRand;
import kaptainwutax.mcutils.state.Dimension;
import kaptainwutax.mcutils.util.data.SpiralIterator;
import kaptainwutax.mcutils.util.pos.BPos;
import kaptainwutax.mcutils.util.pos.CPos;
import kaptainwutax.mcutils.util.pos.RPos;
import kaptainwutax.mcutils.version.MCVersion;
import kaptainwutax.terrainutils.TerrainGenerator;
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
import java.util.stream.StreamSupport;
public class Test {
/**
* Find a single position for a specific item withing a radius for a set of structure
* Supports only 1.13+ (verified for 1.15+)
*
* @param item The specific item
* @param center The center position (in blocks)
* @param radius The radius to search for (in blocks)
* @param chunkRand The chunkrand object (for optimization, doesn't need to be seeded at all)
* @param terrainGenerator The terraingenerator initialized
* @param structures the list of structures to search in
* @return a single position
*/
public static BPos locateLoot(Item item, BPos center, int radius, ChunkRand chunkRand, TerrainGenerator terrainGenerator, Set<RegionStructure<?, ?>> structures) {
for(RegionStructure<?, ?> structure : structures) {
Generator.GeneratorFactory<?> factory = Generators.get(structure.getClass());
if(factory == null) {
continue;
}
Generator structureGenerator = factory.create(terrainGenerator.getVersion());
if(!structureGenerator.getPossibleLootItems().contains(item)) {
continue;
}
int chunkInRegion = structure.getSpacing();
int regionSize = chunkInRegion * 16;
SpiralIterator<RPos> spiralIterator = new SpiralIterator<>(
new RPos(center.toRegionPos(regionSize).getX(), center.toRegionPos(regionSize).getZ(), regionSize),
new RPos(radius / regionSize, radius / regionSize, regionSize), 1, (x, y, z) -> new RPos(x, z, regionSize)
);
CPos lootPos = StreamSupport.stream(spiralIterator.spliterator(), false)
.map(rPos -> structure.getInRegion(terrainGenerator.getWorldSeed(), rPos.getX(), rPos.getZ(), chunkRand))
.filter(Objects::nonNull)
.filter(cPos -> structure.canSpawn(cPos, terrainGenerator.getBiomeSource()) && structure.canGenerate(cPos, terrainGenerator))
.filter(cPos -> structureGenerator.generate(terrainGenerator, cPos, chunkRand) &&
((ILoot)structure).getLoot(terrainGenerator.getWorldSeed(), structureGenerator, chunkRand, false)
.stream().anyMatch(chestContent -> chestContent.contains(item))
)
.findAny().orElse(null);
if(lootPos != null) {
return lootPos.toBlockPos().add(9, 0, 9);
}
}
return null;
}
public static void main(String[] args) {
final MCVersion version = MCVersion.v1_17;
BPos pos = locateLoot(Items.GOLDEN_APPLE, new BPos(0, 0, 0), 3000, new ChunkRand(),
TerrainGenerator.of(BiomeSource.of(Dimension.OVERWORLD, version, 1L)),
new HashSet<RegionStructure<?, ?>>() {{
add(new DesertPyramid(version));
add(new BuriedTreasure(version));
add(new Shipwreck(version));
}}
);
// will print Pos{x=2633, y=0, z=2825}
System.out.println(pos);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment