package com.hypixel.hytale.server.worldgen.prefab.unique; import com.hypixel.hytale.math.vector.Vector2d; import com.hypixel.hytale.math.vector.Vector3d; import com.hypixel.hytale.procedurallib.condition.IBlockFluidCondition; import com.hypixel.hytale.procedurallib.condition.ICoordinateCondition; import com.hypixel.hytale.procedurallib.condition.ICoordinateRndCondition; import com.hypixel.hytale.procedurallib.condition.IIntCondition; import com.hypixel.hytale.server.core.prefab.PrefabRotation; import com.hypixel.hytale.server.worldgen.biome.Biome; import com.hypixel.hytale.server.worldgen.util.condition.BlockMaskCondition; import java.util.Random; import javax.annotation.Nonnull; public class UniquePrefabConfiguration { protected final ICoordinateRndCondition heightCondition; protected final BlockMaskCondition placementConfiguration; protected final PrefabRotation[] rotations; protected final IIntCondition biomeMask; protected final ICoordinateCondition mapCondition; protected final IBlockFluidCondition parent; protected final Vector2d anchor; protected final Vector3d spawnOffset; protected final double maxDistance; protected final boolean fitHeightmap; protected final boolean submerge; protected final boolean onWater; protected final int environmentId; protected final int maxAttempts; protected final double exclusionRadiusSquared; protected final boolean spawnLocation; protected final double zoneBorderExclusion; protected final boolean showOnMap; public UniquePrefabConfiguration( ICoordinateRndCondition heightCondition, BlockMaskCondition placementConfiguration, PrefabRotation[] rotations, IIntCondition biomeMask, ICoordinateCondition mapCondition, IBlockFluidCondition parent, Vector2d anchor, Vector3d spawnOffset, double maxDistance, boolean fitHeightmap, boolean submerge, boolean onWater, int environmentId, int maxAttempts, double exclusionRadius, boolean spawnLocation, double zoneBorderExclusion, boolean showOnMap ) { this.heightCondition = heightCondition; this.placementConfiguration = placementConfiguration; this.rotations = rotations; this.biomeMask = biomeMask; this.mapCondition = mapCondition; this.parent = parent; this.anchor = anchor; this.spawnOffset = spawnOffset; this.maxDistance = maxDistance; this.fitHeightmap = fitHeightmap; this.submerge = submerge; this.onWater = onWater; this.environmentId = environmentId; this.maxAttempts = maxAttempts; this.exclusionRadiusSquared = exclusionRadius * exclusionRadius; this.spawnLocation = spawnLocation; this.zoneBorderExclusion = zoneBorderExclusion; this.showOnMap = showOnMap; } public Vector2d getAnchor() { return this.anchor; } public double getMaxDistance() { return this.maxDistance; } public ICoordinateCondition getMapCondition() { return this.mapCondition; } public BlockMaskCondition getPlacementConfiguration() { return this.placementConfiguration; } public Vector3d getSpawnOffset() { return this.spawnOffset; } public boolean isValidParentBiome(@Nonnull Biome biome) { return this.biomeMask.eval(biome.getId()); } public boolean isFitHeightmap() { return this.fitHeightmap; } public boolean isSubmerge() { return this.submerge; } public boolean isValidParentBlock(int block, int fluid) { return this.parent.eval(block, fluid); } public ICoordinateRndCondition getHeightCondition() { return this.heightCondition; } public PrefabRotation getRotation(@Nonnull Random random) { return this.rotations != null && this.rotations.length != 0 ? this.rotations[random.nextInt(this.rotations.length)] : PrefabRotation.ROTATION_0; } public boolean isOnWater() { return this.onWater; } public int getEnvironmentId() { return this.environmentId; } public int getMaxAttempts() { return this.maxAttempts; } public double getExclusionRadiusSquared() { return this.exclusionRadiusSquared; } public boolean isSpawnLocation() { return this.spawnLocation; } public double getZoneBorderExclusion() { return this.zoneBorderExclusion; } public boolean isShowOnMap() { return this.showOnMap; } }