UniquePrefabGenerator class

Пакет: com.hypixel.hytale.server.worldgen.prefab.unique

Файл: com/hypixel/hytale/server/worldgen/prefab/unique/UniquePrefabGenerator.java

Поля (37)

МодификаторыТипИмя
final int UNIQUE_ZONE_PLACEMENT_HEURISTIC_ITERATIONS
break
double distancex
int var10
int var10
int var10
float var11
int var11
ZoneBiomeResult var12
CoverContainer.CoverContainerEntry.CoverContainerEntryPart var12
int var13
double var15
double var17
int var23
ZoneBiomeResult var25
int var26
double var3
MaskProvider var4
double var5
double var5
int var5
int var6
WaterContainer var6
ICoordinateRndCondition var6
Vector3i var7
var7
double var7
int var7
BlockFluidEntry var7
CoverContainer.CoverContainerEntry[] var7
int var8
int var8
int var8
BlockFluidEntry var8
double var9
ZoneBiomeResult var9
int var9

Методы (19)

МодификаторыВозвратСигнатура
abstract return new Vector3ireturn new Vector3i(var7, var10, var8)
abstract return new Vector3ireturn new Vector3i(var5, var13, var6)
for for(UniquePrefabContainer.UniquePrefabEntry var14 : var4)
for for(int var7 = 0; var7 < 8; var7++)
for for(CoverContainer.CoverContainerEntry var11 : var7)
public PrefabCategory getCategoryPrefabCategory getCategory()
public UniquePrefabConfiguration getConfigurationUniquePrefabConfiguration getConfiguration()
protected BlockFluidEntry getCoverInGroundAtBlockFluidEntry getCoverInGroundAt(int var1, int var2, int var3, int var4, @Nonnull Random var5, @Nonnull Biome var6)
protected int getHeightint getHeight(int var1, @Nonnull ChunkGenerator var2, @Nonnull Biome var3, int var4, int var5)
public String getNameString getName()
public IWeightedMap<WorldGenPrefabSupplier> getPrefabsIWeightedMap<WorldGenPrefabSupplier> getPrefabs()
if if(var2 != null)
if if(++var8 > var5)
if if(var7 == null)
if if(var14 != null)
protected boolean isMatchingCoverboolean isMatchingCover(int var1, @Nonnull CoverContainer.CoverContainerEntry var2, @Nonnull Random var3, int var4, int var5, int var6)
protected boolean isMatchingHeightboolean isMatchingHeight(int var1, int var2, int var3, Random var4, int var5)
protected boolean isMatchingNoiseDensityboolean isMatchingNoiseDensity(int var1, int var2, int var3)
protected boolean isMatchingParentBlockboolean isMatchingParentBlock(int var1, int var2, int var3, int var4, @Nonnull Random var5, @Nonnull ZoneBiomeResult var6)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.prefab.unique;

class="kw">import com.hypixel.hytale.common.map.IWeightedMap;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.util.TrigMathUtil;
class="kw">import com.hypixel.hytale.procedurallib.condition.ICoordinateRndCondition;
class="kw">import com.hypixel.hytale.server.worldgen.biome.Biome;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.MaskProvider;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ZoneBiomeResult;
class="kw">import com.hypixel.hytale.server.worldgen.container.CoverContainer;
class="kw">import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
class="kw">import com.hypixel.hytale.server.worldgen.container.WaterContainer;
class="kw">import com.hypixel.hytale.server.worldgen.loader.WorldGenPrefabSupplier;
class="kw">import com.hypixel.hytale.server.worldgen.prefab.PrefabCategory;
class="kw">import com.hypixel.hytale.server.worldgen.util.BlockFluidEntry;
class="kw">import com.hypixel.hytale.server.worldgen.util.LogUtil;
class="kw">import java.util.Random;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2i;
class="kw">import org.joml.Vector3i;

class="kw">public class UniquePrefabGenerator {
   class="kw">private class="kw">static class="kw">final int UNIQUE_ZONE_PLACEMENT_HEURISTIC_ITERATIONS = 8;
   class="kw">protected class="kw">final String name;
   class="kw">protected class="kw">final PrefabCategory category;
   class="kw">protected class="kw">final IWeightedMap<WorldGenPrefabSupplier> prefabs;
   class="kw">protected class="kw">final UniquePrefabConfiguration configuration;
   class="kw">protected class="kw">final int zoneIndex;

