multi-threaded finders
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
package kaptainwutax.seedcracker;
|
||||
|
||||
import com.mojang.blaze3d.platform.GlStateManager;
|
||||
import io.netty.util.internal.ConcurrentSet;
|
||||
import kaptainwutax.seedcracker.finder.*;
|
||||
import kaptainwutax.seedcracker.util.FinderBuilder;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
@@ -8,13 +9,17 @@ import net.minecraft.world.World;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ExecutorService;
|
||||
import java.util.concurrent.Executors;
|
||||
|
||||
public class FinderQueue {
|
||||
|
||||
private final static FinderQueue INSTANCE = new FinderQueue();
|
||||
public static final ExecutorService SERVICE = Executors.newFixedThreadPool(5);
|
||||
|
||||
private List<FinderBuilder> finderBuilders = new ArrayList<>();
|
||||
private List<Finder> activeFinders = new ArrayList<>();
|
||||
private Set<Finder> activeFinders = new ConcurrentSet<>();
|
||||
|
||||
private FinderQueue() {
|
||||
this.clear();
|
||||
@@ -26,17 +31,19 @@ public class FinderQueue {
|
||||
|
||||
public void onChunkData(World world, ChunkPos chunkPos) {
|
||||
this.finderBuilders.forEach(finderBuilder -> {
|
||||
List<Finder> finders = finderBuilder.build(world, chunkPos);
|
||||
SERVICE.submit(() -> {
|
||||
List<Finder> finders = finderBuilder.build(world, chunkPos);
|
||||
|
||||
finders.forEach(finder -> {
|
||||
if(finder.isValidDimension(finder.getWorld().dimension.getType())) {
|
||||
finder.findInChunk();
|
||||
this.activeFinders.add(finder);
|
||||
}
|
||||
finders.forEach(finder -> {
|
||||
if (finder.isValidDimension(finder.getWorld().dimension.getType())) {
|
||||
finder.findInChunk();
|
||||
if(!finder.isUseless()) {
|
||||
this.activeFinders.add(finder);
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
this.activeFinders.removeIf(Finder::isUseless);
|
||||
}
|
||||
|
||||
public void renderFinders() {
|
||||
@@ -67,6 +74,8 @@ public class FinderQueue {
|
||||
this.finderBuilders.add(EndPillarsFinder::create);
|
||||
this.finderBuilders.add(BiomeFinder::create);
|
||||
this.finderBuilders.add(OceanMonumentFinder::create);
|
||||
this.finderBuilders.add(EndCityFinder::create);
|
||||
this.finderBuilders.add(IglooFinder::create);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -39,7 +39,7 @@ public class SeedCracker implements ModInitializer {
|
||||
return INSTANCE;
|
||||
}
|
||||
|
||||
public void clear() {
|
||||
public synchronized void clear() {
|
||||
this.worldSeeds = null;
|
||||
this.structureSeeds = null;
|
||||
this.pillarSeeds = null;
|
||||
@@ -47,8 +47,8 @@ public class SeedCracker implements ModInitializer {
|
||||
this.biomeCache.clear();
|
||||
}
|
||||
|
||||
public void onPillarData(PillarData pillarData) {
|
||||
if(this.pillarSeeds == null) {
|
||||
public synchronized boolean onPillarData(PillarData pillarData) {
|
||||
if(pillarData != null && (this.pillarSeeds == null || this.pillarSeeds.isEmpty())) {
|
||||
LOG.warn("Looking for pillar seeds...");
|
||||
|
||||
this.pillarSeeds = pillarData.getPillarSeeds();
|
||||
@@ -60,12 +60,18 @@ public class SeedCracker implements ModInitializer {
|
||||
}
|
||||
|
||||
this.onStructureData(null);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
public void onStructureData(StructureData structureData) {
|
||||
if(structureData != null) {
|
||||
return false;
|
||||
}
|
||||
|
||||
public synchronized boolean onStructureData(StructureData structureData) {
|
||||
boolean added = false;
|
||||
|
||||
if(structureData != null && !this.structureCache.contains(structureData)) {
|
||||
this.structureCache.add(structureData);
|
||||
added = true;
|
||||
}
|
||||
|
||||
if(this.structureSeeds == null && this.pillarSeeds != null && this.structureCache.size() >= 5) {
|
||||
@@ -91,12 +97,13 @@ public class SeedCracker implements ModInitializer {
|
||||
return !structureData.test(chunkRandom);
|
||||
});
|
||||
|
||||
this.structureCache.clear();
|
||||
this.onBiomeData(null);
|
||||
}
|
||||
|
||||
return added;
|
||||
}
|
||||
|
||||
public boolean onBiomeData(BiomeData biomeData) {
|
||||
public synchronized boolean onBiomeData(BiomeData biomeData) {
|
||||
boolean added = false;
|
||||
|
||||
if(biomeData != null && !this.biomeCache.contains(biomeData)) {
|
||||
@@ -137,8 +144,6 @@ public class SeedCracker implements ModInitializer {
|
||||
} else {
|
||||
LOG.error("Finished search with no seeds.");
|
||||
}
|
||||
|
||||
this.biomeCache.clear();
|
||||
} else if(this.worldSeeds != null && biomeData != null) {
|
||||
this.worldSeeds.removeIf(worldSeed -> {
|
||||
BiomeLayerSampler sampler = BiomeLayers.build(worldSeed, LevelGeneratorType.DEFAULT,
|
||||
|
||||
Reference in New Issue
Block a user