diff --git a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java index ddfd0f05..fc90ec95 100644 --- a/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java +++ b/src/main/java/ru/betterend/blocks/complex/WoodenMaterial.java @@ -237,6 +237,7 @@ public class WoodenMaterial { TagAPI.addTags(stairs, ItemTags.WOODEN_STAIRS, ItemTags.STAIRS); TagAPI.addTags(trapdoor, ItemTags.WOODEN_TRAPDOORS, ItemTags.TRAPDOORS); TagAPI.addTag(TagAPI.ITEM_CHEST, chest); + TagAPI.addTag(TagAPI.ITEM_WORKBENCHES, craftingTable); // Block Tags // TagAPI.addTag(BlockTags.PLANKS, planks); @@ -252,6 +253,7 @@ public class WoodenMaterial { TagAPI.addTags(trapdoor, BlockTags.WOODEN_TRAPDOORS, BlockTags.TRAPDOORS); TagAPI.addTag(TagAPI.BLOCK_BOOKSHELVES, shelf); TagAPI.addTag(TagAPI.BLOCK_CHEST, chest); + TagAPI.addTag(TagAPI.BLOCK_WORKBENCHES, craftingTable); logBlockTag = TagAPI.makeBlockTag(BetterEnd.MOD_ID, name + "_logs"); logItemTag = TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_logs"); diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 7ad20617..fe59f8da 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -447,6 +447,15 @@ public class EndBlocks extends BlocksRegistry { public static final Block AERIDIUM = registerBlock("aeridium", new TerrainPlantBlock(RUTISCUS)); public static final Block LUTEBUS = registerBlock("lutebus", new TerrainPlantBlock(RUTISCUS)); public static final Block LAMELLARIUM = registerBlock("lamellarium", new TerrainPlantBlock(RUTISCUS)); + public static final Block INFLEXIA = registerBlock( + "inflexia", + new TerrainPlantBlock( + PALLIDIUM, + PALLIDIUM_TRANSITION_1, + PALLIDIUM_TRANSITION_2, + PALLIDIUM_TRANSITION_3 + ) + ); public static final Block BLUE_VINE_SEED = registerBlock("blue_vine_seed", new BlueVineSeedBlock()); public static final Block BLUE_VINE = registerEndBlockOnly("blue_vine", new BlueVineBlock()); diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index 54d43f50..61a8b198 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -79,6 +79,7 @@ import ru.betterend.world.features.trees.PythadendronTreeFeature; import ru.betterend.world.features.trees.TenaneaFeature; import ru.betterend.world.features.trees.UmbrellaTreeFeature; import ru.betterend.world.generator.GeneratorOptions; +import ru.betterend.world.surface.UmbraSurfaceBuilder; import java.util.List; import java.util.function.Supplier; @@ -303,6 +304,7 @@ public class EndFeatures { 1 ); //public static final BCLFeature PEARLBERRY = redisterVegetation("pearlberry", new SinglePlantFeature(EndBlocks.PEARLBERRY, 5, 5), 1); + public static final BCLFeature INFLEXIA = redisterVegetation("inflexia", new SinglePlantFeature(EndBlocks.INFLEXIA, 5, 3), 8); // Vines // public static final BCLFeature DENSE_VINE = redisterVegetation( @@ -519,7 +521,13 @@ public class EndFeatures { BetterEnd.makeID("tunel_cave"), new TunelCaveFeature() ); - public static final BCLFeature UMBRALITH_ARCH = registerChanced("umbralith_arch", new ArchFeature(EndBlocks.UMBRALITH.stone), 10); + public static final BCLFeature UMBRALITH_ARCH = registerChanced( + "umbralith_arch", + new ArchFeature( + EndBlocks.UMBRALITH.stone, + UmbraSurfaceBuilder::getSurfaceState + ), + 10); public static final BCLFeature THIN_UMBRALITH_ARCH = registerChanced("thin_umbralith_arch", new ThinArchFeature(EndBlocks.UMBRALITH.stone), 15); // Ores // diff --git a/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java index de68e32e..49fec9c4 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java @@ -8,14 +8,14 @@ import ru.betterend.world.surface.SurfaceBuilders; public class UmbraValleyBiome extends EndBiome { public UmbraValleyBiome() { - super( - new BCLBiomeDef(BetterEnd.makeID("umbra_valley")) - .setFogColor(100, 100, 100) - .setPlantsColor(200, 200, 200) - .setWaterAndFogColor(69, 104, 134) - .setSurface(SurfaceBuilders.UMBRA_SURFACE.configured(SurfaceBuilders.DEFAULT_END_CONFIG)) - .addFeature(EndFeatures.UMBRALITH_ARCH) - .addFeature(EndFeatures.THIN_UMBRALITH_ARCH) + super(new BCLBiomeDef(BetterEnd.makeID("umbra_valley")) + .setFogColor(100, 100, 100) + .setPlantsColor(200, 200, 200) + .setWaterAndFogColor(69, 104, 134) + .setSurface(SurfaceBuilders.UMBRA_SURFACE.configured(SurfaceBuilders.DEFAULT_END_CONFIG)) + .addFeature(EndFeatures.UMBRALITH_ARCH) + .addFeature(EndFeatures.THIN_UMBRALITH_ARCH) + .addFeature(EndFeatures.INFLEXIA) ); } } diff --git a/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java b/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java index 11df6514..95b30eda 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ArchFeature.java @@ -1,11 +1,15 @@ package ru.betterend.world.features.terrain; +import com.google.common.collect.Lists; import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.Block; -import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.surfacebuilders.ConfiguredSurfaceBuilder; import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.Vec3; import ru.bclib.api.TagAPI; @@ -17,49 +21,69 @@ import ru.bclib.util.MHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import java.util.List; import java.util.Random; +import java.util.function.Function; +import java.util.function.Supplier; public class ArchFeature extends DefaultFeature { - private Block block; - - public ArchFeature(Block block) { - this.block = block; - } - - @Override - public boolean place(FeaturePlaceContext featurePlaceContext) { - final WorldGenLevel world = featurePlaceContext.level(); - BlockPos origin = featurePlaceContext.origin(); - Random random = featurePlaceContext.random(); - - BlockPos pos = getPosOnSurfaceWG(world, new BlockPos((origin.getX() & 0xFFFFFFF0) | 7, 0, (origin.getZ() & 0xFFFFFFF0) | 7)); - if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { - return false; - } - - float bigRadius = MHelper.randRange(10F, 20F, random); - float smallRadius = MHelper.randRange(3F, 7F, random); - if (smallRadius + bigRadius > 23) { - smallRadius = 23 - bigRadius; - } - SDF arch = new SDFTorus().setBigRadius(bigRadius).setSmallRadius(smallRadius).setBlock(block); - arch = new SDFRotation().setRotation(MHelper.randomHorizontal(random), (float) Math.PI * 0.5F).setSource(arch); - - final float smallRadiusF = smallRadius; - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - arch = new SDFDisplacement().setFunction((vec) -> { - return (float) (Math.abs(noise.eval( - vec.x() * 0.1, - vec.y() * 0.1, - vec.z() * 0.1 - )) * 3F + Math.abs(noise.eval(vec.x() * 0.3, vec.y() * 0.3 + 100, vec.z() * 0.3)) * 1.3F) - smallRadiusF * Math.abs(1 - vec.y() / bigRadius); - }).setSource(arch); - - float side = (bigRadius + smallRadius + 3F) * 2; - if (side > 47) { - side = 47; - } - arch.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); - return true; - } + private Function surfaceFunction; + private Block block; + + public ArchFeature(Block block, Function surfaceFunction) { + this.surfaceFunction = surfaceFunction; + this.block = block; + } + + @Override + public boolean place(FeaturePlaceContext featurePlaceContext) { + final WorldGenLevel world = featurePlaceContext.level(); + BlockPos origin = featurePlaceContext.origin(); + Random random = featurePlaceContext.random(); + + BlockPos pos = getPosOnSurfaceWG( + world, + new BlockPos((origin.getX() & 0xFFFFFFF0) | 7, 0, (origin.getZ() & 0xFFFFFFF0) | 7) + ); + if (!world.getBlockState(pos.below(5)).is(TagAPI.BLOCK_GEN_TERRAIN)) { + return false; + } + + float bigRadius = MHelper.randRange(10F, 20F, random); + float smallRadius = MHelper.randRange(3F, 7F, random); + if (smallRadius + bigRadius > 23) { + smallRadius = 23 - bigRadius; + } + SDF arch = new SDFTorus().setBigRadius(bigRadius).setSmallRadius(smallRadius).setBlock(block); + arch = new SDFRotation().setRotation(MHelper.randomHorizontal(random), (float) Math.PI * 0.5F).setSource(arch); + + final float smallRadiusF = smallRadius; + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + arch = new SDFDisplacement().setFunction((vec) -> { + return (float) (Math.abs(noise.eval(vec.x() * 0.1, + vec.y() * 0.1, + vec.z() * 0.1 + )) * 3F + Math.abs(noise.eval( + vec.x() * 0.3, + vec.y() * 0.3 + 100, + vec.z() * 0.3 + )) * 1.3F) - smallRadiusF * Math.abs(1 - vec.y() / bigRadius); + }).setSource(arch); + + List surface = Lists.newArrayList(); + arch.addPostProcess((info) -> { + if (info.getStateUp().isAir()) { + return surfaceFunction.apply(info.getPos()); + } + return info.getState(); + }); + + float side = (bigRadius + smallRadius + 3F) * 2; + if (side > 47) { + side = 47; + } + arch.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); + + return true; + } } diff --git a/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java index d799740c..277a7333 100644 --- a/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java +++ b/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java @@ -1,10 +1,12 @@ package ru.betterend.world.surface; +import net.minecraft.core.BlockPos; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilder; import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; +import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import java.util.Random; @@ -19,23 +21,30 @@ public class UmbraSurfaceBuilder extends SurfaceBuilder 0.3F) { - config = SurfaceBuilders.PALLIDIUM_SURFACE_CONFIG; - } - else if (grass > 0.1F) { - config = SurfaceBuilders.PALLIDIUM_T1_SURFACE_CONFIG; - } - else if (grass > -0.1) { - config = SurfaceBuilders.PALLIDIUM_T2_SURFACE_CONFIG; - } - else if (grass > -0.3F) { - config = SurfaceBuilders.PALLIDIUM_T3_SURFACE_CONFIG; - } - else { - config = SurfaceBuilders.UMBRA_SURFACE_CONFIG; - } + SurfaceBuilderBaseConfiguration config = getConfig(x, z, random); SurfaceBuilder.DEFAULT.apply(random, chunk, biome, x, z, height, noise + depth, defaultBlock, defaultFluid, seaLevel, seed, n, config); } + + public static BlockState getSurfaceState(BlockPos pos) { + return getConfig(pos.getX(), pos.getZ(), MHelper.RANDOM).getTopMaterial(); + } + + private static SurfaceBuilderBaseConfiguration getConfig(int x, int z, Random random) { + float grass = ((float) NOISE.eval(x * 0.03, z * 0.03) + (float) NOISE.eval(x * 0.1, z * 0.1) * 0.6F + random.nextFloat() * 0.2F) - 0.05F; + if (grass > 0.3F) { + return SurfaceBuilders.PALLIDIUM_SURFACE_CONFIG; + } + else if (grass > 0.1F) { + return SurfaceBuilders.PALLIDIUM_T1_SURFACE_CONFIG; + } + else if (grass > -0.1) { + return SurfaceBuilders.PALLIDIUM_T2_SURFACE_CONFIG; + } + else if (grass > -0.3F) { + return SurfaceBuilders.PALLIDIUM_T3_SURFACE_CONFIG; + } + else { + return SurfaceBuilders.UMBRA_SURFACE_CONFIG; + } + } } \ No newline at end of file diff --git a/src/main/resources/assets/betterend/textures/block/inflexia.png b/src/main/resources/assets/betterend/textures/block/inflexia.png new file mode 100644 index 00000000..1ef26234 Binary files /dev/null and b/src/main/resources/assets/betterend/textures/block/inflexia.png differ