HyCodeYourTale
classpublicPriority 3

FieldFunctionMaterialProvider

com.hypixel.hytale.builtin.hytalegenerator.materialproviders.FieldFunctionMaterialProvider

extends MaterialProvider

1

Methods

1

Public Methods

2

Fields

1

Constructors

Constructors

public
FieldFunctionMaterialProvider(Density density, List<FieldFunctionMaterialProvider.FieldDelimiter<V>> delimiters)

Methods

Public Methods (1)

public
V getVoxelTypeAt(MaterialProvider.Context context)
@Nullable@Override

Fields

Private/Package Fields (2)

privateDensity density
privateFieldFunctionMaterialProvider.FieldDelimiter<V>[] fieldDelimiters

Inheritance

Parent
Current
Interface
Child

Use mouse wheel to zoom, drag to pan. Click nodes to navigate.

Related Classes

Used By

Source Code

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<V> extends MaterialProvider<V> {
   @Nonnull
   private final Density density;
   @Nonnull
   private final FieldFunctionMaterialProvider.FieldDelimiter<V>[] fieldDelimiters;

   public FieldFunctionMaterialProvider(@Nonnull Density density, @Nonnull List<FieldFunctionMaterialProvider.FieldDelimiter<V>> delimiters) {
      this.density = density;
      this.fieldDelimiters = new FieldFunctionMaterialProvider.FieldDelimiter[delimiters.size()];

      for (FieldFunctionMaterialProvider.FieldDelimiter<V> 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<V> delimiter : this.fieldDelimiters) {
         if (delimiter.isInside(densityValue)) {
            return delimiter.materialProvider.getVoxelTypeAt(context);
         }
      }

      return null;
   }

   public static class FieldDelimiter<V> {
      double top;
      double bottom;
      MaterialProvider<V> materialProvider;

      public FieldDelimiter(@Nonnull MaterialProvider<V> 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;
      }
   }
}