Skip to content
Closed
24 changes: 24 additions & 0 deletions search.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
{
"defaults": {
"center": null,
"shape": "circle"
},

"groups": {


"struct": {
"structures": ["Witch"],
"radius": 2000
},

"biome": {
"biomes": ["Forest"],
"radius": 2000
}

},

"match": ["struct", "biome"],
"ignore": []
}
3 changes: 3 additions & 0 deletions src/main/java/amidst/AmidstSettings.java
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class AmidstSettings {

public final Setting<String> lastProfile;
public final Setting<String> worldType;
public final Setting<String> searchJsonFile;

/**
* This is not persisted.
Expand Down Expand Up @@ -69,6 +70,8 @@ public AmidstSettings(Preferences preferences) {

lastProfile = Settings.createString( preferences, "profile", "");
worldType = Settings.createString( preferences, "worldType", WorldType.PROMPT_EACH_TIME);
searchJsonFile = Settings.createString( preferences, "searchJsonFile", "search.json");

biomeProfileSelection = new BiomeProfileSelection(BiomeProfile.getDefaultProfile());
// @formatter:on
}
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/amidst/FeatureToggles.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,6 @@
public enum FeatureToggles {
;

public static final boolean SEED_SEARCH = false;
public static final boolean SEED_SEARCH = true;
public static final boolean WORLD_EXPORTER = false;
}
17 changes: 0 additions & 17 deletions src/main/java/amidst/documentation/GsonConstructor.java

This file was deleted.

22 changes: 22 additions & 0 deletions src/main/java/amidst/documentation/GsonObject.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package amidst.documentation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* This annotation is added to classes which can be (de)serialised with GSON.
* These classes must have a no-argument constructor, which will be used by GSON
* to construct instances for deserialisation.
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target(ElementType.TYPE)
public @interface GsonObject {
/**
* Whether or not to ignore unknown fields when deserialising an instance.
*/
public boolean ignoreUnknown() default false;
}
27 changes: 27 additions & 0 deletions src/main/java/amidst/documentation/JsonField.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package amidst.documentation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
* This annotation gives information on the fields of a JSON class.
* Used by amidst.util.StrictTypeAdapterFactory to enforce required fields.
*/
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Target({ ElementType.FIELD })
public @interface JsonField {

/**
* Whether or not this field is optional
*/
public boolean optional() default false;

/**
* Other fields which must be present when this field is present
*/
public String[] require() default {};
}
81 changes: 81 additions & 0 deletions src/main/java/amidst/filter/BiomeConstraint.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
package amidst.filter;

import java.util.Optional;

import amidst.documentation.Immutable;
import amidst.logging.AmidstLogger;
import amidst.mojangapi.minecraftinterface.MinecraftInterfaceException;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.biome.Biome;
import amidst.mojangapi.world.biome.BiomeData;
import amidst.mojangapi.world.coordinates.Coordinates;
import amidst.mojangapi.world.coordinates.Region;
import amidst.mojangapi.world.coordinates.Resolution;


@Immutable
public class BiomeConstraint implements Constraint {

private final Region region;
private final Biome biome;
private final boolean checkDistance;

public BiomeConstraint(Region region, Biome biome, boolean check) {
this.region = region;
this.biome = biome;
checkDistance = check;
}

@Override
public Region getRegion() {
return region;
}

@Override
public Optional<Coordinates> checkRegion(World world, Region.Box region) {
try {
BiomeData data = world.getBiomeDataOracle().getBiomeData(region, true);

return Optional.ofNullable(data.findFirst((x, y, b) -> {
if(b != biome.getIndex())
return null;

Coordinates pos = region.getCorner().add(Coordinates.from(x, y, Resolution.QUARTER));
if(checkDistance && !region.contains(pos))
return null;
return pos;
}));
} catch (MinecraftInterfaceException e) {
AmidstLogger.error(e);
return Optional.empty();
}
}

@Override
public void addMarkers(WorldFilterResult.ResultItem item) {
if(item.biome != null && item.biome != biome)
throw new IllegalArgumentException("biome is already set!");

item.biome = biome;
}

@Override
public boolean equals(Object other) {
if(!(other instanceof BiomeConstraint))
return false;

BiomeConstraint o = (BiomeConstraint) other;
return region.equals(o.region)
&& biome.equals(o.biome)
&& checkDistance == o.checkDistance;
}

@Override
public int hashCode() {
int prime = 31;
int h = region.hashCode();
h = prime*h + biome.hashCode();
h = prime*h + (checkDistance?0:1);
return h;
}
}
23 changes: 23 additions & 0 deletions src/main/java/amidst/filter/Constraint.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package amidst.filter;

import java.util.Optional;

import amidst.documentation.Immutable;
import amidst.filter.WorldFilterResult.ResultItem;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.coordinates.Coordinates;
import amidst.mojangapi.world.coordinates.Region;

@Immutable
public interface Constraint {

public Region getRegion();

public Optional<Coordinates> checkRegion(World world, Region.Box region);

public void addMarkers(ResultItem item);

public boolean equals(Object other);
public int hashCode();

}
27 changes: 27 additions & 0 deletions src/main/java/amidst/filter/Criterion.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package amidst.filter;

import java.util.List;
import java.util.Objects;

import amidst.documentation.Immutable;
import amidst.mojangapi.world.World;
import amidst.mojangapi.world.coordinates.Coordinates;
import amidst.mojangapi.world.coordinates.Region;
import amidst.util.TriState;

@Immutable
public interface Criterion<R extends CriterionResult> {

public R createResult();

public Region.Box getNextRegionToCheck(ResultsMap map);

public default TriState checkRegion(ResultsMap map, World world, Coordinates offset, Region.Box region) {
Objects.requireNonNull(region);
R res = map.get(this);
res.checkRegionAndUpdate(map, world, offset, region);
return res.hasMatched();
}

public List<Criterion<?>> getChildren();
}
19 changes: 19 additions & 0 deletions src/main/java/amidst/filter/CriterionResult.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package amidst.filter;

import amidst.mojangapi.world.World;
import amidst.mojangapi.world.coordinates.Coordinates;
import amidst.mojangapi.world.coordinates.Region;
import amidst.util.TriState;

public interface CriterionResult {
public TriState hasMatched();

public void checkRegionAndUpdate(ResultsMap map, World world, Coordinates offset, Region.Box region);

public default void addItemToWorldResult(WorldFilterResult result) {
//Do nothing
}

public CriterionResult copy();

}
36 changes: 36 additions & 0 deletions src/main/java/amidst/filter/ResultsMap.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package amidst.filter;

import java.util.HashMap;
import java.util.Map;

public class ResultsMap {
private Map<Criterion<?>, CriterionResult> results;

public ResultsMap() {
results = new HashMap<>();
}

public boolean create(Criterion<?> criterion) {
if(results.containsKey(criterion))
return false;
results.put(criterion, criterion.createResult());
return true;
}

@SuppressWarnings("unchecked")
public <T extends CriterionResult> T get(Criterion<T> criterion) {
return (T) results.get(criterion);
}

@SuppressWarnings("unchecked")
public <T extends CriterionResult> T remove(Criterion<T> criterion) {
return (T) results.remove(criterion);
}

public ResultsMap copy() {
ResultsMap copy = new ResultsMap();
copy.results.putAll(results);
copy.results.replaceAll((cr, res) -> res.copy());
return copy;
}
}
Loading