mirror of
https://github.com/Sollace/Unicopia.git
synced 2024-11-23 13:37:58 +01:00
- Fixed clouds affecting lighting
- Clouds no longer affect the world heightmap (fixes certain structures generating on clouds) - Added proper cloud gen beyond just structures - Fixed mobs spawning on clouds when they shouldn't
This commit is contained in:
parent
17b014939a
commit
a987e9612a
6 changed files with 215 additions and 1 deletions
|
@ -6,6 +6,8 @@ import org.jetbrains.annotations.Nullable;
|
|||
|
||||
import net.minecraft.block.Block;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.entity.EntityType;
|
||||
import net.minecraft.entity.SpawnGroup;
|
||||
import net.minecraft.entity.player.PlayerEntity;
|
||||
import net.minecraft.item.ItemStack;
|
||||
import net.minecraft.registry.tag.ItemTags;
|
||||
|
@ -16,6 +18,7 @@ import net.minecraft.util.ActionResult;
|
|||
import net.minecraft.util.Hand;
|
||||
import net.minecraft.util.hit.BlockHitResult;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.world.BlockView;
|
||||
import net.minecraft.world.World;
|
||||
|
||||
public class NaturalCloudBlock extends PoreousCloudBlock {
|
||||
|
@ -25,10 +28,23 @@ public class NaturalCloudBlock extends PoreousCloudBlock {
|
|||
public NaturalCloudBlock(Settings settings, boolean meltable,
|
||||
@Nullable Supplier<Soakable> soggyBlock,
|
||||
Supplier<Block> compactedBlock) {
|
||||
super(settings.nonOpaque(), meltable, soggyBlock);
|
||||
super(settings.nonOpaque().allowsSpawning((state, world, pos, type) -> {
|
||||
return type == EntityType.PHANTOM || type == EntityType.PARROT || type.getSpawnGroup() == SpawnGroup.AMBIENT;
|
||||
}), meltable, soggyBlock);
|
||||
this.compactedBlock = compactedBlock;
|
||||
}
|
||||
|
||||
@Override
|
||||
@Deprecated
|
||||
public float getAmbientOcclusionLightLevel(BlockState state, BlockView world, BlockPos pos) {
|
||||
return 0.9F;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isTransparent(BlockState state, BlockView world, BlockPos pos) {
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ActionResult onUse(BlockState state, World world, BlockPos pos, PlayerEntity player, Hand hand, BlockHitResult hit) {
|
||||
ItemStack stack = player.getStackInHand(hand);
|
||||
|
|
|
@ -0,0 +1,21 @@
|
|||
package com.minelittlepony.unicopia.mixin;
|
||||
|
||||
import org.spongepowered.asm.mixin.Mixin;
|
||||
import org.spongepowered.asm.mixin.injection.At;
|
||||
import org.spongepowered.asm.mixin.injection.Inject;
|
||||
import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable;
|
||||
|
||||
import com.minelittlepony.unicopia.block.cloud.CloudLike;
|
||||
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.world.Heightmap;
|
||||
|
||||
@Mixin(Heightmap.class)
|
||||
abstract class MixinHeightmap {
|
||||
@Inject(method = "method_16682", at = @At("HEAD"), cancellable = true)
|
||||
private static void excludeCloudsFromWorldSurfaceHeightMap(BlockState state, CallbackInfoReturnable<Boolean> info) {
|
||||
if (state.getBlock() instanceof CloudLike) {
|
||||
info.setReturnValue(false);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -7,6 +7,7 @@ import com.minelittlepony.unicopia.Unicopia;
|
|||
import com.minelittlepony.unicopia.block.ShellsBlock;
|
||||
import com.minelittlepony.unicopia.block.UBlocks;
|
||||
import com.minelittlepony.unicopia.server.world.gen.CaveCarvingStructureProcessor;
|
||||
import com.minelittlepony.unicopia.server.world.gen.CloudCarver;
|
||||
import com.minelittlepony.unicopia.server.world.gen.OverworldBiomeSelectionCallback;
|
||||
import com.minelittlepony.unicopia.server.world.gen.SurfaceGrowthStructureProcessor;
|
||||
import com.minelittlepony.unicopia.util.registry.DynamicRegistry;
|
||||
|
@ -38,6 +39,9 @@ import net.minecraft.world.biome.OverworldBiomeCreator;
|
|||
import net.minecraft.world.biome.SpawnSettings;
|
||||
import net.minecraft.world.gen.GenerationStep;
|
||||
import net.minecraft.world.gen.blockpredicate.BlockPredicate;
|
||||
import net.minecraft.world.gen.carver.Carver;
|
||||
import net.minecraft.world.gen.carver.CaveCarverConfig;
|
||||
import net.minecraft.world.gen.carver.ConfiguredCarver;
|
||||
import net.minecraft.world.gen.feature.ConfiguredFeatures;
|
||||
import net.minecraft.world.gen.feature.DefaultBiomeFeatures;
|
||||
import net.minecraft.world.gen.feature.Feature;
|
||||
|
@ -126,6 +130,9 @@ public interface UWorldGen {
|
|||
StructureProcessorType<SurfaceGrowthStructureProcessor> SURFACE_GROWTH_STRUCTURE_PROCESSOR = Registry.register(Registries.STRUCTURE_PROCESSOR, Unicopia.id("surface_growth"), () -> SurfaceGrowthStructureProcessor.CODEC);
|
||||
StructureProcessorType<CaveCarvingStructureProcessor> CAVE_CARVING_STRUCTURE_PROCESSOR = Registry.register(Registries.STRUCTURE_PROCESSOR, Unicopia.id("cave_carving"), () -> CaveCarvingStructureProcessor.CODEC);
|
||||
|
||||
RegistryKey<ConfiguredCarver<?>> OVERWORLD_CLOUD_CARVER_CONFIG = RegistryKey.of(RegistryKeys.CONFIGURED_CARVER, Unicopia.id("overworld_cloud_carver"));
|
||||
Carver<CaveCarverConfig> CLOUR_CARVER = Registry.register(Registries.CARVER, Unicopia.id("cloud"), new CloudCarver(CaveCarverConfig.CAVE_CODEC));
|
||||
|
||||
@SafeVarargs
|
||||
static <T> T applyAll(T t, Consumer<T> ...consumers) {
|
||||
for (Consumer<T> consumer : consumers) {
|
||||
|
@ -142,6 +149,7 @@ public interface UWorldGen {
|
|||
.or(BiomeSelectors.tag(BiomeTags.IS_RIVER))
|
||||
.or(BiomeSelectors.includeByKey(BiomeKeys.STONY_SHORE))
|
||||
), GenerationStep.Feature.VEGETAL_DECORATION, SHELLS_PLACED_FEATURE);
|
||||
BiomeModifications.addCarver(BiomeSelectors.foundInOverworld(), GenerationStep.Carver.AIR, OVERWORLD_CLOUD_CARVER_CONFIG);
|
||||
UTreeGen.bootstrap();
|
||||
|
||||
OverworldBiomeSelectionCallback.EVENT.register(context -> {
|
||||
|
|
|
@ -0,0 +1,142 @@
|
|||
package com.minelittlepony.unicopia.server.world.gen;
|
||||
|
||||
import java.util.function.Function;
|
||||
|
||||
import com.minelittlepony.unicopia.block.UBlocks;
|
||||
import com.mojang.serialization.Codec;
|
||||
import net.minecraft.block.BlockState;
|
||||
import net.minecraft.registry.entry.RegistryEntry;
|
||||
import net.minecraft.util.math.BlockPos;
|
||||
import net.minecraft.util.math.ChunkPos;
|
||||
import net.minecraft.util.math.MathHelper;
|
||||
import net.minecraft.util.math.random.Random;
|
||||
import net.minecraft.world.biome.Biome;
|
||||
import net.minecraft.world.chunk.Chunk;
|
||||
import net.minecraft.world.gen.carver.Carver;
|
||||
import net.minecraft.world.gen.carver.CarverContext;
|
||||
import net.minecraft.world.gen.carver.CarvingMask;
|
||||
import net.minecraft.world.gen.carver.CaveCarver;
|
||||
import net.minecraft.world.gen.carver.CaveCarverConfig;
|
||||
import net.minecraft.world.gen.chunk.AquiferSampler;
|
||||
import net.minecraft.world.gen.densityfunction.DensityFunction.NoisePos;
|
||||
|
||||
public class CloudCarver extends CaveCarver {
|
||||
|
||||
private Random random;
|
||||
|
||||
public CloudCarver(Codec<CaveCarverConfig> codec) {
|
||||
super(codec);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected int getMaxCaveCount() {
|
||||
return 15;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected float getTunnelSystemWidth(Random random) {
|
||||
return (random.nextFloat() * 2.0F + random.nextFloat()) * 2.0F;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected double getTunnelSystemHeightWidthRatio() {
|
||||
return 0.5;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean carve(
|
||||
CarverContext context,
|
||||
CaveCarverConfig config,
|
||||
Chunk chunk,
|
||||
Function<BlockPos, RegistryEntry<Biome>> function,
|
||||
Random random,
|
||||
AquiferSampler sampler,
|
||||
ChunkPos chunkPos,
|
||||
CarvingMask carvingMask
|
||||
) {
|
||||
this.random = random;
|
||||
return super.carve(context, config, chunk, function, random, new AquiferSampler() {
|
||||
@Override
|
||||
public BlockState apply(NoisePos pos, double density) {
|
||||
BlockState state = sampler.apply(pos, density);
|
||||
return state != null && state.isAir() ? UBlocks.CLOUD.getDefaultState() : state;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean needsFluidTick() {
|
||||
return sampler.needsFluidTick();
|
||||
}
|
||||
|
||||
}, chunkPos, carvingMask);
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void carveCave(
|
||||
CarverContext context,
|
||||
CaveCarverConfig config,
|
||||
Chunk chunk,
|
||||
Function<BlockPos, RegistryEntry<Biome>> posToBiome,
|
||||
AquiferSampler aquiferSampler,
|
||||
double x,
|
||||
double y,
|
||||
double z,
|
||||
float xScale,
|
||||
double yScale,
|
||||
CarvingMask mask,
|
||||
Carver.SkipPredicate skipPredicate
|
||||
) {
|
||||
if (random == null) {
|
||||
return;
|
||||
}
|
||||
int maxY = context.getMinY() + context.getHeight();
|
||||
|
||||
int bubbleCount = 10 + random.nextInt(12);
|
||||
for (int i = 0; i < bubbleCount; i++) {
|
||||
double width = 1.5 * xScale + random.nextTriangular(3, 2);
|
||||
double height = Math.min(width * yScale * (1 + random.nextFloat() * 2) + MathHelper.sin((float) (Math.PI / 2)) * xScale, maxY - y);
|
||||
double bubbleX = x + (random.nextFloat() * 2 - 1) * width;
|
||||
double bubbleZ = z + (random.nextFloat() * 2 - 1) * width;
|
||||
carveRegion(context, config, chunk, posToBiome, aquiferSampler, bubbleX + 1.0, y, bubbleZ, width, height, mask, skipPredicate);
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void carveTunnels(
|
||||
CarverContext context,
|
||||
CaveCarverConfig config,
|
||||
Chunk chunk,
|
||||
Function<BlockPos, RegistryEntry<Biome>> posToBiome,
|
||||
long seed,
|
||||
AquiferSampler aquiferSampler,
|
||||
double x,
|
||||
double y,
|
||||
double z,
|
||||
double horizontalScale,
|
||||
double verticalScale,
|
||||
float w,
|
||||
float yaw,
|
||||
float pitch,
|
||||
int branchStartIndex,
|
||||
int branchCount,
|
||||
double yawPitchRatio,
|
||||
CarvingMask mask,
|
||||
Carver.SkipPredicate skipPredicate
|
||||
) {
|
||||
if (random == null) {
|
||||
return;
|
||||
}
|
||||
int maxY = context.getMinY() + context.getHeight();
|
||||
int bubbleCount = 10 + random.nextInt(12);
|
||||
for (int i = 0; i < bubbleCount; i++) {
|
||||
double width = /*1.5 + MathHelper.sin((float) (Math.PI / 2)) * xScale +*/ 1.5 * horizontalScale + random.nextInt(3) + w;
|
||||
double height = width * (1 + random.nextFloat() * 2) * verticalScale * 0.2;
|
||||
double bubbleX = x + (random.nextFloat() * 2 - 1) * width * 1.5;
|
||||
double bubbleZ = z + (random.nextFloat() * 2 - 1) * width * 1.5;
|
||||
double bubbleY = y + random.nextFloat() * height * 0.5;
|
||||
if (bubbleY + height < maxY) {
|
||||
carveRegion(context, config, chunk, posToBiome, aquiferSampler, bubbleX, bubbleY, bubbleZ, width, height, mask, skipPredicate);
|
||||
}
|
||||
}
|
||||
//super.carveTunnels(context, config, chunk, posToBiome, seed, aquiferSampler, x, y, z, horizontalScale, verticalScale, w, yaw, pitch, branchStartIndex, branchCount, yawPitchRatio, mask, skipPredicate);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,26 @@
|
|||
{
|
||||
"type": "unicopia:cloud",
|
||||
"config": {
|
||||
"probability": 0.05,
|
||||
"y": {
|
||||
"type": "minecraft:uniform",
|
||||
"min_inclusive": {
|
||||
"absolute": 240
|
||||
},
|
||||
"max_inclusive": {
|
||||
"absolute": 600
|
||||
}
|
||||
},
|
||||
"yScale": 0.15,
|
||||
"lava_level": {
|
||||
"above_bottom": 8
|
||||
},
|
||||
"replaceable": "minecraft:air",
|
||||
"horizontal_radius_multiplier": 3.7,
|
||||
"vertical_radius_multiplier": 2.8,
|
||||
"floor_level": {
|
||||
"type": "minecraft:constant",
|
||||
"value": 0
|
||||
}
|
||||
}
|
||||
}
|
|
@ -28,6 +28,7 @@
|
|||
"MixinFallingBlockEntity",
|
||||
"MixinFlowableFluid",
|
||||
"MixinGuardianTargetPredicate",
|
||||
"MixinHeightmap",
|
||||
"MixinItem",
|
||||
"MixinItemEntity",
|
||||
"MixinItemStack",
|
||||
|
|
Loading…
Reference in a new issue