From 73052367241fbeef106fa547b225f10343a54331 Mon Sep 17 00:00:00 2001 From: dfsek Date: Wed, 15 Dec 2021 21:22:41 -0700 Subject: [PATCH] create GaussianRandomLocator --- .../locators/GaussianRandomLocator.java | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java diff --git a/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java new file mode 100644 index 000000000..3bddbefc0 --- /dev/null +++ b/common/addons/config-locators/src/main/java/com/dfsek/terra/addons/feature/locator/locators/GaussianRandomLocator.java @@ -0,0 +1,52 @@ +/* + * 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 java.util.Random; + +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 GaussianRandomLocator implements Locator { + private final double mean; + + private final Range points; + + private final double standardDeviation; + + + public GaussianRandomLocator(Range height, Range points, double standardDeviation) { + this.mean = (height.getMax() + height.getMin()) / 2.0; + this.points = points; + this.standardDeviation = standardDeviation; + } + + @Override + public BinaryColumn getSuitableCoordinates(Column column) { + long seed = column.getWorld().getSeed(); + seed = 31 * seed + column.getX(); + seed = 31 * seed + column.getZ(); + + Random r = new Random(seed); + + int size = points.get(r); + + + BinaryColumn results = new BinaryColumn(column.getMinY(), column.getMaxY()); + for(int i = 0; i < size; i++) { + int h = (int) r.nextGaussian(mean, standardDeviation); + if(h >= column.getMaxY() || h < column.getMinY()) continue; + results.set(h); + } + + return results; + } +}