mirror of
https://github.com/PolyhedralDev/Terra.git
synced 2026-06-23 21:14:26 +00:00
update most things to use new maybe and either
This commit is contained in:
+3
-2
@@ -9,6 +9,7 @@ import com.dfsek.terra.addons.biome.extrusion.api.Extrusion;
|
||||
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipeline;
|
||||
import com.dfsek.terra.addons.biome.extrusion.utils.ExtrusionPipelineFactory;
|
||||
import com.dfsek.terra.api.util.Column;
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
|
||||
@@ -39,11 +40,11 @@ public class BiomeExtrusionProvider implements BiomeProvider {
|
||||
public Column<Biome> getColumn(int x, int z, long seed, int min, int max) {
|
||||
return delegate.getBaseBiome(x, z, seed)
|
||||
.map(base -> (Column<Biome>) new BaseBiomeColumn(this, base, min, max, x, z, seed))
|
||||
.orElseGet(() -> BiomeProvider.super.getColumn(x, z, seed, min, max));
|
||||
.get(() -> BiomeProvider.super.getColumn(x, z, seed, min, max));
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return delegate.getBaseBiome(x, z, seed);
|
||||
}
|
||||
|
||||
|
||||
+3
-2
@@ -11,6 +11,7 @@ import java.util.Optional;
|
||||
|
||||
import com.dfsek.terra.addons.image.colorsampler.ColorSampler;
|
||||
import com.dfsek.terra.addons.image.converter.ColorConverter;
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
|
||||
@@ -40,8 +41,8 @@ public class ImageBiomeProvider implements BiomeProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Optional.of(getBiome(x, z));
|
||||
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Maybe.just(getBiome(x, z));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+5
-2
@@ -8,6 +8,9 @@
|
||||
package com.dfsek.terra.addons.biome.pipeline;
|
||||
|
||||
import com.dfsek.seismic.type.sampler.Sampler;
|
||||
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
|
||||
import com.github.benmanes.caffeine.cache.Caffeine;
|
||||
import com.github.benmanes.caffeine.cache.LoadingCache;
|
||||
|
||||
@@ -106,8 +109,8 @@ public class PipelineBiomeProvider implements BiomeProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Optional.of(getBiome(x, z, seed));
|
||||
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Maybe.just(getBiome(x, z, seed));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+4
-9
@@ -8,18 +8,13 @@
|
||||
package com.dfsek.terra.addons.biome.single;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.Optional;
|
||||
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
|
||||
|
||||
public class SingleBiomeProvider implements BiomeProvider {
|
||||
private final Biome biome;
|
||||
|
||||
public SingleBiomeProvider(Biome biome) {
|
||||
this.biome = biome;
|
||||
}
|
||||
public record SingleBiomeProvider(Biome biome) implements BiomeProvider {
|
||||
|
||||
@Override
|
||||
public Biome getBiome(int x, int y, int z, long seed) {
|
||||
@@ -27,8 +22,8 @@ public class SingleBiomeProvider implements BiomeProvider {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Optional<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Optional.of(biome);
|
||||
public Maybe<Biome> getBaseBiome(int x, int z, long seed) {
|
||||
return Maybe.just(biome);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
+1
-1
@@ -30,7 +30,7 @@ public class ElevationInterpolator {
|
||||
gens[x + 1 + smooth][z + 1 + smooth] =
|
||||
provider
|
||||
.getBaseBiome(bx, bz, seed)
|
||||
.orElseGet(() -> provider.getBiome(bx, 0, bz, seed)) // kind of a hack
|
||||
.get(() -> provider.getBiome(bx, 0, bz, seed)) // kind of a hack
|
||||
.getContext()
|
||||
.get(noisePropertiesKey);
|
||||
}
|
||||
|
||||
+54
-50
@@ -2,10 +2,13 @@ package com.dfsek.terra.addons.commands.locate;
|
||||
|
||||
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
import com.dfsek.terra.api.util.generic.data.types.Either;
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
import com.dfsek.terra.api.world.biome.generation.BiomeProvider;
|
||||
import com.dfsek.terra.api.world.info.WorldProperties;
|
||||
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
import java.util.Optional;
|
||||
@@ -14,6 +17,7 @@ import java.util.function.Predicate;
|
||||
import java.util.stream.IntStream;
|
||||
import java.util.stream.Stream;
|
||||
|
||||
|
||||
public class BiomeLocator {
|
||||
|
||||
/**
|
||||
@@ -27,9 +31,10 @@ public class BiomeLocator {
|
||||
* @param step The search step/increment. Higher values are faster but less accurate.
|
||||
* @param filter The condition to match the biome.
|
||||
* @param search3D If true, searches the entire vertical column at each step. If false, only checks originY.
|
||||
*
|
||||
* @return An Optional containing the location of the found biome, or empty if not found.
|
||||
*/
|
||||
public static Optional<Either<Vector3Int, Vector2Int>> search(
|
||||
public static Maybe<Either<Vector3Int, Vector2Int>> search(
|
||||
@NotNull BiomeProvider provider,
|
||||
@NotNull WorldProperties properties,
|
||||
int originX,
|
||||
@@ -44,64 +49,63 @@ public class BiomeLocator {
|
||||
int maxHeight = properties.getMaxHeight();
|
||||
|
||||
// 1. Check the exact center first
|
||||
Optional<Either<Vector3Int, Vector2Int>> centerResult = check(provider, seed, originX, originZ, step, filter, search3D, minHeight, maxHeight);
|
||||
if (centerResult.isPresent()) {
|
||||
return centerResult;
|
||||
}
|
||||
return
|
||||
check(provider, seed, originX, originZ, step, filter, search3D, minHeight, maxHeight)
|
||||
|
||||
// 2. Begin Parallel Square Spiral Search
|
||||
// We iterate rings sequentially to guarantee finding the *nearest* result.
|
||||
// However, we process all points within a specific ring in parallel.
|
||||
for (int r = step; r <= radius; r += step) {
|
||||
final int currentRadius = r;
|
||||
final int minX = -currentRadius;
|
||||
final int maxX = currentRadius;
|
||||
final int minZ = -currentRadius;
|
||||
final int maxZ = currentRadius;
|
||||
// 2. Begin Parallel Square Spiral Search
|
||||
// We iterate rings sequentially to guarantee finding the *nearest* result.
|
||||
// However, we process all points within a specific ring in parallel.
|
||||
.or(() -> {
|
||||
for(int r = step; r <= radius; r += step) {
|
||||
final int currentRadius = r;
|
||||
final int minX = -currentRadius;
|
||||
final int maxX = currentRadius;
|
||||
final int minZ = -currentRadius;
|
||||
final int maxZ = currentRadius;
|
||||
|
||||
Stream<int[]> northSide = IntStream.iterate(minX, n -> n < maxX, n -> n + step)
|
||||
.mapToObj(x -> new int[]{x, minZ}); // Fixed Z (min), varying X
|
||||
Stream<int[]> northSide = IntStream.iterate(minX, n -> n < maxX, n -> n + step)
|
||||
.mapToObj(x -> new int[]{ x, minZ }); // Fixed Z (min), varying X
|
||||
|
||||
Stream<int[]> eastSide = IntStream.iterate(minZ, n -> n < maxZ, n -> n + step)
|
||||
.mapToObj(z -> new int[]{maxX, z}); // Fixed X (max), varying Z
|
||||
Stream<int[]> eastSide = IntStream.iterate(minZ, n -> n < maxZ, n -> n + step)
|
||||
.mapToObj(z -> new int[]{ maxX, z }); // Fixed X (max), varying Z
|
||||
|
||||
Stream<int[]> southSide = IntStream.iterate(maxX, n -> n > minX, n -> n - step)
|
||||
.mapToObj(x -> new int[]{x, maxZ}); // Fixed Z (max), varying X
|
||||
Stream<int[]> southSide = IntStream.iterate(maxX, n -> n > minX, n -> n - step)
|
||||
.mapToObj(x -> new int[]{ x, maxZ }); // Fixed Z (max), varying X
|
||||
|
||||
Stream<int[]> westSide = IntStream.iterate(maxZ, n -> n > minZ, n -> n - step)
|
||||
.mapToObj(z -> new int[]{minX, z}); // Fixed X (min), varying Z
|
||||
Stream<int[]> westSide = IntStream.iterate(maxZ, n -> n > minZ, n -> n - step)
|
||||
.mapToObj(z -> new int[]{ minX, z }); // Fixed X (min), varying Z
|
||||
|
||||
Optional<Either<Vector3Int, Vector2Int>> ringResult = Stream.of(northSide, eastSide, southSide, westSide)
|
||||
.flatMap(Function.identity())
|
||||
.parallel()
|
||||
.map(coords -> check(
|
||||
provider,
|
||||
seed,
|
||||
originX + coords[0],
|
||||
originZ + coords[1],
|
||||
step,
|
||||
filter,
|
||||
search3D,
|
||||
minHeight,
|
||||
maxHeight
|
||||
))
|
||||
.filter(Optional::isPresent)
|
||||
.map(Optional::get)
|
||||
.findFirst(); // findFirst() respects encounter order (North -> East -> South -> West)
|
||||
Optional<Either<Vector3Int, Vector2Int>> ringResult = Stream.of(northSide, eastSide, southSide, westSide)
|
||||
.flatMap(Function.identity())
|
||||
.parallel()
|
||||
.map(coords -> check(
|
||||
provider,
|
||||
seed,
|
||||
originX + coords[0],
|
||||
originZ + coords[1],
|
||||
step,
|
||||
filter,
|
||||
search3D,
|
||||
minHeight,
|
||||
maxHeight
|
||||
))
|
||||
.flatMap(Maybe::toStream)
|
||||
.findFirst(); // findFirst() respects encounter order (North -> East -> South -> West)
|
||||
|
||||
if (ringResult.isPresent()) {
|
||||
return ringResult;
|
||||
}
|
||||
}
|
||||
if(ringResult.isPresent()) {
|
||||
return Maybe.fromOptional(ringResult);
|
||||
}
|
||||
}
|
||||
return Maybe.nothing();
|
||||
});
|
||||
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
/**
|
||||
* Helper to check a specific coordinate column or point.
|
||||
* This logic is executed inside the worker threads.
|
||||
*/
|
||||
private static Optional<Either<Vector3Int, Vector2Int>> check(
|
||||
private static Maybe<Either<Vector3Int, Vector2Int>> check(
|
||||
BiomeProvider provider,
|
||||
long seed,
|
||||
int x,
|
||||
@@ -112,14 +116,14 @@ public class BiomeLocator {
|
||||
int minHeight,
|
||||
int maxHeight
|
||||
) {
|
||||
if (search3D) {
|
||||
if(search3D) {
|
||||
// Iterate from bottom to top of the world using the step
|
||||
for (int y = minHeight; y < maxHeight; y += step) {
|
||||
if (filter.test(provider.getBiome(x, y, z, seed))) {
|
||||
return Optional.of(Either.left(Vector3Int.of(x, y, z)));
|
||||
for(int y = minHeight; y < maxHeight; y += step) {
|
||||
if(filter.test(provider.getBiome(x, y, z, seed))) {
|
||||
return Maybe.just(Either.left(Vector3Int.of(x, y, z)));
|
||||
}
|
||||
}
|
||||
return Optional.empty();
|
||||
return Maybe.nothing();
|
||||
} else {
|
||||
// 2D Mode: Check only the base biome
|
||||
// We use a flatMap approach here to be safe with Optionals inside the stream
|
||||
|
||||
+13
-18
@@ -3,6 +3,10 @@ package com.dfsek.terra.addons.commands.locate;
|
||||
|
||||
import com.dfsek.seismic.type.vector.Vector2Int;
|
||||
import com.dfsek.seismic.type.vector.Vector3Int;
|
||||
|
||||
import com.dfsek.terra.api.util.function.FunctionUtils;
|
||||
import com.dfsek.terra.api.util.generic.data.types.Maybe;
|
||||
|
||||
import org.incendo.cloud.CommandManager;
|
||||
import org.incendo.cloud.component.DefaultValue;
|
||||
import org.incendo.cloud.context.CommandContext;
|
||||
@@ -26,6 +30,8 @@ import com.dfsek.terra.api.util.reflection.TypeKey;
|
||||
import com.dfsek.terra.api.world.World;
|
||||
import com.dfsek.terra.api.world.biome.Biome;
|
||||
|
||||
import static com.dfsek.terra.api.util.function.FunctionUtils.collapse;
|
||||
|
||||
|
||||
public class LocateCommandAddon implements AddonInitializer {
|
||||
@Inject
|
||||
@@ -83,7 +89,7 @@ public class LocateCommandAddon implements AddonInitializer {
|
||||
context.sender().sendMessage(
|
||||
"Searching for " + targetBiome.getID() + " within " + radius + " blocks" + modeMsg + "...");
|
||||
|
||||
Optional<Either<Vector3Int, Vector2Int>> result;
|
||||
Maybe<Either<Vector3Int, Vector2Int>> result;
|
||||
|
||||
// 3. Execute Search Loop
|
||||
while(true) {
|
||||
@@ -100,7 +106,7 @@ public class LocateCommandAddon implements AddonInitializer {
|
||||
|
||||
// Exit Conditions:
|
||||
// 1. Found a result
|
||||
if(result.isPresent()) {
|
||||
if(result.isJust()) {
|
||||
break;
|
||||
}
|
||||
// 2. Not in auto mode (only run once)
|
||||
@@ -118,22 +124,11 @@ public class LocateCommandAddon implements AddonInitializer {
|
||||
}
|
||||
|
||||
// 4. Handle Result
|
||||
if(result.isPresent()) {
|
||||
Either<Vector3Int, Vector2Int> location = result.get();
|
||||
String coords;
|
||||
|
||||
if(location.hasLeft()) { // 3D Result
|
||||
Vector3Int vec = location.getLeft().get();
|
||||
coords = String.format("%d, %d, %d", vec.getX(), vec.getY(), vec.getZ());
|
||||
} else { // 2D Result
|
||||
Vector2Int vec = location.getRight().get();
|
||||
coords = String.format("%d, ~, %d", vec.getX(), vec.getZ());
|
||||
}
|
||||
|
||||
context.sender().sendMessage("Found " + targetBiome.getID() + " at [" + coords + "]");
|
||||
} else {
|
||||
context.sender().sendMessage("Could not find " + targetBiome.getID() + " within " + radius + " blocks.");
|
||||
}
|
||||
context.sender().sendMessage(collapse(result.map(location -> location.collect(
|
||||
left -> String.format("%d, %d, %d", left.getX(), left.getY(), left.getZ()),
|
||||
right -> String.format("%d, ~, %d", right.getX(), right.getZ())))
|
||||
.map(coords -> "Found " + targetBiome.getID() + " at [" + coords + "]")
|
||||
.toEither("Could not find " + targetBiome.getID() + " within " + radius + " blocks.")));
|
||||
})
|
||||
.permission("terra.locate.biome")
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user