package com.hypixel.hytale.builtin.hytalegenerator.materialproviders; import com.hypixel.hytale.builtin.hytalegenerator.density.Density; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; public class FieldFunctionMaterialProvider extends MaterialProvider { @Nonnull private final Density density; @Nonnull private final FieldFunctionMaterialProvider.FieldDelimiter[] fieldDelimiters; public FieldFunctionMaterialProvider(@Nonnull Density density, @Nonnull List> delimiters) { this.density = density; this.fieldDelimiters = new FieldFunctionMaterialProvider.FieldDelimiter[delimiters.size()]; for (FieldFunctionMaterialProvider.FieldDelimiter field : delimiters) { if (field == null) { throw new IllegalArgumentException("delimiters contain null value"); } } for (int i = 0; i < delimiters.size(); i++) { this.fieldDelimiters[i] = delimiters.get(i); } } @Nullable @Override public V getVoxelTypeAt(@Nonnull MaterialProvider.Context context) { Density.Context childContext = new Density.Context(context); double densityValue = this.density.process(childContext); for (FieldFunctionMaterialProvider.FieldDelimiter delimiter : this.fieldDelimiters) { if (delimiter.isInside(densityValue)) { return delimiter.materialProvider.getVoxelTypeAt(context); } } return null; } public static class FieldDelimiter { double top; double bottom; MaterialProvider materialProvider; public FieldDelimiter(@Nonnull MaterialProvider materialProvider, double bottom, double top) { this.bottom = bottom; this.top = top; this.materialProvider = materialProvider; } boolean isInside(double fieldValue) { return fieldValue < this.top && fieldValue >= this.bottom; } } }