Merge remote-tracking branch 'origin/master'

This commit is contained in:
Neil
2020-02-18 16:25:41 +01:00
52 changed files with 916 additions and 755 deletions
@@ -5,46 +5,82 @@ import kaptainwutax.seedcracker.cracker.population.PopulationData;
import kaptainwutax.seedcracker.util.Log;
import kaptainwutax.seedcracker.util.Rand;
import kaptainwutax.seedcracker.util.math.LCG;
import net.minecraft.world.gen.ChunkRandom;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.atomic.AtomicInteger;
public class TimeMachine {
private LCG inverseLCG = Rand.JAVA_LCG.combine(-2);
public int THREAD_COUNT = 4;
public ExecutorService SERVICE = Executors.newFixedThreadPool(THREAD_COUNT);
private boolean isRunning = false;
public TimeMachine() {
}
public List<Long> buildStructureSeeds(int pillarSeed, List<StructureData> structureDataList, List<PopulationData> populationDataList, List<Long> structureSeeds) {
ChunkRandom chunkRandom = new ChunkRandom();
public List<Long> bruteforceRegion(int pillarSeed, int region, long size, List<StructureData> structureDataList, List<DecoratorData> decoratorDataList) {
List<Long> result = new ArrayList<>();
Rand rand = new Rand(0L);
for(long i = 0; i < (1L << 32); i++) {
if((i & ((1L << 28) - 1)) == 0) {
Log.warn("Progress " + (i * 100.0f) / (1L << 32) + "%...");
}
for(long i = start; i < end; i++) {
long structureSeed = this.timeMachine(i, pillarSeed);
boolean goodSeed = true;
for(StructureData structureData: structureDataList) {
if(!goodSeed)break;
chunkRandom.setStructureSeed(structureSeed, structureData.getRegionX(),
structureData.getRegionZ(), structureData.getSalt());
if(!structureData.test(chunkRandom))goodSeed = false;
if(!structureData.test(structureSeed, rand))goodSeed = false;
}
for(PopulationData populationData: populationDataList) {
for(DecoratorData decoratorData : decoratorDataList) {
if(!goodSeed)break;
if(!populationData.test(structureSeed))goodSeed = false;
if(!decoratorData.test(structureSeed))goodSeed = false;
}
if(goodSeed) {
structureSeeds.add(structureSeed);
result.add(structureSeed);
}
}
return result;
}
public Set<Long> buildStructureSeeds(int pillarSeed, List<StructureData> structureDataList, List<DecoratorData> decoratorDataList, Set<Long> structureSeeds) {
if(this.isRunning) {
throw new IllegalStateException("Time Machine is already running");
}
this.isRunning = true;
long size = (long)Math.ceil((double)(1L << 32) / THREAD_COUNT);
AtomicInteger progress = new AtomicInteger();
for(int i = 0; i < THREAD_COUNT; i++) {
int finalI = i;
SERVICE.submit(() -> {
structureSeeds.addAll(this.bruteforceRegion(pillarSeed, finalI, size, structureDataList, decoratorDataList));
Log.warn("Completed thread " + finalI + "!");
progress.getAndIncrement();
});
}
while(progress.get() < THREAD_COUNT) {
try {Thread.sleep(20);}
catch(InterruptedException e) {e.printStackTrace();}
}
this.isRunning = false;
return structureSeeds;
}
@@ -59,4 +95,8 @@ public class TimeMachine {
return currentSeed;
}
public void stop() {
this.isRunning = false;
}
}