   class="kw">public UniquePrefabGenerator(String var1, PrefabCategory var2, IWeightedMap<WorldGenPrefabSupplier> var3, UniquePrefabConfiguration var4, int var5) {
      this.name = var1;
      this.category = var2;
      this.prefabs = var3;
      this.configuration = var4;
      this.zoneIndex = var5;
   }

   class="kw">public String getName() {
      class="kw">return this.name;
   }

   class="kw">public PrefabCategory getCategory() {
      class="kw">return this.category;
   }

   class="kw">public IWeightedMap<WorldGenPrefabSupplier> getPrefabs() {
      class="kw">return this.prefabs;
   }

   @Nullable
   class="kw">public WorldGenPrefabSupplier generatePrefab(Random var1) {
      class="kw">return this.prefabs.get(var1);
   }

   @Nonnull
   class="kw">public Vector3i generate(
      int var1, @Nullable Vector2i var2, @Nonnull ChunkGenerator var3, @Nonnull Random var4, int var5, @Nonnull UniquePrefabContainer.UniquePrefabEntry[] var6
   ) {
      if (var2 != null) {
         class="kw">return this.forceUniqueZonePlacement(var1, var2, var3);
      }

      int var8 = 0;

      Vector3i var7;
      while ((var7 = this.tryPlacement(var1, var3, var4, var6)) == null) {
         if (++var8 > var5) {
            break;
         }
      }

      if (var7 == null) {
         LogUtil.getLogger()
            .at(Level.SEVERE)
            .log(
               "Failed to generate Unique-Prefab '%s' with anchor '%s', maxDistance: %s",
               this.name,
               this.configuration.getAnchor(),
               this.configuration.getMaxDistance()
            );
         var7 = this.forceGeneration(var1, var3);
         LogUtil.getLogger().at(Level.WARNING).log("FORCED Unique-Prefab '%s' at %s after %s attempts!", this.name, var7, var8);
      } else {
         LogUtil.getLogger().at(Level.FINE).log("Generated Unique-Prefab '%s' at %s after %s attempts!", this.name, var7, var8);
      }

      class="kw">return var7;
   }

   @Nullable
   class="kw">protected Vector3i tryPlacement(int var1, @Nonnull ChunkGenerator var2, @Nonnull Random var3, @Nonnull UniquePrefabContainer.UniquePrefabEntry[] var4) {
      double var5 = this.configuration.getAnchor().x();
      double var7 = this.configuration.getAnchor().y();
      double var9 = var3.nextDouble() * this.configuration.getMaxDistance();
      float var11 = var3.nextFloat() * (float) (Math.PI * 2);
      var5 += TrigMathUtil.cos(var11) * var9;
      var7 += TrigMathUtil.sin(var11) * var9;
      int var23 = MathUtil.floor(var5);
      int var10 = MathUtil.floor(var7);

      for (UniquePrefabContainer.UniquePrefabEntry var14 : var4) {
         if (var14 != null) {
            double var15 = var14.getPosition().x - var5;
            double var17 = var14.getPosition().z - var7;
            double distancex = var15 * var15 + var17 * var17;
            if (distancex <= var14.getExclusionRadiusSquared() || distancex <= this.configuration.getExclusionRadiusSquared()) {
               class="kw">return null;
            }
         }
      }

      if (!this.isMatchingNoiseDensity(var1, var23, var10)) {
         class="kw">return null;
      } else {
         ZoneBiomeResult var25 = var2.getZoneBiomeResultAt(var1, var23, var10);
         if (var25.getZoneResult().getZone().id() != this.zoneIndex) {
            class="kw">return null;
         } else if (!this.configuration.isValidParentBiome(var25.getBiome())) {
            class="kw">return null;
         } else if (var25.zoneResult.getBorderDistance() < this.configuration.getZoneBorderExclusion()) {
            class="kw">return null;
         } else {
            int var26 = this.getHeight(var1, var2, var25.getBiome(), var23, var10);
            if (!this.isMatchingHeight(var1, var23, var10, var3, var26)) {
               class="kw">return null;
            } else {
               class="kw">return !this.isMatchingParentBlock(var1, var23, var26, var10, var3, var25) ? null : new Vector3i(var23, var26, var10);
            }
         }
      }
   }

