diff --git a/README.md b/README.md index 120884de..633b9ac2 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,13 @@ # Better End -Better End Mod for Fabric, MC 1.17.1 +Better End Mod for Fabric, MC 1.18 Importing: * Clone repo * Edit gradle.properties if necessary -* Run command line in folder: gradlew genSources eclipse (or Another-IDE-Name) +* Run command line in folder: gradlew genSources idea (or eclipse) * Import project to IDE Building: diff --git a/build.gradle b/build.gradle index 7e53b9c5..772978a6 100644 --- a/build.gradle +++ b/build.gradle @@ -25,6 +25,11 @@ repositories { maven { url 'https://maven.blamejared.com' } maven { url "https://maven.shedaniel.me/" } maven { url 'https://jitpack.io' } + maven { url 'https://maven.terraformersmc.com/releases' } +} + +loom { + accessWidenerPath = file("src/main/resources/betterend.accesswidener") } dependencies { @@ -33,7 +38,7 @@ dependencies { modImplementation "net.fabricmc:fabric-loader:${project.loader_version}" modImplementation "net.fabricmc.fabric-api:fabric-api:${project.fabric_version}" - useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}" + // useApi "vazkii.patchouli:Patchouli:1.17-${project.patchouli_version}" println "Using local BCLib: ${local_bclib}" if (local_bclib){ implementation( project(path:":BCLib", configuration: 'dev') ) diff --git a/gradle.properties b/gradle.properties index 582b8428..e213d265 100644 --- a/gradle.properties +++ b/gradle.properties @@ -3,9 +3,9 @@ org.gradle.jvmargs=-Xmx2G # Fabric Properties # check these on https://fabricmc.net/use -minecraft_version=1.18 -yarn_mappings=6 -loader_version=0.12.8 +minecraft_version=1.18.1 +fabric_version = 0.44.0+1.18 +loader_version=0.12.12 #Loom loom_version=0.10-SNAPSHOT @@ -19,7 +19,6 @@ archives_base_name=better-end # currently not on the main fabric site, check on the maven: https://maven.fabricmc.net/net/fabricmc/fabric-api/fabric-api patchouli_version = 55-FABRIC-SNAPSHOT -fabric_version = 0.44.0+1.18 -bclib_version = 1.0.1 +bclib_version = 1.1.4 rei_version = 7.0.343 canvas_version = 1.0.+ diff --git a/settings.gradle b/settings.gradle index 8eab6b85..03387e2a 100644 --- a/settings.gradle +++ b/settings.gradle @@ -11,10 +11,10 @@ pluginManagement { // #### Custom Settings #### //Change the next line to disable local BCLib loading -def allowLocalLibUse = false +def allowLocalLibUse = true //When true, the local BCLib is also used in commandline builds -def allowLocalLibInConsoleMode = false +def allowLocalLibInConsoleMode = true //The path were to look for the local BCLib def BCLibPath = '../BCLib' diff --git a/src/main/java/ru/betterend/BetterEnd.java b/src/main/java/ru/betterend/BetterEnd.java index 1f0cf42f..40e6c306 100644 --- a/src/main/java/ru/betterend/BetterEnd.java +++ b/src/main/java/ru/betterend/BetterEnd.java @@ -3,7 +3,9 @@ package ru.betterend; import net.fabricmc.api.ModInitializer; import net.fabricmc.loader.api.FabricLoader; import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biomes; import ru.bclib.api.WorldDataAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.Logger; import ru.betterend.api.BetterEndPlugin; import ru.betterend.config.Configs; @@ -28,13 +30,12 @@ import ru.betterend.util.BonemealPlants; import ru.betterend.util.LootTableUtil; import ru.betterend.world.generator.GeneratorOptions; import ru.betterend.world.generator.TerrainGenerator; -import ru.betterend.world.surface.SurfaceBuilders; public class BetterEnd implements ModInitializer { public static final String MOD_ID = "betterend"; public static final Logger LOGGER = new Logger(MOD_ID); public static final boolean RUNS_FALL_FLYING_LIB = FabricLoader.getInstance().getModContainer("fallflyinglib").isPresent(); - + @Override public void onInitialize() { WorldDataAPI.registerModCache(MOD_ID); @@ -43,7 +44,6 @@ public class BetterEnd implements ModInitializer { EndBlockEntities.register(); EndFeatures.register(); EndEntities.register(); - SurfaceBuilders.register(); EndBiomes.register(); EndTags.register(); EndEnchantments.register(); @@ -61,14 +61,22 @@ public class BetterEnd implements ModInitializer { FabricLoader.getInstance().getEntrypoints("betterend", BetterEndPlugin.class).forEach(BetterEndPlugin::register); Integrations.init(); Configs.saveConfigs(); - + if (GeneratorOptions.useNewGenerator()) { - ru.bclib.world.generator.GeneratorOptions.setFarEndBiomes(GeneratorOptions.getIslandDistBlock() > 250000L); + ru.bclib.world.generator.GeneratorOptions.setFarEndBiomes(GeneratorOptions.getIslandDistBlock()); ru.bclib.world.generator.GeneratorOptions.setEndLandFunction((pos) -> TerrainGenerator.isLand(pos.x, pos.y)); } + + BiomeAPI.registerEndBiomeModification((biomeID, biome) -> { + if (!biomeID.equals(Biomes.THE_VOID.location())) { + EndStructures.addBiomeStructures(biomeID, biome); + EndFeatures.addBiomeFeatures(biomeID, biome); + } + }); + } - public static ResourceLocation makeID(String path) { return new ResourceLocation(MOD_ID, path); } + } diff --git a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java index 025701f0..4c34dbde 100644 --- a/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/DragonTreeSaplingBlock.java @@ -4,20 +4,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class DragonTreeSaplingBlock extends PottableFeatureSapling { public DragonTreeSaplingBlock() { - super(); - } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.DRAGON_TREE.getFeature(); + super((state)->EndFeatures.DRAGON_TREE.getFeature()); } @Override diff --git a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java index 041f22ff..46244688 100644 --- a/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java +++ b/src/main/java/ru/betterend/blocks/EndLotusStemBlock.java @@ -88,7 +88,7 @@ public class EndLotusStemBlock extends BaseBlock implements SimpleWaterloggedBlo @SuppressWarnings("deprecation") public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { if (state.getValue(WATERLOGGED)) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } return state; } diff --git a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java index 788665b4..4fea40b2 100644 --- a/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/HelixTreeSaplingBlock.java @@ -4,18 +4,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class HelixTreeSaplingBlock extends PottableFeatureSapling { - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.HELIX_TREE.getFeature(); + public HelixTreeSaplingBlock() { + super((state)->EndFeatures.HELIX_TREE.getFeature()); } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.AMBER_MOSS); diff --git a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java index 30d9be03..a53a457a 100644 --- a/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java +++ b/src/main/java/ru/betterend/blocks/HydrothermalVentBlock.java @@ -90,7 +90,7 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo return Blocks.WATER.defaultBlockState(); } else if (state.getValue(WATERLOGGED) && facing == Direction.UP && neighborState.is(Blocks.WATER)) { - world.getBlockTicks().scheduleTick(pos, this, 20); + world.scheduleTick(pos, this, 20); } return state; } @@ -118,7 +118,7 @@ public class HydrothermalVentBlock extends BaseBlockNotFull implements EntityBlo BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, EndBlocks.VENT_BUBBLE_COLUMN); - world.getBlockTicks().scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); + world.scheduleTick(up, EndBlocks.VENT_BUBBLE_COLUMN, 5); } } diff --git a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java index 0f6dd809..ebb1e3b5 100644 --- a/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LacugroveSaplingBlock.java @@ -4,20 +4,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class LacugroveSaplingBlock extends PottableFeatureSapling { public LacugroveSaplingBlock() { - super(); - } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.LACUGROVE.getFeature(); + super((state)->EndFeatures.LACUGROVE.getFeature()); } @Override diff --git a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java index 506d1691..e1881306 100644 --- a/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/LucerniaSaplingBlock.java @@ -4,22 +4,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class LucerniaSaplingBlock extends PottableFeatureSapling { public LucerniaSaplingBlock() { - super(); + super((state)->EndFeatures.LUCERNIA.getFeature()); } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.LUCERNIA.getFeature(); - } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.RUTISCUS); diff --git a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java index efd74d09..31363dee 100644 --- a/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java +++ b/src/main/java/ru/betterend/blocks/LumecornSeedBlock.java @@ -4,25 +4,34 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.state.BlockBehaviour; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import ru.betterend.blocks.basis.EndPlantWithAgeBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Optional; import java.util.Random; public class LumecornSeedBlock extends EndPlantWithAgeBlock { - + @Override public void growAdult(WorldGenLevel world, Random random, BlockPos pos) { - EndFeatures.LUMECORN.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); + ((Feature) (EndFeatures.LUMECORN.getFeature())).place(new FeaturePlaceContext<>( + Optional.empty(), + world, + null, + random, + pos, + (NoneFeatureConfiguration) null)); } - + @Override protected boolean isTerrain(BlockState state) { return state.is(EndBlocks.END_MOSS); } - + @Override public BlockBehaviour.OffsetType getOffsetType() { return BlockBehaviour.OffsetType.NONE; diff --git a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java index 705992f7..5e63fdce 100644 --- a/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/MossyGlowshroomSaplingBlock.java @@ -4,22 +4,15 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class MossyGlowshroomSaplingBlock extends PottableFeatureSapling { public MossyGlowshroomSaplingBlock() { - super(7); + super(7, (state)->EndFeatures.MOSSY_GLOWSHROOM.getFeature()); } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.MOSSY_GLOWSHROOM.getFeature(); - } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.END_MOSS) || world.getBlockState(pos.below()) diff --git a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java index c7234f0c..2e428182 100644 --- a/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java +++ b/src/main/java/ru/betterend/blocks/NeonCactusPlantBlock.java @@ -115,9 +115,9 @@ public class NeonCactusPlantBlock extends BaseBlockNotFull implements SimpleWate @Override public BlockState updateShape(BlockState state, Direction direction, BlockState newState, LevelAccessor world, BlockPos pos, BlockPos posFrom) { - world.getBlockTicks().scheduleTick(pos, this, 2); + world.scheduleTick(pos, this, 2); if (state.getValue(WATERLOGGED)) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } Direction dir = state.getValue(FACING); BlockState downState = world.getBlockState(pos.relative(dir.getOpposite())); diff --git a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java index a965af01..9d6afd70 100644 --- a/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/PythadendronSaplingBlock.java @@ -4,20 +4,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class PythadendronSaplingBlock extends PottableFeatureSapling { public PythadendronSaplingBlock() { - super(); - } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.PYTHADENDRON_TREE.getFeature(); + super((state)->EndFeatures.PYTHADENDRON_TREE.getFeature()); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java index c0625123..290b35c1 100644 --- a/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallAmaranitaBlock.java @@ -7,7 +7,9 @@ import net.minecraft.world.level.Level; 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.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.shapes.CollisionContext; import net.minecraft.world.phys.shapes.VoxelShape; @@ -16,6 +18,7 @@ import ru.betterend.blocks.basis.EndPlantBlock; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import java.util.Optional; import java.util.Random; public class SmallAmaranitaBlock extends EndPlantBlock { @@ -30,8 +33,8 @@ public class SmallAmaranitaBlock extends EndPlantBlock { public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlockPos bigPos = growBig(world, pos); if (bigPos != null) { - if (EndFeatures.GIGANTIC_AMARANITA.getFeature() - .place(new FeaturePlaceContext<>(world, null, random, bigPos, null))) { + if (((Feature)EndFeatures.GIGANTIC_AMARANITA.getFeature()) + .place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, bigPos, null))) { replaceMushroom(world, bigPos); replaceMushroom(world, bigPos.south()); replaceMushroom(world, bigPos.east()); @@ -39,7 +42,7 @@ public class SmallAmaranitaBlock extends EndPlantBlock { } return; } - EndFeatures.LARGE_AMARANITA.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); + ((Feature)EndFeatures.LARGE_AMARANITA.getFeature()).place( new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java index a59f6de1..cda6ec18 100644 --- a/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java +++ b/src/main/java/ru/betterend/blocks/SmallJellyshroomBlock.java @@ -20,7 +20,9 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.BonemealableBlock; import net.minecraft.world.level.block.SoundType; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; import net.minecraft.world.level.storage.loot.LootContext; import net.minecraft.world.level.storage.loot.parameters.LootContextParams; @@ -37,6 +39,7 @@ import ru.betterend.registry.EndFeatures; import java.util.EnumMap; import java.util.List; +import java.util.Optional; import java.util.Random; public class SmallJellyshroomBlock extends BaseAttachedBlock implements RenderLayerProvider, BonemealableBlock, PottablePlant { @@ -101,7 +104,7 @@ public class SmallJellyshroomBlock extends BaseAttachedBlock implements RenderLa @Override public void performBonemeal(ServerLevel world, Random random, BlockPos pos, BlockState state) { BlocksHelper.setWithUpdate(world, pos, Blocks.AIR); - EndFeatures.JELLYSHROOM.getFeature().place(new FeaturePlaceContext<>(world, null, random, pos, null)); + ((Feature)EndFeatures.JELLYSHROOM.getFeature()).place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos, null)); } @Override diff --git a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java index e0c7c295..b56c1cfc 100644 --- a/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/TenaneaSaplingBlock.java @@ -4,20 +4,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; public class TenaneaSaplingBlock extends PottableFeatureSapling { public TenaneaSaplingBlock() { - super(); - } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.TENANEA.getFeature(); + super((state)->EndFeatures.TENANEA.getFeature()); } @Override diff --git a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java index 66c76870..0ff48c93 100644 --- a/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java +++ b/src/main/java/ru/betterend/blocks/UmbrellaTreeSaplingBlock.java @@ -4,7 +4,6 @@ import net.minecraft.core.BlockPos; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.state.BlockState; -import net.minecraft.world.level.levelgen.feature.Feature; import ru.bclib.client.render.BCLRenderLayer; import ru.betterend.blocks.basis.PottableFeatureSapling; import ru.betterend.registry.EndBlocks; @@ -12,15 +11,9 @@ import ru.betterend.registry.EndFeatures; public class UmbrellaTreeSaplingBlock extends PottableFeatureSapling { public UmbrellaTreeSaplingBlock() { - super(); + super((state)-> EndFeatures.UMBRELLA_TREE.getFeature()); } - - @Override - @SuppressWarnings("deprecation") - protected Feature getFeature() { - return EndFeatures.UMBRELLA_TREE.getFeature(); - } - + @Override public boolean canSurvive(BlockState state, LevelReader world, BlockPos pos) { return world.getBlockState(pos.below()).is(EndBlocks.JUNGLE_MOSS); diff --git a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java index 83babfe1..3ea9dc38 100644 --- a/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java +++ b/src/main/java/ru/betterend/blocks/VentBubbleColumnBlock.java @@ -76,7 +76,7 @@ public class VentBubbleColumnBlock extends Block implements BucketPickup, Liquid BlockPos up = pos.above(); if (world.getBlockState(up).is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, up, this); - world.getBlockTicks().scheduleTick(up, this, 5); + world.scheduleTick(up, this, 5); } } return state; diff --git a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java index b41a4fea..065444ed 100644 --- a/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/EndLanternBlock.java @@ -101,7 +101,7 @@ public class EndLanternBlock extends BaseBlockNotFull implements SimpleWaterlogg public BlockState updateShape(BlockState state, Direction facing, BlockState neighborState, LevelAccessor world, BlockPos pos, BlockPos neighborPos) { Boolean water = state.getValue(WATERLOGGED); if (water) { - world.getLiquidTicks().scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); + world.scheduleTick(pos, Fluids.WATER, Fluids.WATER.getTickDelay(world)); } if (!canSurvive(state, world, pos)) { return water ? Blocks.WATER.defaultBlockState() : Blocks.AIR.defaultBlockState(); diff --git a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java index e7b131cd..784377f5 100644 --- a/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java +++ b/src/main/java/ru/betterend/blocks/basis/PedestalBlock.java @@ -82,7 +82,7 @@ public class PedestalBlock extends BaseBlockNotFull implements EntityBlock { /** * Register new Pedestal block with specified mod id. * - * @param id pedestal id + * @param id pedestal id * @param source source block * @return new Pedestal block with specified id. */ diff --git a/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java b/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java index 20f5f24f..b8dc1fb4 100644 --- a/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java +++ b/src/main/java/ru/betterend/blocks/basis/PottableFeatureSapling.java @@ -1,14 +1,18 @@ package ru.betterend.blocks.basis; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.feature.Feature; import ru.bclib.blocks.FeatureSaplingBlock; import ru.betterend.interfaces.PottablePlant; +import java.util.function.Function; + public abstract class PottableFeatureSapling extends FeatureSaplingBlock implements PottablePlant { - public PottableFeatureSapling() { - super(); + public PottableFeatureSapling(Function> featureSupplier) { + super(featureSupplier); } - public PottableFeatureSapling(int light) { - super(light); + public PottableFeatureSapling(int light, Function> featureSupplier) { + super(light, featureSupplier); } } diff --git a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java index 7adad5af..5325a67f 100644 --- a/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EndStoneSmelterBlockEntity.java @@ -429,8 +429,9 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme } @Override - public CompoundTag save(CompoundTag tag) { - super.save(tag); + public void saveAdditional(CompoundTag tag) { + super.saveAdditional(tag); + tag.putShort("BurnTime", (short) burnTime); tag.putShort("FuelTime", (short) fuelTime); tag.putShort("SmeltTime", (short) smeltTime); @@ -439,8 +440,6 @@ public class EndStoneSmelterBlockEntity extends BaseContainerBlockEntity impleme CompoundTag usedRecipes = new CompoundTag(); recipesUsed.forEach((identifier, integer) -> usedRecipes.putInt(identifier.toString(), integer)); tag.put("RecipesUsed", usedRecipes); - - return tag; } public boolean canPlaceItem(int slot, ItemStack stack) { diff --git a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java index 84c2e74d..4546cf14 100644 --- a/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/EternalPedestalEntity.java @@ -35,11 +35,11 @@ public class EternalPedestalEntity extends PedestalBlockEntity { } @Override - public CompoundTag save(CompoundTag tag) { + public void saveAdditional(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.save(tag); + super.saveAdditional(tag); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java index 6d03ed5c..8d678176 100644 --- a/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/InfusionPedestalEntity.java @@ -40,11 +40,11 @@ public class InfusionPedestalEntity extends PedestalBlockEntity { } @Override - public CompoundTag save(CompoundTag tag) { + public void saveAdditional(CompoundTag tag) { if (hasRitual()) { tag.put("ritual", linkedRitual.toTag(new CompoundTag())); } - return super.save(tag); + super.saveAdditional(tag); } @Override diff --git a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java index 75e85049..4a581bcf 100644 --- a/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java +++ b/src/main/java/ru/betterend/blocks/entities/PedestalBlockEntity.java @@ -1,6 +1,6 @@ package ru.betterend.blocks.entities; -import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; +//import net.fabricmc.fabric.api.block.entity.BlockEntityClientSerializable; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.world.Container; @@ -14,7 +14,8 @@ import ru.betterend.blocks.basis.PedestalBlock; import ru.betterend.registry.EndBlockEntities; import ru.betterend.registry.EndItems; -public class PedestalBlockEntity extends BlockEntity implements Container, BlockEntityClientSerializable { +// TODO Fix client serialisation +public class PedestalBlockEntity extends BlockEntity implements Container/*, BlockEntityClientSerializable*/ { private ItemStack activeItem = ItemStack.EMPTY; private final int maxAge = 314; @@ -110,7 +111,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block fromTag(tag); } - @Override + /*@Override public CompoundTag save(CompoundTag tag) { tag.put("active_item", activeItem.save(new CompoundTag())); return super.save(tag); @@ -124,7 +125,7 @@ public class PedestalBlockEntity extends BlockEntity implements Container, Block @Override public CompoundTag toClientTag(CompoundTag tag) { return save(tag); - } + }*/ protected void fromTag(CompoundTag tag) { if (tag.contains("active_item")) { diff --git a/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java b/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java index 89736e67..53183d2d 100644 --- a/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java +++ b/src/main/java/ru/betterend/complexmaterials/MetalMaterial.java @@ -48,452 +48,452 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndItems; public class MetalMaterial { - public final Block ore; - public final Block block; - public final Block tile; - public final Block bars; - public final Block pressurePlate; - public final Block door; - public final Block trapdoor; - public final Block chain; - public final Block stairs; - public final Block slab; + public final Block ore; + public final Block block; + public final Block tile; + public final Block bars; + public final Block pressurePlate; + public final Block door; + public final Block trapdoor; + public final Block chain; + public final Block stairs; + public final Block slab; - public final Block chandelier; - public final Block bulb_lantern; - public final ColoredMaterial bulb_lantern_colored; + public final Block chandelier; + public final Block bulb_lantern; + public final ColoredMaterial bulb_lantern_colored; - public final Block anvilBlock; + public final Block anvilBlock; - public final Item rawOre; - public final Item nugget; - public final Item ingot; + public final Item rawOre; + public final Item nugget; + public final Item ingot; - public final Item shovelHead; - public final Item pickaxeHead; - public final Item axeHead; - public final Item hoeHead; - public final Item swordBlade; - public final Item swordHandle; + public final Item shovelHead; + public final Item pickaxeHead; + public final Item axeHead; + public final Item hoeHead; + public final Item swordBlade; + public final Item swordHandle; - public final Item shovel; - public final Item sword; - public final Item pickaxe; - public final Item axe; - public final Item hoe; - public final Item hammer; + public final Item shovel; + public final Item sword; + public final Item pickaxe; + public final Item axe; + public final Item hoe; + public final Item hammer; - public final Item forgedPlate; - public final Item helmet; - public final Item chestplate; - public final Item leggings; - public final Item boots; + public final Item forgedPlate; + public final Item helmet; + public final Item chestplate; + public final Item leggings; + public final Item boots; - public final Tag.Named alloyingOre; + public final Tag.Named alloyingOre; - public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial( - name, - true, - FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), - EndItems.makeEndItemSettings(), - material, - armor - ); - } + public static MetalMaterial makeNormal(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + true, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), + EndItems.makeEndItemSettings(), + material, + armor + ); + } - public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial( - name, - true, - FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) - .mapColor(color) - .hardness(hardness) - .resistance(resistance), - EndItems.makeEndItemSettings(), - material, - armor - ); - } + public static MetalMaterial makeNormal(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + true, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) + .mapColor(color) + .hardness(hardness) + .resistance(resistance), + EndItems.makeEndItemSettings(), + material, + armor + ); + } - public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { - return new MetalMaterial( - name, - false, - FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), - EndItems.makeEndItemSettings(), - material, - armor - ); - } + public static MetalMaterial makeOreless(String name, MaterialColor color, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + false, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK).mapColor(color), + EndItems.makeEndItemSettings(), + material, + armor + ); + } - public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { - return new MetalMaterial( - name, - false, - FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) - .mapColor(color) - .hardness(hardness) - .resistance(resistance), - EndItems.makeEndItemSettings(), - material, - armor - ); - } + public static MetalMaterial makeOreless(String name, MaterialColor color, float hardness, float resistance, Tier material, ArmorMaterial armor) { + return new MetalMaterial( + name, + false, + FabricBlockSettings.copyOf(Blocks.IRON_BLOCK) + .mapColor(color) + .hardness(hardness) + .resistance(resistance), + EndItems.makeEndItemSettings(), + material, + armor + ); + } - private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { - BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings) - .hardness(1) - .resistance(1) - .luminance(15) - .sound(SoundType.LANTERN); - final int level = material.getLevel(); + private MetalMaterial(String name, boolean hasOre, FabricBlockSettings settings, Properties itemSettings, Tier material, ArmorMaterial armor) { + BlockBehaviour.Properties lanternProperties = FabricBlockSettings.copyOf(settings) + .hardness(1) + .resistance(1) + .luminance(15) + .sound(SoundType.LANTERN); + final int level = material.getLevel(); - rawOre = hasOre ? EndItems.registerEndItem(name + "_raw", new ModelProviderItem(itemSettings)) : null; - ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseOreBlock(rawOre, 1, 3, 1)) : null; - alloyingOre = hasOre ? TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_alloying") : null; - if (hasOre) { - TagAPI.addTag(alloyingOre, ore, rawOre); - } + rawOre = hasOre ? EndItems.registerEndItem(name + "_raw", new ModelProviderItem(itemSettings)) : null; + ore = hasOre ? EndBlocks.registerBlock(name + "_ore", new BaseOreBlock(()->rawOre, 1, 3, 1)) : null; + alloyingOre = hasOre ? TagAPI.makeItemTag(BetterEnd.MOD_ID, name + "_alloying") : null; + if (hasOre) { + TagAPI.addTag(alloyingOre, ore, rawOre); + } - block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); - tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); - stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); - slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(tile)); - door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(block)); - trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(block)); - bars = EndBlocks.registerBlock(name + "_bars", new BaseMetalBarsBlock(block)); - chain = EndBlocks.registerBlock(name + "_chain", new BaseChainBlock(block.defaultMaterialColor())); - pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(block)); + block = EndBlocks.registerBlock(name + "_block", new BaseBlock(settings)); + tile = EndBlocks.registerBlock(name + "_tile", new BaseBlock(settings)); + stairs = EndBlocks.registerBlock(name + "_stairs", new BaseStairsBlock(tile)); + slab = EndBlocks.registerBlock(name + "_slab", new BaseSlabBlock(tile)); + door = EndBlocks.registerBlock(name + "_door", new BaseDoorBlock(block)); + trapdoor = EndBlocks.registerBlock(name + "_trapdoor", new BaseTrapdoorBlock(block)); + bars = EndBlocks.registerBlock(name + "_bars", new BaseMetalBarsBlock(block)); + chain = EndBlocks.registerBlock(name + "_chain", new BaseChainBlock(block.defaultMaterialColor())); + pressurePlate = EndBlocks.registerBlock(name + "_plate", new WoodenPressurePlateBlock(block)); - chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); - bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); - bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); + chandelier = EndBlocks.registerBlock(name + "_chandelier", new ChandelierBlock(block)); + bulb_lantern = EndBlocks.registerBlock(name + "_bulb_lantern", new BulbVineLanternBlock(lanternProperties)); + bulb_lantern_colored = new ColoredMaterial(BulbVineLanternColoredBlock::new, bulb_lantern, false); - nugget = EndItems.registerEndItem(name + "_nugget", new ModelProviderItem(itemSettings)); - ingot = EndItems.registerEndItem(name + "_ingot", new ModelProviderItem(itemSettings)); + nugget = EndItems.registerEndItem(name + "_nugget", new ModelProviderItem(itemSettings)); + ingot = EndItems.registerEndItem(name + "_ingot", new ModelProviderItem(itemSettings)); - shovelHead = EndItems.registerEndItem(name + "_shovel_head"); - pickaxeHead = EndItems.registerEndItem(name + "_pickaxe_head"); - axeHead = EndItems.registerEndItem(name + "_axe_head"); - hoeHead = EndItems.registerEndItem(name + "_hoe_head"); - swordBlade = EndItems.registerEndItem(name + "_sword_blade"); - swordHandle = EndItems.registerEndItem(name + "_sword_handle"); + shovelHead = EndItems.registerEndItem(name + "_shovel_head"); + pickaxeHead = EndItems.registerEndItem(name + "_pickaxe_head"); + axeHead = EndItems.registerEndItem(name + "_axe_head"); + hoeHead = EndItems.registerEndItem(name + "_hoe_head"); + swordBlade = EndItems.registerEndItem(name + "_sword_blade"); + swordHandle = EndItems.registerEndItem(name + "_sword_handle"); - shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); - sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); - pickaxe = EndItems.registerEndTool(name + "_pickaxe", new EndPickaxe(material, 1, -2.8F, itemSettings)); - axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); - hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); - hammer = EndItems.registerEndTool( - name + "_hammer", - new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings) - ); + shovel = EndItems.registerEndTool(name + "_shovel", new BaseShovelItem(material, 1.5F, -3.0F, itemSettings)); + sword = EndItems.registerEndTool(name + "_sword", new BaseSwordItem(material, 3, -2.4F, itemSettings)); + pickaxe = EndItems.registerEndTool(name + "_pickaxe", new EndPickaxe(material, 1, -2.8F, itemSettings)); + axe = EndItems.registerEndTool(name + "_axe", new BaseAxeItem(material, 6.0F, -3.0F, itemSettings)); + hoe = EndItems.registerEndTool(name + "_hoe", new BaseHoeItem(material, -3, 0.0F, itemSettings)); + hammer = EndItems.registerEndTool( + name + "_hammer", + new EndHammerItem(material, 5.0F, -3.2F, 0.3D, itemSettings) + ); - forgedPlate = EndItems.registerEndItem(name + "_forged_plate"); - helmet = EndItems.registerEndItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); - chestplate = EndItems.registerEndItem( - name + "_chestplate", - new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings) - ); - leggings = EndItems.registerEndItem( - name + "_leggings", - new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings) - ); - boots = EndItems.registerEndItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); + forgedPlate = EndItems.registerEndItem(name + "_forged_plate"); + helmet = EndItems.registerEndItem(name + "_helmet", new EndArmorItem(armor, EquipmentSlot.HEAD, itemSettings)); + chestplate = EndItems.registerEndItem( + name + "_chestplate", + new EndArmorItem(armor, EquipmentSlot.CHEST, itemSettings) + ); + leggings = EndItems.registerEndItem( + name + "_leggings", + new EndArmorItem(armor, EquipmentSlot.LEGS, itemSettings) + ); + boots = EndItems.registerEndItem(name + "_boots", new EndArmorItem(armor, EquipmentSlot.FEET, itemSettings)); - anvilBlock = EndBlocks.registerBlock( - name + "_anvil", - new EndAnvilBlock(this, block.defaultMaterialColor(), level) - ); + anvilBlock = EndBlocks.registerBlock( + name + "_anvil", + new EndAnvilBlock(this, block.defaultMaterialColor(), level) + ); - if (hasOre) { - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_ingot") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_raw", rawOre, ingot) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_ingot") - .buildWithBlasting(); - AlloyingRecipe.Builder.create(name + "_ingot_alloy") - .setInput(alloyingOre, alloyingOre) - .setOutput(ingot, 3) - .setExpiriense(2.1F) - .build(); - } + if (hasOre) { + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_ore", ore, ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_ingot") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_ingot_furnace_raw", rawOre, ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_ingot") + .buildWithBlasting(); + AlloyingRecipe.Builder.create(name + "_ingot_alloy") + .setInput(alloyingOre, alloyingOre) + .setOutput(ingot, 3) + .setExpiriense(2.1F) + .build(); + } - // Basic recipes - GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_nuggets", ingot) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("###", "###", "###") - .addMaterial('#', nugget) - .setGroup("end_metal_ingots_nug") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_nuggets_from_ingot", nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(9) - .setList("#") - .addMaterial('#', ingot) - .setGroup("end_metal_nuggets_ing") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_block", block) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("###", "###", "###") - .addMaterial('#', ingot) - .setGroup("end_metal_blocks") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_block", ingot) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(9) - .setList("#") - .addMaterial('#', block) - .setGroup("end_metal_ingots") - .build(); + // Basic recipes + GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_nuggets", ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', nugget) + .setGroup("end_metal_ingots_nug") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_nuggets_from_ingot", nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(9) + .setList("#") + .addMaterial('#', ingot) + .setGroup("end_metal_nuggets_ing") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_block", block) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "###", "###") + .addMaterial('#', ingot) + .setGroup("end_metal_blocks") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_ingot_from_block", ingot) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(9) + .setList("#") + .addMaterial('#', block) + .setGroup("end_metal_ingots") + .build(); - // Block recipes - GridRecipe.make(BetterEnd.MOD_ID, name + "_tile", tile) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(4) - .setShape("##", "##") - .addMaterial('#', block) - .setGroup("end_metal_tiles") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bars", bars) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(16) - .setShape("###", "###") - .addMaterial('#', ingot) - .setGroup("end_metal_bars") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("##") - .addMaterial('#', ingot) - .setGroup("end_metal_plates") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_door", door) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(3) - .setShape("##", "##", "##") - .addMaterial('#', ingot) - .setGroup("end_metal_doors") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_trapdoor", trapdoor) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("##", "##") - .addMaterial('#', ingot) - .setGroup("end_metal_trapdoors") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(4) - .setShape("# ", "## ", "###") - .addMaterial('#', block, tile) - .setGroup("end_metal_stairs") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab) - .checkConfig(Configs.RECIPE_CONFIG) - .setOutputCount(6) - .setShape("###") - .addMaterial('#', block, tile) - .setGroup("end_metal_slabs") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chain", chain) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("N", "#", "N") - .addMaterial('#', ingot) - .addMaterial('N', nugget) - .setGroup("end_metal_chain") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_anvil", anvilBlock) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("###", " I ", "III") - .addMaterial('#', block, tile) - .addMaterial('I', ingot) - .setGroup("end_metal_anvil") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_bulb_lantern", bulb_lantern) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("C", "I", "#") - .addMaterial('C', chain) - .addMaterial('I', ingot) - .addMaterial('#', EndItems.GLOWING_BULB) - .build(); + // Block recipes + GridRecipe.make(BetterEnd.MOD_ID, name + "_tile", tile) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("##", "##") + .addMaterial('#', block) + .setGroup("end_metal_tiles") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bars", bars) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(16) + .setShape("###", "###") + .addMaterial('#', ingot) + .setGroup("end_metal_bars") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_pressure_plate", pressurePlate) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##") + .addMaterial('#', ingot) + .setGroup("end_metal_plates") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_door", door) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(3) + .setShape("##", "##", "##") + .addMaterial('#', ingot) + .setGroup("end_metal_doors") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_trapdoor", trapdoor) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("##", "##") + .addMaterial('#', ingot) + .setGroup("end_metal_trapdoors") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_stairs", stairs) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(4) + .setShape("# ", "## ", "###") + .addMaterial('#', block, tile) + .setGroup("end_metal_stairs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_slab", slab) + .checkConfig(Configs.RECIPE_CONFIG) + .setOutputCount(6) + .setShape("###") + .addMaterial('#', block, tile) + .setGroup("end_metal_slabs") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_chain", chain) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("N", "#", "N") + .addMaterial('#', ingot) + .addMaterial('N', nugget) + .setGroup("end_metal_chain") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_anvil", anvilBlock) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", " I ", "III") + .addMaterial('#', block, tile) + .addMaterial('I', ingot) + .setGroup("end_metal_anvil") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_bulb_lantern", bulb_lantern) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("C", "I", "#") + .addMaterial('C', chain) + .addMaterial('I', ingot) + .addMaterial('#', EndItems.GLOWING_BULB) + .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chandelier", chandelier) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("I#I", " # ") - .addMaterial('#', ingot) - .addMaterial('I', EndItems.LUMECORN_ROD) - .setGroup("end_metal_chandelier") - .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_chandelier", chandelier) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("I#I", " # ") + .addMaterial('#', ingot) + .addMaterial('I', EndItems.LUMECORN_ROD) + .setGroup("end_metal_chandelier") + .build(); - // Tools & armor into nuggets - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_axe_nugget", axe, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hoe_nugget", hoe, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_pickaxe_nugget", pickaxe, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_sword_nugget", sword, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hammer_nugget", hammer, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_helmet_nugget", helmet, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_chestplate_nugget", chestplate, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_leggings_nugget", leggings, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); - FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_boots_nugget", boots, nugget) - .checkConfig(Configs.RECIPE_CONFIG) - .setGroup("end_nugget") - .buildWithBlasting(); + // Tools & armor into nuggets + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_axe_nugget", axe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hoe_nugget", hoe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_pickaxe_nugget", pickaxe, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_sword_nugget", sword, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_hammer_nugget", hammer, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_helmet_nugget", helmet, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_chestplate_nugget", chestplate, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_leggings_nugget", leggings, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); + FurnaceRecipe.make(BetterEnd.MOD_ID, name + "_boots_nugget", boots, nugget) + .checkConfig(Configs.RECIPE_CONFIG) + .setGroup("end_nugget") + .buildWithBlasting(); - // Tool parts from ingots - AnvilRecipe.create(name + "_shovel_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setOutput(shovelHead) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); - AnvilRecipe.create(name + "_pickaxe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setInputCount(3) - .setOutput(pickaxeHead) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); - AnvilRecipe.create(name + "_axe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setInputCount(3) - .setOutput(axeHead) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); - AnvilRecipe.create(name + "_hoe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setInputCount(2) - .setOutput(hoeHead) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); - AnvilRecipe.create(name + "_sword_blade") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setOutput(swordBlade) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); - AnvilRecipe.create(name + "_forged_plate") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(ingot) - .setOutput(forgedPlate) - .setAnvilLevel(level) - .setToolLevel(level) - .setDamage(level) - .build(); + // Tool parts from ingots + AnvilRecipe.create(name + "_shovel_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(shovelHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_pickaxe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(3) + .setOutput(pickaxeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_axe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(3) + .setOutput(axeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_hoe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setInputCount(2) + .setOutput(hoeHead) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_sword_blade") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(swordBlade) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); + AnvilRecipe.create(name + "_forged_plate") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(ingot) + .setOutput(forgedPlate) + .setAnvilLevel(level) + .setToolLevel(level) + .setDamage(level) + .build(); - // Tools from parts - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hammer") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(hammer) - .setBase(block) - .setAddition(Items.STICK) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_axe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(axe) - .setBase(axeHead) - .setAddition(Items.STICK) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_pickaxe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(pickaxe) - .setBase(pickaxeHead) - .setAddition(Items.STICK) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hoe") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(hoe) - .setBase(hoeHead) - .setAddition(Items.STICK) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword_handle") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(swordHandle) - .setBase(ingot) - .setAddition(Items.STICK) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(sword) - .setBase(swordBlade) - .setAddition(swordHandle) - .build(); - SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_shovel") - .checkConfig(Configs.RECIPE_CONFIG) - .setResult(shovel) - .setBase(shovelHead) - .setAddition(Items.STICK) - .build(); + // Tools from parts + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hammer") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(hammer) + .setBase(block) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_axe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(axe) + .setBase(axeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_pickaxe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(pickaxe) + .setBase(pickaxeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_hoe") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(hoe) + .setBase(hoeHead) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword_handle") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(swordHandle) + .setBase(ingot) + .setAddition(Items.STICK) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_sword") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(sword) + .setBase(swordBlade) + .setAddition(swordHandle) + .build(); + SmithingTableRecipe.create(BetterEnd.MOD_ID, name + "_shovel") + .checkConfig(Configs.RECIPE_CONFIG) + .setResult(shovel) + .setBase(shovelHead) + .setAddition(Items.STICK) + .build(); - // Armor crafting - GridRecipe.make(BetterEnd.MOD_ID, name + "_helmet", helmet) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("###", "# #") - .addMaterial('#', forgedPlate) - .setGroup("end_metal_helmets") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_chestplate", chestplate) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("# #", "###", "###") - .addMaterial('#', forgedPlate) - .setGroup("end_metal_chestplates") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_leggings", leggings) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("###", "# #", "# #") - .addMaterial('#', forgedPlate) - .setGroup("end_metal_leggings") - .build(); - GridRecipe.make(BetterEnd.MOD_ID, name + "_boots", boots) - .checkConfig(Configs.RECIPE_CONFIG) - .setShape("# #", "# #") - .addMaterial('#', forgedPlate) - .setGroup("end_metal_boots") - .build(); + // Armor crafting + GridRecipe.make(BetterEnd.MOD_ID, name + "_helmet", helmet) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_helmets") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_chestplate", chestplate) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# #", "###", "###") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_chestplates") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_leggings", leggings) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("###", "# #", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_leggings") + .build(); + GridRecipe.make(BetterEnd.MOD_ID, name + "_boots", boots) + .checkConfig(Configs.RECIPE_CONFIG) + .setShape("# #", "# #") + .addMaterial('#', forgedPlate) + .setGroup("end_metal_boots") + .build(); - TagAPI.addTag(BlockTags.ANVIL, anvilBlock); - TagAPI.addTag(BlockTags.BEACON_BASE_BLOCKS, block); - TagAPI.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); - TagAPI.addTag(TagAPI.BLOCK_DRAGON_IMMUNE, ore, bars); - TagAPI.addTag(TagAPI.ITEM_HAMMERS, hammer); - } + TagAPI.addTag(BlockTags.ANVIL, anvilBlock); + TagAPI.addTag(BlockTags.BEACON_BASE_BLOCKS, block); + TagAPI.addTag(ItemTags.BEACON_PAYMENT_ITEMS, ingot); + TagAPI.addTag(TagAPI.BLOCK_DRAGON_IMMUNE, ore, bars); + TagAPI.addTag(TagAPI.ITEM_HAMMERS, hammer); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/entity/CubozoaEntity.java b/src/main/java/ru/betterend/entity/CubozoaEntity.java index 35937fda..60a6a0f8 100644 --- a/src/main/java/ru/betterend/entity/CubozoaEntity.java +++ b/src/main/java/ru/betterend/entity/CubozoaEntity.java @@ -26,7 +26,7 @@ import net.minecraft.world.entity.player.Player; import net.minecraft.world.item.ItemStack; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/entity/EndFishEntity.java b/src/main/java/ru/betterend/entity/EndFishEntity.java index a347030e..a89adfd2 100644 --- a/src/main/java/ru/betterend/entity/EndFishEntity.java +++ b/src/main/java/ru/betterend/entity/EndFishEntity.java @@ -27,7 +27,7 @@ import net.minecraft.world.item.enchantment.Enchantments; import net.minecraft.world.level.Level; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndItems; diff --git a/src/main/java/ru/betterend/entity/EndSlimeEntity.java b/src/main/java/ru/betterend/entity/EndSlimeEntity.java index e6339e9e..f44cb34c 100644 --- a/src/main/java/ru/betterend/entity/EndSlimeEntity.java +++ b/src/main/java/ru/betterend/entity/EndSlimeEntity.java @@ -33,8 +33,8 @@ import net.minecraft.world.level.Level; import net.minecraft.world.level.LevelAccessor; import net.minecraft.world.level.ServerLevelAccessor; import net.minecraft.world.level.block.Blocks; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; diff --git a/src/main/java/ru/betterend/integration/EnderscapeIntegration.java b/src/main/java/ru/betterend/integration/EnderscapeIntegration.java index c8716469..83099d0c 100644 --- a/src/main/java/ru/betterend/integration/EnderscapeIntegration.java +++ b/src/main/java/ru/betterend/integration/EnderscapeIntegration.java @@ -4,9 +4,9 @@ import net.minecraft.core.MappedRegistry; import net.minecraft.resources.ResourceKey; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; -import ru.bclib.integration.ModIntegration; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.integration.modmenu.ModIntegration; import ru.bclib.world.features.BCLFeature; public class EnderscapeIntegration extends ModIntegration { @@ -36,7 +36,9 @@ public class EnderscapeIntegration extends ModIntegration { BiomeAPI.registerEndBiomeModification((biomeID, biome) -> { if (!biomeID.getNamespace().equals("enderscape")) { - BiomeAPI.addBiomeFeatures(biome, scatteredShadowQuartzOre, voidNebuliteOre, nebuliteOre); + BiomeAPI.addBiomeFeature(biome, scatteredShadowQuartzOre); + BiomeAPI.addBiomeFeature(biome, voidNebuliteOre); + BiomeAPI.addBiomeFeature(biome, nebuliteOre); } }); diff --git a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java index c8f45267..f2c7d178 100644 --- a/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java +++ b/src/main/java/ru/betterend/integration/FlamboyantRefabricatedIntegration.java @@ -2,7 +2,7 @@ package ru.betterend.integration; import com.google.common.collect.Maps; import net.minecraft.world.level.ItemLike; -import ru.bclib.integration.ModIntegration; +import ru.bclib.integration.modmenu.ModIntegration; import ru.bclib.util.ColorUtil; import ru.betterend.blocks.HydraluxPetalColoredBlock; import ru.betterend.complexmaterials.ColoredMaterial; diff --git a/src/main/java/ru/betterend/integration/Integrations.java b/src/main/java/ru/betterend/integration/Integrations.java index 21a7a9aa..837b8fb8 100644 --- a/src/main/java/ru/betterend/integration/Integrations.java +++ b/src/main/java/ru/betterend/integration/Integrations.java @@ -5,7 +5,7 @@ import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.Items; import ru.bclib.api.ModIntegrationAPI; -import ru.bclib.integration.ModIntegration; +import ru.bclib.integration.modmenu.ModIntegration; import ru.bclib.recipes.GridRecipe; import ru.betterend.BetterEnd; import ru.betterend.config.Configs; diff --git a/src/main/java/ru/betterend/integration/NourishIntegration.java b/src/main/java/ru/betterend/integration/NourishIntegration.java index cddd6923..4d17a020 100644 --- a/src/main/java/ru/betterend/integration/NourishIntegration.java +++ b/src/main/java/ru/betterend/integration/NourishIntegration.java @@ -3,7 +3,7 @@ package ru.betterend.integration; import net.minecraft.tags.Tag; import net.minecraft.world.item.Item; import ru.bclib.api.TagAPI; -import ru.bclib.integration.ModIntegration; +import ru.bclib.integration.modmenu.ModIntegration; import ru.betterend.registry.EndItems; public class NourishIntegration extends ModIntegration { diff --git a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java index 229e3cba..7d00ea2a 100644 --- a/src/main/java/ru/betterend/integration/byg/BYGIntegration.java +++ b/src/main/java/ru/betterend/integration/byg/BYGIntegration.java @@ -1,12 +1,7 @@ package ru.betterend.integration.byg; -import net.minecraft.world.level.block.Block; -import ru.bclib.api.TagAPI; -import ru.bclib.integration.ModIntegration; +import ru.bclib.integration.modmenu.ModIntegration; import ru.betterend.integration.EndBiomeIntegration; -import ru.betterend.integration.Integrations; -import ru.betterend.integration.byg.biomes.BYGBiomes; -import ru.betterend.integration.byg.features.BYGFeatures; public class BYGIntegration extends ModIntegration implements EndBiomeIntegration { public BYGIntegration() { @@ -15,61 +10,17 @@ public class BYGIntegration extends ModIntegration implements EndBiomeIntegratio @Override public void init() { - Block block = Integrations.BYG.getBlock("ivis_phylium"); + /*Block block = Integrations.BYG.getBlock("ivis_phylium"); if (block != null) { TagAPI.addTags(block, TagAPI.BLOCK_END_GROUND, TagAPI.BLOCK_GEN_TERRAIN); } BYGBlocks.register(); BYGFeatures.register(); - BYGBiomes.register(); + BYGBiomes.register();*/ } @Override public void addBiomes() { - BYGBiomes.addBiomes(); - - //Class biomeClass = this.getClass("corgiaoc.byg.common.world.biome.BYGEndBiome"); - //List biomes = this.getStaticFieldValue(biomeClass, "BYG_END_BIOMES"); - - /*if (biomes != null && biomeClass != null) { - biomes.forEach((obj) -> { - Biome biome = this.getAndExecuteRuntime(biomeClass, obj, "getBiome"); - if (biome != null) { - ResourceLocation biomeID = BuiltinRegistries.BIOME.getKey(biome); - BCLBiome endBiome = BiomeAPI.getBiome(biomeID); - Biome edge = this.getAndExecuteRuntime(biomeClass, obj, "getEdge"); - if (edge != null) { - ResourceLocation edgeID = BuiltinRegistries.BIOME.getKey(edge); - EndBiomes.LAND_BIOMES.removeMutableBiome(edgeID); - EndBiomes.VOID_BIOMES.removeMutableBiome(edgeID); - BCLBiome edgeBiome = BiomeAPI.getBiome(edgeID); - endBiome.setEdge(edgeBiome); - } - else { - Boolean isVoid = this.getAndExecuteRuntime(biomeClass, obj, "isVoid"); - if (isVoid != null && isVoid.booleanValue()) { - EndBiomes.LAND_BIOMES.removeMutableBiome(biomeID); - EndBiomes.VOID_BIOMES.addBiomeMutable(endBiome); - } - ShufflingList subBiomes = this.getAndExecuteRuntime( - biomeClass, - obj, - "getHills" - ); - if (subBiomes != null) { - subBiomes.stream().collect(Collectors.toList()).forEach((id) -> { - BCLBiome subBiome = BiomeAPI.getBiome(id); - EndBiomes.LAND_BIOMES.removeMutableBiome(id); - EndBiomes.VOID_BIOMES.removeMutableBiome(id); - if (!endBiome.containsSubBiome(subBiome)) { - EndBiomes.SUBBIOMES.add(subBiome); - endBiome.addSubBiome(subBiome); - } - }); - } - } - } - }); - }*/ + //BYGBiomes.addBiomes(); } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java index 013afbe9..9d01f412 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/BYGBiomes.java @@ -1,5 +1,6 @@ package ru.betterend.integration.byg.biomes; +import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.EndBiome; @@ -11,7 +12,7 @@ public class BYGBiomes { //public static final EndBiome ETHERIAL_GROVE = EndBiomes.registerSubBiomeIntegration(new EterialGrove()); public static void register() { - System.out.println("Registered " + OLD_BULBIS_GARDENS); + BetterEnd.LOGGER.info("Registered " + OLD_BULBIS_GARDENS); } public static void addBiomes() { diff --git a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java index 249b3501..c3471b12 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/NightshadeRedwoods.java @@ -2,14 +2,15 @@ package ru.betterend.integration.byg.biomes; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; import ru.bclib.BCLib; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; import ru.betterend.registry.EndFeatures; @@ -17,53 +18,67 @@ import ru.betterend.world.biome.EndBiome; import java.util.List; -public class NightshadeRedwoods extends EndBiome { +public class NightshadeRedwoods extends EndBiome.Config { public NightshadeRedwoods() { - super(makeDef()); + super("nightshade_redwoods"); } - - private static BCLBiomeDef makeDef() { + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { Biome biome = Integrations.BYG.getBiome("nightshade_forest"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - - BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("nightshade_redwoods")).setFogColor(140, 108, 47) - .setFogDensity(1.5F) - .setWaterAndFogColor(55, 70, 186) - .setFoliageColor(122, 17, 155) - .setParticles( - ParticleTypes.REVERSE_PORTAL, - 0.002F - ) - .setSurface(biome.getGenerationSettings() - .getSurfaceBuilder() - .get()) - .setGrassColor(48, 13, 89) - .setPlantsColor(200, 125, 9) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) - .addFeature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) - .addFeature(BYGFeatures.NIGHTSHADE_MOSS); - + + builder.fogColor(140, 108, 47) + .fogDensity(1.5F) + .waterAndFogColor(55, 70, 186) + .foliageColor(122, 17, 155) + .particles( + ParticleTypes.REVERSE_PORTAL, + 0.002F + ) + //TODO: 1.18 surface rules +// .setSurface(biome.getGenerationSettings() +// .getSurfaceBuilder() +// .get()) + .grassColor(48, 13, 89) + .plantsColor(200, 125, 9) + .feature(EndFeatures.END_LAKE_RARE) + .feature(BYGFeatures.NIGHTSHADE_REDWOOD_TREE) + .feature(BYGFeatures.NIGHTSHADE_MOSS_WOOD) + .feature(BYGFeatures.NIGHTSHADE_MOSS); + if (BCLib.isClient()) { - SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); - SoundEvent music = effects.getBackgroundMusic().get().getEvent(); - SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); - SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); - def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + SoundEvent loop = effects.getAmbientLoopSoundEvent() + .get(); + SoundEvent music = effects.getBackgroundMusic() + .get() + .getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings() + .get() + .getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings() + .get() + .getSoundEvent(); + builder.loop(loop) + .music(music) + .additions(additions) + .mood(mood); } - biome.getGenerationSettings().features().forEach((list) -> { - list.forEach((feature) -> { - def.addFeature(Decoration.VEGETAL_DECORATION, feature.get()); - }); - }); - + biome.getGenerationSettings() + .features() + .forEach((list) -> { + list.forEach((feature) -> { + builder.feature(Decoration.VEGETAL_DECORATION, feature.get()); + }); + }); + for (MobCategory group : MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group).unwrap(); + List list = biome.getMobSettings() + .getMobs(group) + .unwrap(); list.forEach((entry) -> { - def.addMobSpawn(entry); + builder.spawn((EntityType) entry.type, 1, entry.minCount, entry.maxCount); }); } - - return def; } } diff --git a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java index d33d0bfb..ac724454 100644 --- a/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java +++ b/src/main/java/ru/betterend/integration/byg/biomes/OldBulbisGardens.java @@ -3,19 +3,19 @@ package ru.betterend.integration.byg.biomes; import net.minecraft.core.Registry; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.data.BuiltinRegistries; -import net.minecraft.data.worldgen.Features; import net.minecraft.resources.ResourceLocation; import net.minecraft.sounds.SoundEvent; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.entity.Mob; import net.minecraft.world.entity.MobCategory; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSpecialEffects; import net.minecraft.world.level.biome.MobSpawnSettings.SpawnerData; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.placement.ConfiguredDecorator; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; import ru.bclib.BCLib; -import ru.bclib.world.biomes.BCLBiomeDef; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.BetterEnd; import ru.betterend.integration.Integrations; import ru.betterend.integration.byg.features.BYGFeatures; @@ -25,83 +25,93 @@ import ru.betterend.world.biome.EndBiome; import java.util.List; import java.util.function.Supplier; -class FeaturesAccesor extends Features { - static ConfiguredDecorator shadowHEIGHTMAP_SQUARE; - - static { - shadowHEIGHTMAP_SQUARE = Decorators.HEIGHTMAP_SQUARE; - } -} -public class OldBulbisGardens extends EndBiome { +public class OldBulbisGardens extends EndBiome.Config { public OldBulbisGardens() { - super(makeDef()); + super("old_bulbis_gardens"); } - - private static BCLBiomeDef makeDef() { + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { Biome biome = Integrations.BYG.getBiome("bulbis_gardens"); BiomeSpecialEffects effects = biome.getSpecialEffects(); - + Block ivis = Integrations.BYG.getBlock("ivis_phylium"); - Block origin = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial().getBlock(); - BCLBiomeDef def = new BCLBiomeDef(BetterEnd.makeID("old_bulbis_gardens")).setFogColor(215, 132, 207) - .setFogDensity(1.8F) - .setWaterAndFogColor(40, 0, 56) - .setFoliageColor(122, 17, 155) - .setParticles( - ParticleTypes.REVERSE_PORTAL, - 0.002F - ) - .setSurface(ivis, origin) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(BYGFeatures.OLD_BULBIS_TREE); - +// Block origin = biome.getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial() +// .getBlock(); + builder.fogColor(215, 132, 207) + .fogDensity(1.8F) + .waterAndFogColor(40, 0, 56) + .foliageColor(122, 17, 155) + .particles( + ParticleTypes.REVERSE_PORTAL, + 0.002F + ) + //TODO: 1.18 surface rules + //.surface(ivis, origin) + .feature(EndFeatures.END_LAKE_RARE) + .feature(BYGFeatures.OLD_BULBIS_TREE); + if (BCLib.isClient()) { - SoundEvent loop = effects.getAmbientLoopSoundEvent().get(); - SoundEvent music = effects.getBackgroundMusic().get().getEvent(); - SoundEvent additions = effects.getAmbientAdditionsSettings().get().getSoundEvent(); - SoundEvent mood = effects.getAmbientMoodSettings().get().getSoundEvent(); - def.setLoop(loop).setMusic(music).setAdditions(additions).setMood(mood); + SoundEvent loop = effects.getAmbientLoopSoundEvent() + .get(); + SoundEvent music = effects.getBackgroundMusic() + .get() + .getEvent(); + SoundEvent additions = effects.getAmbientAdditionsSettings() + .get() + .getSoundEvent(); + SoundEvent mood = effects.getAmbientMoodSettings() + .get() + .getSoundEvent(); + builder.loop(loop) + .music(music) + .additions(additions) + .mood(mood); } - + for (MobCategory group : MobCategory.values()) { - List list = biome.getMobSettings().getMobs(group).unwrap(); + List list = biome.getMobSettings() + .getMobs(group) + .unwrap(); list.forEach((entry) -> { - def.addMobSpawn(entry); + builder.spawn((EntityType) entry.type, 1, entry.minCount, entry.maxCount); }); } - - List>>> features = biome.getGenerationSettings().features(); - List>> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); + + List>> features = biome.getGenerationSettings() + .features(); + List> vegetal = features.get(Decoration.VEGETAL_DECORATION.ordinal()); if (vegetal.size() > 2) { - Supplier> getter; + Supplier getter; // Trees (first two features) // I couldn't process them with conditions, so that's why they are hardcoded (paulevs) for (int i = 0; i < 2; i++) { getter = vegetal.get(i); - ConfiguredFeature feature = getter.get(); + PlacedFeature feature = getter.get(); ResourceLocation id = BetterEnd.makeID("obg_feature_" + i); feature = Registry.register( - BuiltinRegistries.CONFIGURED_FEATURE, - id, - feature.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1) + BuiltinRegistries.PLACED_FEATURE, + id, + //TODO: 1.18 Check if this is correct + feature//.decorated(FeaturesAccesor.shadowHEIGHTMAP_SQUARE).countRandom(1) ); - def.addFeature(Decoration.VEGETAL_DECORATION, feature); + builder.feature(Decoration.VEGETAL_DECORATION, feature); } // Grasses and other features for (int i = 2; i < vegetal.size(); i++) { getter = vegetal.get(i); - ConfiguredFeature feature = getter.get(); - def.addFeature(Decoration.VEGETAL_DECORATION, feature); + PlacedFeature feature = getter.get(); + builder.feature(Decoration.VEGETAL_DECORATION, feature); } } - - def.addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(BYGFeatures.IVIS_MOSS_WOOD) - .addFeature(BYGFeatures.IVIS_MOSS) - .addFeature(BYGFeatures.IVIS_VINE) - .addFeature(BYGFeatures.IVIS_SPROUT); - - return def; + + builder.feature(EndFeatures.PURPLE_POLYPORE) + .feature(BYGFeatures.IVIS_MOSS_WOOD) + .feature(BYGFeatures.IVIS_MOSS) + .feature(BYGFeatures.IVIS_VINE) + .feature(BYGFeatures.IVIS_SPROUT); } } diff --git a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java index 14d2a1e7..9b9abaec 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAlloyingCategory.java @@ -7,7 +7,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -20,7 +20,7 @@ import ru.betterend.registry.EndBlocks; import java.text.DecimalFormat; import java.util.List; -public class REIAlloyingCategory implements TransferDisplayCategory { +public class REIAlloyingCategory implements DisplayCategory { private final EntryStack ICON; REIAlloyingCategory(EntryStack icon) { @@ -81,8 +81,9 @@ public class REIAlloyingCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAlloyingDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); diff --git a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java index 2347d512..ef1220e1 100644 --- a/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIAnvilCategory.java @@ -7,7 +7,7 @@ import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -25,7 +25,7 @@ import java.util.Arrays; import java.util.List; import java.util.stream.Collectors; -public class REIAnvilCategory implements TransferDisplayCategory { +public class REIAnvilCategory implements DisplayCategory { private final EntryStack[] ANVILS; REIAnvilCategory(EntryStack[] anvils) { @@ -85,8 +85,9 @@ public class REIAnvilCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIAnvilDisplay display, IntList redSlots) { Point startPoint = new Point(bounds.getCenterX() - 41, bounds.getCenterY() - 27); matrices.pushPose(); diff --git a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java index 06a456a0..0be2955a 100644 --- a/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java +++ b/src/main/java/ru/betterend/integration/rei/REIInfusionCategory.java @@ -1,13 +1,11 @@ package ru.betterend.integration.rei; import com.google.common.collect.Lists; -import com.mojang.blaze3d.vertex.PoseStack; -import it.unimi.dsi.fastutil.ints.IntList; import me.shedaniel.math.Point; import me.shedaniel.math.Rectangle; import me.shedaniel.rei.api.client.gui.widgets.Widget; import me.shedaniel.rei.api.client.gui.widgets.Widgets; -import me.shedaniel.rei.api.client.registry.display.TransferDisplayCategory; +import me.shedaniel.rei.api.client.registry.display.DisplayCategory; import me.shedaniel.rei.api.common.category.CategoryIdentifier; import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; @@ -21,7 +19,7 @@ import ru.betterend.registry.EndBlocks; import java.util.ArrayList; import java.util.List; -public class REIInfusionCategory implements TransferDisplayCategory { +public class REIInfusionCategory implements DisplayCategory { private final static ResourceLocation BACKGROUND = BetterEnd.makeID("textures/gui/rei_infusion.png"); private final EntryStack ICON; @@ -109,7 +107,4 @@ public class REIInfusionCategory implements TransferDisplayCategory widgets, Rectangle bounds, REIInfusionDisplay display, IntList redSlots) {} } diff --git a/src/main/java/ru/betterend/integration/rei/REIPlugin.java b/src/main/java/ru/betterend/integration/rei/REIPlugin.java index fac1bd48..3371c605 100644 --- a/src/main/java/ru/betterend/integration/rei/REIPlugin.java +++ b/src/main/java/ru/betterend/integration/rei/REIPlugin.java @@ -5,12 +5,10 @@ import me.shedaniel.rei.api.client.plugins.REIClientPlugin; import me.shedaniel.rei.api.client.registry.category.CategoryRegistry; import me.shedaniel.rei.api.client.registry.display.DisplayRegistry; import me.shedaniel.rei.api.common.category.CategoryIdentifier; -import me.shedaniel.rei.api.common.entry.EntryIngredient; import me.shedaniel.rei.api.common.entry.EntryStack; import me.shedaniel.rei.api.common.util.EntryIngredients; import me.shedaniel.rei.api.common.util.EntryStacks; import me.shedaniel.rei.plugin.common.DefaultPlugin; -import net.fabricmc.fabric.impl.content.registry.FuelRegistryImpl; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.crafting.BlastingRecipe; @@ -24,7 +22,6 @@ import ru.betterend.recipe.builders.AlloyingRecipe; import ru.betterend.recipe.builders.InfusionRecipe; import ru.betterend.registry.EndBlocks; -import java.util.Collections; import java.util.List; import java.util.stream.Collectors; @@ -54,13 +51,14 @@ public class REIPlugin implements REIClientPlugin { registry.registerRecipeFiller(BlastingRecipe.class, RecipeType.BLASTING, REIBlastingDisplay::new); registry.registerRecipeFiller(AnvilRecipe.class, AnvilRecipe.TYPE, REIAnvilDisplay::new); registry.registerRecipeFiller(InfusionRecipe.class, InfusionRecipe.TYPE, REIInfusionDisplay::new); - - FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { - if (time >= 2000) { - final List list = Collections.singletonList(EntryIngredients.of(item)); - registry.add(new REIAlloyingFuelDisplay(list, time)); - } - }); + + //TODO: 1.18 REI fix this +// FuelRegistryImpl.INSTANCE.getFuelTimes().forEach((item, time) -> { +// if (time >= 2000) { +// final List list = Collections.singletonList(EntryIngredients.of(item)); +// registry.add(new REIAlloyingFuelDisplay(list, time)); +// } +// }); } @Override diff --git a/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java b/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java new file mode 100644 index 00000000..2813474b --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/StructureFeaturesAccessor.java @@ -0,0 +1,9 @@ +package ru.betterend.interfaces; + +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; + +public interface StructureFeaturesAccessor { + ConfiguredStructureFeature> getEND_CITY(); +} diff --git a/src/main/java/ru/betterend/interfaces/TargetChecker.java b/src/main/java/ru/betterend/interfaces/TargetChecker.java new file mode 100644 index 00000000..fde54ed2 --- /dev/null +++ b/src/main/java/ru/betterend/interfaces/TargetChecker.java @@ -0,0 +1,5 @@ +package ru.betterend.interfaces; + +public interface TargetChecker { + boolean isTarget(); +} diff --git a/src/main/java/ru/betterend/item/GuideBookItem.java b/src/main/java/ru/betterend/item/GuideBookItem.java index 39e69ed5..91971e54 100644 --- a/src/main/java/ru/betterend/item/GuideBookItem.java +++ b/src/main/java/ru/betterend/item/GuideBookItem.java @@ -15,7 +15,6 @@ import ru.bclib.items.ModelProviderItem; import ru.betterend.BetterEnd; import ru.betterend.registry.EndItems; import ru.betterend.util.LangUtil; -import vazkii.patchouli.api.PatchouliAPI; import java.util.List; @@ -33,7 +32,8 @@ public class GuideBookItem extends ModelProviderItem { @Override public InteractionResultHolder use(Level world, Player user, InteractionHand hand) { if (!world.isClientSide && user instanceof ServerPlayer) { - PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); + //TODO: reanable Patchouli once it is available for 1.18 + //PatchouliAPI.get().openBookGUI((ServerPlayer) user, BOOK_ID); return InteractionResultHolder.success(user.getItemInHand(hand)); } return InteractionResultHolder.consume(user.getItemInHand(hand)); diff --git a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java index 5a53ce31..b3a31546 100644 --- a/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java +++ b/src/main/java/ru/betterend/mixin/client/MusicTrackerMixin.java @@ -12,7 +12,7 @@ import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.client.ClientOptions; import ru.betterend.world.biome.EndBiome; @@ -90,9 +90,10 @@ public abstract class MusicTrackerMixin { } private boolean be_shouldChangeSound(Music musicSound) { - return currentMusic != null && !musicSound.getEvent() - .getLocation() - .equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); + return currentMusic != null && !musicSound + .getEvent() + .getLocation() + .equals(this.currentMusic.getLocation()) && musicSound.replaceCurrentMusic(); } private boolean be_checkNullSound(Music musicSound) { diff --git a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java b/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java deleted file mode 100644 index 5ece436d..00000000 --- a/src/main/java/ru/betterend/mixin/common/BiomeGenerationSettingsAccessor.java +++ /dev/null @@ -1,30 +0,0 @@ -package ru.betterend.mixin.common; - -import net.minecraft.world.level.biome.BiomeGenerationSettings; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.gen.Accessor; - -import java.util.List; -import java.util.function.Supplier; - -@Deprecated(forRemoval = true) -@Mixin(BiomeGenerationSettings.class) -public interface BiomeGenerationSettingsAccessor { - @Accessor("features") - @Deprecated(forRemoval = true) - List>>> be_getFeatures(); - - @Accessor("features") - @Deprecated(forRemoval = true) - void be_setFeatures(List>>> features); - - @Accessor("structureStarts") - @Deprecated(forRemoval = true) - List>> be_getStructures(); - - @Accessor("structureStarts") - @Deprecated(forRemoval = true) - void be_setStructures(List>> structures); -} diff --git a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java index 6ec5f02f..e7581297 100644 --- a/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndCityFeatureMixin.java @@ -2,12 +2,13 @@ package ru.betterend.mixin.common; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.WorldgenRandom; +import net.minecraft.world.level.levelgen.XoroshiroRandomSource; import net.minecraft.world.level.levelgen.feature.EndCityFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; import org.spongepowered.asm.mixin.injection.At; @@ -15,22 +16,28 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Optional; +import java.util.Random; + @Mixin(EndCityFeature.class) public class EndCityFeatureMixin { - @Inject(method = "isFeatureChunk", at = @At("HEAD"), cancellable = true) - private void be_isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long l, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration defaultFeatureConfig, LevelHeightAccessor levelHeightAccessor, CallbackInfoReturnable info) { + @Inject(method = "pieceGeneratorSupplier", at = @At("HEAD"), cancellable = true) + private static void be_isFeatureChunk(PieceGeneratorSupplier.Context context, CallbackInfoReturnable>> info) { + final ChunkPos pos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + Random chunkRandom = new WorldgenRandom(new XoroshiroRandomSource(pos.x, pos.z)); + if (GeneratorOptions.useNewGenerator()) { int chance = GeneratorOptions.getEndCityFailChance(); - if (chance == 0) { - info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); - info.cancel(); - } - else if (chunkRandom.nextInt(chance) == 0) { - info.setReturnValue(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60); - info.cancel(); + if (chance == 0 || chunkRandom.nextInt(chance) == 0) { + if (!(getYPositionForFeature(pos, chunkGenerator, levelHeightAccessor) >= 60)){ + info.cancel(); + info.setReturnValue(Optional.empty()); + } } else { - info.setReturnValue(false); + info.setReturnValue(Optional.empty()); info.cancel(); } } diff --git a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java index 69720262..5dbf4f2b 100644 --- a/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EndPodiumFeatureMixin.java @@ -23,6 +23,7 @@ import ru.bclib.util.StructureHelper; import ru.betterend.BetterEnd; import ru.betterend.world.generator.GeneratorOptions; +import java.util.Optional; import java.util.Random; @Mixin(EndPodiumFeature.class) @@ -56,7 +57,8 @@ public class EndPodiumFeatureMixin { private FeaturePlaceContext be_setPosOnGround(FeaturePlaceContext featurePlaceContext) { WorldGenLevel world = featurePlaceContext.level(); BlockPos pos = be_updatePortalPos(world); - return new FeaturePlaceContext<>( + return new FeaturePlaceContext( + Optional.empty(), world, featurePlaceContext.chunkGenerator(), featurePlaceContext.random(), diff --git a/src/main/java/ru/betterend/mixin/common/EntityMixin.java b/src/main/java/ru/betterend/mixin/common/EntityMixin.java index 20d4e1ee..31b3876f 100644 --- a/src/main/java/ru/betterend/mixin/common/EntityMixin.java +++ b/src/main/java/ru/betterend/mixin/common/EntityMixin.java @@ -66,8 +66,6 @@ public abstract class EntityMixin implements TeleportingEntity { entity.getXRot() ); entity.setDeltaMovement(teleportTarget.speed); - //TODO: check if this works as intended in 1.17 - destination.addDuringTeleport(entity); } diff --git a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java deleted file mode 100644 index aa8b7619..00000000 --- a/src/main/java/ru/betterend/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ /dev/null @@ -1,41 +0,0 @@ -package ru.betterend.mixin.common; - -import net.minecraft.world.level.biome.BiomeSource; -import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator; -import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; -import net.minecraft.world.level.levelgen.StructureSettings; -import org.spongepowered.asm.mixin.Final; -import org.spongepowered.asm.mixin.Mixin; -import org.spongepowered.asm.mixin.Shadow; -import org.spongepowered.asm.mixin.injection.At; -import org.spongepowered.asm.mixin.injection.Inject; -import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; -import ru.betterend.world.generator.GeneratorOptions; -import ru.betterend.world.generator.TerrainGenerator; - -import java.util.function.Supplier; - -@Mixin(NoiseBasedChunkGenerator.class) -public abstract class NoiseBasedChunkGeneratorMixin extends ChunkGenerator { - @Final - @Shadow - protected Supplier settings; - - public NoiseBasedChunkGeneratorMixin(BiomeSource populationSource, BiomeSource biomeSource, StructureSettings structuresConfig, long worldSeed) { - super(populationSource, biomeSource, structuresConfig, worldSeed); - } - - @Inject(method = "(Lnet/minecraft/world/level/biome/BiomeSource;Lnet/minecraft/world/level/biome/BiomeSource;JLjava/util/function/Supplier;)V", at = @At("TAIL")) - private void beOnInit(BiomeSource populationSource, BiomeSource biomeSource, long seed, Supplier settings, CallbackInfo info) { - TerrainGenerator.initNoise(seed); - } - - @Inject(method = "fillNoiseColumn([DIIII)V", at = @At("HEAD"), cancellable = true, allow = 2) - private void be_fillNoiseColumn(double[] buffer, int x, int z, int k, int l, CallbackInfo info) { - if (GeneratorOptions.useNewGenerator() && settings.get().stable(NoiseGeneratorSettings.END)) { - TerrainGenerator.fillTerrainDensity(buffer, x, z, getBiomeSource()); - info.cancel(); - } - } -} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java new file mode 100644 index 00000000..718caa54 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkAccessor.java @@ -0,0 +1,24 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseSettings; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Accessor; + +@Mixin(NoiseChunk.class) +public interface NoiseChunkAccessor { + @Accessor("noiseSettings") + NoiseSettings bnv_getNoiseSettings(); + + @Accessor("cellCountXZ") + int bnv_getCellCountXZ(); + + @Accessor("cellCountY") + int bnv_getCellCountY(); + + @Accessor("firstCellZ") + int bnv_getFirstCellZ(); + + @Accessor("cellNoiseMinY") + int bnv_getCellNoiseMinY(); +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java new file mode 100644 index 00000000..5154eaf1 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseChunkMixin.java @@ -0,0 +1,28 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.Aquifer; +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseChunk.NoiseFiller; +import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; +import net.minecraft.world.level.levelgen.NoiseSampler; +import net.minecraft.world.level.levelgen.blending.Blender; +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.CallbackInfo; +import ru.betterend.interfaces.TargetChecker; + +@Mixin(NoiseChunk.class) +public class NoiseChunkMixin implements TargetChecker { + private boolean be_isEndGenerator; + + @Inject(method = "*", at = @At("TAIL")) + private void be_onNoiseChunkInit(int i, int j, int k, NoiseSampler noiseSampler, int l, int m, NoiseFiller noiseFiller, NoiseGeneratorSettings noiseGeneratorSettings, Aquifer.FluidPicker fluidPicker, Blender blender, CallbackInfo info) { + be_isEndGenerator = noiseGeneratorSettings.stable(NoiseGeneratorSettings.END); + } + + @Override + public boolean isTarget() { + return be_isEndGenerator; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java new file mode 100644 index 00000000..14dcdfe5 --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/NoiseInterpolatorMixin.java @@ -0,0 +1,45 @@ +package ru.betterend.mixin.common; + +import net.minecraft.world.level.levelgen.NoiseChunk; +import net.minecraft.world.level.levelgen.NoiseSettings; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; +import ru.betterend.interfaces.TargetChecker; +import ru.betterend.world.generator.TerrainGenerator; + +@Mixin(NoiseChunk.NoiseInterpolator.class) +public class NoiseInterpolatorMixin { + @Final + @Shadow(aliases = "this$0") + private NoiseChunk this$0; + + @Inject(method = "fillSlice", at = @At("HEAD"), cancellable = true) + private void be_fillSlice(double[][] data, int x, CallbackInfo info) { + if (!TargetChecker.class.cast(this$0).isTarget()) { + return; + } + + info.cancel(); + + NoiseChunkAccessor accessor = NoiseChunkAccessor.class.cast(this$0); + NoiseSettings noiseSettings = accessor.bnv_getNoiseSettings(); + + final int sizeY = noiseSettings.getCellHeight(); + final int sizeXZ = noiseSettings.getCellWidth(); + //final int cellsY = accessor.bnv_getCellCountY() + 1; + final int cellsXZ = accessor.bnv_getCellCountXZ() + 1; + final int firstCellZ = accessor.bnv_getFirstCellZ(); + //final int cellNoiseMinY = accessor.bnv_getCellNoiseMinY(); + + x *= sizeXZ; + + for (int cellXZ = 0; cellXZ < cellsXZ; ++cellXZ) { + int z = (firstCellZ + cellXZ) * sizeXZ; + TerrainGenerator.fillTerrainDensity(data[cellXZ], x, z, sizeXZ, sizeY); + } + } +} diff --git a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java index ecf0c116..4cb230da 100644 --- a/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java +++ b/src/main/java/ru/betterend/mixin/common/ServerLevelMixin.java @@ -1,7 +1,6 @@ package ru.betterend.mixin.common; import net.minecraft.core.BlockPos; -import net.minecraft.core.Registry; import net.minecraft.resources.ResourceKey; import net.minecraft.resources.ResourceLocation; import net.minecraft.server.MinecraftServer; @@ -14,7 +13,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.dimension.DimensionType; -import net.minecraft.world.level.storage.LevelStorageSource; +import net.minecraft.world.level.storage.LevelStorageSource.LevelStorageAccess; import net.minecraft.world.level.storage.ServerLevelData; import net.minecraft.world.level.storage.WritableLevelData; import org.spongepowered.asm.mixin.Mixin; @@ -23,11 +22,11 @@ import org.spongepowered.asm.mixin.injection.Inject; import org.spongepowered.asm.mixin.injection.ModifyArg; import org.spongepowered.asm.mixin.injection.callback.CallbackInfo; import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.betterend.BetterEnd; -import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndBlocks; import ru.betterend.world.generator.GeneratorOptions; +import ru.betterend.world.generator.TerrainGenerator; import java.util.List; import java.util.concurrent.Executor; @@ -35,21 +34,29 @@ import java.util.function.Supplier; @Mixin(ServerLevel.class) public abstract class ServerLevelMixin extends Level { - private static String be_lastWorld = null; + //private static String be_lastWorld = null; protected ServerLevelMixin(WritableLevelData writableLevelData, ResourceKey resourceKey, DimensionType dimensionType, Supplier supplier, boolean bl, boolean bl2, long l) { super(writableLevelData, resourceKey, dimensionType, supplier, bl, bl2, l); } +// @Inject(method = "*", at = @At("TAIL")) +// private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { +// if (be_lastWorld != null && be_lastWorld.equals(session.getLevelId())) { +// return; +// } +// +// be_lastWorld = session.getLevelId(); +// //ServerLevel world = ServerLevel.class.cast(this); +// //EndBiomes.onWorldLoad(world.getSeed(), world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY)); +// } + @Inject(method = "*", at = @At("TAIL")) - private void be_onServerWorldInit(MinecraftServer server, Executor workerExecutor, LevelStorageSource.LevelStorageAccess session, ServerLevelData properties, ResourceKey registryKey, DimensionType dimensionType, ChunkProgressListener worldGenerationProgressListener, ChunkGenerator chunkGenerator, boolean debugWorld, long l, List list, boolean bl, CallbackInfo info) { - if (be_lastWorld != null && be_lastWorld.equals(session.getLevelId())) { - return; + private void be_onServerWorldInit(MinecraftServer minecraftServer, Executor executor, LevelStorageAccess levelStorageAccess, ServerLevelData serverLevelData, ResourceKey resourceKey, DimensionType dimensionType, ChunkProgressListener chunkProgressListener, ChunkGenerator chunkGenerator, boolean bl, long seed, List list, boolean bl2, CallbackInfo ci) { + ServerLevel level = ServerLevel.class.cast(this); + if (level.dimension() == Level.END) { + TerrainGenerator.initNoise(seed, chunkGenerator.getBiomeSource(), chunkGenerator.climateSampler()); } - - be_lastWorld = session.getLevelId(); - ServerLevel world = ServerLevel.class.cast(this); - EndBiomes.onWorldLoad(world.getSeed(), world.registryAccess().registryOrThrow(Registry.BIOME_REGISTRY)); } @Inject(method = "getSharedSpawnPos", at = @At("HEAD"), cancellable = true) diff --git a/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java b/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java new file mode 100644 index 00000000..c3126b2d --- /dev/null +++ b/src/main/java/ru/betterend/mixin/common/StructureFeaturesMixin.java @@ -0,0 +1,19 @@ +package ru.betterend.mixin.common; + +import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; +import net.minecraft.world.level.levelgen.feature.StructureFeature; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import org.spongepowered.asm.mixin.Final; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Shadow; +import ru.betterend.interfaces.StructureFeaturesAccessor; + +@Mixin(StructureFeatures.class) +public class StructureFeaturesMixin implements StructureFeaturesAccessor { + @Shadow @Final private static ConfiguredStructureFeature> END_CITY; + + public ConfiguredStructureFeature> getEND_CITY(){ + return END_CITY; + } +} diff --git a/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java index cbd755db..fb9c0cf3 100644 --- a/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java +++ b/src/main/java/ru/betterend/mixin/common/WorldGenRegionMixin.java @@ -3,6 +3,7 @@ package ru.betterend.mixin.common; import net.minecraft.core.BlockPos; import net.minecraft.server.level.WorldGenRegion; import net.minecraft.world.level.ChunkPos; +import net.minecraft.world.level.chunk.ChunkAccess; import org.spongepowered.asm.mixin.Final; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.Shadow; @@ -14,13 +15,14 @@ import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; public class WorldGenRegionMixin { @Final @Shadow - private ChunkPos center; + private ChunkAccess center; @Inject(method = "ensureCanWrite", at = @At("HEAD"), cancellable = true) private void be_alterBlockCheck(BlockPos blockPos, CallbackInfoReturnable info) { + ChunkPos cPos = center.getPos(); int x = blockPos.getX() >> 4; int z = blockPos.getZ() >> 4; WorldGenRegion region = (WorldGenRegion) (Object) this; - info.setReturnValue(Math.abs(x - center.x) < 2 && Math.abs(z - center.z) < 2); + info.setReturnValue(Math.abs(x - cPos.x) < 2 && Math.abs(z - cPos.z) < 2); } } diff --git a/src/main/java/ru/betterend/recipe/AnvilRecipes.java b/src/main/java/ru/betterend/recipe/AnvilRecipes.java index dde61edb..55bc83d4 100644 --- a/src/main/java/ru/betterend/recipe/AnvilRecipes.java +++ b/src/main/java/ru/betterend/recipe/AnvilRecipes.java @@ -7,78 +7,78 @@ import ru.betterend.item.material.EndToolMaterial; import ru.betterend.registry.EndItems; public class AnvilRecipes { - public static void register() { - AnvilRecipe.create("ender_pearl_to_dust") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(Items.ENDER_PEARL) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(4) - .setDamage(5) - .build(); - AnvilRecipe.create("ender_shard_to_dust") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.ENDER_SHARD) - .setOutput(EndItems.ENDER_DUST) - .setToolLevel(0) - .setDamage(3) - .build(); + public static void register() { + AnvilRecipe.create("ender_pearl_to_dust") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(Items.ENDER_PEARL) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(4) + .setDamage(5) + .build(); + AnvilRecipe.create("ender_shard_to_dust") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.ENDER_SHARD) + .setOutput(EndItems.ENDER_DUST) + .setToolLevel(0) + .setDamage(3) + .build(); - int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); - AnvilRecipe.create("aeternium_axe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_AXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_pickaxe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_shovel_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_hoe_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HOE_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_hammer_head") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) - .setAnvilLevel(anvilLevel) - .setToolLevel(EndToolMaterial.THALLASIUM.getLevel()) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_sword_blade") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_SWORD_BLADE) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - AnvilRecipe.create("aeternium_forged_plate") - .checkConfig(Configs.RECIPE_CONFIG) - .setInput(EndItems.AETERNIUM_INGOT) - .setOutput(EndItems.AETERNIUM_FORGED_PLATE) - .setAnvilLevel(anvilLevel) - .setToolLevel(anvilLevel) - .setDamage(6) - .build(); - } + int anvilLevel = EndToolMaterial.AETERNIUM.getLevel(); + AnvilRecipe.create("aeternium_axe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_AXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_pickaxe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_PICKAXE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_shovel_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SHOVEL_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_hoe_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HOE_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_hammer_head") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_HAMMER_HEAD) + .setAnvilLevel(anvilLevel) + .setToolLevel(EndToolMaterial.THALLASIUM.getLevel()) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_sword_blade") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_SWORD_BLADE) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + AnvilRecipe.create("aeternium_forged_plate") + .checkConfig(Configs.RECIPE_CONFIG) + .setInput(EndItems.AETERNIUM_INGOT) + .setOutput(EndItems.AETERNIUM_FORGED_PLATE) + .setAnvilLevel(anvilLevel) + .setToolLevel(anvilLevel) + .setDamage(6) + .build(); + } } diff --git a/src/main/java/ru/betterend/registry/EndBiomes.java b/src/main/java/ru/betterend/registry/EndBiomes.java index 455098c3..75823c17 100644 --- a/src/main/java/ru/betterend/registry/EndBiomes.java +++ b/src/main/java/ru/betterend/registry/EndBiomes.java @@ -2,13 +2,14 @@ package ru.betterend.registry; import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; +import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.biome.Biome; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.LifeCycleAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.generator.BiomeMap; import ru.bclib.world.generator.BiomePicker; +import ru.bclib.world.generator.map.hex.HexBiomeMap; import ru.betterend.config.Configs; -import ru.betterend.util.FeaturesHelper; import ru.betterend.world.biome.EndBiome; import ru.betterend.world.biome.air.BiomeIceStarfield; import ru.betterend.world.biome.cave.EmptyAuroraCaveBiome; @@ -41,7 +42,8 @@ import ru.betterend.world.generator.GeneratorOptions; public class EndBiomes { public static final BiomePicker CAVE_BIOMES = new BiomePicker(); - private static BiomeMap caveBiomeMap; + private static HexBiomeMap caveBiomeMap; + private static long lastSeed; // Better End Land public static final EndBiome FOGGY_MUSHROOMLAND = registerBiome(new FoggyMushroomlandBiome(), BiomeType.LAND); @@ -74,25 +76,29 @@ public class EndBiomes { public static final EndCaveBiome LUSH_AURORA_CAVE = registerCaveBiome(new LushAuroraCaveBiome()); public static final EndCaveBiome JADE_CAVE = registerCaveBiome(new JadeCaveBiome()); - public static void register() {} + public static void register() { + LifeCycleAPI.onLevelLoad(EndBiomes::onWorldLoad); + } - public static void onWorldLoad(long seed, Registry registry) { + private static void onWorldLoad(ServerLevel level, long seed, Registry registry) { CAVE_BIOMES.getBiomes().forEach(biome -> biome.updateActualBiomes(registry)); CAVE_BIOMES.rebuild(); - if (caveBiomeMap == null || caveBiomeMap.getSeed() != seed) { - caveBiomeMap = new BiomeMap(seed, GeneratorOptions.getBiomeSizeCaves(), CAVE_BIOMES); + if (caveBiomeMap == null || lastSeed != seed) { + caveBiomeMap = new HexBiomeMap(seed, GeneratorOptions.getBiomeSizeCaves(), CAVE_BIOMES); + lastSeed = seed; } - FeaturesHelper.addFeatures(registry); } /** * Put existing {@link EndBiome} as a sub-biome into selected parent. * - * @param biome - {@link EndBiome} instance + * @param biomeConfig - {@link EndBiome.Config} instance * @param parent - {@link EndBiome} to be linked with * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiome(EndBiome biome, EndBiome parent) { + public static EndBiome registerSubBiome(EndBiome.Config biomeConfig, EndBiome parent) { + final EndBiome biome = EndBiome.create(biomeConfig); + if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerSubBiome(parent, biome); } @@ -102,11 +108,12 @@ public class EndBiomes { /** * Registers {@link EndBiome} and adds it into worldgen. * - * @param biome - {@link EndBiome} instance + * @param biomeConfig - {@link EndBiome.Config} instance * @param type - {@link BiomeType} * @return registered {@link EndBiome} */ - public static EndBiome registerBiome(EndBiome biome, BiomeType type) { + public static EndBiome registerBiome(EndBiome.Config biomeConfig, BiomeType type) { + final EndBiome biome = EndBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { if (type == BiomeType.LAND) { BiomeAPI.registerEndLandBiome(biome); @@ -121,10 +128,11 @@ public class EndBiomes { /** * Put integration sub-biome {@link EndBiome} into subbiomes list and registers it. * - * @param biome - {@link EndBiome} instance + * @param biomeConfig - {@link EndBiome.Config} instance * @return registered {@link EndBiome} */ - public static EndBiome registerSubBiomeIntegration(EndBiome biome) { + public static EndBiome registerSubBiomeIntegration(EndBiome.Config biomeConfig) { + EndBiome biome = EndBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); } @@ -146,7 +154,8 @@ public class EndBiomes { } } - public static EndCaveBiome registerCaveBiome(EndCaveBiome biome) { + public static EndCaveBiome registerCaveBiome(EndCaveBiome.Config biomeConfig) { + final EndCaveBiome biome = EndCaveBiome.create(biomeConfig); if (Configs.BIOME_CONFIG.getBoolean(biome.getID(), "enabled", true)) { BiomeAPI.registerBiome(biome); CAVE_BIOMES.addBiome(biome); @@ -155,6 +164,6 @@ public class EndBiomes { } public static EndCaveBiome getCaveBiome(int x, int z) { - return (EndCaveBiome) caveBiomeMap.getBiome(x, z); + return (EndCaveBiome) caveBiomeMap.getBiome(x, 5, z); } } diff --git a/src/main/java/ru/betterend/registry/EndBlocks.java b/src/main/java/ru/betterend/registry/EndBlocks.java index 4e9884cd..41f7c536 100644 --- a/src/main/java/ru/betterend/registry/EndBlocks.java +++ b/src/main/java/ru/betterend/registry/EndBlocks.java @@ -429,8 +429,8 @@ public class EndBlocks { public static final Block SILK_MOTH_HIVE = registerBlock("silk_moth_hive", new SilkMothHiveBlock()); // Ores // - public static final Block ENDER_ORE = registerBlock("ender_ore", new BaseOreBlock(EndItems.ENDER_SHARD, 1, 3, 5)); - public static final Block AMBER_ORE = registerBlock("amber_ore", new BaseOreBlock(EndItems.RAW_AMBER, 1, 2, 4)); + public static final Block ENDER_ORE = registerBlock("ender_ore", new BaseOreBlock(()->EndItems.ENDER_SHARD, 1, 3, 5)); + public static final Block AMBER_ORE = registerBlock("amber_ore", new BaseOreBlock(()->EndItems.RAW_AMBER, 1, 2, 4)); // Materials // public static final MetalMaterial THALLASIUM = MetalMaterial.makeNormal( diff --git a/src/main/java/ru/betterend/registry/EndFeatures.java b/src/main/java/ru/betterend/registry/EndFeatures.java index e1aff6ad..50f1d2eb 100644 --- a/src/main/java/ru/betterend/registry/EndFeatures.java +++ b/src/main/java/ru/betterend/registry/EndFeatures.java @@ -1,21 +1,20 @@ package ru.betterend.registry; -import com.google.common.collect.Lists; import net.minecraft.resources.ResourceLocation; 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.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.CountConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.FeatureConfiguration; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.placement.FeatureDecorator; -import ru.bclib.api.BiomeAPI; +import net.minecraft.world.level.levelgen.placement.CountPlacement; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; +import net.minecraft.world.level.levelgen.placement.PlacementModifier; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.features.BCLFeature; import ru.bclib.world.features.DefaultFeature; import ru.betterend.BetterEnd; @@ -81,11 +80,6 @@ import ru.betterend.world.features.trees.MossyGlowshroomFeature; 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; public class EndFeatures { // Trees // @@ -223,7 +217,8 @@ public class EndFeatures { "umbralith_arch", new ArchFeature( EndBlocks.UMBRALITH.stone, - UmbraSurfaceBuilder::getSurfaceState + //TODO: 1.18 this needs to change to a dynamic block + (pos)->Blocks.END_STONE.defaultBlockState() //UmbraSurfaceBuilder::getSurfaceState ), 10); public static final BCLFeature THIN_UMBRALITH_ARCH = registerChanced("thin_umbralith_arch", new ThinArchFeature(EndBlocks.UMBRALITH.stone), 15); @@ -295,9 +290,7 @@ public class EndFeatures { private static BCLFeature registerLayer(String name, Block block, float radius, int minY, int maxY, int count) { OreLayerFeature layer = new OreLayerFeature(block.defaultBlockState(), radius, minY, maxY); - ConfiguredFeature configured = layer - .configured(FeatureConfiguration.NONE) - .decorated(FeatureDecorator.COUNT.configured(new CountConfiguration(count))); + PlacedFeature configured = layer.configured(FeatureConfiguration.NONE).placed(new PlacementModifier[]{CountPlacement.of(count)}); return new BCLFeature(BetterEnd.makeID(name), layer, GenerationStep.Decoration.UNDERGROUND_ORES, configured); } @@ -305,75 +298,46 @@ public class EndFeatures { return registerLayer(name, material.stone, radius, minY, maxY, count); } - public static void registerBiomeFeatures(ResourceLocation id, Biome biome, List>>> features) { + public static void addBiomeFeatures(ResourceLocation id, Biome biome) { if (id.getNamespace().equals(BetterEnd.MOD_ID)) { return; } - if (GeneratorOptions.removeChorusFromVanillaBiomes()) { - if (id.getNamespace().equals("minecraft")) { - String path = id.getPath(); - if (path.equals("end_highlands") || path.equals("end_midlands") || path.equals("small_end_islands")) { - int pos = GenerationStep.Decoration.VEGETAL_DECORATION.ordinal(); - if (pos < features.size()) { - List>> list = features.get(pos); - // If only chorus plants are enabled - if (list.size() == 1) { - features.get(pos).clear(); - } - } - } - } - } - - addFeature(FLAVOLITE_LAYER, features); - addFeature(THALLASIUM_ORE, features); - addFeature(ENDER_ORE, features); - addFeature(CRASHED_SHIP, features); + BiomeAPI.addBiomeFeature(biome, FLAVOLITE_LAYER); + BiomeAPI.addBiomeFeature(biome, THALLASIUM_ORE); + BiomeAPI.addBiomeFeature(biome, ENDER_ORE); + BiomeAPI.addBiomeFeature(biome, CRASHED_SHIP); BCLBiome bclbiome = BiomeAPI.getBiome(id); boolean hasCaves = bclbiome.getCustomData("has_caves", true) && !(bclbiome instanceof EndCaveBiome); if (hasCaves && !BiomeAPI.END_VOID_BIOME_PICKER.containsImmutable(id)) { if (Configs.BIOME_CONFIG.getBoolean(id, "hasCaves", true)) { - addFeature(ROUND_CAVE, features); - addFeature(TUNEL_CAVE, features); + // TODO replace caves with carvers + BiomeAPI.addBiomeFeature(biome, ROUND_CAVE); + BiomeAPI.addBiomeFeature(biome, TUNEL_CAVE); } } - BCLFeature feature = BiomeAPI.getBiome(id).getStructuresFeature(); + // TODO restore biome structures + /*BCLFeature feature = BiomeAPI.getBiome(id).getStructuresFeature(); if (feature != null) { addFeature(feature, features); - } + }*/ } - public static void addDefaultFeatures(BCLBiomeDef def) { - def.addFeature(FLAVOLITE_LAYER); - def.addFeature(THALLASIUM_ORE); - def.addFeature(ENDER_ORE); - def.addFeature(CRASHED_SHIP); - - if (def.getID().getPath().endsWith("_cave")) { - return; - } - - boolean hasCaves = def.getCustomData("has_caves", true); - hasCaves = Configs.BIOME_CONFIG.getBoolean(def.getID(), "hasCaves", hasCaves); + public static BCLBiomeBuilder addDefaultFeatures(BCLBiomeBuilder builder, boolean hasCaves) { + builder.feature(FLAVOLITE_LAYER); + builder.feature(THALLASIUM_ORE); + builder.feature(ENDER_ORE); + builder.feature(CRASHED_SHIP); + + // TODO replace cave features with carvers if (hasCaves) { - def.addFeature(ROUND_CAVE); - def.addFeature(TUNEL_CAVE); - } - } - - private static void addFeature(BCLFeature feature, List>>> features) { - int index = feature.getFeatureStep().ordinal(); - if (features.size() > index) { - features.get(index).add(() -> feature.getFeatureConfigured()); - } - else { - List>> newFeature = Lists.newArrayList(); - newFeature.add(() -> feature.getFeatureConfigured()); - features.add(newFeature); + builder.feature(ROUND_CAVE); + builder.feature(TUNEL_CAVE); } + + return builder; } public static void register() {} diff --git a/src/main/java/ru/betterend/registry/EndStructures.java b/src/main/java/ru/betterend/registry/EndStructures.java index 827db4a4..32edb605 100644 --- a/src/main/java/ru/betterend/registry/EndStructures.java +++ b/src/main/java/ru/betterend/registry/EndStructures.java @@ -4,8 +4,8 @@ import net.minecraft.core.Registry; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; import net.minecraft.world.level.levelgen.feature.StructurePieceType; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.world.structures.BCLStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.features.EternalPortalStructure; @@ -22,22 +22,21 @@ import ru.betterend.world.structures.piece.NBTPiece; import ru.betterend.world.structures.piece.PaintedMountainPiece; import ru.betterend.world.structures.piece.VoxelPiece; -import java.util.Collection; -import java.util.function.Supplier; - public class EndStructures { public static final StructurePieceType VOXEL_PIECE = register("voxel", VoxelPiece::new); public static final StructurePieceType MOUNTAIN_PIECE = register("mountain_piece", CrystalMountainPiece::new); public static final StructurePieceType CAVE_PIECE = register("cave_piece", CavePiece::new); public static final StructurePieceType LAKE_PIECE = register("lake_piece", LakePiece::new); - public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register( - "painted_mountain_piece", - PaintedMountainPiece::new - ); + public static final StructurePieceType PAINTED_MOUNTAIN_PIECE = register("painted_mountain_piece", PaintedMountainPiece::new); public static final StructurePieceType NBT_PIECE = register("nbt_piece", NBTPiece::new); - public static final BCLStructureFeature GIANT_MOSSY_GLOWSHROOM = new BCLStructureFeature(BetterEnd.makeID( - "giant_mossy_glowshroom"), new GiantMossyGlowshroomStructure(), Decoration.SURFACE_STRUCTURES, 16, 8); + public static final BCLStructureFeature GIANT_MOSSY_GLOWSHROOM = new BCLStructureFeature( + BetterEnd.makeID("giant_mossy_glowshroom"), + new GiantMossyGlowshroomStructure(), + Decoration.SURFACE_STRUCTURES, + 16, + 8 + ); public static final BCLStructureFeature MEGALAKE = new BCLStructureFeature( BetterEnd.makeID("megalake"), new MegaLakeStructure(), @@ -59,8 +58,13 @@ public class EndStructures { 3, 2 ); - public static final BCLStructureFeature PAINTED_MOUNTAIN = new BCLStructureFeature(BetterEnd.makeID( - "painted_mountain"), new PaintedMountainStructure(), Decoration.RAW_GENERATION, 3, 2); + public static final BCLStructureFeature PAINTED_MOUNTAIN = new BCLStructureFeature( + BetterEnd.makeID("painted_mountain"), + new PaintedMountainStructure(), + Decoration.RAW_GENERATION, + 3, + 2 + ); public static final BCLStructureFeature ETERNAL_PORTAL = new BCLStructureFeature( BetterEnd.makeID("eternal_portal"), new EternalPortalStructure(), @@ -76,22 +80,15 @@ public class EndStructures { 8 ); - public static void register() { - } + public static void register() {} private static StructurePieceType register(String id, StructurePieceType pieceType) { return Registry.register(Registry.STRUCTURE_PIECE, BetterEnd.makeID(id), pieceType); } - public static void registerBiomeStructures(ResourceLocation id, Biome biome, Collection>> structures) { - if (!id.getPath().contains("mountain") && !id.getPath().contains("lake")) { - addStructure(ETERNAL_PORTAL, structures); + public static void addBiomeStructures(ResourceLocation biomeID, Biome biome) { + if (!biomeID.getPath().contains("mountain") && !biomeID.getPath().contains("lake")) { + BiomeAPI.addBiomeStructure(BiomeAPI.getBiomeKey(biome), ETERNAL_PORTAL); } } - - private static void addStructure(BCLStructureFeature feature, Collection>> structures) { - structures.add(() -> { - return feature.getFeatureConfigured(); - }); - } } diff --git a/src/main/java/ru/betterend/registry/EndTags.java b/src/main/java/ru/betterend/registry/EndTags.java index 1a7c8c0d..569932b9 100644 --- a/src/main/java/ru/betterend/registry/EndTags.java +++ b/src/main/java/ru/betterend/registry/EndTags.java @@ -13,12 +13,10 @@ import net.minecraft.world.food.FoodProperties; import net.minecraft.world.item.Item; import net.minecraft.world.item.Items; import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.LeavesBlock; import net.minecraft.world.level.block.state.BlockBehaviour.Properties; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import net.minecraft.world.level.material.Material; import ru.bclib.api.BonemealAPI; import ru.bclib.api.ComposterAPI; @@ -133,8 +131,9 @@ public class EndTags { TagAPI.addTag(ALLOYING_COPPER, Items.COPPER_ORE, Items.DEEPSLATE_COPPER_ORE, Items.RAW_COPPER); } + // TODO make getter for biome top blocks public static void addTerrainTags(Registry biomeRegistry) { - biomeRegistry.forEach((biome) -> { + /*biomeRegistry.forEach((biome) -> { if (biome.getBiomeCategory() == BiomeCategory.THEEND) { SurfaceBuilderConfiguration config = biome.getGenerationSettings().getSurfaceBuilderConfig(); Block under = config.getUnderMaterial().getBlock(); @@ -143,6 +142,6 @@ public class EndTags { TagAPI.addTag(TagAPI.BLOCK_END_GROUND, surface); } }); - TagAPI.BLOCK_END_STONES.getValues().forEach(TagAPI::addEndGround); + TagAPI.BLOCK_END_STONES.getValues().forEach(TagAPI::addEndGround);*/ } } diff --git a/src/main/java/ru/betterend/rituals/EternalRitual.java b/src/main/java/ru/betterend/rituals/EternalRitual.java index c0a2fca1..e10973f8 100644 --- a/src/main/java/ru/betterend/rituals/EternalRitual.java +++ b/src/main/java/ru/betterend/rituals/EternalRitual.java @@ -8,7 +8,6 @@ import net.minecraft.core.Registry; import net.minecraft.core.particles.BlockParticleOption; import net.minecraft.core.particles.ParticleOptions; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.Features; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; @@ -441,7 +440,8 @@ public class EternalRitual { direction = direction.getClockWise(); } } - if (targetWorld.dimension() == Level.END) { + // TODO find island feature + /*if (targetWorld.dimension() == Level.END) { Features.END_ISLAND.place( targetWorld, targetWorld.getChunkSource().getGenerator(), @@ -449,16 +449,16 @@ public class EternalRitual { basePos.below() ); } - else if (targetWorld.dimension() == Level.OVERWORLD) { - basePos.setY(targetWorld.getChunk(basePos) - .getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); + else */if (targetWorld.dimension() == Level.OVERWORLD) { + basePos.setY(targetWorld.getChunk(basePos).getHeight(Heightmap.Types.WORLD_SURFACE, basePos.getX(), basePos.getZ()) + 1); } - EndFeatures.BIOME_ISLAND.getFeatureConfigured() - .place(targetWorld, - targetWorld.getChunkSource().getGenerator(), - new Random(basePos.asLong()), - basePos.below() - ); + EndFeatures.BIOME_ISLAND + .getPlacedFeature() + .place(targetWorld, + targetWorld.getChunkSource().getGenerator(), + new Random(basePos.asLong()), + basePos.below() + ); generatePortal(targetWorld, basePos, portalAxis, portalId); return basePos.immutable(); } @@ -694,9 +694,9 @@ public class EternalRitual { } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block * @param condition Predicate for test block states in the chunk section * @return Position of the first found block or null. @@ -733,9 +733,9 @@ public class EternalRitual { } /** - * @param world World for search - * @param checkPos Start search position - * @param radius Search radius + * @param world World for search + * @param checkPos Start search position + * @param radius Search radius * @param searchBlock Target block * @param condition Predicate for test block states in the chunk section * @return List of positions of the all found blocks or empty list. diff --git a/src/main/java/ru/betterend/util/BlockFixer.java b/src/main/java/ru/betterend/util/BlockFixer.java index 89b2bc55..76b6de89 100644 --- a/src/main/java/ru/betterend/util/BlockFixer.java +++ b/src/main/java/ru/betterend/util/BlockFixer.java @@ -75,7 +75,7 @@ public class BlockFixer { for (Direction dir : BlocksHelper.HORIZONTAL) { if (level.isEmptyBlock(POS.relative(dir))) { try { - level.getLiquidTicks().scheduleTick(POS, state.getFluidState().getType(), 0); + level.scheduleTick(POS, state.getFluidState().getType(), 0); } catch (Exception e) {} break; diff --git a/src/main/java/ru/betterend/util/FeaturesHelper.java b/src/main/java/ru/betterend/util/FeaturesHelper.java deleted file mode 100644 index 5b2d799c..00000000 --- a/src/main/java/ru/betterend/util/FeaturesHelper.java +++ /dev/null @@ -1,39 +0,0 @@ -package ru.betterend.util; - -import com.google.common.collect.Lists; -import net.minecraft.core.Registry; -import net.minecraft.resources.ResourceLocation; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.ConfiguredStructureFeature; -import ru.bclib.api.BiomeAPI; -import ru.betterend.config.Configs; -import ru.betterend.mixin.common.BiomeGenerationSettingsAccessor; -import ru.betterend.registry.EndFeatures; -import ru.betterend.registry.EndStructures; - -import java.util.ArrayList; -import java.util.List; -import java.util.function.Supplier; - -public class FeaturesHelper { - public static void addFeatures(Registry biomeRegistry) { - biomeRegistry.forEach((biome) -> { - ResourceLocation key = biomeRegistry.getKey(biome); - if (BiomeAPI.isEndBiome(key)) { - BiomeGenerationSettingsAccessor accessor = (BiomeGenerationSettingsAccessor) biome.getGenerationSettings(); - List>> structures = Lists.newArrayList(accessor.be_getStructures()); - List>>> preFeatures = accessor.be_getFeatures(); - List>>> features = new ArrayList<>(preFeatures.size()); - preFeatures.forEach((list) -> features.add(Lists.newArrayList(list))); - - EndFeatures.registerBiomeFeatures(key, biome, features); - EndStructures.registerBiomeStructures(key, biome, structures); - - accessor.be_setFeatures(features); - accessor.be_setStructures(structures); - } - }); - Configs.BIOME_CONFIG.saveChanges(); - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/biome/EndBiome.java b/src/main/java/ru/betterend/world/biome/EndBiome.java index ad3597e7..7e0601d4 100644 --- a/src/main/java/ru/betterend/world/biome/EndBiome.java +++ b/src/main/java/ru/betterend/world/biome/EndBiome.java @@ -1,23 +1,177 @@ package ru.betterend.world.biome; +import net.minecraft.core.BlockPos; +import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.resources.ResourceLocation; +import net.minecraft.sounds.SoundEvents; +import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BiomeAPI; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.bclib.world.biomes.BCLBiome; -import ru.bclib.world.biomes.BCLBiomeDef; +import ru.betterend.BetterEnd; +import ru.betterend.interfaces.StructureFeaturesAccessor; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; +import ru.betterend.registry.EndSounds; -public class EndBiome extends BCLBiome { - public EndBiome(BCLBiomeDef def) { - super(updateDef(def)); +import java.util.function.BiFunction; + +public class EndBiome extends BCLBiome implements SurfaceMaterialProvider { + public static class DefaultSurfaceMaterialProvider implements SurfaceMaterialProvider{ + public static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); + @Override + public BlockState getTopMaterial() { + return getUnderMaterial(); + } + + @Override + public BlockState getAltTopMaterial() { + return getTopMaterial(); + } + + @Override + public BlockState getUnderMaterial() { + return END_STONE; + } + + @Override + public boolean generateFloorRule(){ + return true; + } + + @Override + public SurfaceRuleBuilder surface() { + SurfaceRuleBuilder builder = SurfaceRuleBuilder.start(); + + if (generateFloorRule() && getTopMaterial()!=getUnderMaterial()){ + if (getTopMaterial()!=getAltTopMaterial()){ + builder.floor(getTopMaterial()); + } else { + builder.chancedFloor(getTopMaterial(), getAltTopMaterial()); + } + } + return builder.filler(getUnderMaterial()); + } } - - public EndBiome(ResourceLocation id, Biome biome, float fogDensity, float genChance, boolean hasCaves) { - super(id, biome, fogDensity, genChance); - this.addCustomData("has_caves", hasCaves); + + public abstract static class Config { + public static final SurfaceMaterialProvider DEFAULT_MATERIAL = new DefaultSurfaceMaterialProvider(); + + protected static final StructureFeaturesAccessor VANILLA_FEATURES = (StructureFeaturesAccessor)new StructureFeatures(); + protected static final SurfaceRules.RuleSource END_STONE = SurfaceRules.state(DefaultSurfaceMaterialProvider.END_STONE); + protected static final SurfaceRules.RuleSource END_MOSS = SurfaceRules.state(EndBlocks.END_MOSS.defaultBlockState()); + protected static final SurfaceRules.RuleSource ENDSTONE_DUST = SurfaceRules.state(EndBlocks.ENDSTONE_DUST.defaultBlockState()); + protected static final SurfaceRules.RuleSource END_MYCELIUM = SurfaceRules.state(EndBlocks.END_MYCELIUM.defaultBlockState()); + protected static final SurfaceRules.RuleSource FLAVOLITE =SurfaceRules.state(EndBlocks.FLAVOLITE.stone.defaultBlockState()); + protected static final SurfaceRules.RuleSource SULPHURIC_ROCK =SurfaceRules.state(EndBlocks.SULPHURIC_ROCK.stone.defaultBlockState()); + protected static final SurfaceRules.RuleSource BRIMSTONE =SurfaceRules.state(EndBlocks.BRIMSTONE.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_FULL =SurfaceRules.state(EndBlocks.PALLIDIUM_FULL.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_HEAVY =SurfaceRules.state(EndBlocks.PALLIDIUM_HEAVY.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_THIN =SurfaceRules.state(EndBlocks.PALLIDIUM_THIN.defaultBlockState()); + protected static final SurfaceRules.RuleSource PALLIDIUM_TINY =SurfaceRules.state(EndBlocks.PALLIDIUM_TINY.defaultBlockState()); + protected static final SurfaceRules.RuleSource UMBRALITH =SurfaceRules.state(EndBlocks.UMBRALITH.stone.defaultBlockState()); + + public final ResourceLocation ID; + + protected Config(String name) { + this.ID = BetterEnd.makeID(name); + } + + protected abstract void addCustomBuildData(BCLBiomeBuilder builder); + + public BiFunction getSupplier(){ + return EndBiome::new; + } + + protected boolean hasCaves(){ + return true; + } + + protected SurfaceMaterialProvider surfaceMaterial() { + return DEFAULT_MATERIAL; + } } - - private static BCLBiomeDef updateDef(BCLBiomeDef def) { - EndFeatures.addDefaultFeatures(def); - return def; + + public EndBiome(ResourceLocation biomeID, Biome biome) { + super(biomeID, biome); + } + + public static EndBiome create(Config biomeConfig){ + BCLBiomeBuilder builder = BCLBiomeBuilder + .start(biomeConfig.ID) + .category(Biome.BiomeCategory.THEEND) + .music(SoundEvents.MUSIC_END) + .waterColor(4159204) + .waterFogColor(329011) + .fogColor(0xA080A0) + .skyColor(0) + .mood(EndSounds.AMBIENT_DUST_WASTELANDS) + .temperature(0.5f) + .wetness(0.5f) + .precipitation(Biome.Precipitation.NONE) + .surface(biomeConfig.surfaceMaterial().surface().build()); + + biomeConfig.addCustomBuildData(builder); + EndFeatures.addDefaultFeatures(builder, biomeConfig.hasCaves()); + + + EndBiome biome = builder.build(biomeConfig.getSupplier()); + biome.addCustomData("has_caves", biomeConfig.hasCaves()); + biome.setSurfaceMaterial(biomeConfig.surfaceMaterial()); + + return biome; + } + + + private SurfaceMaterialProvider surfMatProv = Config.DEFAULT_MATERIAL; + private void setSurfaceMaterial(SurfaceMaterialProvider prov) { + surfMatProv = prov; + } + + @Override + public BlockState getTopMaterial() { + return surfMatProv.getTopMaterial(); + } + + @Override + public BlockState getUnderMaterial() { + return surfMatProv.getUnderMaterial(); + } + + @Override + public BlockState getAltTopMaterial() { + return surfMatProv.getAltTopMaterial(); + } + + @Override + public boolean generateFloorRule() { return surfMatProv.generateFloorRule(); } + + @Override + public SurfaceRuleBuilder surface() { return surfMatProv.surface(); } + + public static BlockState findTopMaterial(BCLBiome biome){ + return BiomeAPI.findTopMaterial(biome).orElse(EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); + } + + public static BlockState findTopMaterial(Biome biome){ + return findTopMaterial(BiomeAPI.getBiome(biome)); + } + + public static BlockState findTopMaterial(WorldGenLevel world, BlockPos pos){ + return findTopMaterial(BiomeAPI.getBiome(world.getBiome(pos))); + } + + public static BlockState findUnderMaterial(BCLBiome biome){ + return BiomeAPI.findUnderMaterial(biome).orElse(EndBiome.Config.DEFAULT_MATERIAL.getUnderMaterial()); + } + + public static BlockState findUnderMaterial(WorldGenLevel world, BlockPos pos){ + return findUnderMaterial(BiomeAPI.getBiome(world.getBiome(pos))); } } diff --git a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java index c581095e..1fbd812a 100644 --- a/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java +++ b/src/main/java/ru/betterend/world/biome/air/BiomeIceStarfield.java @@ -1,25 +1,33 @@ package ru.betterend.world.biome.air; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class BiomeIceStarfield extends EndBiome { +public class BiomeIceStarfield extends EndBiome.Config { public BiomeIceStarfield() { - super(new BCLBiomeDef(BetterEnd.makeID("ice_starfield")).addCustomData("has_caves", false) - .addStructureFeature(EndStructures.GIANT_ICE_STAR.getFeatureConfigured()) - .setFogColor(224, 245, 254) - .setTemperature(0F) - .setFogDensity(2.2F) - .setFoliageColor(193, 244, 244) - .setGenChance(0.25F) - .setParticles(EndParticles.SNOWFLAKE, 0.002F) - .addFeature(EndFeatures.ICE_STAR) - .addFeature(EndFeatures.ICE_STAR_SMALL) - .addMobSpawn(EntityType.ENDERMAN, 20, 1, 4)); + super("ice_starfield"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.GIANT_ICE_STAR.getFeatureConfigured()) + .fogColor(224, 245, 254) + .temperature(0F) + .fogDensity(2.2F) + .foliageColor(193, 244, 244) + .genChance(0.25F) + .particles(EndParticles.SNOWFLAKE, 0.002F) + .feature(EndFeatures.ICE_STAR) + .feature(EndFeatures.ICE_STAR_SMALL) + .spawn(EntityType.ENDERMAN, 20, 1, 4); } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java index 83b371d1..b7b0bdc5 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyAuroraCaveBiome.java @@ -1,30 +1,50 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class EmptyAuroraCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.01F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptyAuroraCaveBiome extends EndCaveBiome { public EmptyAuroraCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_aurora_cave")).setFogColor(150, 30, 68) - .setFogDensity(2.0F) - .setPlantsColor(108, 25, 46) - .setWaterAndFogColor(186, 77, 237) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F)); - - this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_aurora_cave"); } - + @Override - public float getFloorDensity() { - return 0.01F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(150, 30, 68) + .fogDensity(2.0F) + .plantsColor(108, 25, 46) + .waterAndFogColor(186, 77, 237) + .particles(EndParticles.GLOWING_SPHERE, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiFunction getSupplier() { + return EmptyAuroraCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java index 151e7475..4adf3ece 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptyEndCaveBiome.java @@ -1,23 +1,44 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class EmptyEndCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptyEndCaveBiome extends EndCaveBiome { public EmptyEndCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_end_cave")).setFogDensity(2.0F)); - this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE, 1); - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_end_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogDensity(2.0F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiFunction getSupplier() { + return Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java index b77fd747..38a1b643 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EmptySmaragdantCaveBiome.java @@ -1,31 +1,51 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class EmptySmaragdantCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class EmptySmaragdantCaveBiome extends EndCaveBiome { public EmptySmaragdantCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("empty_smaragdant_cave")).setFogColor(0, 253, 182) - .setFogDensity(2.0F) - .setPlantsColor(0, 131, 145) - .setWaterAndFogColor(31, 167, 212) - .setParticles(EndParticles.SMARAGDANT, 0.001F)); - - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("empty_smaragdant_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(0, 253, 182) + .fogDensity(2.0F) + .plantsColor(0, 131, 145) + .waterAndFogColor(31, 167, 212) + .particles(EndParticles.SMARAGDANT, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiFunction getSupplier() { + return EmptySmaragdantCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java index eb22f9f2..0b1a1db3 100644 --- a/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/EndCaveBiome.java @@ -1,12 +1,15 @@ package ru.betterend.world.biome.cave; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.Biome.BiomeCategory; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.GenerationStep; import net.minecraft.world.level.levelgen.feature.Feature; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.WeightedList; -import ru.bclib.world.biomes.BCLBiomeDef; import ru.bclib.world.features.BCLFeature; import ru.betterend.BetterEnd; import ru.betterend.registry.EndSounds; @@ -14,24 +17,44 @@ import ru.betterend.world.biome.EndBiome; import ru.betterend.world.features.terrain.caves.CaveChunkPopulatorFeature; import java.util.Random; +import java.util.function.BiFunction; public class EndCaveBiome extends EndBiome { + public static abstract class Config extends EndBiome.Config { + protected Config(String name) { + super(name); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + BCLFeature feature = BCLFeature.makeChunkFeature( + BetterEnd.makeID(ID.getPath() + "_cave_populator"), + GenerationStep.Decoration.RAW_GENERATION, + new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(ID)) + ); + + builder.category(BiomeCategory.NONE) + .feature(feature) + .music(EndSounds.MUSIC_CAVES) + .loop(EndSounds.AMBIENT_CAVES); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + public BiFunction getSupplier() { + return EndCaveBiome::new; + } + } + private WeightedList> floorFeatures = new WeightedList>(); private WeightedList> ceilFeatures = new WeightedList>(); - - public EndCaveBiome(BCLBiomeDef definition) { - super(makeDef(definition)); - } - - private static BCLBiomeDef makeDef(BCLBiomeDef definition) { - BCLFeature feature = BCLFeature.makeChunkFeature( - BetterEnd.makeID(definition.getID().getPath() + "_cave_populator"), - new CaveChunkPopulatorFeature(() -> (EndCaveBiome) BiomeAPI.getBiome(definition.getID())) - ); - definition.setCategory(BiomeCategory.NONE).addFeature(feature); - definition.setMusic(EndSounds.MUSIC_CAVES); - definition.setLoop(EndSounds.AMBIENT_CAVES); - return definition; + + public EndCaveBiome(ResourceLocation biomeID, Biome biome) { + super(biomeID, biome); } public void addFloorFeature(Feature feature, float weight) { @@ -65,4 +88,8 @@ public class EndCaveBiome extends EndBiome { public BlockState getWall(BlockPos pos) { return null; } + + public static EndCaveBiome create(EndBiome.Config biomeConfig){ + return (EndCaveBiome) EndBiome.create(biomeConfig); + } } diff --git a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java index be061028..90382c99 100644 --- a/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/JadeCaveBiome.java @@ -1,32 +1,53 @@ package ru.betterend.world.biome.cave; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.util.Mth; import net.minecraft.world.level.block.state.BlockState; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; +import ru.betterend.world.biome.EndBiome; -public class JadeCaveBiome extends EndCaveBiome { - private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); - private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); - private static final BlockState[] JADE = new BlockState[3]; - - public JadeCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("jade_cave")).setFogColor(118, 150, 112) - .setFogDensity(2.0F) - .setWaterAndFogColor(95, 223, 255)); - JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); - JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); - JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); +import java.util.function.BiFunction; + +public class JadeCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + private static final OpenSimplexNoise WALL_NOISE = new OpenSimplexNoise("jade_cave".hashCode()); + private static final OpenSimplexNoise DEPTH_NOISE = new OpenSimplexNoise("depth_noise".hashCode()); + private static final BlockState[] JADE = new BlockState[3]; + + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + JADE[0] = EndBlocks.VIRID_JADESTONE.stone.defaultBlockState(); + JADE[1] = EndBlocks.AZURE_JADESTONE.stone.defaultBlockState(); + JADE[2] = EndBlocks.SANDY_JADESTONE.stone.defaultBlockState(); + } + + @Override + public BlockState getWall(BlockPos pos) { + double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; + int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); + index = Mth.abs(index) % 3; + return JADE[index]; + } } - + + public JadeCaveBiome() { + super("jade_cave"); + } + @Override - public BlockState getWall(BlockPos pos) { - double depth = DEPTH_NOISE.eval(pos.getX() * 0.02, pos.getZ() * 0.02) * 0.2 + 0.5; - int index = Mth.floor((pos.getY() + WALL_NOISE.eval(pos.getX() * 0.2, pos.getZ() * 0.2) * 1.5) * depth + 0.5); - index = Mth.abs(index) % 3; - return JADE[index]; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(118, 150, 112) + .fogDensity(2.0F) + .waterAndFogColor(95, 223, 255); + } + + @Override + public BiFunction getSupplier() { + return JadeCaveBiome.Biome::new; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java index 2e476aa9..95518656 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushAuroraCaveBiome.java @@ -1,48 +1,79 @@ package ru.betterend.world.biome.cave; import net.minecraft.core.BlockPos; +import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; import ru.bclib.blocks.BlockProperties; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class LushAuroraCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); + this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); + this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); + + this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); + this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); + this.addCeilFeature(EndFeatures.RUBINEA, 3); + this.addCeilFeature(EndFeatures.MAGNULA, 1); + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); + } + + @Override + public float getFloorDensity() { + return 0.2F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + + @Override + public BlockState getCeil(BlockPos pos) { + return EndBlocks.CAVE_MOSS.defaultBlockState() + .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP); + } + } -public class LushAuroraCaveBiome extends EndCaveBiome { public LushAuroraCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lush_aurora_cave")).setFogColor(150, 30, 68) - .setFogDensity(2.0F) - .setPlantsColor(108, 25, 46) - .setWaterAndFogColor(186, 77, 237) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setSurface(EndBlocks.CAVE_MOSS)); - - this.addFloorFeature(EndFeatures.BIG_AURORA_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.CAVE_BUSH, 5); - this.addFloorFeature(EndFeatures.CAVE_GRASS, 40); - this.addFloorFeature(EndFeatures.END_STONE_STALAGMITE_CAVEMOSS, 5); - - this.addCeilFeature(EndFeatures.CAVE_BUSH, 1); - this.addCeilFeature(EndFeatures.CAVE_PUMPKIN, 1); - this.addCeilFeature(EndFeatures.RUBINEA, 3); - this.addCeilFeature(EndFeatures.MAGNULA, 1); - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE_CAVEMOSS, 10); + super("lush_aurora_cave"); } - + @Override - public float getFloorDensity() { - return 0.2F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(150, 30, 68) + .fogDensity(2.0F) + .plantsColor(108, 25, 46) + .waterAndFogColor(186, 77, 237) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + ; } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiFunction getSupplier() { + return LushAuroraCaveBiome.Biome::new; } - + @Override - public BlockState getCeil(BlockPos pos) { - return EndBlocks.CAVE_MOSS.defaultBlockState() - .setValue(BlockProperties.TRIPLE_SHAPE, BlockProperties.TripleShape.TOP); + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CAVE_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java index f40c33a4..6674466b 100644 --- a/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java +++ b/src/main/java/ru/betterend/world/biome/cave/LushSmaragdantCaveBiome.java @@ -1,33 +1,64 @@ package ru.betterend.world.biome.cave; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; +import ru.betterend.world.biome.EndBiome; + +import java.util.function.BiFunction; + +public class LushSmaragdantCaveBiome extends EndCaveBiome.Config { + public static class Biome extends EndCaveBiome { + public Biome(ResourceLocation biomeID, net.minecraft.world.level.biome.Biome biome) { + super(biomeID, biome); + + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); + this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); + + this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + } + + @Override + public float getFloorDensity() { + return 0.1F; + } + + @Override + public float getCeilDensity() { + return 0.1F; + } + } -public class LushSmaragdantCaveBiome extends EndCaveBiome { public LushSmaragdantCaveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lush_smaragdant_cave")).setFogColor(0, 253, 182) - .setFogDensity(2.0F) - .setPlantsColor(0, 131, 145) - .setWaterAndFogColor(31, 167, 212) - .setParticles(EndParticles.SMARAGDANT, 0.001F) - .setSurface(EndBlocks.CAVE_MOSS)); - - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL, 1); - this.addFloorFeature(EndFeatures.SMARAGDANT_CRYSTAL_SHARD, 20); - - this.addCeilFeature(EndFeatures.END_STONE_STALACTITE, 1); + super("lush_smaragdant_cave"); } - + @Override - public float getFloorDensity() { - return 0.1F; + protected void addCustomBuildData(BCLBiomeBuilder builder) { + super.addCustomBuildData(builder); + builder.fogColor(0, 253, 182) + .fogDensity(2.0F) + .plantsColor(0, 131, 145) + .waterAndFogColor(31, 167, 212) + .particles(EndParticles.SMARAGDANT, 0.001F); } - + @Override - public float getCeilDensity() { - return 0.1F; + public BiFunction getSupplier() { + return LushSmaragdantCaveBiome.Biome::new; + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CAVE_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java index 5339973a..b1d14021 100644 --- a/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/AmberLandBiome.java @@ -1,9 +1,9 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -11,30 +11,43 @@ import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class AmberLandBiome extends EndBiome { +public class AmberLandBiome extends EndBiome.Config { public AmberLandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("amber_land")) - .setFogColor(255, 184, 71) - .setFogDensity(2.0F) - .setPlantsColor(219, 115, 38) - .setWaterAndFogColor(145, 108, 72) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_AMBER_LAND) - .setParticles(EndParticles.AMBER_SPHERE, 0.001F) - .setSurface(EndBlocks.AMBER_MOSS) - .addFeature(EndFeatures.AMBER_ORE) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.HELIX_TREE) - .addFeature(EndFeatures.LANCELEAF) - .addFeature(EndFeatures.GLOW_PILLAR) - .addFeature(EndFeatures.AMBER_GRASS) - .addFeature(EndFeatures.AMBER_ROOT) - .addFeature(EndFeatures.BULB_MOSS) - .addFeature(EndFeatures.BULB_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.END_SLIME, 30, 1, 2)); + super("amber_land"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(255, 184, 71) + .fogDensity(2.0F) + .plantsColor(219, 115, 38) + .waterAndFogColor(145, 108, 72) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_AMBER_LAND) + .particles(EndParticles.AMBER_SPHERE, 0.001F) + .feature(EndFeatures.AMBER_ORE) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.HELIX_TREE) + .feature(EndFeatures.LANCELEAF) + .feature(EndFeatures.GLOW_PILLAR) + .feature(EndFeatures.AMBER_GRASS) + .feature(EndFeatures.AMBER_ROOT) + .feature(EndFeatures.BULB_MOSS) + .feature(EndFeatures.BULB_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 4) + .spawn(EndEntities.END_SLIME, 30, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.AMBER_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java index 8c9ff1ba..553e5f7f 100644 --- a/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/BlossomingSpiresBiome.java @@ -1,36 +1,54 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class BlossomingSpiresBiome extends EndBiome { +public class BlossomingSpiresBiome extends EndBiome.Config { public BlossomingSpiresBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("blossoming_spires")) - .addCustomData("has_caves", false) - .setFogColor(241, 146, 229) - .setFogDensity(1.7F) - .setPlantsColor(122, 45, 122) - .setSurface(EndBlocks.PINK_MOSS) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) - .addFeature(EndFeatures.SPIRE) - .addFeature(EndFeatures.FLOATING_SPIRE) - .addFeature(EndFeatures.TENANEA) - .addFeature(EndFeatures.TENANEA_BUSH) - .addFeature(EndFeatures.BULB_VINE) - .addFeature(EndFeatures.BUSHY_GRASS) - .addFeature(EndFeatures.BUSHY_GRASS_WG) - .addFeature(EndFeatures.BLOSSOM_BERRY) - .addFeature(EndFeatures.TWISTED_MOSS) - .addFeature(EndFeatures.TWISTED_MOSS_WOOD) - .addFeature(EndFeatures.SILK_MOTH_NEST) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4) - .addMobSpawn(EndEntities.SILK_MOTH, 5, 1, 2)); + super("blossoming_spires"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(241, 146, 229) + .fogDensity(1.7F) + .plantsColor(122, 45, 122) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_BLOSSOMING_SPIRES) + .feature(EndFeatures.SPIRE) + .feature(EndFeatures.FLOATING_SPIRE) + .feature(EndFeatures.TENANEA) + .feature(EndFeatures.TENANEA_BUSH) + .feature(EndFeatures.BULB_VINE) + .feature(EndFeatures.BUSHY_GRASS) + .feature(EndFeatures.BUSHY_GRASS_WG) + .feature(EndFeatures.BLOSSOM_BERRY) + .feature(EndFeatures.TWISTED_MOSS) + .feature(EndFeatures.TWISTED_MOSS_WOOD) + .feature(EndFeatures.SILK_MOTH_NEST) + .spawn(EntityType.ENDERMAN, 50, 1, 4) + .spawn(EndEntities.SILK_MOTH, 5, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.PINK_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java index 5881f117..9c4b49b3 100644 --- a/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ChorusForestBiome.java @@ -1,44 +1,56 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.Features; -import net.minecraft.data.worldgen.StructureFeatures; +import net.minecraft.data.worldgen.placement.EndPlacements; import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep.Decoration; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class ChorusForestBiome extends EndBiome { +public class ChorusForestBiome extends EndBiome.Config { public ChorusForestBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("chorus_forest")) - .setFogColor(87, 26, 87) - .setFogDensity(1.5F) - .setPlantsColor(122, 45, 122) - .setWaterAndFogColor(73, 30, 73) - .setSurface(EndBlocks.CHORUS_NYLIUM) - .setParticles(ParticleTypes.PORTAL, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.PYTHADENDRON_TREE) - .addFeature(EndFeatures.PYTHADENDRON_BUSH) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) - .addFeature(Decoration.VEGETAL_DECORATION, Features.CHORUS_PLANT) - .addFeature(EndFeatures.CHORUS_GRASS) - .addFeature(EndFeatures.CHORUS_MUSHROOM) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + super("chorus_forest"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(87, 26, 87) + .fogDensity(1.5F) + .plantsColor(122, 45, 122) + .waterAndFogColor(73, 30, 73) + .particles(ParticleTypes.PORTAL, 0.01F) + .loop(EndSounds.AMBIENT_CHORUS_FOREST) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.VIOLECITE_LAYER) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.PYTHADENDRON_TREE) + .feature(EndFeatures.PYTHADENDRON_BUSH) + .feature(EndFeatures.PURPLE_POLYPORE) + .feature(Decoration.VEGETAL_DECORATION, EndPlacements.CHORUS_PLANT) + .feature(EndFeatures.CHORUS_GRASS) + .feature(EndFeatures.CHORUS_MUSHROOM) + .feature(EndFeatures.TAIL_MOSS) + .feature(EndFeatures.TAIL_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_PURPLE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 50, 1, 4); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CHORUS_NYLIUM.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java index 166fb677..af1624f5 100644 --- a/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/CrystalMountainsBiome.java @@ -1,23 +1,36 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class CrystalMountainsBiome extends EndBiome { +public class CrystalMountainsBiome extends EndBiome.Config { public CrystalMountainsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("crystal_mountains")) - .addStructureFeature(EndStructures.MOUNTAIN.getFeatureConfigured()) - .setPlantsColor(255, 133, 211) - .setSurface(EndBlocks.CRYSTAL_MOSS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.ROUND_CAVE) - .addFeature(EndFeatures.CRYSTAL_GRASS) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("crystal_mountains"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.MOUNTAIN.getFeatureConfigured()) + .plantsColor(255, 133, 211) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.CRYSTAL_GRASS) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.CRYSTAL_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java index 73a383f4..e6a47d62 100644 --- a/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DragonGraveyardsBiome.java @@ -1,35 +1,49 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DragonGraveyardsBiome extends EndBiome { +public class DragonGraveyardsBiome extends EndBiome.Config { public DragonGraveyardsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dragon_graveyards")) - .setGenChance(0.1F) - .setFogColor(244, 46, 79) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.0007F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.SANGNUM) - .setWaterAndFogColor(203, 59, 167) - .setPlantsColor(244, 46, 79) - .addFeature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) - .addFeature(EndFeatures.DRAGON_BONE_BLOCK_ORE) - .addFeature(EndFeatures.FALLEN_PILLAR) - .addFeature(EndFeatures.OBSIDIAN_BOULDER) - .addFeature(EndFeatures.GIGANTIC_AMARANITA) - .addFeature(EndFeatures.LARGE_AMARANITA) - .addFeature(EndFeatures.SMALL_AMARANITA) - .addFeature(EndFeatures.GLOBULAGUS) - .addFeature(EndFeatures.CLAWFERN) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dragon_graveyards"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.genChance(0.1f) + .fogColor(244, 46, 79) + .fogDensity(1.3F) + .particles(EndParticles.FIREFLY, 0.0007F) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .waterAndFogColor(203, 59, 167) + .plantsColor(244, 46, 79) + .feature(EndFeatures.OBSIDIAN_PILLAR_BASEMENT) + .feature(EndFeatures.DRAGON_BONE_BLOCK_ORE) + .feature(EndFeatures.FALLEN_PILLAR) + .feature(EndFeatures.OBSIDIAN_BOULDER) + .feature(EndFeatures.GIGANTIC_AMARANITA) + .feature(EndFeatures.LARGE_AMARANITA) + .feature(EndFeatures.SMALL_AMARANITA) + .feature(EndFeatures.GLOBULAGUS) + .feature(EndFeatures.CLAWFERN) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.SANGNUM.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java index ffb6b087..c81b67df 100644 --- a/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DryShrublandBiome.java @@ -1,29 +1,42 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DryShrublandBiome extends EndBiome { +public class DryShrublandBiome extends EndBiome.Config { public DryShrublandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dry_shrubland")) - .setFogColor(132, 35, 13) - .setFogDensity(1.2F) - .setWaterAndFogColor(113, 88, 53) - .setPlantsColor(237, 122, 66) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.LUCERNIA_BUSH_RARE) - .addFeature(EndFeatures.ORANGO) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LUTEBUS) - .addFeature(EndFeatures.LAMELLARIUM) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dry_shrubland"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(132, 35, 13) + .fogDensity(1.2F) + .waterAndFogColor(113, 88, 53) + .plantsColor(237, 122, 66) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.LUCERNIA_BUSH_RARE) + .feature(EndFeatures.ORANGO) + .feature(EndFeatures.AERIDIUM) + .feature(EndFeatures.LUTEBUS) + .feature(EndFeatures.LAMELLARIUM) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.RUTISCUS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java index ec648b46..cd14af8a 100644 --- a/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/DustWastelandsBiome.java @@ -1,26 +1,40 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class DustWastelandsBiome extends EndBiome { +public class DustWastelandsBiome extends EndBiome.Config { public DustWastelandsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("dust_wastelands")) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setDepth(1.5F) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("dust_wastelands"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(192, 180, 131) + //TODO: 1.18 removed + //.depth(1.5F) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .music(EndSounds.MUSIC_OPENSPACE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java index 11ff8227..808bdb0e 100644 --- a/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/FoggyMushroomlandBiome.java @@ -1,9 +1,9 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -12,38 +12,57 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class FoggyMushroomlandBiome extends EndBiome { +public class FoggyMushroomlandBiome extends EndBiome.Config { public FoggyMushroomlandBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("foggy_mushroomland")) - .addStructureFeature(EndStructures.GIANT_MOSSY_GLOWSHROOM - .getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(41, 122, 173) - .setFogDensity(3) - .setWaterAndFogColor(119, 227, 250) - .setSurface(EndBlocks.END_MOSS, EndBlocks.END_MYCELIUM) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setLoop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) - .setMusic(EndSounds.MUSIC_FOREST) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.MOSSY_GLOWSHROOM) - .addFeature(EndFeatures.BLUE_VINE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.DENSE_VINE) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.END_LILY) - .addFeature(EndFeatures.BUBBLE_CORAL) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.DRAGONFLY, 80, 2, 5) - .addMobSpawn(EndEntities.END_FISH, 20, 2, 5) - .addMobSpawn(EndEntities.CUBOZOA, 10, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 10, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("foggy_mushroomland"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.GIANT_MOSSY_GLOWSHROOM.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(41, 122, 173) + .fogDensity(3) + .waterAndFogColor(119, 227, 250) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .loop(EndSounds.AMBIENT_FOGGY_MUSHROOMLAND) + .music(EndSounds.MUSIC_FOREST) + .feature(EndFeatures.END_LAKE) + .feature(EndFeatures.MOSSY_GLOWSHROOM) + .feature(EndFeatures.BLUE_VINE) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.DENSE_VINE) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CYAN_MOSS) + .feature(EndFeatures.CYAN_MOSS_WOOD) + .feature(EndFeatures.END_LILY) + .feature(EndFeatures.BUBBLE_CORAL) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EndEntities.DRAGONFLY, 80, 2, 5) + .spawn(EndEntities.END_FISH, 20, 2, 5) + .spawn(EndEntities.CUBOZOA, 10, 3, 8) + .spawn(EndEntities.END_SLIME, 10, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.END_MYCELIUM.defaultBlockState(); + } + }; + + } } diff --git a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java index 61cc949c..90530fc4 100644 --- a/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/GlowingGrasslandsBiome.java @@ -1,40 +1,53 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class GlowingGrasslandsBiome extends EndBiome { +public class GlowingGrasslandsBiome extends EndBiome.Config { public GlowingGrasslandsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("glowing_grasslands")) - .setFogColor(99, 228, 247) - .setFogDensity(1.3F) - .setParticles(EndParticles.FIREFLY, 0.001F) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) - .setSurface(EndBlocks.END_MOSS) - .setWaterAndFogColor(92, 250, 230) - .setPlantsColor(73, 210, 209) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.LUMECORN) - .addFeature(EndFeatures.BLOOMING_COOKSONIA) - .addFeature(EndFeatures.SALTEAGO) - .addFeature(EndFeatures.VAIOLUSH_FERN) - .addFeature(EndFeatures.FRACTURN) - .addFeature(EndFeatures.UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CREEPING_MOSS_RARE) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("glowing_grasslands"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(99, 228, 247) + .fogDensity(1.3F) + .particles(EndParticles.FIREFLY, 0.001F) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_GLOWING_GRASSLANDS) + .waterAndFogColor(92, 250, 230) + .plantsColor(73, 210, 209) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.LUMECORN) + .feature(EndFeatures.BLOOMING_COOKSONIA) + .feature(EndFeatures.SALTEAGO) + .feature(EndFeatures.VAIOLUSH_FERN) + .feature(EndFeatures.FRACTURN) + .feature(EndFeatures.UMBRELLA_MOSS_RARE) + .feature(EndFeatures.CREEPING_MOSS_RARE) + .feature(EndFeatures.TWISTED_UMBRELLA_MOSS_RARE) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java index 94dd756b..b9a4ba45 100644 --- a/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/LanternWoodsBiome.java @@ -1,40 +1,53 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class LanternWoodsBiome extends EndBiome { +public class LanternWoodsBiome extends EndBiome.Config { public LanternWoodsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("lantern_woods")) - .setFogColor(189, 82, 70) - .setFogDensity(1.1F) - .setWaterAndFogColor(171, 234, 226) - .setPlantsColor(254, 85, 57) - .setSurface(EndBlocks.RUTISCUS) - .setMusic(EndSounds.MUSIC_FOREST) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .addFeature(EndFeatures.END_LAKE_NORMAL) - .addFeature(EndFeatures.FLAMAEA) - .addFeature(EndFeatures.LUCERNIA) - .addFeature(EndFeatures.LUCERNIA_BUSH) - .addFeature(EndFeatures.FILALUX) - .addFeature(EndFeatures.AERIDIUM) - .addFeature(EndFeatures.LAMELLARIUM) - .addFeature(EndFeatures.BOLUX_MUSHROOM) - .addFeature(EndFeatures.AURANT_POLYPORE) - .addFeature(EndFeatures.POND_ANEMONE) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED) - .addFeature(EndFeatures.RUSCUS) - .addFeature(EndFeatures.RUSCUS_WOOD) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("lantern_woods"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(189, 82, 70) + .fogDensity(1.1F) + .waterAndFogColor(171, 234, 226) + .plantsColor(254, 85, 57) + .music(EndSounds.MUSIC_FOREST) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .feature(EndFeatures.END_LAKE_NORMAL) + .feature(EndFeatures.FLAMAEA) + .feature(EndFeatures.LUCERNIA) + .feature(EndFeatures.LUCERNIA_BUSH) + .feature(EndFeatures.FILALUX) + .feature(EndFeatures.AERIDIUM) + .feature(EndFeatures.LAMELLARIUM) + .feature(EndFeatures.BOLUX_MUSHROOM) + .feature(EndFeatures.AURANT_POLYPORE) + .feature(EndFeatures.POND_ANEMONE) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED) + .feature(EndFeatures.RUSCUS) + .feature(EndFeatures.RUSCUS_WOOD) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.RUTISCUS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java index 36027f3d..e99aeb20 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeBiome.java @@ -1,8 +1,9 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -10,33 +11,52 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class MegalakeBiome extends EndBiome { +public class MegalakeBiome extends EndBiome.Config { public MegalakeBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("megalake")) - .addStructureFeature(EndStructures.MEGALAKE.getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(1.75F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE) - .setSurface(EndBlocks.END_MOSS, EndBlocks.ENDSTONE_DUST) - .setDepth(0F) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 50, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("megalake"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.MEGALAKE.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(178, 209, 248) + .waterAndFogColor(96, 163, 255) + .fogDensity(1.75F) + .music(EndSounds.MUSIC_WATER) + .loop(EndSounds.AMBIENT_MEGALAKE) + //TODO: 1.18 removed + //.depth(0F) + .feature(EndFeatures.END_LOTUS) + .feature(EndFeatures.END_LOTUS_LEAF) + .feature(EndFeatures.BUBBLE_CORAL_RARE) + .feature(EndFeatures.END_LILY_RARE) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .feature(EndFeatures.MENGER_SPONGE) + .spawn(EndEntities.DRAGONFLY, 50, 1, 3) + .spawn(EndEntities.END_FISH, 50, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java index c4dd17a9..10705776 100644 --- a/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/MegalakeGroveBiome.java @@ -1,8 +1,9 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; @@ -11,35 +12,49 @@ import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class MegalakeGroveBiome extends EndBiome { +public class MegalakeGroveBiome extends EndBiome.Config { public MegalakeGroveBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("megalake_grove")) - .addStructureFeature(EndStructures.MEGALAKE_SMALL.getFeatureConfigured()) - .setPlantsColor(73, 210, 209) - .setFogColor(178, 209, 248) - .setWaterAndFogColor(96, 163, 255) - .setFogDensity(2.0F) - .setParticles(EndParticles.GLOWING_SPHERE, 0.001F) - .setMusic(EndSounds.MUSIC_WATER) - .setLoop(EndSounds.AMBIENT_MEGALAKE_GROVE) - .setSurface(EndBlocks.END_MOSS) - .setDepth(0F) - .addFeature(EndFeatures.LACUGROVE) - .addFeature(EndFeatures.END_LOTUS) - .addFeature(EndFeatures.END_LOTUS_LEAF) - .addFeature(EndFeatures.BUBBLE_CORAL_RARE) - .addFeature(EndFeatures.END_LILY_RARE) - .addFeature(EndFeatures.UMBRELLA_MOSS) - //.addFeature(EndFeatures.PEARLBERRY) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addFeature(EndFeatures.MENGER_SPONGE) - .addMobSpawn(EndEntities.DRAGONFLY, 20, 1, 3) - .addMobSpawn(EndEntities.END_FISH, 20, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EndEntities.END_SLIME, 5, 1, 2) - .addMobSpawn(EntityType.ENDERMAN, 10, 1, 2)); + super("megalake_grove"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.MEGALAKE_SMALL.getFeatureConfigured()) + .plantsColor(73, 210, 209) + .fogColor(178, 209, 248) + .waterAndFogColor(96, 163, 255) + .fogDensity(2.0F) + .particles(EndParticles.GLOWING_SPHERE, 0.001F) + .music(EndSounds.MUSIC_WATER) + .loop(EndSounds.AMBIENT_MEGALAKE_GROVE) + //TODO: 1.18 removed + //.depth(0F) + .feature(EndFeatures.LACUGROVE) + .feature(EndFeatures.END_LOTUS) + .feature(EndFeatures.END_LOTUS_LEAF) + .feature(EndFeatures.BUBBLE_CORAL_RARE) + .feature(EndFeatures.END_LILY_RARE) + .feature(EndFeatures.UMBRELLA_MOSS) + //.feature(EndFeatures.PEARLBERRY) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .feature(EndFeatures.MENGER_SPONGE) + .spawn(EndEntities.DRAGONFLY, 20, 1, 3) + .spawn(EndEntities.END_FISH, 20, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EndEntities.END_SLIME, 5, 1, 2) + .spawn(EntityType.ENDERMAN, 10, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java index 10078324..41f078dc 100644 --- a/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/NeonOasisBiome.java @@ -1,34 +1,52 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class NeonOasisBiome extends EndBiome { +public class NeonOasisBiome extends EndBiome.Config { public NeonOasisBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("neon_oasis")) - .setGenChance(0.5F) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(106, 238, 215) - .setSurface(EndBlocks.ENDSTONE_DUST, EndBlocks.END_MOSS) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .addFeature(EndFeatures.DESERT_LAKE) - .addFeature(EndFeatures.NEON_CACTUS) - .addFeature(EndFeatures.UMBRELLA_MOSS) - .addFeature(EndFeatures.CREEPING_MOSS) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_RED) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("neon_oasis"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.genChance(0.5F) + .fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(106, 238, 215) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .music(EndSounds.MUSIC_OPENSPACE) + .feature(EndFeatures.DESERT_LAKE) + .feature(EndFeatures.NEON_CACTUS) + .feature(EndFeatures.UMBRELLA_MOSS) + .feature(EndFeatures.CREEPING_MOSS) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_RED) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.END_MOSS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java index 6dd98733..0f5f0494 100644 --- a/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/PaintedMountainsBiome.java @@ -2,24 +2,38 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndSounds; import ru.betterend.registry.EndStructures; import ru.betterend.world.biome.EndBiome; -public class PaintedMountainsBiome extends EndBiome { +public class PaintedMountainsBiome extends EndBiome.Config { public PaintedMountainsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("painted_mountains")) - .addStructureFeature(EndStructures.PAINTED_MOUNTAIN.getFeatureConfigured()) - .setFogColor(226, 239, 168) - .setFogDensity(2) - .setWaterAndFogColor(192, 180, 131) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_DUST_WASTELANDS) - .setSurface(EndBlocks.ENDSTONE_DUST) - .setParticles(ParticleTypes.WHITE_ASH, 0.01F) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("painted_mountains"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.structure(EndStructures.PAINTED_MOUNTAIN.getFeatureConfigured()) + .fogColor(226, 239, 168) + .fogDensity(2) + .waterAndFogColor(192, 180, 131) + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_DUST_WASTELANDS) + .particles(ParticleTypes.WHITE_ASH, 0.01F) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.ENDSTONE_DUST.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java index 97cf1f6d..2efbe920 100644 --- a/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/ShadowForestBiome.java @@ -1,44 +1,57 @@ package ru.betterend.world.biome.land; import net.minecraft.core.particles.ParticleTypes; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class ShadowForestBiome extends EndBiome { +public class ShadowForestBiome extends EndBiome.Config { public ShadowForestBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("shadow_forest")) - .setFogColor(0, 0, 0) - .setFogDensity(2.5F) - .setPlantsColor(45, 45, 45) - .setWaterAndFogColor(42, 45, 80) - .setSurface(EndBlocks.SHADOW_GRASS) - .setParticles(ParticleTypes.MYCELIUM, 0.01F) - .setLoop(EndSounds.AMBIENT_CHORUS_FOREST) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.VIOLECITE_LAYER) - .addFeature(EndFeatures.END_LAKE_RARE) - .addFeature(EndFeatures.DRAGON_TREE) - .addFeature(EndFeatures.DRAGON_TREE_BUSH) - .addFeature(EndFeatures.SHADOW_PLANT) - .addFeature(EndFeatures.MURKWEED) - .addFeature(EndFeatures.NEEDLEGRASS) - .addFeature(EndFeatures.SHADOW_BERRY) - .addFeature(EndFeatures.TWISTED_VINE) - .addFeature(EndFeatures.PURPLE_POLYPORE) - .addFeature(EndFeatures.TAIL_MOSS) - .addFeature(EndFeatures.TAIL_MOSS_WOOD) - .addFeature(EndFeatures.CHARNIA_PURPLE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EndEntities.SHADOW_WALKER, 80, 2, 4) - .addMobSpawn(EntityType.ENDERMAN, 40, 1, 4) - .addMobSpawn(EntityType.PHANTOM, 1, 1, 2)); + super("shadow_forest"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(0, 0, 0) + .fogDensity(2.5F) + .plantsColor(45, 45, 45) + .waterAndFogColor(42, 45, 80) + .particles(ParticleTypes.MYCELIUM, 0.01F) + .loop(EndSounds.AMBIENT_CHORUS_FOREST) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.VIOLECITE_LAYER) + .feature(EndFeatures.END_LAKE_RARE) + .feature(EndFeatures.DRAGON_TREE) + .feature(EndFeatures.DRAGON_TREE_BUSH) + .feature(EndFeatures.SHADOW_PLANT) + .feature(EndFeatures.MURKWEED) + .feature(EndFeatures.NEEDLEGRASS) + .feature(EndFeatures.SHADOW_BERRY) + .feature(EndFeatures.TWISTED_VINE) + .feature(EndFeatures.PURPLE_POLYPORE) + .feature(EndFeatures.TAIL_MOSS) + .feature(EndFeatures.TAIL_MOSS_WOOD) + .feature(EndFeatures.CHARNIA_PURPLE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EndEntities.SHADOW_WALKER, 80, 2, 4) + .spawn(EntityType.ENDERMAN, 40, 1, 4) + .spawn(EntityType.PHANTOM, 1, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.SHADOW_GRASS.defaultBlockState(); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java index 490874c1..46702131 100644 --- a/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/SulphurSpringsBiome.java @@ -1,38 +1,94 @@ package ru.betterend.world.biome.land; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.Blocks; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.api.surface.rules.SwitchRuleSource; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndEntities; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.surface.SurfaceBuilders; +import ru.betterend.world.surface.SulphuricSurfaceNoiseCondition; -public class SulphurSpringsBiome extends EndBiome { +import java.util.List; + +public class SulphurSpringsBiome extends EndBiome.Config { public SulphurSpringsBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("sulphur_springs")) - .addCustomData("has_caves", false) - .setSurface(SurfaceBuilders.SULPHURIC_SURFACE.configured(SurfaceBuilders.DEFAULT_END_CONFIG)) - .setMusic(EndSounds.MUSIC_OPENSPACE) - .setLoop(EndSounds.AMBIENT_SULPHUR_SPRINGS) - .setWaterColor(25, 90, 157) - .setWaterFogColor(30, 65, 61) - .setFogColor(207, 194, 62) - .setFogDensity(1.5F) - .setDepth(0F) - .setParticles(EndParticles.SULPHUR_PARTICLE, 0.001F) - .addFeature(EndFeatures.GEYSER) - .addFeature(EndFeatures.SURFACE_VENT) - .addFeature(EndFeatures.SULPHURIC_LAKE) - .addFeature(EndFeatures.SULPHURIC_CAVE) - .addFeature(EndFeatures.HYDRALUX) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_ORANGE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addMobSpawn(EndEntities.END_FISH, 50, 3, 8) - .addMobSpawn(EndEntities.CUBOZOA, 50, 3, 8) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 4)); + super("sulphur_springs"); + } + + @Override + protected boolean hasCaves() { + return false; + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder + .music(EndSounds.MUSIC_OPENSPACE) + .loop(EndSounds.AMBIENT_SULPHUR_SPRINGS) + .waterColor(25, 90, 157) + .waterFogColor(30, 65, 61) + .fogColor(207, 194, 62) + .fogDensity(1.5F) + //TODO: 1.18 removed + //.depth(0F) + .particles(EndParticles.SULPHUR_PARTICLE, 0.001F) + .feature(EndFeatures.GEYSER) + .feature(EndFeatures.SURFACE_VENT) + .feature(EndFeatures.SULPHURIC_LAKE) + .feature(EndFeatures.SULPHURIC_CAVE) + .feature(EndFeatures.HYDRALUX) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_ORANGE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .spawn(EndEntities.END_FISH, 50, 3, 8) + .spawn(EndEntities.CUBOZOA, 50, 3, 8) + .spawn(EntityType.ENDERMAN, 50, 1, 4); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.FLAVOLITE.stone.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return Blocks.END_STONE.defaultBlockState(); + } + + @Override + public boolean generateFloorRule() { + return false; + } + + @Override + public SurfaceRuleBuilder surface() { + return super + .surface() + .rule(2, + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, + new SwitchRuleSource( + new SulphuricSurfaceNoiseCondition(), + List.of( + SurfaceRules.state(surfaceMaterial().getAltTopMaterial()), + SurfaceRules.state(surfaceMaterial().getTopMaterial()), + SULPHURIC_ROCK, + BRIMSTONE + ) + ) + ) + ); + } + }; } } 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 efc91e20..5bea07bb 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbraValleyBiome.java @@ -1,27 +1,76 @@ package ru.betterend.world.biome.land; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.levelgen.SurfaceRules; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.api.surface.SurfaceRuleBuilder; +import ru.bclib.api.surface.rules.SwitchRuleSource; +import ru.bclib.interfaces.SurfaceMaterialProvider; +import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -import ru.betterend.world.surface.SurfaceBuilders; +import ru.betterend.world.surface.UmbraSurfaceNoiseCondition; -public class UmbraValleyBiome extends EndBiome { +import java.util.List; + +public class UmbraValleyBiome extends EndBiome.Config { public UmbraValleyBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("umbra_valley")) - .setFogColor(100, 100, 100) - .setPlantsColor(172, 189, 190) - .setWaterAndFogColor(69, 104, 134) - .setSurface(SurfaceBuilders.UMBRA_SURFACE.configured(SurfaceBuilders.DEFAULT_END_CONFIG)) - .setParticles(EndParticles.AMBER_SPHERE, 0.0001F) - .setLoop(EndSounds.UMBRA_VALLEY) - .setMusic(EndSounds.MUSIC_DARK) - .addFeature(EndFeatures.UMBRALITH_ARCH) - .addFeature(EndFeatures.THIN_UMBRALITH_ARCH) - .addFeature(EndFeatures.INFLEXIA) - .addFeature(EndFeatures.FLAMMALIX) - ); + super("umbra_valley"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(100, 100, 100) + .plantsColor(172, 189, 190) + .waterAndFogColor(69, 104, 134) + .particles(EndParticles.AMBER_SPHERE, 0.0001F) + .loop(EndSounds.UMBRA_VALLEY) + .music(EndSounds.MUSIC_DARK) + .feature(EndFeatures.UMBRALITH_ARCH) + .feature(EndFeatures.THIN_UMBRALITH_ARCH) + .feature(EndFeatures.INFLEXIA) + .feature(EndFeatures.FLAMMALIX); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.UMBRALITH.stone.defaultBlockState(); + } + + @Override + public BlockState getAltTopMaterial() { + return EndBlocks.PALLIDIUM_FULL.defaultBlockState(); + } + + @Override + public boolean generateFloorRule() { + return false; + } + + @Override + public SurfaceRuleBuilder surface() { + return super + .surface() + .rule(2, + SurfaceRules.ifTrue(SurfaceRules.ON_FLOOR, + new SwitchRuleSource( + new UmbraSurfaceNoiseCondition(), + List.of( + SurfaceRules.state(surfaceMaterial().getAltTopMaterial()), + PALLIDIUM_HEAVY, + PALLIDIUM_THIN, + PALLIDIUM_TINY, + SurfaceRules.state(surfaceMaterial().getTopMaterial()) + ) + ) + ) + ); + } + }; } } diff --git a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java index ae905948..a14bcec7 100644 --- a/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java +++ b/src/main/java/ru/betterend/world/biome/land/UmbrellaJungleBiome.java @@ -1,44 +1,57 @@ package ru.betterend.world.biome.land; -import net.minecraft.data.worldgen.StructureFeatures; import net.minecraft.world.entity.EntityType; -import ru.bclib.world.biomes.BCLBiomeDef; -import ru.betterend.BetterEnd; +import net.minecraft.world.level.block.state.BlockState; +import ru.bclib.api.biomes.BCLBiomeBuilder; +import ru.bclib.interfaces.SurfaceMaterialProvider; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.registry.EndParticles; import ru.betterend.registry.EndSounds; import ru.betterend.world.biome.EndBiome; -public class UmbrellaJungleBiome extends EndBiome { +public class UmbrellaJungleBiome extends EndBiome.Config { public UmbrellaJungleBiome() { - super(new BCLBiomeDef(BetterEnd.makeID("umbrella_jungle")) - .setFogColor(87, 223, 221) - .setWaterAndFogColor(119, 198, 253) - .setFoliageColor(27, 183, 194) - .setFogDensity(2.3F) - .setParticles(EndParticles.JUNGLE_SPORE, 0.001F) - .setMusic(EndSounds.MUSIC_FOREST) - .setLoop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) - .setSurface(EndBlocks.JUNGLE_MOSS) - .addFeature(EndFeatures.END_LAKE) - .addFeature(EndFeatures.UMBRELLA_TREE) - .addFeature(EndFeatures.JELLYSHROOM) - .addFeature(EndFeatures.TWISTED_UMBRELLA_MOSS) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) - .addFeature(EndFeatures.JUNGLE_GRASS) - .addFeature(EndFeatures.CYAN_MOSS) - .addFeature(EndFeatures.CYAN_MOSS_WOOD) - .addFeature(EndFeatures.JUNGLE_FERN_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WALL) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_WOOD) - .addFeature(EndFeatures.SMALL_JELLYSHROOM_CEIL) - .addFeature(EndFeatures.JUNGLE_VINE) - .addFeature(EndFeatures.CHARNIA_CYAN) - .addFeature(EndFeatures.CHARNIA_GREEN) - .addFeature(EndFeatures.CHARNIA_LIGHT_BLUE) - .addFeature(EndFeatures.CHARNIA_RED_RARE) - .addStructureFeature(StructureFeatures.END_CITY) - .addMobSpawn(EntityType.ENDERMAN, 50, 1, 2)); + super("umbrella_jungle"); + } + + @Override + protected void addCustomBuildData(BCLBiomeBuilder builder) { + builder.fogColor(87, 223, 221) + .waterAndFogColor(119, 198, 253) + .foliageColor(27, 183, 194) + .fogDensity(2.3F) + .particles(EndParticles.JUNGLE_SPORE, 0.001F) + .music(EndSounds.MUSIC_FOREST) + .loop(EndSounds.AMBIENT_UMBRELLA_JUNGLE) + .feature(EndFeatures.END_LAKE) + .feature(EndFeatures.UMBRELLA_TREE) + .feature(EndFeatures.JELLYSHROOM) + .feature(EndFeatures.TWISTED_UMBRELLA_MOSS) + .feature(EndFeatures.SMALL_JELLYSHROOM_FLOOR) + .feature(EndFeatures.JUNGLE_GRASS) + .feature(EndFeatures.CYAN_MOSS) + .feature(EndFeatures.CYAN_MOSS_WOOD) + .feature(EndFeatures.JUNGLE_FERN_WOOD) + .feature(EndFeatures.SMALL_JELLYSHROOM_WALL) + .feature(EndFeatures.SMALL_JELLYSHROOM_WOOD) + .feature(EndFeatures.SMALL_JELLYSHROOM_CEIL) + .feature(EndFeatures.JUNGLE_VINE) + .feature(EndFeatures.CHARNIA_CYAN) + .feature(EndFeatures.CHARNIA_GREEN) + .feature(EndFeatures.CHARNIA_LIGHT_BLUE) + .feature(EndFeatures.CHARNIA_RED_RARE) + .structure(VANILLA_FEATURES.getEND_CITY()) + .spawn(EntityType.ENDERMAN, 50, 1, 2); + } + + @Override + protected SurfaceMaterialProvider surfaceMaterial() { + return new EndBiome.DefaultSurfaceMaterialProvider() { + @Override + public BlockState getTopMaterial() { + return EndBlocks.JUNGLE_MOSS.defaultBlockState(); + } + }; } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java index 22838b86..95e7c05e 100644 --- a/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java +++ b/src/main/java/ru/betterend/world/features/BiomeIslandFeature.java @@ -8,8 +8,6 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderConfiguration; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.operator.SDFTranslate; @@ -17,6 +15,7 @@ import ru.bclib.sdf.primitive.SDFCappedCone; import ru.bclib.util.BlocksHelper; import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; +import ru.betterend.world.biome.EndBiome; public class BiomeIslandFeature extends DefaultFeature { private static final MutableBlockPos CENTER = new MutableBlockPos(); @@ -25,21 +24,24 @@ public class BiomeIslandFeature extends DefaultFeature { private static OpenSimplexNoise simplexNoise = new OpenSimplexNoise(412L); private static BlockState topBlock = Blocks.GRASS_BLOCK.defaultBlockState(); private static BlockState underBlock = Blocks.DIRT.defaultBlockState(); - + @Override public boolean place(FeaturePlaceContext featureConfig) { final BlockPos pos = featureConfig.origin(); final WorldGenLevel world = featureConfig.level(); Biome biome = world.getBiome(pos); - SurfaceBuilderConfiguration surfaceConfig = biome.getGenerationSettings().getSurfaceBuilderConfig(); - BlockState topMaterial = surfaceConfig.getTopMaterial(); + int dist = BlocksHelper.downRay(world, pos, 10) + 1; + BlockPos surfacePos = new BlockPos(pos.getX(), pos.getY()-dist, pos.getZ()); + BlockState topMaterial = EndBiome.findTopMaterial(world, surfacePos);; + if (BlocksHelper.isFluid(topMaterial)) { - topBlock = ((SurfaceBuilderBaseConfiguration) surfaceConfig).getUnderwaterMaterial(); + topBlock = Blocks.GRAVEL.defaultBlockState(); + underBlock = Blocks.STONE.defaultBlockState(); } else { - topBlock = topMaterial; + underBlock = EndBiome.findUnderMaterial(world, surfacePos); } - underBlock = surfaceConfig.getUnderMaterial(); + simplexNoise = new OpenSimplexNoise(world.getSeed()); CENTER.set(pos); ISLAND.fillRecursive(world, pos.below()); diff --git a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java index 185c0901..b6301235 100644 --- a/src/main/java/ru/betterend/world/features/CrashedShipFeature.java +++ b/src/main/java/ru/betterend/world/features/CrashedShipFeature.java @@ -23,6 +23,7 @@ import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; import ru.bclib.world.features.NBTStructureFeature; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; import java.util.Random; @@ -30,7 +31,11 @@ public class CrashedShipFeature extends NBTStructureFeature { private static final StructureProcessor REPLACER; private static final String STRUCTURE_PATH = "/data/minecraft/structures/end_city/ship.nbt"; private StructureTemplate structure; - + + public CrashedShipFeature() { + super(EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); + } + @Override protected StructureTemplate getStructure(WorldGenLevel world, BlockPos pos, Random random) { if (structure == null) { diff --git a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java index 6f114656..8774f75c 100644 --- a/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/DesertLakeFeature.java @@ -16,6 +16,7 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; import java.util.Random; @@ -123,10 +124,7 @@ public class DesertLakeFeature extends DefaultFeature { } pos = POS.below(); if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { - state = world.getBiome(pos) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + state = EndBiome.findTopMaterial(world, pos); //world.getBiome(pos).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) BlocksHelper.setWithoutUpdate( @@ -198,10 +196,7 @@ public class DesertLakeFeature extends DefaultFeature { } else if (y < waterLevel) { if (world.isEmptyBlock(POS.above())) { - state = world.getBiome(POS) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + state = EndBiome.findTopMaterial(world, pos); //world.getBiome(POS).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); BlocksHelper.setWithoutUpdate( world, POS, diff --git a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java index b35a60f2..591c412d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/EndLakeFeature.java @@ -16,6 +16,7 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.util.BlockFixer; +import ru.betterend.world.biome.EndBiome; import java.util.Random; @@ -23,6 +24,10 @@ public class EndLakeFeature extends DefaultFeature { private static final BlockState END_STONE = Blocks.END_STONE.defaultBlockState(); private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(15152); private static final MutableBlockPos POS = new MutableBlockPos(); + + public EndLakeFeature(){ + + } @Override public boolean place(FeaturePlaceContext featureConfig) { @@ -123,10 +128,11 @@ public class EndLakeFeature extends DefaultFeature { } pos = POS.below(); if (world.getBlockState(pos).is(TagAPI.BLOCK_GEN_TERRAIN)) { - state = world.getBiome(pos) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + state = EndBiome.findTopMaterial(world, pos); + //state = world.getBiome(pos) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); if (y > waterLevel + 1) BlocksHelper.setWithoutUpdate(world, pos, state); else if (y > waterLevel) BlocksHelper.setWithoutUpdate( @@ -193,10 +199,11 @@ public class EndLakeFeature extends DefaultFeature { // Make border else if (y < waterLevel && y2 + x2 + z2 <= rb) { if (world.isEmptyBlock(POS.above())) { - state = world.getBiome(POS) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + state = EndBiome.findTopMaterial(world, pos); +// state = world.getBiome(POS) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); BlocksHelper.setWithoutUpdate( world, POS, diff --git a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java index 612fc6e9..632b5101 100644 --- a/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/FloatingSpireFeature.java @@ -8,7 +8,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.primitive.SDFSphere; @@ -16,8 +16,10 @@ import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; import java.util.List; +import java.util.Optional; import java.util.Random; public class FloatingSpireFeature extends SpireFeature { @@ -62,13 +64,14 @@ public class FloatingSpireFeature extends SpireFeature { if (random.nextInt(16) == 0) { support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + return EndBiome.findTopMaterial(world, info.getPos());//world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getUnderMaterial(); + return EndBiome.findUnderMaterial(world, info.getPos()); +// return world.getBiome(info.getPos()) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getUnderMaterial(); } return info.getState(); }); @@ -77,7 +80,7 @@ public class FloatingSpireFeature extends SpireFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { EndFeatures.TENANEA_BUSH.getFeature() - .place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java index ae0aff33..ca9db523 100644 --- a/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/GeyserFeature.java @@ -37,6 +37,7 @@ import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndFeatures; import ru.betterend.util.BlockFixer; +import java.util.Optional; import java.util.Random; import java.util.function.Function; @@ -259,7 +260,7 @@ public class GeyserFeature extends DefaultFeature { } EndFeatures.SULPHURIC_LAKE.getFeature() - .place(new FeaturePlaceContext<>(world, chunkGenerator, random, pos, null)); + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, pos, null)); double distance = radius1 * 1.7; BlockPos start = pos.offset(-distance, -halfHeight - 15 - distance, -distance); diff --git a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java index b8eaf7a6..04440416 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SpireFeature.java @@ -11,8 +11,8 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; import net.minecraft.world.level.material.Material; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFDisplacement; import ru.bclib.sdf.operator.SDFSmoothUnion; @@ -23,8 +23,10 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBiomes; import ru.betterend.registry.EndFeatures; +import ru.betterend.world.biome.EndBiome; import java.util.List; +import java.util.Optional; import java.util.Random; import java.util.function.Function; @@ -65,13 +67,15 @@ public class SpireFeature extends DefaultFeature { if (random.nextInt(16) == 0) { support.add(info.getPos().above()); } - return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + return EndBiome.findTopMaterial(world, info.getPos()); + //return world.getBiome(info.getPos()).getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } else if (info.getState(Direction.UP, 3).isAir()) { - return world.getBiome(info.getPos()) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getUnderMaterial(); + return EndBiome.findUnderMaterial(world, info.getPos()); +// return world.getBiome(info.getPos()) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getUnderMaterial(); } return info.getState(); }).fillRecursive(world, center); @@ -79,7 +83,7 @@ public class SpireFeature extends DefaultFeature { support.forEach((bpos) -> { if (BiomeAPI.getFromBiome(world.getBiome(bpos)) == EndBiomes.BLOSSOMING_SPIRES) { EndFeatures.TENANEA_BUSH.getFeature() - .place(new FeaturePlaceContext<>(world, chunkGenerator, random, bpos, null)); + .place(new FeaturePlaceContext<>(Optional.empty(), world, chunkGenerator, random, bpos, null)); } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java index 8402a245..39c261a1 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricCaveFeature.java @@ -167,7 +167,8 @@ public class SulphuricCaveFeature extends DefaultFeature { state = world.getBlockState(mut); while (state.is(Blocks.WATER)) { BlocksHelper.setWithoutUpdate(world, mut, EndBlocks.VENT_BUBBLE_COLUMN.defaultBlockState()); - world.getBlockTicks() + //TODO: 1.18 test ticks + world/*.getBlockTicks()*/ .scheduleTick(mut, EndBlocks.VENT_BUBBLE_COLUMN, MHelper.randRange(8, 32, random)); mut.setY(mut.getY() + 1); state = world.getBlockState(mut); diff --git a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java index 7d490631..0962cc36 100644 --- a/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/SulphuricLakeFeature.java @@ -75,7 +75,7 @@ public class SulphuricLakeFeature extends DefaultFeature { else { if (!isAbsoluteBorder(world, POS)) { BlocksHelper.setWithoutUpdate(world, POS, Blocks.WATER); - world.getLiquidTicks().scheduleTick(POS, Fluids.WATER, 0); + world.scheduleTick(POS, Fluids.WATER, 0); brimstone.add(POS.below()); if (random.nextBoolean()) { brimstone.add(POS.below(2)); diff --git a/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java b/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java index c85eb980..95bb6edb 100644 --- a/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/ThinArchFeature.java @@ -23,55 +23,55 @@ import ru.betterend.noise.OpenSimplexNoise; import java.util.Random; public class ThinArchFeature extends DefaultFeature { - private Block block; - - public ThinArchFeature(Block block) { - this.block = block; - } - - @Override - public boolean place(FeaturePlaceContext featurePlaceContext) { - final WorldGenLevel world = featurePlaceContext.level(); - BlockPos origin = featurePlaceContext.origin(); - Random random = featurePlaceContext.random(); + private Block block; + + public ThinArchFeature(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; - } - - SDF sdf = null; - float bigRadius = MHelper.randRange(15F, 20F, random); - float variation = bigRadius * 0.3F; - int count = MHelper.randRange(2, 4, random); - - for (int i = 0; i < count; i++) { - float smallRadius = MHelper.randRange(0.6F, 1.3F, random); - SDF arch = new SDFTorus().setBigRadius(bigRadius - random.nextFloat() * variation).setSmallRadius(smallRadius).setBlock(block); - float angle = (i - count * 0.5F) * 0.3F + random.nextFloat() * 0.05F + (float) Math.PI * 0.5F; - arch = new SDFRotation().setRotation(Vector3f.XP, angle).setSource(arch); - sdf = sdf == null ? arch : new SDFUnion().setSourceA(sdf).setSourceB(arch); - } - - sdf = new SDFRotation().setRotation(MHelper.randomHorizontal(random), random.nextFloat() * MHelper.PI2).setSource(sdf); - - OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); - sdf = new SDFCoordModify().setFunction(vec -> { - float dx = (float) noise.eval(vec.y() * 0.02, vec.z() * 0.02); - float dy = (float) noise.eval(vec.x() * 0.02, vec.z() * 0.02); - float dz = (float) noise.eval(vec.x() * 0.02, vec.y() * 0.02); - vec.add(dx * 10, dy * 10, dz * 10); - }).setSource(sdf); - sdf = new SDFDisplacement().setFunction(vec -> { - float offset = vec.y() / bigRadius - 0.5F; - return Mth.clamp(offset * 3, -10F, 0F); - }).setSource(sdf); - - float side = (bigRadius + 2.5F) * 2; - if (side > 47) { - side = 47; - } - sdf.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); - return true; - } + 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; + } + + SDF sdf = null; + float bigRadius = MHelper.randRange(15F, 20F, random); + float variation = bigRadius * 0.3F; + int count = MHelper.randRange(2, 4, random); + + for (int i = 0; i < count; i++) { + float smallRadius = MHelper.randRange(0.6F, 1.3F, random); + SDF arch = new SDFTorus().setBigRadius(bigRadius - random.nextFloat() * variation).setSmallRadius(smallRadius).setBlock(block); + float angle = (i - count * 0.5F) * 0.3F + random.nextFloat() * 0.05F + (float) Math.PI * 0.5F; + arch = new SDFRotation().setRotation(Vector3f.XP, angle).setSource(arch); + sdf = sdf == null ? arch : new SDFUnion().setSourceA(sdf).setSourceB(arch); + } + + sdf = new SDFRotation().setRotation(MHelper.randomHorizontal(random), random.nextFloat() * MHelper.PI2).setSource(sdf); + + OpenSimplexNoise noise = new OpenSimplexNoise(random.nextLong()); + sdf = new SDFCoordModify().setFunction(vec -> { + float dx = (float) noise.eval(vec.y() * 0.02, vec.z() * 0.02); + float dy = (float) noise.eval(vec.x() * 0.02, vec.z() * 0.02); + float dz = (float) noise.eval(vec.x() * 0.02, vec.y() * 0.02); + vec.add(dx * 10, dy * 10, dz * 10); + }).setSource(sdf); + sdf = new SDFDisplacement().setFunction(vec -> { + float offset = vec.y() / bigRadius - 0.5F; + return Mth.clamp(offset * 3, -10F, 0F); + }).setSource(sdf); + + float side = (bigRadius + 2.5F) * 2; + if (side > 47) { + side = 47; + } + sdf.fillArea(world, pos, AABB.ofSize(Vec3.atCenterOf(pos), side, side, side)); + return true; + } } diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java index 9aa57da0..e092dec8 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/CaveChunkPopulatorFeature.java @@ -16,6 +16,7 @@ import ru.bclib.world.features.DefaultFeature; import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; +import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.function.Supplier; @@ -40,7 +41,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { MutableBlockPos max = new MutableBlockPos().set(pos); fillSets(sx, sz, world.getChunk(pos), floorPositions, ceilPositions, min, max); EndCaveBiome biome = supplier.get(); - BlockState surfaceBlock = biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + BlockState surfaceBlock = Blocks.END_STONE.defaultBlockState(); //biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); BlockFixer.fixBlocks(world, min, max); @@ -111,7 +112,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); @@ -127,7 +128,7 @@ public class CaveChunkPopulatorFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java index 7f7d7d36..9505cdae 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/EndCaveFeature.java @@ -14,9 +14,8 @@ import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; -import ru.bclib.interfaces.BiomeSetter; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.bclib.world.biomes.BCLBiome; @@ -26,6 +25,7 @@ import ru.betterend.util.BlockFixer; import ru.betterend.world.biome.cave.EndCaveBiome; import java.util.List; +import java.util.Optional; import java.util.Random; import java.util.Set; @@ -74,10 +74,8 @@ public abstract class EndCaveFeature extends DefaultFeature { } } }); - BlockState surfaceBlock = biome.getBiome() - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + + BlockState surfaceBlock = Blocks.END_STONE.defaultBlockState(); //biome.getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); placeCeil(world, biome, ceilPositions, random); placeWalls(world, biome, caveBlocks, random); @@ -99,7 +97,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); @@ -115,7 +113,7 @@ public abstract class EndCaveFeature extends DefaultFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); @@ -153,12 +151,13 @@ public abstract class EndCaveFeature extends DefaultFeature { protected void setBiomes(WorldGenLevel world, EndCaveBiome biome, Set blocks) { blocks.forEach((pos) -> setBiome(world, pos, biome)); } - + protected void setBiome(WorldGenLevel world, BlockPos pos, EndCaveBiome biome) { - BiomeSetter array = (BiomeSetter) world.getChunk(pos).getBiomes(); - if (array != null) { - array.bclib_setBiome(biome.getActualBiome(), pos); - } + //TODO: 1.18 No longer implemented in BCLib +// BiomeSetter array = (BiomeSetter) world.getChunk(pos).getBiomes(); +// if (array != null) { +// array.bclib_setBiome(biome.getActualBiome(), pos); +// } } private BlockPos findPos(WorldGenLevel world, BlockPos pos, int radius, Random random) { diff --git a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java index 95400bb8..8f95755d 100644 --- a/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java +++ b/src/main/java/ru/betterend/world/features/terrain/caves/TunelCaveFeature.java @@ -15,8 +15,8 @@ import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.Feature; import net.minecraft.world.level.levelgen.feature.FeaturePlaceContext; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; @@ -24,6 +24,7 @@ import ru.betterend.registry.EndBiomes; import ru.betterend.world.biome.cave.EndCaveBiome; import java.util.Map; +import java.util.Optional; import java.util.Random; import java.util.Set; import java.util.stream.IntStream; @@ -166,10 +167,11 @@ public class TunelCaveFeature extends EndCaveFeature { } floorSets.forEach((biome, floorPositions) -> { - BlockState surfaceBlock = biome.getBiome() - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + BlockState surfaceBlock = Blocks.END_STONE.defaultBlockState(); +// BlockState surfaceBlock = biome.getBiome() +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); placeFloor(world, biome, floorPositions, random, surfaceBlock); }); ceilSets.forEach((biome, ceilPositions) -> { @@ -197,7 +199,7 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getFloorFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.above(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.above(), null)); } } }); @@ -214,7 +216,7 @@ public class TunelCaveFeature extends EndCaveFeature { if (density > 0 && random.nextFloat() <= density) { Feature feature = biome.getCeilFeature(random); if (feature != null) { - feature.place(new FeaturePlaceContext<>(world, null, random, pos.below(), null)); + feature.place(new FeaturePlaceContext<>(Optional.empty(), world, null, random, pos.below(), null)); } } }); diff --git a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java index 4e404a6f..79f0850d 100644 --- a/src/main/java/ru/betterend/world/generator/GeneratorOptions.java +++ b/src/main/java/ru/betterend/world/generator/GeneratorOptions.java @@ -22,9 +22,9 @@ public class GeneratorOptions { private static BlockPos spawn; private static boolean replacePortal; private static boolean replacePillars; - private static long islandDistBlock; private static int islandDistChunk; private static boolean directSpikeHeight; + private static int circleRadius = 1000; public static void init() { biomeSizeCaves = Configs.GENERATOR_CONFIG.getInt("biomeMap", "biomeSizeCaves", 32); @@ -76,8 +76,7 @@ public class GeneratorOptions { ); replacePortal = Configs.GENERATOR_CONFIG.getBoolean("portal", "customEndPortal", true); replacePillars = Configs.GENERATOR_CONFIG.getBoolean("spikes", "customObsidianSpikes", true); - int circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); - islandDistBlock = (long) circleRadius * (long) circleRadius; + circleRadius = Configs.GENERATOR_CONFIG.getInt("customGenerator", "voidRingSize", 1000); islandDistChunk = (circleRadius >> 3); // Twice bigger than normal } @@ -137,8 +136,8 @@ public class GeneratorOptions { return replacePillars; } - public static long getIslandDistBlock() { - return islandDistBlock; + public static int getIslandDistBlock() { + return circleRadius; } public static int getIslandDistChunk() { diff --git a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java index e013b896..afe82b9c 100644 --- a/src/main/java/ru/betterend/world/generator/TerrainGenerator.java +++ b/src/main/java/ru/betterend/world/generator/TerrainGenerator.java @@ -3,9 +3,11 @@ package ru.betterend.world.generator; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import net.minecraft.util.Mth; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.biome.BiomeSource; +import net.minecraft.world.level.biome.Climate.Sampler; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.MHelper; +import ru.bclib.world.biomes.BCLBiome; import ru.betterend.noise.OpenSimplexNoise; import java.awt.Point; @@ -28,8 +30,10 @@ public class TerrainGenerator { private static IslandLayer smallIslands; private static OpenSimplexNoise noise1; private static OpenSimplexNoise noise2; + private static BiomeSource biomeSource; + private static Sampler sampler; - public static void initNoise(long seed) { + public static void initNoise(long seed, BiomeSource biomeSource, Sampler sampler) { Random random = new Random(seed); largeIslands = new IslandLayer(random.nextInt(), GeneratorOptions.bigOptions); mediumIslands = new IslandLayer(random.nextInt(), GeneratorOptions.mediumOptions); @@ -37,15 +41,19 @@ public class TerrainGenerator { noise1 = new OpenSimplexNoise(random.nextInt()); noise2 = new OpenSimplexNoise(random.nextInt()); TERRAIN_BOOL_CACHE_MAP.clear(); + TerrainGenerator.biomeSource = biomeSource; + TerrainGenerator.sampler = sampler; } - public static void fillTerrainDensity(double[] buffer, int x, int z, BiomeSource biomeSource) { + public static void fillTerrainDensity(double[] buffer, int posX, int posZ, int scaleXZ, int scaleY) { LOCKER.lock(); largeIslands.clearCache(); mediumIslands.clearCache(); smallIslands.clearCache(); + int x = Mth.floor(posX / scaleXZ); + int z = Mth.floor(posZ / scaleXZ); double distortion1 = noise1.eval(x * 0.1, z * 0.1) * 20 + noise2.eval( x * 0.2, z * 0.2 @@ -54,17 +62,17 @@ public class TerrainGenerator { x * 0.2, z * 0.2 ) * 10 + noise2.eval(x * 0.4, z * 0.4) * 5; - double px = (double) x * SCALE_XZ + distortion1; - double pz = (double) z * SCALE_XZ + distortion2; + double px = (double) x * scaleXZ + distortion1; + double pz = (double) z * scaleXZ + distortion2; largeIslands.updatePositions(px, pz); mediumIslands.updatePositions(px, pz); smallIslands.updatePositions(px, pz); - float height = getAverageDepth(biomeSource, x << 1, z << 1) * 0.5F; + float height = getAverageDepth(x << 1, z << 1) * 0.5F; for (int y = 0; y < buffer.length; y++) { - double py = (double) y * SCALE_Y; + double py = (double) y * scaleY; float dist = largeIslands.getDensity(px, py, pz, height); dist = dist > 1 ? dist : MHelper.max(dist, mediumIslands.getDensity(px, py, pz, height)); dist = dist > 1 ? dist : MHelper.max(dist, smallIslands.getDensity(px, py, pz, height)); @@ -82,30 +90,48 @@ public class TerrainGenerator { LOCKER.unlock(); } - private static float getAverageDepth(BiomeSource biomeSource, int x, int z) { - if (getBiome(biomeSource, x, z).getDepth() < 0.1F) { + private static float getAverageDepth(int x, int z) { + if (biomeSource == null) { + return 0; + } + if (getBiome(biomeSource, x, z).getTerrainHeight() < 0.1F) { return 0F; } float depth = 0F; for (int i = 0; i < OFFS.length; i++) { int px = x + OFFS[i].x; int pz = z + OFFS[i].y; - depth += getBiome(biomeSource, px, pz).getDepth() * COEF[i]; + depth += getBiome(biomeSource, px, pz).getTerrainHeight() * COEF[i]; } return depth; } - private static Biome getBiome(BiomeSource biomeSource, int x, int z) { - return biomeSource.getNoiseBiome(x, 0, z); + private static BCLBiome getBiome(BiomeSource biomeSource, int x, int z) { + return BiomeAPI.getBiome(biomeSource.getNoiseBiome(x, 0, z, sampler)); } - /** - * Check if this is land - * - * @param x - biome pos x - * @param z - biome pos z - */ - public static boolean isLand(int x, int z) { + static { + float sum = 0; + List coef = Lists.newArrayList(); + List pos = Lists.newArrayList(); + for (int x = -3; x <= 3; x++) { + for (int z = -3; z <= 3; z++) { + float dist = MHelper.length(x, z) / 3F; + if (dist <= 1) { + sum += dist; + coef.add(dist); + pos.add(new Point(x, z)); + } + } + } + OFFS = pos.toArray(new Point[] {}); + COEF = new float[coef.size()]; + for (int i = 0; i < COEF.length; i++) { + COEF[i] = coef.get(i) / sum; + } + } + + public static Boolean isLand(int x, int z) { int sectionX = TerrainBoolCache.scaleCoordinate(x); int sectionZ = TerrainBoolCache.scaleCoordinate(z); @@ -166,83 +192,4 @@ public class TerrainGenerator { return result; } - - /** - * Get something like height - * - * @param x - block pos x - * @param z - block pos z - */ - public static int getHeight(int x, int z, BiomeSource biomeSource) { - int posX = (x >> 3) << 3; - int posZ = (z >> 3) << 3; - float dx = (x - posX) / 8.0F; - float dz = (z - posZ) / 8.0F; - double[][][] buffer = new double[2][2][32]; - - LOCKER.lock(); - for (int i = 0; i < 4; i++) { - int ix = i & 1; - int iz = i >> 1; - int px = ((ix << 3) + posX) >> 3; - int pz = ((iz << 3) + posZ) >> 3; - fillTerrainDensity(buffer[ix][iz], px, pz, biomeSource); - } - LOCKER.unlock(); - - for (int j = 30; j >= 0; j--) { - float a = (float) buffer[0][0][j]; - float b = (float) buffer[1][0][j]; - float c = (float) buffer[0][1][j]; - float d = (float) buffer[1][1][j]; - - float e = (float) buffer[0][0][j + 1]; - float f = (float) buffer[1][0][j + 1]; - float g = (float) buffer[0][1][j + 1]; - float h = (float) buffer[1][1][j + 1]; - - if (a < 0 && b < 0 && c < 0 && d < 0 && e < 0 && f < 0 && g < 0 && h < 0) { - continue; - } - - a = Mth.lerp(dx, a, b); - b = Mth.lerp(dx, c, d); - c = Mth.lerp(dx, e, f); - d = Mth.lerp(dx, g, h); - - a = Mth.lerp(dz, a, b); - b = Mth.lerp(dz, c, d); - - for (int n = 7; n >= 0; n--) { - float dy = n / 8.0F; - float dens = Mth.lerp(dy, a, b); - if (dens > 0) { - return (j << 3 | n) + 1; - } - } - } - - return -256; - } - - static { - float sum = 0; - List coef = Lists.newArrayList(); - List pos = Lists.newArrayList(); - for (int x = -3; x <= 3; x++) { - for (int z = -3; z <= 3; z++) { - float dist = MHelper.length(x, z) / 3F; - if (dist <= 1) { - sum += dist; - coef.add(dist); - pos.add(new Point(x, z)); - } - } - } - OFFS = pos.toArray(new Point[] {}); - COEF = new float[coef.size()]; - for (int i = 0; i < COEF.length; i++) { - COEF[i] = coef.get(i) / sum; - } - } } diff --git a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java index 4b9d0735..dd27ed41 100644 --- a/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/EternalPortalStructure.java @@ -1,80 +1,73 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.resources.ResourceLocation; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.WorldgenRandom; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.util.StructureHelper; +import ru.bclib.world.structures.BCLStructureFeature; import ru.betterend.BetterEnd; import ru.betterend.world.structures.piece.NBTPiece; +import java.util.Random; + public class EternalPortalStructure extends FeatureBaseStructure { private static final ResourceLocation STRUCTURE_ID = BetterEnd.makeID("portal/eternal_portal"); private static final StructureTemplate STRUCTURE = StructureHelper.readStructure(STRUCTURE_ID); - - @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { + + public EternalPortalStructure() { + super(PieceGeneratorSupplier.simple( + EternalPortalStructure::checkLocation, + EternalPortalStructure::generatePieces + )); + } + + protected static boolean checkLocation(PieceGeneratorSupplier.Context context) { + if (!BCLStructureFeature.isValidBiome(context)) return false; + + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + long x = (long) chunkPos.x * (long) chunkPos.x; long z = (long) chunkPos.z * (long) chunkPos.z; if (x + z < 1024L) { return false; } if (chunkGenerator.getBaseHeight( - pos.getBlockX(8), - pos.getBlockX(8), - Heightmap.Types.WORLD_SURFACE_WG, - levelHeightAccessor + chunkPos.getBlockX(8), + chunkPos.getBlockZ(8), + Heightmap.Types.WORLD_SURFACE_WG, + levelHeightAccessor ) < 5) { return false; } - return super.isFeatureChunk( - chunkGenerator, - biomeSource, - worldSeed, - chunkRandom, - pos, - biome, - chunkPos, - featureConfig, - levelHeightAccessor - ); + return FeatureBaseStructure.checkLocation(context); } - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return PortalStructureStart::new; - } - - public static class PortalStructureStart extends StructureStart { - public PortalStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { - super(feature, pos, references, seed); - } - - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(8); - int z = chunkPos.getBlockZ(8); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - this.pieces.add(new NBTPiece( + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + int x = chunkPos.getBlockX(8); + int z = chunkPos.getBlockZ(8); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + structurePiecesBuilder.addPiece(new NBTPiece( STRUCTURE_ID, STRUCTURE, new BlockPos(x, y - 4, z), random.nextInt(5), true, random - )); - } + )); } } diff --git a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java index ff3b5ad5..e40adc52 100644 --- a/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/FeatureBaseStructure.java @@ -2,29 +2,27 @@ package ru.betterend.world.structures.features; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.BiomeSource; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; -import net.minecraft.world.level.levelgen.WorldgenRandom; import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import ru.bclib.world.structures.BCLStructureFeature; import java.util.Random; public abstract class FeatureBaseStructure extends StructureFeature { protected static final BlockState AIR = Blocks.AIR.defaultBlockState(); - public FeatureBaseStructure() { - super(NoneFeatureConfiguration.CODEC); + public FeatureBaseStructure(PieceGeneratorSupplier pieceGeneratorSupplier) { + super(NoneFeatureConfiguration.CODEC, pieceGeneratorSupplier); } - - @Override - protected boolean isFeatureChunk(ChunkGenerator chunkGenerator, BiomeSource biomeSource, long worldSeed, WorldgenRandom chunkRandom, ChunkPos pos, Biome biome, ChunkPos chunkPos, NoneFeatureConfiguration featureConfig, LevelHeightAccessor levelHeightAccessor) { - return getGenerationHeight(pos, chunkGenerator, levelHeightAccessor) >= 20; + + protected static boolean checkLocation(PieceGeneratorSupplier.Context context) { + return getGenerationHeight(context.chunkPos(), context.chunkGenerator(), context.heightAccessor()) >= 20 && BCLStructureFeature.isValidBiome(context); } private static int getGenerationHeight(ChunkPos chunkPos, ChunkGenerator chunkGenerator, LevelHeightAccessor levelHeightAccessor) { diff --git a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java index 526f567a..737ec6f4 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantIceStarStructure.java @@ -2,16 +2,13 @@ package ru.betterend.world.structures.features; import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFRotation; import ru.bclib.sdf.operator.SDFTranslate; @@ -26,13 +23,16 @@ import java.util.List; import java.util.Random; public class GiantIceStarStructure extends SDFStructureFeature { - private final float minSize = 20; - private final float maxSize = 35; - private final int minCount = 25; - private final int maxCount = 40; - - @Override - protected SDF getSDF(BlockPos pos, Random random) { + private static final float minSize = 20; + private static final float maxSize = 35; + private static final int minCount = 25; + private static final int maxCount = 40; + + public GiantIceStarStructure() { + super(GiantIceStarStructure::generatePieces); + } + + protected static SDF getSDF(BlockPos pos, Random random) { float size = MHelper.randRange(minSize, maxSize, random); int count = MHelper.randRange(minCount, maxCount, random); List points = getFibonacciPoints(count); @@ -90,7 +90,7 @@ public class GiantIceStarStructure extends SDFStructureFeature { }); } - private List getFibonacciPoints(int count) { + private static List getFibonacciPoints(int count) { float max = count - 1; List result = new ArrayList(count); for (int i = 0; i < count; i++) { @@ -103,28 +103,21 @@ public class GiantIceStarStructure extends SDFStructureFeature { } return result; } - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return StarStructureStart::new; - } - - public static class StarStructureStart extends StructureStart { - public StarStructureStart(StructureFeature feature, ChunkPos pos, int references, long seed) { - super(feature, pos, references, seed); - } - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); - BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); - VoxelPiece piece = new VoxelPiece((world) -> { - ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); - }, random.nextInt()); - this.pieces.add(piece); - - //this.calculateBoundingBox(); - } + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + BlockPos start = new BlockPos(x, MHelper.randRange(32, 128, random), z); + VoxelPiece piece = new VoxelPiece((world) -> { + getSDF(start, random).fillRecursive(world, start); + }, random.nextInt()); + structurePiecesBuilder.addPiece(piece); + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java index 94607759..691558b1 100644 --- a/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/GiantMossyGlowshroomStructure.java @@ -3,6 +3,9 @@ package ru.betterend.world.structures.features; import com.mojang.math.Vector3f; import net.minecraft.core.BlockPos; import net.minecraft.core.Direction; +import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.sdf.operator.SDFBinary; import ru.bclib.sdf.operator.SDFCoordModify; @@ -29,8 +32,15 @@ import java.util.List; import java.util.Random; public class GiantMossyGlowshroomStructure extends SDFStructureFeature { - @Override - protected SDF getSDF(BlockPos center, Random random) { + public GiantMossyGlowshroomStructure() { + super(GiantMossyGlowshroomStructure::generatePieces); + } + + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + SDFStructureFeature.generatePieces(structurePiecesBuilder, context, GiantMossyGlowshroomStructure::getSDF); + } + + protected static SDF getSDF(BlockPos center, Random random) { SDFCappedCone cone1 = new SDFCappedCone().setHeight(2.5F).setRadius1(1.5F).setRadius2(2.5F); SDFCappedCone cone2 = new SDFCappedCone().setHeight(3F).setRadius1(2.5F).setRadius2(13F); SDF posedCone2 = new SDFTranslate().setTranslate(0, 5, 0).setSource(cone2); diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java index 118b1f18..5db2baca 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeSmallStructure.java @@ -1,43 +1,47 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; +import java.util.Random; + public class MegaLakeSmallStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + public MegaLakeSmallStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MegaLakeSmallStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { - super(feature, chunkPos, references, seed); - } + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - if (y > 5) { - float radius = MHelper.randRange(20, 40, random); - float depth = MHelper.randRange(5, 10, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.pieces.add(piece); - } - - //this.calculateBoundingBox(); + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); + if (y > 5) { + float radius = MHelper.randRange(20, 40, random); + float depth = MHelper.randRange(5, 10, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + structurePiecesBuilder.addPiece(piece); } + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java index fd19a701..c26342a3 100644 --- a/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MegaLakeStructure.java @@ -1,43 +1,50 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.LakePiece; +import java.util.Random; + public class MegaLakeStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + + + public MegaLakeStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MegaLakeStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { - super(feature, chunkPos, references, seed); - } - - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - if (y > 5) { - float radius = MHelper.randRange(32, 64, random); - float depth = MHelper.randRange(7, 15, random); - LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); - this.pieces.add(piece); - } - - //this.calculateBoundingBox(); + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + + if (y > 5) { + Biome biome = chunkGenerator.getNoiseBiome(x >> 2, y >> 2, z >> 2); + + float radius = MHelper.randRange(32, 64, random); + float depth = MHelper.randRange(7, 15, random); + LakePiece piece = new LakePiece(new BlockPos(x, y, z), radius, depth, random, biome); + structurePiecesBuilder.addPiece(piece); } + + //this.calculateBoundingBox(); } + } diff --git a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java index 8f61a6f9..fa75499d 100644 --- a/src/main/java/ru/betterend/world/structures/features/MountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/MountainStructure.java @@ -1,49 +1,55 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.CrystalMountainPiece; +import java.util.Random; + public class MountainStructure extends FeatureBaseStructure { - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + + public MountainStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + MountainStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { - super(feature, chunkPos, references, seed); - } - - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - if (y > 5) { - float radius = MHelper.randRange(50, 100, random); - float height = radius * MHelper.randRange(0.8F, 1.2F, random); - CrystalMountainPiece piece = new CrystalMountainPiece( + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + if (y > 5) { + //TODO: 1.18 right way to get biome? + Biome biome = chunkGenerator.getNoiseBiome(x, y, z); + + float radius = MHelper.randRange(50, 100, random); + float height = radius * MHelper.randRange(0.8F, 1.2F, random); + CrystalMountainPiece piece = new CrystalMountainPiece( new BlockPos(x, y, z), radius, height, random, biome - ); - this.pieces.add(piece); - } - - //this.calculateBoundingBox(); + ); + structurePiecesBuilder.addPiece(piece); } + + //this.calculateBoundingBox(); } } + diff --git a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java index d67faea4..f9471435 100644 --- a/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java +++ b/src/main/java/ru/betterend/world/structures/features/PaintedMountainStructure.java @@ -1,7 +1,6 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; import net.minecraft.world.level.biome.Biome; @@ -9,33 +8,39 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.world.structures.piece.PaintedMountainPiece; +import java.util.Random; + public class PaintedMountainStructure extends FeatureBaseStructure { private static final BlockState[] VARIANTS; - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + + public PaintedMountainStructure() { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + PaintedMountainStructure::generatePieces + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { - super(feature, chunkPos, references, seed); - } - - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + + protected static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); if (y > 50) { + //TODO: 1.18 right way to get biome? + Biome biome = chunkGenerator.getNoiseBiome(x, y, z); + float radius = MHelper.randRange(50, 100, random); float height = radius * MHelper.randRange(0.4F, 0.6F, random); int count = MHelper.floor(height * MHelper.randRange(0.1F, 0.35F, random) + 1); @@ -43,12 +48,12 @@ public class PaintedMountainStructure extends FeatureBaseStructure { for (int i = 0; i < count; i++) { slises[i] = VARIANTS[random.nextInt(VARIANTS.length)]; } - this.pieces.add(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); + structurePiecesBuilder.addPiece(new PaintedMountainPiece(new BlockPos(x, y, z), radius, height, random, biome, slises)); } //this.calculateBoundingBox(); } - } + static { VARIANTS = new BlockState[] { diff --git a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java index 4e4e565e..81af3526 100644 --- a/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java +++ b/src/main/java/ru/betterend/world/structures/features/SDFStructureFeature.java @@ -1,50 +1,46 @@ package ru.betterend.world.structures.features; import net.minecraft.core.BlockPos; -import net.minecraft.core.RegistryAccess; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.LevelHeightAccessor; -import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; -import net.minecraft.world.level.levelgen.feature.StructureFeature; import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration; -import net.minecraft.world.level.levelgen.structure.StructureStart; -import net.minecraft.world.level.levelgen.structure.templatesystem.StructureManager; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGenerator; +import net.minecraft.world.level.levelgen.structure.pieces.PieceGeneratorSupplier; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder; import ru.bclib.sdf.SDF; import ru.bclib.util.MHelper; import ru.betterend.world.structures.piece.VoxelPiece; import java.util.Random; +import java.util.function.BiFunction; public abstract class SDFStructureFeature extends FeatureBaseStructure { - - protected abstract SDF getSDF(BlockPos pos, Random random); - - @Override - public StructureFeature.StructureStartFactory getStartFactory() { - return SDFStructureStart::new; + public SDFStructureFeature(PieceGenerator generator) { + super(PieceGeneratorSupplier.simple( + FeatureBaseStructure::checkLocation, + generator + )); } - - public static class SDFStructureStart extends StructureStart { - public SDFStructureStart(StructureFeature feature, ChunkPos chunkPos, int references, long seed) { - super(feature, chunkPos, references, seed); - } - - @Override - public void generatePieces(RegistryAccess registryManager, ChunkGenerator chunkGenerator, StructureManager structureManager, ChunkPos chunkPos, Biome biome, NoneFeatureConfiguration featureConfiguration, LevelHeightAccessor levelHeightAccessor) { - int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); - int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); - int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); - if (y > 5) { - BlockPos start = new BlockPos(x, y, z); - VoxelPiece piece = new VoxelPiece((world) -> { - ((SDFStructureFeature) this.getFeature()).getSDF(start, this.random).fillRecursive(world, start); - }, random.nextInt()); - this.pieces.add(piece); - } - - //this.calculateBoundingBox(); + + public static void generatePieces(StructurePiecesBuilder structurePiecesBuilder, PieceGenerator.Context context, BiFunction sdf) { + final Random random = context.random(); + final ChunkPos chunkPos = context.chunkPos(); + final ChunkGenerator chunkGenerator = context.chunkGenerator(); + final LevelHeightAccessor levelHeightAccessor = context.heightAccessor(); + int x = chunkPos.getBlockX(MHelper.randRange(4, 12, random)); + int z = chunkPos.getBlockZ(MHelper.randRange(4, 12, random)); + int y = chunkGenerator.getBaseHeight(x, z, Types.WORLD_SURFACE_WG, levelHeightAccessor); + if (y > 5) { + BlockPos start = new BlockPos(x, y, z); + VoxelPiece piece = new VoxelPiece((world) -> { + sdf.apply(start, random).fillRecursive(world, start); + }, random.nextInt()); + + structurePiecesBuilder.addPiece(piece); } + + //this.calculateBoundingBox(); } } diff --git a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java index c629d35e..9122c8fa 100644 --- a/src/main/java/ru/betterend/world/structures/piece/BasePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/BasePiece.java @@ -4,6 +4,7 @@ import net.minecraft.nbt.CompoundTag; import net.minecraft.world.level.levelgen.feature.StructurePieceType; import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.StructurePiece; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; public abstract class BasePiece extends StructurePiece { protected BasePiece(StructurePieceType type, int i, BoundingBox boundingBox) { @@ -16,4 +17,11 @@ public abstract class BasePiece extends StructurePiece { } protected abstract void fromNbt(CompoundTag tag); + + protected void addAdditionalSaveData(CompoundTag tag) {} + + @Override + protected void addAdditionalSaveData(StructurePieceSerializationContext structurePieceSerializationContext, CompoundTag compoundTag) { + addAdditionalSaveData(compoundTag); + } } \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java index 3de511f7..bd9ecbbf 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CavePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CavePiece.java @@ -4,13 +4,13 @@ import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.api.TagAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; @@ -32,13 +32,14 @@ public class CavePiece extends BasePiece { makeBoundingBox(); } - public CavePiece(ServerLevel serverLevel, CompoundTag tag) { + public CavePiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.CAVE_PIECE, tag); makeBoundingBox(); } - + + @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int x1 = MHelper.max(this.boundingBox.minX(), blockBox.minX()); int z1 = MHelper.max(this.boundingBox.minZ(), blockBox.minZ()); int x2 = MHelper.min(this.boundingBox.maxX(), blockBox.maxX()); @@ -79,11 +80,11 @@ public class CavePiece extends BasePiece { } } - return true; + return; } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); } diff --git a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java index 9d16fd65..60acae3b 100644 --- a/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/CrystalMountainPiece.java @@ -3,7 +3,6 @@ package ru.betterend.world.structures.piece; import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -16,11 +15,13 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import ru.bclib.api.BiomeAPI; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.MHelper; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; import java.util.Random; @@ -29,21 +30,21 @@ public class CrystalMountainPiece extends MountainPiece { public CrystalMountainPiece(BlockPos center, float radius, float height, Random random, Biome biome) { super(EndStructures.MOUNTAIN_PIECE, center, radius, height, random, biome); - top = biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + top = EndBiome.findTopMaterial(biome); //biome.getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } - public CrystalMountainPiece(ServerLevel serverLevel, CompoundTag tag) { - super(EndStructures.MOUNTAIN_PIECE, serverLevel, tag); + public CrystalMountainPiece(StructurePieceSerializationContext type, CompoundTag tag) { + super(EndStructures.MOUNTAIN_PIECE, tag); } @Override protected void fromNbt(CompoundTag tag) { super.fromNbt(tag); - top = BiomeAPI.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); + top = EndBiome.findTopMaterial(BiomeAPI.getBiome(biomeID)); //BiomeAPI.getBiome(biomeID).getBiome().getGenerationSettings().getSurfaceBuilderConfig().getTopMaterial(); } @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getMinBlockX(); int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); @@ -138,8 +139,6 @@ public class CrystalMountainPiece extends MountainPiece { } } } - - return true; } private void crystal(ChunkAccess chunk, BlockPos pos, int radius, int height, float fill, Random random) { diff --git a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java index eabc553f..2588ddd3 100644 --- a/src/main/java/ru/betterend/world/structures/piece/LakePiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/LakePiece.java @@ -8,7 +8,6 @@ import net.minecraft.core.SectionPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; @@ -20,14 +19,16 @@ import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.level.material.FluidState; -import ru.bclib.api.BiomeAPI; import ru.bclib.api.TagAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.BlocksHelper; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; import ru.betterend.registry.EndBlocks; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; import java.util.Map; import java.util.Random; @@ -57,13 +58,13 @@ public class LakePiece extends BasePiece { makeBoundingBox(); } - public LakePiece(ServerLevel serverLevel, CompoundTag tag) { + public LakePiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.LAKE_PIECE, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("depth", depth); @@ -83,7 +84,7 @@ public class LakePiece extends BasePiece { } @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int minY = this.boundingBox.minY(); int maxY = this.boundingBox.maxY(); int sx = SectionPos.sectionToBlockCoord(chunkPos.x); @@ -131,10 +132,11 @@ public class LakePiece extends BasePiece { )) { state = chunk.getBlockState(mut.above()); if (state.isAir()) { - state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + state = EndBiome.findTopMaterial(world, worldPos); +// state = random.nextBoolean() ? ENDSTONE : world.getBiome(worldPos) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); } else { state = state.getFluidState() @@ -147,7 +149,6 @@ public class LakePiece extends BasePiece { } } fixWater(world, chunk, mut, random, sx, sz); - return true; } private void fixWater(WorldGenLevel world, ChunkAccess chunk, MutableBlockPos mut, Random random, int sx, int sz) { @@ -167,10 +168,11 @@ public class LakePiece extends BasePiece { BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + bState = EndBiome.findTopMaterial(world, mut.offset(sx, 0, sz)); +// bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); } else { bState = bState.getFluidState() @@ -189,10 +191,11 @@ public class LakePiece extends BasePiece { mut.setY(y + 1); BlockState bState = chunk.getBlockState(mut); if (bState.isAir()) { - bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)) - .getGenerationSettings() - .getSurfaceBuilderConfig() - .getTopMaterial(); + bState =EndBiome.findTopMaterial(world, mut.offset(sx, 0, sz)); +// bState = random.nextBoolean() ? ENDSTONE : world.getBiome(mut.offset(sx, 0, sz)) +// .getGenerationSettings() +// .getSurfaceBuilderConfig() +// .getTopMaterial(); } else { bState = bState.getFluidState() @@ -205,7 +208,9 @@ public class LakePiece extends BasePiece { } } else if (chunk.getBlockState(mut.move(Direction.UP)).isAir()) { - chunk.getLiquidTicks().scheduleTick(mut.move(Direction.DOWN), state.getType(), 0); + //TODO: 1.18 test if this is thr right tick + chunk.markPosForPostprocessing(mut.move(Direction.DOWN)); +// /*chunk.getLiquidTicks()*/world.scheduleTick(mut.move(Direction.DOWN), state.getType(), 0); } } } diff --git a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java index 7d95ab4b..896f7099 100644 --- a/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/MountainPiece.java @@ -6,14 +6,13 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.util.Mth; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.biome.Biome; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.feature.StructurePieceType; import net.minecraft.world.level.levelgen.structure.BoundingBox; -import ru.bclib.api.BiomeAPI; +import ru.bclib.api.biomes.BiomeAPI; import ru.bclib.util.MHelper; import ru.betterend.noise.OpenSimplexNoise; @@ -46,13 +45,13 @@ public abstract class MountainPiece extends BasePiece { makeBoundingBox(); } - public MountainPiece(StructurePieceType type, ServerLevel serverLevel, CompoundTag tag) { + public MountainPiece(StructurePieceType type, CompoundTag tag) { super(type, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("center", NbtUtils.writeBlockPos(center)); tag.putFloat("radius", radius); tag.putFloat("height", height); diff --git a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java index 061a2b20..b4112065 100644 --- a/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/NBTPiece.java @@ -5,7 +5,6 @@ import net.minecraft.core.Vec3i; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.NbtUtils; import net.minecraft.resources.ResourceLocation; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -13,11 +12,13 @@ import net.minecraft.world.level.block.Mirror; import net.minecraft.world.level.block.Rotation; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import net.minecraft.world.level.levelgen.structure.templatesystem.StructurePlaceSettings; import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate; import ru.bclib.util.MHelper; import ru.bclib.util.StructureHelper; import ru.betterend.registry.EndStructures; +import ru.betterend.world.biome.EndBiome; import java.util.Random; @@ -42,13 +43,14 @@ public class NBTPiece extends BasePiece { makeBoundingBox(); } - public NBTPiece(ServerLevel serverLevel, CompoundTag tag) { + public NBTPiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.NBT_PIECE, tag); makeBoundingBox(); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); tag.putString("structureID", structureID.toString()); tag.putInt("rotation", rotation.ordinal()); tag.putInt("mirror", mirror.ordinal()); @@ -69,7 +71,7 @@ public class NBTPiece extends BasePiece { } @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { BoundingBox bounds = BoundingBox.fromCorners(new Vec3i( blockBox.minX(), this.boundingBox.minY(), @@ -88,9 +90,8 @@ public class NBTPiece extends BasePiece { StructureHelper.erode(world, bounds, erosion, random); } if (cover) { - StructureHelper.cover(world, bounds, random); + StructureHelper.cover(world, bounds, random, EndBiome.Config.DEFAULT_MATERIAL.getTopMaterial()); } - return true; } private void makeBoundingBox() { diff --git a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java index 9ff908cc..4c37167c 100644 --- a/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/PaintedMountainPiece.java @@ -5,7 +5,6 @@ import net.minecraft.core.BlockPos.MutableBlockPos; import net.minecraft.nbt.CompoundTag; import net.minecraft.nbt.ListTag; import net.minecraft.nbt.NbtUtils; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; @@ -16,6 +15,7 @@ import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.Heightmap; import net.minecraft.world.level.levelgen.Heightmap.Types; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.util.MHelper; import ru.betterend.registry.EndStructures; @@ -29,13 +29,13 @@ public class PaintedMountainPiece extends MountainPiece { this.slises = slises; } - public PaintedMountainPiece(ServerLevel serverLevel, CompoundTag tag) { - super(EndStructures.PAINTED_MOUNTAIN_PIECE, serverLevel, tag); + public PaintedMountainPiece(StructurePieceSerializationContext type, CompoundTag tag) { + super(EndStructures.PAINTED_MOUNTAIN_PIECE, tag); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { - super.addAdditionalSaveData(serverLevel, tag); + protected void addAdditionalSaveData(CompoundTag tag) { + super.addAdditionalSaveData(tag); ListTag slise = new ListTag(); for (BlockState state : slises) { slise.add(NbtUtils.writeBlockState(state)); @@ -54,7 +54,7 @@ public class PaintedMountainPiece extends MountainPiece { } @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { int sx = chunkPos.getMinBlockX(); int sz = chunkPos.getMinBlockZ(); MutableBlockPos pos = new MutableBlockPos(); @@ -101,7 +101,5 @@ public class PaintedMountainPiece extends MountainPiece { } } } - - return true; } } diff --git a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java index e876af74..ae7853c0 100644 --- a/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java +++ b/src/main/java/ru/betterend/world/structures/piece/VoxelPiece.java @@ -2,12 +2,12 @@ package ru.betterend.world.structures.piece; import net.minecraft.core.BlockPos; import net.minecraft.nbt.CompoundTag; -import net.minecraft.server.level.ServerLevel; import net.minecraft.world.level.ChunkPos; import net.minecraft.world.level.StructureFeatureManager; import net.minecraft.world.level.WorldGenLevel; import net.minecraft.world.level.chunk.ChunkGenerator; import net.minecraft.world.level.levelgen.structure.BoundingBox; +import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext; import ru.bclib.world.structures.StructureWorld; import ru.betterend.registry.EndStructures; @@ -24,13 +24,13 @@ public class VoxelPiece extends BasePiece { this.boundingBox = world.getBounds(); } - public VoxelPiece(ServerLevel level, CompoundTag tag) { + public VoxelPiece(StructurePieceSerializationContext type, CompoundTag tag) { super(EndStructures.VOXEL_PIECE, tag); this.boundingBox = world.getBounds(); } @Override - protected void addAdditionalSaveData(ServerLevel serverLevel, CompoundTag tag) { + protected void addAdditionalSaveData(CompoundTag tag) { tag.put("world", world.toBNT()); } @@ -40,8 +40,7 @@ public class VoxelPiece extends BasePiece { } @Override - public boolean postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { + public void postProcess(WorldGenLevel world, StructureFeatureManager arg, ChunkGenerator chunkGenerator, Random random, BoundingBox blockBox, ChunkPos chunkPos, BlockPos blockPos) { this.world.placeChunk(world, chunkPos); - return true; } } diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java deleted file mode 100644 index b692cd39..00000000 --- a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceBuilder.java +++ /dev/null @@ -1,100 +0,0 @@ -package ru.betterend.world.surface; - -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; - -public class SulphuricSurfaceBuilder extends SurfaceBuilder { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); - - public SulphuricSurfaceBuilder() { - super(SurfaceBuilderBaseConfiguration.CODEC); - } - - @Override - public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, int seed, long n, SurfaceBuilderBaseConfiguration surfaceBlocks) { - double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange( - -0.1, - 0.1, - MHelper.RANDOM - ); - if (value < -0.6) { - SurfaceBuilder.DEFAULT.apply( - random, - chunk, - biome, - x, - z, - height, - noise, - defaultBlock, - defaultFluid, - seaLevel, - seed, - n, - SurfaceBuilders.DEFAULT_END_CONFIG - ); - } - else if (value < -0.3) { - SurfaceBuilder.DEFAULT.apply( - random, - chunk, - biome, - x, - z, - height, - noise, - defaultBlock, - defaultFluid, - seaLevel, - seed, - n, - SurfaceBuilders.FLAVOLITE_CONFIG - ); - } - else if (value < 0.5) { - SurfaceBuilder.DEFAULT.apply( - random, - chunk, - biome, - x, - z, - height, - noise, - defaultBlock, - defaultFluid, - seaLevel, - seed, - n, - SurfaceBuilders.SULFURIC_ROCK_CONFIG - ); - } - else { - SurfaceBuilder.DEFAULT.apply( - random, - chunk, - biome, - x, - z, - height, - noise, - defaultBlock, - defaultFluid, - seaLevel, - seed, - n, - SurfaceBuilders.BRIMSTONE_CONFIG - ); - } - } - - /*public static SulphuricSurfaceBuilder register(String name) { - return Registry.register(Registry.SURFACE_BUILDER, name, new SulphuricSurfaceBuilder()); - }*/ -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java new file mode 100644 index 00000000..3e4da424 --- /dev/null +++ b/src/main/java/ru/betterend/world/surface/SulphuricSurfaceNoiseCondition.java @@ -0,0 +1,28 @@ +package ru.betterend.world.surface; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; +import ru.betterend.noise.OpenSimplexNoise; + +/** + * Noise source that returns a value in [0, 3] + */ +public class SulphuricSurfaceNoiseCondition implements NumericProvider { + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(5123); + + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + final int x = context.getBlockX(); + final int z = context.getBlockZ(); + final double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange( + -0.1, + 0.1, + MHelper.RANDOM + ); + if (value < -0.6) return 0; + if (value < -0.3) return 1; + if (value < -0.5) return 2; + return 3; + } +} diff --git a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java b/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java deleted file mode 100644 index 3252f12b..00000000 --- a/src/main/java/ru/betterend/world/surface/SurfaceBuilders.java +++ /dev/null @@ -1,50 +0,0 @@ -package ru.betterend.world.surface; - -import net.minecraft.core.Registry; -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.levelgen.surfacebuilders.SurfaceBuilder; -import net.minecraft.world.level.levelgen.surfacebuilders.SurfaceBuilderBaseConfiguration; -import ru.betterend.registry.EndBlocks; - -public class SurfaceBuilders { - public static final SurfaceBuilderBaseConfiguration DEFAULT_END_CONFIG = makeSimpleConfig(Blocks.END_STONE); - public static final SurfaceBuilderBaseConfiguration FLAVOLITE_CONFIG = makeSimpleConfig(EndBlocks.FLAVOLITE.stone); - public static final SurfaceBuilderBaseConfiguration BRIMSTONE_CONFIG = makeSimpleConfig(EndBlocks.BRIMSTONE); - public static final SurfaceBuilderBaseConfiguration SULFURIC_ROCK_CONFIG = makeSimpleConfig(EndBlocks.SULPHURIC_ROCK.stone); - public static final SurfaceBuilderBaseConfiguration UMBRA_SURFACE_CONFIG = makeSimpleConfig(EndBlocks.UMBRALITH.stone); - public static final SurfaceBuilderBaseConfiguration PALLIDIUM_FULL_SURFACE_CONFIG = makeSurfaceConfig(EndBlocks.PALLIDIUM_FULL, EndBlocks.UMBRALITH.stone); - public static final SurfaceBuilderBaseConfiguration PALLIDIUM_HEAVY_SURFACE_CONFIG = makeSurfaceConfig(EndBlocks.PALLIDIUM_HEAVY, EndBlocks.UMBRALITH.stone); - public static final SurfaceBuilderBaseConfiguration PALLIDIUM_THIN_SURFACE_CONFIG = makeSurfaceConfig(EndBlocks.PALLIDIUM_THIN, EndBlocks.UMBRALITH.stone); - public static final SurfaceBuilderBaseConfiguration PALLIDIUM_TINY_SURFACE_CONFIG = makeSurfaceConfig(EndBlocks.PALLIDIUM_TINY, EndBlocks.UMBRALITH.stone); - - public static final SurfaceBuilder SULPHURIC_SURFACE = register( - "sulphuric_surface", - new SulphuricSurfaceBuilder() - ); - public static final SurfaceBuilder UMBRA_SURFACE = register( - "umbra_surface", - new UmbraSurfaceBuilder() - ); - - private static SurfaceBuilder register(String name, SurfaceBuilder builder) { - return Registry.register(Registry.SURFACE_BUILDER, name, builder); - } - - private static SurfaceBuilderBaseConfiguration makeSimpleConfig(Block block) { - BlockState state = block.defaultBlockState(); - return new SurfaceBuilderBaseConfiguration(state, state, state); - } - - private static SurfaceBuilderBaseConfiguration makeSurfaceConfig(Block surface, Block under) { - return new SurfaceBuilderBaseConfiguration( - surface.defaultBlockState(), - under.defaultBlockState(), - under.defaultBlockState() - ); - } - - public static void register() { - } -} diff --git a/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java b/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java deleted file mode 100644 index 33636ab6..00000000 --- a/src/main/java/ru/betterend/world/surface/UmbraSurfaceBuilder.java +++ /dev/null @@ -1,50 +0,0 @@ -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; - -public class UmbraSurfaceBuilder extends SurfaceBuilder { - private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(1512); - - public UmbraSurfaceBuilder() { - super(SurfaceBuilderBaseConfiguration.CODEC); - } - - @Override - public void apply(Random random, ChunkAccess chunk, Biome biome, int x, int z, int height, double noise, BlockState defaultBlock, BlockState defaultFluid, int seaLevel, int seed, long n, SurfaceBuilderBaseConfiguration surfaceBlocks) { - int depth = (int) (NOISE.eval(x * 0.1, z * 0.1) * 20 + NOISE.eval(x * 0.5, z * 0.5) * 10 + 60); - 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.4F) { - return SurfaceBuilders.PALLIDIUM_FULL_SURFACE_CONFIG; - } - else if (grass > 0.15F) { - return SurfaceBuilders.PALLIDIUM_HEAVY_SURFACE_CONFIG; - } - else if (grass > -0.15) { - return SurfaceBuilders.PALLIDIUM_THIN_SURFACE_CONFIG; - } - else if (grass > -0.4F) { - return SurfaceBuilders.PALLIDIUM_TINY_SURFACE_CONFIG; - } - else { - return SurfaceBuilders.UMBRA_SURFACE_CONFIG; - } - } -} \ No newline at end of file diff --git a/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java b/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java new file mode 100644 index 00000000..dfa847eb --- /dev/null +++ b/src/main/java/ru/betterend/world/surface/UmbraSurfaceNoiseCondition.java @@ -0,0 +1,29 @@ +package ru.betterend.world.surface; + +import ru.bclib.interfaces.NumericProvider; +import ru.bclib.mixin.common.SurfaceRulesContextAccessor; +import ru.bclib.util.MHelper; +import ru.betterend.noise.OpenSimplexNoise; + +/** + * Noise source that returns a value in [0, 4] + */ +public class UmbraSurfaceNoiseCondition implements NumericProvider { + private static final OpenSimplexNoise NOISE = new OpenSimplexNoise(1512); + + @Override + public int getNumber(SurfaceRulesContextAccessor context) { + final int x = context.getBlockX(); + final int z = context.getBlockZ(); + final double value = NOISE.eval(x * 0.03, z * 0.03) + NOISE.eval(x * 0.1, z * 0.1) * 0.3 + MHelper.randRange( + -0.1, + 0.1, + MHelper.RANDOM + ); + if (value > 0.4) return 0; + if (value > 0.15) return 1; + if (value > -0.15) return 2; + if (value > -0.4) return 3; + return 4; + } +} diff --git a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java index 76d6ad88..fa1783e6 100644 --- a/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java +++ b/src/main/java/shadow/fabric/api/client/rendering/v1/ArmorRenderingRegistry.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, @@ -56,7 +56,7 @@ public final class ArmorRenderingRegistry { * Registers a provider for custom armor models for an item. * * @param provider the provider for the model - * @param items the items to be registered for + * @param items the items to be registered for */ public static void registerModel(@Nullable ModelProvider provider, Item... items) { registerModel(provider, Arrays.asList(items)); @@ -66,7 +66,7 @@ public final class ArmorRenderingRegistry { * Registers a provider for custom armor models for an item. * * @param provider the provider for the model - * @param items the items to be registered for + * @param items the items to be registered for */ public static void registerModel(@Nullable ModelProvider provider, Iterable items) { ArmorRenderingRegistryImpl.registerModel(provider, items); @@ -76,7 +76,7 @@ public final class ArmorRenderingRegistry { * Registers a provider for custom texture models for an item. * * @param provider the provider for the texture - * @param items the items to be registered for + * @param items the items to be registered for */ public static void registerTexture(@Nullable TextureProvider provider, Item... items) { registerTexture(provider, Arrays.asList(items)); @@ -86,7 +86,7 @@ public final class ArmorRenderingRegistry { * Registers a provider for custom texture models for an item. * * @param provider the provider for the texture - * @param items the items to be registered for + * @param items the items to be registered for */ public static void registerTexture(@Nullable TextureProvider provider, Iterable items) { ArmorRenderingRegistryImpl.registerTexture(provider, items); @@ -96,7 +96,7 @@ public final class ArmorRenderingRegistry { * Register simple armor items to use the vanilla armor file name under the mods namespace. * * @param identifier The namespace + path to use for the armor texture location. - * @param items the items to be registered + * @param items the items to be registered */ public static void registerSimpleTexture(ResourceLocation identifier, Item... items) { registerTexture((entity, stack, slot, secondLayer, suffix, defaultTexture) -> { @@ -110,9 +110,9 @@ public final class ArmorRenderingRegistry { /** * Gets the model of the armor piece. * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in * @param defaultModel The default model that vanilla provides * @return The model of the armor piece. */ @@ -124,11 +124,11 @@ public final class ArmorRenderingRegistry { /** * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in - * @param secondLayer True if using the second texture layer - * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in + * @param secondLayer True if using the second texture layer + * @param suffix The texture suffix, used in vanilla by {@link net.minecraft.world.item.DyeableArmorItem} * @param defaultTexture The default vanilla texture identifier * @return the custom armor texture identifier, return null to use the vanilla ones. Defaulted to the item's registry id. */ @@ -143,9 +143,9 @@ public final class ArmorRenderingRegistry { /** * Gets the model of the armor piece. * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in * @param defaultModel The default vanilla armor model * @return The model of the armor piece. Should never be null. */ @@ -158,9 +158,9 @@ public final class ArmorRenderingRegistry { /** * Gets the armor texture {@link net.minecraft.resources.ResourceLocation}. * - * @param entity The entity equipping the armor - * @param stack The item stack of the armor - * @param slot The slot which the armor is in + * @param entity The entity equipping the armor + * @param stack The item stack of the armor + * @param slot The slot which the armor is in * @param defaultTexture The default vanilla texture identifier * @return the custom armor texture identifier. Should never be null. */ diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java index 5c96d4ad..ccb6a838 100644 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorProviderExtensions.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java index 4c4f6e88..5e23e5c4 100644 --- a/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java +++ b/src/main/java/shadow/fabric/impl/client/rendering/ArmorRenderingRegistryImpl.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java index 62e9adc5..7a26ae46 100644 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinArmorFeatureRenderer.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java index 719b8f92..32ed410e 100644 --- a/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java +++ b/src/main/java/shadow/fabric/mixin/client/rendering/MixinItem.java @@ -5,7 +5,7 @@ * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * - * http://www.apache.org/licenses/LICENSE-2.0 + * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, diff --git a/src/main/resources/betterend.accesswidener b/src/main/resources/betterend.accesswidener new file mode 100644 index 00000000..1c8e98af --- /dev/null +++ b/src/main/resources/betterend.accesswidener @@ -0,0 +1,4 @@ +accessWidener v1 named + +# Classes +accessible class net/minecraft/world/level/levelgen/SurfaceRules$SurfaceRule diff --git a/src/main/resources/betterend.mixins.common.json b/src/main/resources/betterend.mixins.common.json index 3640ff46..c92e2fc1 100644 --- a/src/main/resources/betterend.mixins.common.json +++ b/src/main/resources/betterend.mixins.common.json @@ -4,22 +4,24 @@ "package": "ru.betterend.mixin.common", "compatibilityLevel": "JAVA_16", "mixins": [ - "BiomeGenerationSettingsAccessor", - "NoiseBasedChunkGeneratorMixin", "ChorusPlantFeatureMixin", "PlayerAdvancementsMixin", "ChorusFlowerBlockMixin", + "StructureFeaturesMixin", + "NoiseInterpolatorMixin", "ChorusPlantBlockMixin", "EndPodiumFeatureMixin", "EndDragonFightMixin", "WorldGenRegionMixin", "BlockBehaviourMixin", + "NoiseChunkAccessor", "DimensionTypeMixin", "CraftingMenuMixin", "LivingEntityMixin", "ServerPlayerMixin", "SpikeFeatureMixin", "ServerLevelMixin", + "NoiseChunkMixin", "EnderManMixin", "EndSpikeMixin", "MonsterMixin", diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index 7d1697ab..67b2f16d 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -35,6 +35,7 @@ "ru.betterend.integration.rei.REIPlugin" ] }, + "accessWidener" : "betterend.accesswidener", "mixins": [ "betterend.mixins.common.json", "betterend.mixins.client.json", @@ -42,10 +43,10 @@ ], "depends": { - "fabricloader": ">=0.12.4", - "fabric": ">=0.42.1", - "minecraft": ">=1.17", - "bclib": ">=0.5.4" + "fabricloader": ">=0.12.9", + "fabric": ">=0.44.0", + "minecraft": ">=1.18.1", + "bclib": ">=1.1.2" }, "suggests": { "byg": ">=1.1.3",