HyCodeYourTale
classpublicPriority 3

UnionProp

com.hypixel.hytale.builtin.hytalegenerator.props.UnionProp

extends Prop

6

Methods

6

Public Methods

3

Fields

1

Constructors

Constructors

public
UnionProp(List<Prop> propChain)

Methods

Public Methods (6)

publicstatic
UnionProp.ChainedScanResult cast(ScanResult scanResult)
@Nonnull
public
ContextDependency getContextDependency()
@Nonnull@Override
public
Bounds3i getWriteBounds()
@Nonnull@Override
public
boolean isNegative()
@Override
public
void place(Prop.Context context)
@Override
public
ScanResult scan(Vector3i position, VoxelSpace<Material> materialSpace, WorkerIndexer.Id id)
@Nonnull@Override

Fields

Private/Package Fields (3)

privateContextDependency contextDependency
privateList<Prop> props
privateBounds3i writeBounds_voxelGrid

Inheritance

Parent
Current
Interface
Child

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

Related Classes

Source Code

package com.hypixel.hytale.builtin.hytalegenerator.props;

import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
import com.hypixel.hytale.builtin.hytalegenerator.conveyor.stagedconveyor.ContextDependency;
import com.hypixel.hytale.builtin.hytalegenerator.datastructures.voxelspace.VoxelSpace;
import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
import com.hypixel.hytale.builtin.hytalegenerator.threadindexer.WorkerIndexer;
import com.hypixel.hytale.math.vector.Vector3i;
import java.util.ArrayList;
import java.util.List;
import javax.annotation.Nonnull;

public class UnionProp extends Prop {
   @Nonnull
   private final List<Prop> props;
   @Nonnull
   private final ContextDependency contextDependency;
   @Nonnull
   private final Bounds3i writeBounds_voxelGrid;

   public UnionProp(@Nonnull List<Prop> propChain) {
      this.props = new ArrayList<>(propChain);
      Vector3i writeRange = new Vector3i();
      Vector3i readRange = new Vector3i();

      for (Prop prop : propChain) {
         writeRange = Vector3i.max(writeRange, prop.getContextDependency().getWriteRange());
         readRange = Vector3i.max(readRange, prop.getContextDependency().getReadRange());
      }

      this.contextDependency = new ContextDependency(readRange, writeRange);
      this.writeBounds_voxelGrid = this.contextDependency.getTotalPropBounds_voxelGrid();
   }

   @Nonnull
   @Override
   public ScanResult scan(@Nonnull Vector3i position, @Nonnull VoxelSpace<Material> materialSpace, @Nonnull WorkerIndexer.Id id) {
      UnionProp.ChainedScanResult scanResult = new UnionProp.ChainedScanResult();
      scanResult.scanResults = new ArrayList<>(this.props.size());

      for (Prop prop : this.props) {
         scanResult.scanResults.add(prop.scan(position, materialSpace, id));
      }

      return scanResult;
   }

   @Override
   public void place(@Nonnull Prop.Context context) {
      List<ScanResult> scanResults = UnionProp.ChainedScanResult.cast(context.scanResult).scanResults;

      for (int i = 0; i < this.props.size(); i++) {
         Prop prop = this.props.get(i);
         Prop.Context childContext = new Prop.Context(context);
         childContext.scanResult = scanResults.get(i);
         prop.place(childContext);
      }
   }

   @Nonnull
   @Override
   public ContextDependency getContextDependency() {
      return this.contextDependency.clone();
   }

   @Nonnull
   @Override
   public Bounds3i getWriteBounds() {
      return this.writeBounds_voxelGrid;
   }

   private static class ChainedScanResult implements ScanResult {
      List<ScanResult> scanResults;

      private ChainedScanResult() {
      }

      @Nonnull
      public static UnionProp.ChainedScanResult cast(ScanResult scanResult) {
         if (!(scanResult instanceof UnionProp.ChainedScanResult)) {
            throw new IllegalArgumentException("The provided ScanResult isn't compatible with this prop.");
         } else {
            return (UnionProp.ChainedScanResult)scanResult;
         }
      }

      @Override
      public boolean isNegative() {
         return this.scanResults == null || this.scanResults.isEmpty();
      }
   }
}