From 072ce5b03ee5c1da446b56cf70cc281c3c55eacb Mon Sep 17 00:00:00 2001 From: dfsek Date: Sat, 15 Jan 2022 01:44:45 -0700 Subject: [PATCH] add TopLocator --- .../addons/feature/locator/LocatorAddon.java | 4 ++- .../locator/config/TopLocatorTemplate.java | 30 ++++++++++++++++ .../feature/locator/locators/TopLocator.java | 34 +++++++++++++++++++ 3 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java create mode 100644 common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java index a8dd39d97..e9ff963f4 100644 --- a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/LocatorAddon.java @@ -20,6 +20,7 @@ import com.dfsek.terra.addons.feature.locator.config.OrLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.PatternLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.RandomLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.SurfaceLocatorTemplate; +import com.dfsek.terra.addons.feature.locator.config.TopLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.XorLocatorTemplate; import com.dfsek.terra.addons.feature.locator.config.pattern.AirMatchPatternTemplate; import com.dfsek.terra.addons.feature.locator.config.pattern.AndPatternTemplate; @@ -60,7 +61,8 @@ public class LocatorAddon implements AddonInitializer { .register(addon, ConfigPackPreLoadEvent.class) .then(event -> { CheckedRegistry>> locatorRegistry = event.getPack().getOrCreateRegistry(LOCATOR_TOKEN); - locatorRegistry.register(addon.key("SURFACE"), () -> new SurfaceLocatorTemplate(platform)); + locatorRegistry.register(addon.key("SURFACE"), SurfaceLocatorTemplate::new); + locatorRegistry.register(addon.key("TOP"), TopLocatorTemplate::new); locatorRegistry.register(addon.key("RANDOM"), RandomLocatorTemplate::new); locatorRegistry.register(addon.key("GAUSSIAN_RANDOM"), GaussianRandomLocatorTemplate::new); diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java new file mode 100644 index 000000000..b3a4a8e7d --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/config/TopLocatorTemplate.java @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.feature.locator.config; + +import com.dfsek.tectonic.api.config.template.annotations.Value; +import com.dfsek.tectonic.api.config.template.object.ObjectTemplate; + +import com.dfsek.terra.addons.feature.locator.locators.SurfaceLocator; +import com.dfsek.terra.addons.feature.locator.locators.TopLocator; +import com.dfsek.terra.api.Platform; +import com.dfsek.terra.api.config.meta.Meta; +import com.dfsek.terra.api.structure.feature.Locator; +import com.dfsek.terra.api.util.Range; + + +public class TopLocatorTemplate implements ObjectTemplate { + + @Value("range") + private @Meta Range range; + + @Override + public Locator get() { + return new TopLocator(range); + } +} diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java new file mode 100644 index 000000000..1c3a935cc --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/TopLocator.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2020-2021 Polyhedral Development + * + * The Terra Core Addons are licensed under the terms of the MIT License. For more details, + * reference the LICENSE file in this module's root directory. + */ + +package com.dfsek.terra.addons.feature.locator.locators; + +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.chunk.generation.util.Column; + + +public class TopLocator implements Locator { + private final Range search; + + public TopLocator(Range search) { + this.search = search; + } + + @Override + public BinaryColumn getSuitableCoordinates(Column column) { + BinaryColumn location = new BinaryColumn(column.getMinY(), column.getMaxY()); + for(int y : search) { + if(column.getBlock(y).isAir() && !column.getBlock(y - 1).isAir()) { + location.set(y); + return location; + } + } + return location; + } +}