From 46c03438b3708cda0a2f52d3150e1793033cea13 Mon Sep 17 00:00:00 2001 From: dfsek Date: Fri, 17 Jun 2022 01:34:11 -0700 Subject: [PATCH] add optimization for AdjacentPatternLocator --- .../locators/AdjacentPatternLocator.java | 21 ++++++++++++------- .../locator/patterns/MatchPattern.java | 19 +++++++++++++++-- .../feature/locator/patterns/Pattern.java | 9 ++++++++ 3 files changed, 39 insertions(+), 10 deletions(-) diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java index 55fc2c2b3..ab1de182f 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/AdjacentPatternLocator.java @@ -11,6 +11,8 @@ import com.dfsek.terra.addons.feature.locator.patterns.Pattern; import com.dfsek.terra.api.structure.feature.BinaryColumn; import com.dfsek.terra.api.structure.feature.Locator; import com.dfsek.terra.api.util.Range; +import com.dfsek.terra.api.world.World; +import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.chunk.generation.util.Column; @@ -31,16 +33,19 @@ public class AdjacentPatternLocator implements Locator { } private boolean isValid(int y, Column column) { + WritableWorld world = column.getWorld(); + int x = column.getX(); + int z = column.getZ(); if(matchAll) { - return pattern.matches(y, column.adjacent(0, -1)) && - pattern.matches(y, column.adjacent(0, 1)) && - pattern.matches(y, column.adjacent(-1, 0)) && - pattern.matches(y, column.adjacent(1, 0)); + return pattern.matches(world, x, y, z - 1) && + pattern.matches(world, x, y, z + 1) && + pattern.matches(world, x - 1, y, z) && + pattern.matches(world, x + 1, y, z); } else { - return pattern.matches(y, column.adjacent(0, -1)) || - pattern.matches(y, column.adjacent(0, 1)) || - pattern.matches(y, column.adjacent(-1, 0)) || - pattern.matches(y, column.adjacent(1, 0)); + return pattern.matches(world, x, y, z - 1) || + pattern.matches(world, x, y, z + 1) || + pattern.matches(world, x - 1, y, z) || + pattern.matches(world, x + 1, y, z); } } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java index ecc3d50ae..8e58eddb7 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/MatchPattern.java @@ -7,14 +7,18 @@ package com.dfsek.terra.addons.feature.locator.patterns; +import com.dfsek.terra.api.world.ServerWorld; + +import com.dfsek.terra.api.world.WritableWorld; + +import net.jafama.FastMath; + import java.util.function.Predicate; import com.dfsek.terra.api.block.state.BlockState; import com.dfsek.terra.api.util.Range; import com.dfsek.terra.api.world.chunk.generation.util.Column; -import net.jafama.FastMath; - public class MatchPattern implements Pattern { private final Range range; @@ -35,4 +39,15 @@ public class MatchPattern implements Pattern { } return true; } + + @Override + public boolean matches(WritableWorld world, int x, int y, int z) { + int min = FastMath.max(world.getMinHeight(), range.getMin() + y); + int max = FastMath.min(world.getMinHeight(), range.getMax() + y); + if(max <= min) return false; + for(int i = min; i < max; i++) { + if(!matches.test(world.getBlockState(x, y, z))) return false; + } + return true; + } } diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java index dbe909943..86850378e 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/patterns/Pattern.java @@ -7,12 +7,21 @@ package com.dfsek.terra.addons.feature.locator.patterns; +import com.dfsek.terra.api.world.ReadableWorld; +import com.dfsek.terra.api.world.ServerWorld; +import com.dfsek.terra.api.world.World; +import com.dfsek.terra.api.world.WritableWorld; import com.dfsek.terra.api.world.chunk.generation.util.Column; public interface Pattern { boolean matches(int y, Column column); + default boolean matches(WritableWorld world, int x, int y, int z) { + return matches(y, world.column(x, z)); + } + + default Pattern and(Pattern that) { return (y, column) -> this.matches(y, column) && that.matches(y, column); }