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;
}
}