diff --git a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java b/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java index 85a29aa6..4a3d5795 100644 --- a/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java +++ b/src/main/java/ru/betterend/blocks/basis/BlockFeatureSapling.java @@ -79,7 +79,9 @@ public abstract class BlockFeatureSapling extends BlockBaseNotFull implements Fe @Override public void grow(ServerWorld world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithoutUpdate(world, pos, Blocks.AIR.getDefaultState()); - getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null); + if (!getFeature().generate(world, world.getChunkManager().getChunkGenerator(), random, pos, null)) { + BlocksHelper.setWithoutUpdate(world, pos, this.getDefaultState()); + } } @Override diff --git a/src/main/java/ru/betterend/compat/REIAlloyingCategory.java b/src/main/java/ru/betterend/compat/REIAlloyingCategory.java index 5e9279b9..b48c3641 100644 --- a/src/main/java/ru/betterend/compat/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/compat/REIAlloyingCategory.java @@ -9,7 +9,6 @@ import org.jetbrains.annotations.NotNull; import com.google.common.collect.Lists; import it.unimi.dsi.fastutil.ints.IntList; - import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.EntryStack; @@ -18,7 +17,6 @@ import me.shedaniel.rei.api.widgets.Widgets; import me.shedaniel.rei.gui.entries.RecipeEntry; import me.shedaniel.rei.gui.entries.SimpleRecipeEntry; import me.shedaniel.rei.gui.widget.Widget; - import net.minecraft.client.gui.DrawableHelper; import net.minecraft.client.util.math.MatrixStack; import net.minecraft.text.TranslatableText; diff --git a/src/main/java/ru/betterend/compat/REIAlloyingDisplay.java b/src/main/java/ru/betterend/compat/REIAlloyingDisplay.java index 3d5ca517..d94e1ca8 100644 --- a/src/main/java/ru/betterend/compat/REIAlloyingDisplay.java +++ b/src/main/java/ru/betterend/compat/REIAlloyingDisplay.java @@ -10,7 +10,6 @@ import org.jetbrains.annotations.NotNull; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.TransferRecipeDisplay; import me.shedaniel.rei.server.ContainerInfo; - import net.minecraft.item.Item; import net.minecraft.recipe.BlastingRecipe; import net.minecraft.recipe.Recipe; @@ -18,7 +17,6 @@ import net.minecraft.screen.ScreenHandler; import net.minecraft.text.TranslatableText; import net.minecraft.util.Formatting; import net.minecraft.util.Identifier; - import ru.betterend.blocks.entities.EndStoneSmelterBlockEntity; import ru.betterend.recipe.AlloyingRecipe; diff --git a/src/main/java/ru/betterend/compat/REIPlugin.java b/src/main/java/ru/betterend/compat/REIPlugin.java index 1b7f50ef..9cd236d6 100644 --- a/src/main/java/ru/betterend/compat/REIPlugin.java +++ b/src/main/java/ru/betterend/compat/REIPlugin.java @@ -3,13 +3,10 @@ package ru.betterend.compat; import me.shedaniel.rei.api.EntryStack; import me.shedaniel.rei.api.RecipeHelper; import me.shedaniel.rei.api.plugins.REIPluginV0; - import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; - import net.minecraft.recipe.BlastingRecipe; import net.minecraft.util.Identifier; - import ru.betterend.BetterEnd; import ru.betterend.recipe.AlloyingRecipe; import ru.betterend.registry.BlockRegistry; diff --git a/src/main/java/ru/betterend/item/EndHammer.java b/src/main/java/ru/betterend/item/EndHammer.java index e67a5622..ecf310a2 100644 --- a/src/main/java/ru/betterend/item/EndHammer.java +++ b/src/main/java/ru/betterend/item/EndHammer.java @@ -3,11 +3,10 @@ package ru.betterend.item; import java.util.UUID; import com.google.common.collect.ImmutableMultimap; -import com.google.common.collect.Multimap; import com.google.common.collect.ImmutableMultimap.Builder; +import com.google.common.collect.Multimap; import io.netty.util.internal.ThreadLocalRandom; - import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; import net.minecraft.block.Material; diff --git a/src/main/java/ru/betterend/recipe/CraftingRecipes.java b/src/main/java/ru/betterend/recipe/CraftingRecipes.java index 8831c3b8..e2649ec2 100644 --- a/src/main/java/ru/betterend/recipe/CraftingRecipes.java +++ b/src/main/java/ru/betterend/recipe/CraftingRecipes.java @@ -5,7 +5,6 @@ import net.minecraft.block.Blocks; import net.minecraft.item.Item; import net.minecraft.item.Items; import net.minecraft.util.registry.Registry; - import ru.betterend.registry.BlockRegistry; import ru.betterend.registry.ItemRegistry; diff --git a/src/main/java/ru/betterend/registry/FeatureRegistry.java b/src/main/java/ru/betterend/registry/FeatureRegistry.java index 34eedbc8..dba1c55f 100644 --- a/src/main/java/ru/betterend/registry/FeatureRegistry.java +++ b/src/main/java/ru/betterend/registry/FeatureRegistry.java @@ -8,14 +8,14 @@ import ru.betterend.world.features.SinglePlantFeature; public class FeatureRegistry { // Trees // - public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 2); + public static final EndFeature MOSSY_GLOWSHROOM = new EndFeature("mossy_glowshroom", new MossyGlowshroomFeature(), 3); // Plants // public static final EndFeature UMBRELLA_MOSS = new EndFeature("umbrella_moss", new DoublePlantFeature(BlockRegistry.UMBRELLA_MOSS, BlockRegistry.UMBRELLA_MOSS_TALL, 5), 5); public static final EndFeature CREEPING_MOSS = new EndFeature("creeping_moss", new SinglePlantFeature(BlockRegistry.CREEPING_MOSS, 5), 5); // Features // - public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 100); + public static final EndFeature END_LAKE = EndFeature.makeLakeFeature("end_lake", new EndLakeFeature(), 4); // Ores // public static final EndFeature ENDER_ORE = EndFeature.makeOreFeature("ender_ore", BlockRegistry.ENDER_ORE, 6, 3, 0, 4, 96); diff --git a/src/main/java/ru/betterend/registry/ItemRegistry.java b/src/main/java/ru/betterend/registry/ItemRegistry.java index f6771232..c706a365 100644 --- a/src/main/java/ru/betterend/registry/ItemRegistry.java +++ b/src/main/java/ru/betterend/registry/ItemRegistry.java @@ -16,7 +16,6 @@ import net.minecraft.item.ToolItem; import net.minecraft.item.ToolMaterials; import net.minecraft.tag.Tag; import net.minecraft.util.registry.Registry; - import ru.betterend.BetterEnd; import ru.betterend.item.EndArmorMaterial; import ru.betterend.item.EndAxe; diff --git a/src/main/java/ru/betterend/world/features/DefaultFeature.java b/src/main/java/ru/betterend/world/features/DefaultFeature.java index 16632569..631226ac 100644 --- a/src/main/java/ru/betterend/world/features/DefaultFeature.java +++ b/src/main/java/ru/betterend/world/features/DefaultFeature.java @@ -7,6 +7,7 @@ import net.minecraft.world.Heightmap.Type; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.feature.DefaultFeatureConfig; import net.minecraft.world.gen.feature.Feature; +import ru.betterend.util.BlocksHelper; public abstract class DefaultFeature extends Feature { protected static final BlockState AIR = Blocks.AIR.getDefaultState(); @@ -19,4 +20,14 @@ public abstract class DefaultFeature extends Feature { protected BlockPos getPosOnSurface(StructureWorldAccess world, BlockPos pos) { return world.getTopPosition(Type.WORLD_SURFACE, pos); } + + protected BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos) { + int h = BlocksHelper.downRay(world, pos, 256); + return pos.down(h); + } + + protected BlockPos getPosOnSurfaceRaycast(StructureWorldAccess world, BlockPos pos, int dist) { + int h = BlocksHelper.downRay(world, pos, dist); + return pos.down(h); + } } diff --git a/src/main/java/ru/betterend/world/features/EndFeature.java b/src/main/java/ru/betterend/world/features/EndFeature.java index 209e5199..06449053 100644 --- a/src/main/java/ru/betterend/world/features/EndFeature.java +++ b/src/main/java/ru/betterend/world/features/EndFeature.java @@ -48,12 +48,12 @@ public class EndFeature { } public static EndFeature makeRawGenFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.RAW_GENERATION, configured); } public static EndFeature makeLakeFeature(String name, Feature feature, int chance) { - ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.CHANCE.configure(new ChanceDecoratorConfig(100))); + ConfiguredFeature configured = feature.configure(FeatureConfig.DEFAULT).decorate(Decorator.WATER_LAKE.configure(new ChanceDecoratorConfig(chance))); return new EndFeature(name, feature, GenerationStep.Feature.LAKES, configured); } diff --git a/src/main/java/ru/betterend/world/features/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/EndLakeFeature.java index c0df9bfe..5cef3929 100644 --- a/src/main/java/ru/betterend/world/features/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/EndLakeFeature.java @@ -4,6 +4,7 @@ import java.util.Random; import net.minecraft.block.BlockState; import net.minecraft.block.Blocks; +import net.minecraft.block.Material; import net.minecraft.util.math.BlockPos; import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.world.StructureWorldAccess; @@ -32,21 +33,22 @@ public class EndLakeFeature extends DefaultFeature { int waterLevel = blockPos.getY(); - BlockPos pos = getPosOnSurface(world, blockPos.north(dist)); - if (pos.getY() < 10) return false; + BlockPos pos = getPosOnSurfaceRaycast(world, blockPos.north(dist).up(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurface(world, blockPos.south(dist)); - if (pos.getY() < 10) return false; + pos = getPosOnSurfaceRaycast(world, blockPos.south(dist).up(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurface(world, blockPos.east(dist)); - if (pos.getY() < 10) return false; + pos = getPosOnSurfaceRaycast(world, blockPos.east(dist).up(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); - pos = getPosOnSurface(world, blockPos.west(dist)); - if (pos.getY() < 10) return false; + pos = getPosOnSurfaceRaycast(world, blockPos.west(dist).up(10), 20); + if (Math.abs(blockPos.getY() - pos.getY()) > 5) return false; waterLevel = MHelper.min(pos.getY(), waterLevel); + BlockState state; for (int y = blockPos.getY(); y <= blockPos.getY() + 10; y++) { POS.setY(y); @@ -62,13 +64,14 @@ public class EndLakeFeature extends DefaultFeature { double r = add * 1.8 + radius * (NOISE.eval(x * 0.2, y * 0.2, z * 0.2) * 0.25 + 0.75); r *= r; if (x2 + z2 <= r) { - if (world.getBlockState(POS).isIn(BlockTagRegistry.END_GROUND)) { + state = world.getBlockState(POS); + if (state.isIn(BlockTagRegistry.END_GROUND) || !state.canPlaceAt(world, POS) || state.getBlock() == BlockRegistry.ENDSTONE_DUST) { BlocksHelper.setWithoutUpdate(world, POS, AIR); } pos = POS.down(); if (world.getBlockState(pos).isIn(BlockTagRegistry.END_GROUND)) { - BlockState state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + state = world.getBiome(pos).getGenerationSettings().getSurfaceConfig().getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) @@ -106,13 +109,16 @@ public class EndLakeFeature extends DefaultFeature { r *= r; rb *= rb; if (y2 + x2 + z2 <= r) { - BlocksHelper.setWithoutUpdate(world, POS, y < waterLevel ? WATER : AIR); + state = world.getBlockState(POS); + if (state.isIn(BlockTagRegistry.END_GROUND) || state.getMaterial().equals(Material.PLANT) || state.getBlock() == BlockRegistry.ENDSTONE_DUST) { + BlocksHelper.setWithoutUpdate(world, POS, y < waterLevel ? WATER : AIR); + } pos = POS.down(); if (world.getBlockState(pos).getBlock().isIn(BlockTagRegistry.END_GROUND)) BlocksHelper.setWithoutUpdate(world, POS.down(), BlockRegistry.ENDSTONE_DUST.getDefaultState()); pos = POS.up(); - if (!world.getBlockState(pos).isAir()) { - while (!world.getBlockState(pos).isAir()) { + if (world.getBlockState(pos).isIn(BlockTagRegistry.END_GROUND)) { + while (world.getBlockState(pos).isIn(BlockTagRegistry.END_GROUND)) { BlocksHelper.setWithoutUpdate(world, pos, pos.getY() < waterLevel ? WATER : AIR); pos = pos.up(); } @@ -121,7 +127,7 @@ public class EndLakeFeature extends DefaultFeature { else if (y <= waterLevel && y2 + x2 + z2 <= rb) { if (world.getBlockState(POS).getMaterial().isReplaceable()) { if (world.isAir(POS.up())) { - BlockState state = world.getBiome(POS).getGenerationSettings().getSurfaceConfig().getTopMaterial(); + state = world.getBiome(POS).getGenerationSettings().getSurfaceConfig().getTopMaterial(); BlocksHelper.setWithoutUpdate(world, POS, random.nextBoolean() ? state : BlockRegistry.ENDSTONE_DUST.getDefaultState()); BlocksHelper.setWithoutUpdate(world, POS.down(), END_STONE); } diff --git a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java index d5549e73..fcd09dee 100644 --- a/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java +++ b/src/main/java/ru/betterend/world/features/MossyGlowshroomFeature.java @@ -10,7 +10,9 @@ import net.minecraft.block.Blocks; import net.minecraft.block.Material; import net.minecraft.client.util.math.Vector3f; import net.minecraft.util.math.BlockPos; +import net.minecraft.util.math.BlockPos.Mutable; import net.minecraft.util.math.Direction; +import net.minecraft.util.math.MathHelper; import net.minecraft.world.StructureWorldAccess; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.feature.DefaultFeatureConfig; @@ -50,6 +52,8 @@ public class MossyGlowshroomFeature extends DefaultFeature { private static final SDFPrimitive CONE_GLOW; private static final SDFPrimitive ROOTS; + private static final Mutable POS = new Mutable(); + @Override public boolean generate(StructureWorldAccess world, ChunkGenerator chunkGenerator, Random random, BlockPos blockPos, DefaultFeatureConfig featureConfig) { blockPos = getPosOnSurface(world, blockPos); @@ -77,8 +81,39 @@ public class MossyGlowshroomFeature extends DefaultFeature { HEAD_POS.setTranslate(pos.getX(), pos.getY(), pos.getZ()); ROOTS_ROT.setAngle(random.nextFloat() * MHelper.PI2); FUNCTION.setSourceA(sdf); + float scale = MHelper.randRange(0.75F, 1.1F, random); + + Vector3f vec = spline.get(0); + float x1 = blockPos.getX() + vec.getX() * scale; + float y1 = blockPos.getY() + vec.getY() * scale; + float z1 = blockPos.getZ() + vec.getZ() * scale; + for (int i = 1; i < count; i++) { + vec = spline.get(i); + float x2 = blockPos.getX() + vec.getX() * scale; + float y2 = blockPos.getY() + vec.getY() * scale; + float z2 = blockPos.getZ() + vec.getZ() * scale; + + for (float py = y1; py < y2; py += 3) { + if (py - blockPos.getY() < 10) continue; + float lerp = (py - y1) / (y2 - y1); + float x = MathHelper.lerp(lerp, x1, x2); + float z = MathHelper.lerp(lerp, z1, z2); + POS.set(x, py, z); + BlockState state = world.getBlockState(POS); + boolean generate = state.getMaterial().isReplaceable() || state.getMaterial().equals(Material.PLANT); + if (!generate) { + return false; + } + } + + x1 = x2; + y1 = y2; + z1 = z2; + } + BlocksHelper.setWithoutUpdate(world, blockPos, AIR); + Set blocks = new SDFScale() - .setScale(MHelper.randRange(0.75F, 1.1F, random)) + .setScale(scale) .setSource(FUNCTION) .setReplaceFunction(REPLACE) .setPostProcess(POST_PROCESS) diff --git a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java index 5ca0fdfc..7f4fd7a0 100644 --- a/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java +++ b/src/main/java/ru/betterend/world/generator/BetterEndBiomeSource.java @@ -35,8 +35,8 @@ public class BetterEndBiomeSource extends BiomeSource { public BetterEndBiomeSource(Registry biomeRegistry, long seed) { super(Collections.emptyList()); - this.mapLand = new BiomeMap(seed, 50, BiomeRegistry.LAND_BIOMES); - this.mapVoid = new BiomeMap(seed, 50, BiomeRegistry.VOID_BIOMES); + this.mapLand = new BiomeMap(seed, 150, BiomeRegistry.LAND_BIOMES); + this.mapVoid = new BiomeMap(seed, 150, BiomeRegistry.VOID_BIOMES); this.centerBiome = biomeRegistry.getOrThrow(BiomeKeys.THE_END); this.biomeRegistry = biomeRegistry; this.seed = seed;