Last active
July 16, 2021 19:57
-
-
Save hube12/527be5b0b8f02173a3d5f23a08e81b9b to your computer and use it in GitHub Desktop.
simple Loot search function in java use hube12:SEED:master-snapshot
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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