PrefabProp class

Пакет: com.hypixel.hytale.builtin.hytalegenerator.props

Файл: com/hypixel/hytale/builtin/hytalegenerator/props/PrefabProp.java

extends: Prop

Поля (32)

МодификаторыТипИмя
public Bounds3i bounds
return
Bounds3i var1
int var10
Holder var10
EntityPlacementData var11
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var12
Material var13
RotatedPosition var15
String var16
var16
List var17
WeightedMap var18
StaticDirectionality var19
PrefabBufferCall var2
List var2
com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var20
Bounds3i var21
RotationTuple var22
IPrefabBuffer var3
int var3
int var4
List var6
String var6
var6
var6
RotatedPosition var7
TransformComponent var8
var8
Vector3i var8
PrefabBuffer.ChildPrefab[] var9
Vector3d var9

Методы (11)

МодификаторыВозвратСигнатура
public IntersectingColumnPredicatepublic IntersectingColumnPredicate()
for for(IPrefabBuffer var8 : var4x)
for for(PrefabBuffer.ChildPrefab var14 : var9)
for for(int var7 = 0; var7 < var5x.length; var7++)
abstract for for(int var5 = 0; var5 < this.childProps.size()
if if(var8 == null)
if if(var3 == null)
if if(var5x != null)
if if(var8 != null)
if if(var8 != null)
public boolean testpublic boolean test(int var1, int var2, int var3, T var4)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.hytalegenerator.props;

class="kw">import com.hypixel.hytale.builtin.hytalegenerator.BlockMask;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.EntityPlacementData;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.WeightedMap;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.bounds.Bounds3i;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.Material;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.material.MaterialCache;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.patterns.ConstantPattern;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.directionality.RotatedPosition;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.directionality.StaticDirectionality;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabMoldingConfiguration;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabPropUtil;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.rng.RngField;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.rng.SeedBox;
class="kw">import com.hypixel.hytale.builtin.hytalegenerator.scanners.DirectScanner;
class="kw">import com.hypixel.hytale.common.util.ExceptionUtil;
class="kw">import com.hypixel.hytale.component.Holder;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.vector.Vector3iUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.Rotation;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.prefab.PrefabRotation;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.PrefabBufferCall;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.IPrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.prefab.selection.buffer.impl.PrefabBuffer;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.Random;
class="kw">import java.util.function.Function;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class PrefabProp class="kw">extends Prop {
   @Nonnull
   class="kw">private class="kw">final Bounds3i writeBounds;
   @Nonnull
   class="kw">private class="kw">final WeightedMap<List<IPrefabBuffer>> prefabPool;
   @Nonnull
   class="kw">private class="kw">final MaterialCache materialCache;
   @Nonnull
   class="kw">private class="kw">final RngField rngField;
   @Nonnull
   class="kw">private class="kw">final FastRandom random;
   @Nonnull
   class="kw">private class="kw">final List<com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp> childProps;
   @Nonnull
   class="kw">private class="kw">final List<RotatedPosition> childPositions;
   @Nonnull
   class="kw">private class="kw">final Vector3i rPrefabPosition;
   @Nonnull
   class="kw">private class="kw">final PrefabProp.IntersectingColumnPredicate<PrefabBufferCall> rColumnPredicate;
   @Nonnull
   class="kw">private class="kw">final Vector3i rWorldPosition;
   @Nonnull
   class="kw">private class="kw">final Vector3d rEntityWorldPosition;
   @Nonnull
   class="kw">private class="kw">final RotatedPosition rRotatedWorldPosition;
   @Nonnull
   class="kw">private class="kw">final MaterialCache.MaterialKey rMaterialKey;

   class="kw">public PrefabProp(
      @Nonnull WeightedMap<List<IPrefabBuffer>> var1, @Nonnull MaterialCache var2, @Nonnull SeedBox var3, @Nullable Function<String, List<IPrefabBuffer>> var4
   ) {
      this.materialCache = var2;
      this.rngField = new RngField(var3.createSupplier().get());
      this.random = new FastRandom();
      this.childProps = new ArrayList<>(0);
      this.childPositions = new ArrayList<>(0);
      this.prefabPool = new WeightedMap<>();
      this.writeBounds = new Bounds3i();
      var1.forEach(
         (var4x, var5) -> {
            if (!var4x.isEmpty()) {
               List var6 = new ArrayList<>();

               for (IPrefabBuffer var8 : var4x) {
                  assert var8 != null;
                  if (var8 == null) {
                     class="kw">return;
                  }

                  var6.add(var8);
                  this.writeBounds.encompass(getWriteBounds(var8));
                  PrefabBuffer.ChildPrefab[] var9 = var8.getChildPrefabs();
                  int var10 = 0;

                  for (PrefabBuffer.ChildPrefab var14 : var9) {
                     RotatedPosition var15 = new RotatedPosition(var14.getX(), var14.getY(), var14.getZ(), var14.getRotation());
                     String var16 = var14.getPath().replace('.', '/');
                     var16 = var16.replace("*", "");
                     List var17 = var4.apply(var16);
                     WeightedMap var18 = new WeightedMap<>();
                     var18.add(var17, 1.0);
                     StaticDirectionality var19 = new StaticDirectionality(var14.getRotation(), ConstantPattern.INSTANCE_TRUE);
                     com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var20 = new com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp(
                        var18,
                        new DirectScanner(),
                        var19,
                        var2,
                        new BlockMask(),
                        PrefabMoldingConfiguration.none(),
                        var4,
                        var3.child(String.valueOf(var10++)),
                        true
                     );
                     this.childProps.add(var20);
                     this.childPositions.add(var15);
                     Bounds3i var21 = var20.getWriteBounds_voxelGrid().clone();
                     var21.offset(var15.x, var15.y, var15.z);
                     RotationTuple var22 = RotationTuple.of(var15.rotation.getRotation(), Rotation.None, Rotation.None);
                     var21.applyRotationAroundVoxel(var22, Vector3iUtil.ZERO);
                     this.writeBounds.encompass(var21);
                  }
               }

               this.prefabPool.add(var6, var5);
            }
         }
      );
      this.rPrefabPosition = new Vector3i();
      this.rColumnPredicate = new PrefabProp.IntersectingColumnPredicate<>();
      this.rWorldPosition = new Vector3i();
      this.rEntityWorldPosition = new Vector3d();
      this.rRotatedWorldPosition = new RotatedPosition(0, 0, 0, PrefabRotation.ROTATION_0);
      this.rMaterialKey = new MaterialCache.MaterialKey();
   }

   @Override
   class="kw">public boolean generate(@Nonnull Prop.Context var1) {
      if (this.prefabPool.size() == 0) {
         class="kw">return true;
      }

      this.random.setSeed(this.rngField.get(var1.position.x, var1.position.y, var1.position.z));
      PrefabBufferCall var2 = new PrefabBufferCall(this.random, PrefabRotation.ROTATION_0);
      IPrefabBuffer var3 = this.pickPrefab(this.random);
      if (var3 == null) {
         class="kw">return true;
      }

      this.rPrefabPosition.set(var1.position);
      this.rColumnPredicate.bounds.assign(var1.materialWriteSpace.getBounds());
      this.rColumnPredicate.bounds.offsetOpposite(var1.position);
      int var4 = Objects.hash(var1.position.x, var1.position.y, var1.position.z, var3.hashCode());

      try {
         var3.forEach(
            this.rColumnPredicate,
            (var2x, var3x, var4x, var5x, var6x, var7x, var8x, var9x, var10x, var11x, var12x) -> {
               this.rWorldPosition.set(var2x + var1.position.x, var3x + var1.position.y, var4x + var1.position.z);
               if (var1.materialWriteSpace.getBounds().contains(this.rWorldPosition)) {
                  this.rMaterialKey.getSolidKey().set(var5x, var7x, var8x, var9x, var6x != null ? var6x.clone() : null);
                  this.rMaterialKey.getFluidKey().set(var11x, (byte)var12x);
                  Material var13 = this.materialCache.getMaterial(this.rMaterialKey);
                  var1.materialWriteSpace.set(var13, this.rWorldPosition);
               }
            },
            (var3x, var4x, var5x, var6x) -> {
               if (var5x != null) {
                  for (int var7 = 0; var7 < var5x.length; var7++) {
                     TransformComponent var8 = var5x[var7].getComponent(TransformComponent.getComponentType());
                     if (var8 != null) {
                        Vector3d var9 = new Vector3d(var8.getPosition());
                        var6x.rotation.rotate(var9);
                        this.rEntityWorldPosition.set(var9).add(var1.position.x, var1.position.y, var1.position.z);
                        if (var1.entityWriteBuffer.getBounds().contains(this.rEntityWorldPosition)
                           && var1.materialWriteSpace.getBounds().contains(this.rEntityWorldPosition)) {
                           Holder var10 = var5x[var7].clone();
                           var8 = var10.getComponent(TransformComponent.getComponentType());
                           if (var8 != null) {
                              var8.getPosition().set(this.rEntityWorldPosition);
                              EntityPlacementData var11 = new EntityPlacementData(new Vector3i(), PrefabRotation.ROTATION_0, var10, var4);
                              var1.entityWriteBuffer.addEntity(var11);
                           }
                        }
                     }
                  }
               }
            },
            (var0, var1x, var2x, var3x, var4x, var5x, var6x, var7x, var8x, var9x) -> {},
            var2
         );
      } catch (Exception var9) {
         String var6 = "Couldn't place prefab prop.";
         var6 = var6 + "\n";
         var6 = var6 + ExceptionUtil.toStringWithStack(var9);
         ((HytaleLogger.Api)HytaleLogger.getLogger().atWarning()).log("%s", var6);
      }

      this.rRotatedWorldPosition.x = var1.position.x;
      this.rRotatedWorldPosition.y = var1.position.y;
      this.rRotatedWorldPosition.z = var1.position.z;

      for (int var5 = 0; var5 < this.childProps.size(); var5++) {
         com.hypixel.hytale.builtin.hytalegenerator.props.deprecated.prefab.PrefabProp var12 = this.childProps.get(var5);
         RotatedPosition var7 = this.childPositions.get(var5).getRelativeTo(this.rRotatedWorldPosition);
         Vector3i var8 = new Vector3i(var7.x, var7.y, var7.z);
         this.rRotatedWorldPosition.rotation.rotate(var8);
         var12.place(var7, var1.materialWriteSpace, var1.entityWriteBuffer);
      }

      class="kw">return true;
   }

   @Nullable
   class="kw">private IPrefabBuffer pickPrefab(@Nonnull Random var1) {
      List var2 = this.prefabPool.pick(var1);
      if (var2.isEmpty()) {
         class="kw">return null;
      }

      int var3 = var1.nextInt(var2.size());
      class="kw">return var2.get(var3);
   }

   @Nonnull
   class="kw">private class="kw">static Bounds3i getWriteBounds(@Nonnull IPrefabBuffer var0) {
      Bounds3i var1 = PrefabPropUtil.getTotalBounds(var0);
      var1.max.add(1, 1, 1);
      class="kw">return var1;
   }

   @Nonnull
   @Override
   class="kw">public Bounds3i getReadBounds_voxelGrid() {
      class="kw">return Bounds3i.ZERO;
   }

   @Nonnull
   @Override
   class="kw">public Bounds3i getWriteBounds_voxelGrid() {
      class="kw">return this.writeBounds;
   }

   class="kw">private class="kw">static class IntersectingColumnPredicate<T> class="kw">implements IPrefabBuffer.ColumnPredicate<T> {
      class="kw">public Bounds3i bounds = new Bounds3i();

      class="kw">public IntersectingColumnPredicate() {
      }

      @Override
      class="kw">public boolean test(int var1, int var2, int var3, T var4) {
         class="kw">return var1 >= this.bounds.min.x && var1 < this.bounds.max.x && var2 >= this.bounds.min.z && var2 < this.bounds.max.z;
      }
   }
}