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