   @Nonnull
   class="kw">protected Vector3i forceGeneration(int var1, @Nonnull ChunkGenerator var2) {
      double var3 = this.configuration.getAnchor().x();
      double var5 = this.configuration.getAnchor().y();
      int var7 = MathUtil.floor(var3);
      int var8 = MathUtil.floor(var5);
      ZoneBiomeResult var9 = var2.getZoneBiomeResultAt(var1, var7, var8);
      int var10 = this.getHeight(var1, var2, var9.getBiome(), var7, var8);
      class="kw">return new Vector3i(var7, var10, var8);
   }

   @Nonnull
   class="kw">protected Vector3i forceUniqueZonePlacement(int var1, @Nonnull Vector2i var2, @Nonnull ChunkGenerator var3) {
      MaskProvider var4 = var3.getZonePatternProvider().getMaskProvider();
      int var5 = var2.x;
      int var6 = var2.y;

      for (int var7 = 0; var7 < 8; var7++) {
         int var8 = MathUtil.floor(var4.getX(var1, var5, var6));
         int var9 = MathUtil.floor(var4.getY(var1, var5, var6));
         int var10 = var8 - var2.x;
         int var11 = var9 - var2.y;
         var5 -= var10 / 2;
         var6 -= var11 / 2;
      }

      ZoneBiomeResult var12 = var3.getZoneBiomeResultAt(var1, var5, var6);
      int var13 = this.getHeight(var1, var3, var12.getBiome(), var5, var6);
      class="kw">return new Vector3i(var5, var13, var6);
   }

   class="kw">protected int getHeight(int var1, @Nonnull ChunkGenerator var2, @Nonnull Biome var3, int var4, int var5) {
      WaterContainer var6 = var3.getWaterContainer();
      class="kw">return var6.hasEntries() && this.configuration.isOnWater() ? var6.getMaxHeight(var1, var4, var5) : var2.getHeight(var1, var4, var5);
   }

   class="kw">protected boolean isMatchingHeight(int var1, int var2, int var3, Random var4, int var5) {
      ICoordinateRndCondition var6 = this.configuration.getHeightCondition();
      class="kw">return var6 == null || var6.eval(var1, var2, var3, var5, var4);
   }

   class="kw">protected boolean isMatchingNoiseDensity(int var1, int var2, int var3) {
      class="kw">return this.configuration.getMapCondition().eval(var1, var2, var3);
   }

   class="kw">protected boolean isMatchingParentBlock(int var1, int var2, int var3, int var4, @Nonnull Random var5, @Nonnull ZoneBiomeResult var6) {
      BlockFluidEntry var7 = this.getCoverInGroundAt(var1, var2, var3, var4, var5, var6.getBiome());
      if (!var7.equals(BlockFluidEntry.EMPTY) && !this.configuration.isValidParentBlock(var7.blockId(), var7.fluidId())) {
         class="kw">return false;
      }

      BlockFluidEntry var8 = var6.getBiome().getLayerContainer().getTopBlockAt(var1, var2, var4);
      class="kw">return this.configuration.isValidParentBlock(var8.blockId(), var8.fluidId());
   }

   class="kw">protected BlockFluidEntry getCoverInGroundAt(int var1, int var2, int var3, int var4, @Nonnull Random var5, @Nonnull Biome var6) {
      CoverContainer.CoverContainerEntry[] var7 = var6.getCoverContainer().getEntries();

      for (CoverContainer.CoverContainerEntry var11 : var7) {
         if (var3 < 320 && this.isMatchingCover(var1, var11, var5, var2, var3, var4)) {
            CoverContainer.CoverContainerEntry.CoverContainerEntryPart var12 = var11.get(var5);
            if (var12.getOffset() == -1) {
               class="kw">return var12.getEntry();
            }
         }
      }

      class="kw">return BlockFluidEntry.EMPTY;
   }

   class="kw">protected boolean isMatchingCover(int var1, @Nonnull CoverContainer.CoverContainerEntry var2, @Nonnull Random var3, int var4, int var5, int var6) {
      class="kw">return var3.nextDouble() < var2.getCoverDensity()
         && var2.getMapCondition().eval(var1, var4, var6)
         && var2.getHeightCondition().eval(var1, var4, var6, var5, var3);
   }

   class="kw">public UniquePrefabConfiguration getConfiguration() {
      class="kw">return this.configuration;
   }
}