From aa8ab46a563eba70c01d87e29b496bea1b8c4238 Mon Sep 17 00:00:00 2001 From: cheaterpaul Date: Mon, 27 Jan 2025 00:40:25 +0100 Subject: [PATCH] add underworld dimension --- .../data/vampirism/dimension/underworld.json | 2 +- .../vampirism/dimension_type/underworld.json | 2 +- .../worldgen/biome/has_structure/crypt.json | 3 + .../worldgen/biome/has_structure/mother.json | 3 + .../biome/has_structure/vampire_altar.json | 3 + .../biome/has_structure/vampire_hut.json | 3 + .../density_function/base_3d_noise.json | 8 ++ .../worldgen/density_function/underworld.json | 7 ++ .../{noise.json => underworld.json} | 8 +- .../vampirism/core/ModDimensions.java | 99 +++++++++---------- .../vampirism/core/ModRegistries.java | 8 +- .../vampirism/core/ModStructures.java | 2 + .../vampirism/core/RegistryManager.java | 6 ++ .../provider/tags/ModBiomeTagsProvider.java | 8 +- .../mixin/DensityFunctionsMixin.java | 19 ++++ .../dimension/UnderworldDensityFunction.java | 51 ++++++++++ .../world/dimension/UnderworldEffects.java | 28 ++++++ .../resources/META-INF/accesstransformer.cfg | 5 + src/main/resources/vampirism.mixins.json | 1 + 19 files changed, 199 insertions(+), 67 deletions(-) create mode 100644 src/generated/resources/data/vampirism/worldgen/density_function/base_3d_noise.json create mode 100644 src/generated/resources/data/vampirism/worldgen/density_function/underworld.json rename src/generated/resources/data/vampirism/worldgen/noise_settings/{noise.json => underworld.json} (98%) create mode 100644 src/main/java/de/teamlapen/vampirism/mixin/DensityFunctionsMixin.java create mode 100644 src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldDensityFunction.java create mode 100644 src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldEffects.java diff --git a/src/generated/resources/data/vampirism/dimension/underworld.json b/src/generated/resources/data/vampirism/dimension/underworld.json index aff9991d4a..fc8dab1e58 100644 --- a/src/generated/resources/data/vampirism/dimension/underworld.json +++ b/src/generated/resources/data/vampirism/dimension/underworld.json @@ -5,6 +5,6 @@ "biome_source": { "type": "vampirism:underworld" }, - "settings": "vampirism:noise" + "settings": "vampirism:underworld" } } \ No newline at end of file diff --git a/src/generated/resources/data/vampirism/dimension_type/underworld.json b/src/generated/resources/data/vampirism/dimension_type/underworld.json index e748d7a6e7..3418735315 100644 --- a/src/generated/resources/data/vampirism/dimension_type/underworld.json +++ b/src/generated/resources/data/vampirism/dimension_type/underworld.json @@ -2,7 +2,7 @@ "ambient_light": 5.0, "bed_works": false, "coordinate_scale": 1.0, - "effects": "minecraft:overworld", + "effects": "vampirism:underworld", "fixed_time": 6000, "has_ceiling": false, "has_raids": false, diff --git a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/crypt.json b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/crypt.json index 41d3682253..e99d7daa67 100644 --- a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/crypt.json +++ b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/crypt.json @@ -1,4 +1,7 @@ { + "remove": [ + "vampirism:underworld_vampire_forest" + ], "values": [ "#vampirism:has_faction/vampire" ] diff --git a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/mother.json b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/mother.json index 41d3682253..e99d7daa67 100644 --- a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/mother.json +++ b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/mother.json @@ -1,4 +1,7 @@ { + "remove": [ + "vampirism:underworld_vampire_forest" + ], "values": [ "#vampirism:has_faction/vampire" ] diff --git a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_altar.json b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_altar.json index 3fdd473120..ef83d6ae92 100644 --- a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_altar.json +++ b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_altar.json @@ -1,4 +1,7 @@ { + "remove": [ + "vampirism:underworld_vampire_forest" + ], "values": [ "#c:is_wasteland", "#c:is_plateau", diff --git a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_hut.json b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_hut.json index 41d3682253..e99d7daa67 100644 --- a/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_hut.json +++ b/src/generated/resources/data/vampirism/tags/worldgen/biome/has_structure/vampire_hut.json @@ -1,4 +1,7 @@ { + "remove": [ + "vampirism:underworld_vampire_forest" + ], "values": [ "#vampirism:has_faction/vampire" ] diff --git a/src/generated/resources/data/vampirism/worldgen/density_function/base_3d_noise.json b/src/generated/resources/data/vampirism/worldgen/density_function/base_3d_noise.json new file mode 100644 index 0000000000..42ce3b80ac --- /dev/null +++ b/src/generated/resources/data/vampirism/worldgen/density_function/base_3d_noise.json @@ -0,0 +1,8 @@ +{ + "type": "minecraft:old_blended_noise", + "smear_scale_multiplier": 4.0, + "xz_factor": 80.0, + "xz_scale": 0.25, + "y_factor": 160.0, + "y_scale": 0.25 +} \ No newline at end of file diff --git a/src/generated/resources/data/vampirism/worldgen/density_function/underworld.json b/src/generated/resources/data/vampirism/worldgen/density_function/underworld.json new file mode 100644 index 0000000000..94d77d8804 --- /dev/null +++ b/src/generated/resources/data/vampirism/worldgen/density_function/underworld.json @@ -0,0 +1,7 @@ +{ + "type": "minecraft:add", + "argument1": { + "type": "vampirism:underworld" + }, + "argument2": "vampirism:base_3d_noise" +} \ No newline at end of file diff --git a/src/generated/resources/data/vampirism/worldgen/noise_settings/noise.json b/src/generated/resources/data/vampirism/worldgen/noise_settings/underworld.json similarity index 98% rename from src/generated/resources/data/vampirism/worldgen/noise_settings/noise.json rename to src/generated/resources/data/vampirism/worldgen/noise_settings/underworld.json index e9feec0618..61cb93fa86 100644 --- a/src/generated/resources/data/vampirism/worldgen/noise_settings/noise.json +++ b/src/generated/resources/data/vampirism/worldgen/noise_settings/underworld.json @@ -21,7 +21,7 @@ "erosion": { "type": "minecraft:cache_2d", "argument": { - "type": "minecraft:end_islands" + "type": "vampirism:underworld" } }, "final_density": { @@ -63,7 +63,7 @@ "argument2": { "type": "minecraft:add", "argument1": 23.4375, - "argument2": "minecraft:end/sloped_cheese" + "argument2": "vampirism:underworld" } } } @@ -112,7 +112,7 @@ "argument2": { "type": "minecraft:cache_2d", "argument": { - "type": "minecraft:end_islands" + "type": "vampirism:underworld" } } } @@ -123,7 +123,7 @@ } }, "lava": 0.0, - "ridges": 0.0, + "ridges": "minecraft:overworld/ridges", "temperature": 0.0, "vegetation": { "type": "minecraft:shifted_noise", diff --git a/src/main/java/de/teamlapen/vampirism/core/ModDimensions.java b/src/main/java/de/teamlapen/vampirism/core/ModDimensions.java index 88c9d0cebc..9266b88805 100644 --- a/src/main/java/de/teamlapen/vampirism/core/ModDimensions.java +++ b/src/main/java/de/teamlapen/vampirism/core/ModDimensions.java @@ -4,6 +4,8 @@ import de.teamlapen.vampirism.REFERENCE; import de.teamlapen.vampirism.api.util.VResourceLocation; import de.teamlapen.vampirism.world.dimension.UnderworldBiomeSource; +import de.teamlapen.vampirism.world.dimension.UnderworldDensityFunction; +import de.teamlapen.vampirism.world.dimension.UnderworldEffects; import net.minecraft.core.HolderGetter; import net.minecraft.core.registries.Registries; import net.minecraft.data.worldgen.BootstrapContext; @@ -18,8 +20,10 @@ import net.minecraft.world.level.dimension.DimensionType; import net.minecraft.world.level.dimension.LevelStem; import net.minecraft.world.level.levelgen.*; +import net.minecraft.world.level.levelgen.synth.BlendedNoise; import net.minecraft.world.level.levelgen.synth.NormalNoise; import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.client.event.RegisterDimensionSpecialEffectsEvent; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; @@ -28,34 +32,48 @@ public class ModDimensions { - public static final ResourceKey UNDERWORLD = ResourceKey.create(Registries.DIMENSION_TYPE, VResourceLocation.mod("underworld")); - public static final ResourceKey UNDERWORLD_STEM = ResourceKey.create(Registries.LEVEL_STEM, VResourceLocation.mod("underworld")); - public static final ResourceKey UNDERWORLD_LEVEL = ResourceKey.create(Registries.DIMENSION, UNDERWORLD_STEM.location()); - public static final ResourceKey RULES = ResourceKey.create(Registries.NOISE_SETTINGS, VResourceLocation.mod("noise")); public static final DeferredRegister> BIOME_SOURCES = DeferredRegister.create(Registries.BIOME_SOURCE, REFERENCE.MODID); - private static final ResourceKey SLOPED_CHEESE_END = ResourceKey.create(Registries.DENSITY_FUNCTION, ResourceLocation.withDefaultNamespace("end/sloped_cheese")); - private static final ResourceKey SHIFT_X = ResourceKey.create(Registries.DENSITY_FUNCTION, ResourceLocation.withDefaultNamespace("shift_x")); - private static final ResourceKey SHIFT_Z = ResourceKey.create(Registries.DENSITY_FUNCTION, ResourceLocation.withDefaultNamespace("shift_z")); + public static final DeferredRegister> DENSITY_FUNCTIONS = DeferredRegister.create(Registries.DENSITY_FUNCTION_TYPE, REFERENCE.MODID); + @SuppressWarnings("unused") + public static final DeferredHolder, MapCodec> UNDERWORLD_BIOME_SOURCE_CODEC = BIOME_SOURCES.register("underworld", () -> UnderworldBiomeSource.CODEC); + @SuppressWarnings("unused") + public static final DeferredHolder, MapCodec> UNDERWORLD_DENSITY_FUNCTION_CODEC = DENSITY_FUNCTIONS.register("underworld", UnderworldDensityFunction.CODEC::codec); + + public static final ResourceKey UNDERWORLD_DIMENSION_TYPE = ResourceKey.create(Registries.DIMENSION_TYPE, VResourceLocation.mod("underworld")); + public static final ResourceKey UNDERWORLD_LEVEL_STEM = ResourceKey.create(Registries.LEVEL_STEM, VResourceLocation.mod("underworld")); + public static final ResourceKey UNDERWORLD_LEVEL = ResourceKey.create(Registries.DIMENSION, UNDERWORLD_LEVEL_STEM.location()); + public static final ResourceKey UNDERWORLD_NOISE_GENERATOR = ResourceKey.create(Registries.NOISE_SETTINGS, VResourceLocation.mod("underworld")); + public static final ResourceKey UNDERWORLD_DENSITY_FUNCTION = ResourceKey.create(Registries.DENSITY_FUNCTION, VResourceLocation.mod("underworld")); + public static final ResourceKey BASE_3D_NOISE_UNDERWORLD = ResourceKey.create(Registries.DENSITY_FUNCTION, VResourceLocation.mod("base_3d_noise")); + + public static final ResourceLocation UNDERWORLD_DIMENSION_SPECIAL_EFFECTS = VResourceLocation.mod("underworld"); - public static final DeferredHolder, MapCodec> UNDERWORLD_BIOME_SOURCE = BIOME_SOURCES.register("underworld", () -> UnderworldBiomeSource.CODEC); static void register(IEventBus bus) { BIOME_SOURCES.register(bus); + DENSITY_FUNCTIONS.register(bus); } - static void bootstrapTypes(BootstrapContext context) { - context.register(UNDERWORLD, new DimensionType(OptionalLong.of(6000), false, false, false, false, 1.0, false, false, 0, 256, 256, BlockTags.INFINIBURN_END, BuiltinDimensionTypes.OVERWORLD_EFFECTS, 5f, new DimensionType.MonsterSettings(false, false, UniformInt.of(0,7), 0))); + + static void bootstrapDimensionTypes(BootstrapContext context) { + context.register(UNDERWORLD_DIMENSION_TYPE, new DimensionType(OptionalLong.of(6000), false, false, false, false, 1.0, false, false, 0, 256, 256, BlockTags.INFINIBURN_END, UNDERWORLD_DIMENSION_SPECIAL_EFFECTS, 5f, new DimensionType.MonsterSettings(false, false, UniformInt.of(0,7), 0))); + } + + static void bootstrapLevelStem(BootstrapContext context) { + context.register(UNDERWORLD_LEVEL_STEM, new LevelStem(context.lookup(Registries.DIMENSION_TYPE).getOrThrow(UNDERWORLD_DIMENSION_TYPE), new NoiseBasedChunkGenerator(new UnderworldBiomeSource(context.lookup(Registries.BIOME)), context.lookup(Registries.NOISE_SETTINGS).getOrThrow(UNDERWORLD_NOISE_GENERATOR)))); } - static void bootstrapLevels(BootstrapContext context) { - var dimensionTypes = context.lookup(Registries.DIMENSION_TYPE); - var noiseSettings = context.lookup(Registries.NOISE_SETTINGS); - var biomes = context.lookup(Registries.BIOME); - context.register(UNDERWORLD_STEM, new LevelStem(dimensionTypes.getOrThrow(UNDERWORLD), new NoiseBasedChunkGenerator(new UnderworldBiomeSource(biomes), noiseSettings.getOrThrow(RULES)))); + static void bootstrapNoise(BootstrapContext context) { + context.register(UNDERWORLD_NOISE_GENERATOR, new NoiseGeneratorSettings(new NoiseSettings(0,128,1,2), ModBlocks.DARK_STONE.get().defaultBlockState(), Blocks.AIR.defaultBlockState(), rute(context.lookup(Registries.DENSITY_FUNCTION), context.lookup(Registries.NOISE)), rule(), List.of(), 0, false, false, false, true)); } - static void bootstrapSource(BootstrapContext context) { - context.register(RULES, new NoiseGeneratorSettings(new NoiseSettings(0,128,1,2), ModBlocks.DARK_STONE.get().defaultBlockState(), Blocks.AIR.defaultBlockState(), rute(context.lookup(Registries.DENSITY_FUNCTION), context.lookup(Registries.NOISE)), rule(), List.of(), 0, false, false, false, true)); + static void bootstrapDensityFunctions(BootstrapContext context) { + context.register(BASE_3D_NOISE_UNDERWORLD, BlendedNoise.createUnseeded(0.25, 0.25, 80.0, 160.0, 4.0)); + context.register(UNDERWORLD_DENSITY_FUNCTION, DensityFunctions.add(new UnderworldDensityFunction(0), NoiseRouterData.getFunction(context.lookup(Registries.DENSITY_FUNCTION), BASE_3D_NOISE_UNDERWORLD))); + } + + static void registerDimensionEffects(RegisterDimensionSpecialEffectsEvent event) { + event.register(UNDERWORLD_DIMENSION_SPECIAL_EFFECTS, new UnderworldEffects()); } private static SurfaceRules.RuleSource rule() { @@ -73,56 +91,29 @@ private static SurfaceRules.RuleSource rule() { } private static NoiseRouter rute(HolderGetter density, HolderGetter noise) { - DensityFunction densityfunction = DensityFunctions.cache2d(DensityFunctions.endIslands(0L)); - DensityFunction densityfunction1 = postProcess(slideEnd(getFunction(density, SLOPED_CHEESE_END))); + DensityFunction erosion = DensityFunctions.cache2d(new UnderworldDensityFunction(0)); + DensityFunction finalDensity = NoiseRouterData.postProcess(NoiseRouterData.slideEnd(NoiseRouterData.getFunction(density, UNDERWORLD_DENSITY_FUNCTION))); - DensityFunction densityfunction4 = getFunction(density, SHIFT_X); - DensityFunction densityfunction5 = getFunction(density, SHIFT_Z); - DensityFunction densityfunction7 = DensityFunctions.shiftedNoise2d( - densityfunction4, densityfunction5, 0.25, noise.getOrThrow(Noises.VEGETATION)); + DensityFunction vegetationXShift = NoiseRouterData.getFunction(density, NoiseRouterData.SHIFT_X); + DensityFunction vegerationZShift = NoiseRouterData.getFunction(density, NoiseRouterData.SHIFT_Z); + DensityFunction vegetation = DensityFunctions.shiftedNoise2d(vegetationXShift, vegerationZShift, 0.25, noise.getOrThrow(Noises.VEGETATION)); return new NoiseRouter( DensityFunctions.zero(), DensityFunctions.zero(), DensityFunctions.zero(), DensityFunctions.zero(), DensityFunctions.zero(), - densityfunction7, + vegetation, DensityFunctions.zero(), - densityfunction, + erosion, DensityFunctions.zero(), - DensityFunctions.zero(), - slideEnd(DensityFunctions.add(densityfunction, DensityFunctions.constant(-0.703125))), - densityfunction1, + NoiseRouterData.getFunction(density, NoiseRouterData.RIDGES), + NoiseRouterData.slideEnd(DensityFunctions.add(erosion, DensityFunctions.constant(-0.703125))), + finalDensity, DensityFunctions.zero(), DensityFunctions.zero(), DensityFunctions.zero() ); } - private static DensityFunction postProcess(DensityFunction densityFunction) { - DensityFunction densityfunction = DensityFunctions.blendDensity(densityFunction); - return DensityFunctions.mul(DensityFunctions.interpolated(densityfunction), DensityFunctions.constant(0.64)).squeeze(); - } - - private static DensityFunction slideEnd(DensityFunction densityFunction) { - return slideEndLike(densityFunction, 0, 128); - } - - private static DensityFunction slideEndLike(DensityFunction densityFunction, int minY, int maxY) { - return slide(densityFunction, minY, maxY, 72, -184, -23.4375, 4, 32, -0.234375); - } - - private static DensityFunction slide( - DensityFunction input, int minY, int maxY, int p_224447_, int p_224448_, double p_224449_, int p_224450_, int p_224451_, double p_224452_ - ) { - DensityFunction densityfunction1 = DensityFunctions.yClampedGradient(minY + maxY - p_224447_, minY + maxY - p_224448_, 1.0, 0.0); - DensityFunction $$9 = DensityFunctions.lerp(densityfunction1, p_224449_, input); - DensityFunction densityfunction2 = DensityFunctions.yClampedGradient(minY + p_224450_, minY + p_224451_, 0.0, 1.0); - return DensityFunctions.lerp(densityfunction2, p_224452_, $$9); - } - - private static DensityFunction getFunction(HolderGetter densityFunctions, ResourceKey key) { - return new DensityFunctions.HolderHolder(densityFunctions.getOrThrow(key)); - } - } diff --git a/src/main/java/de/teamlapen/vampirism/core/ModRegistries.java b/src/main/java/de/teamlapen/vampirism/core/ModRegistries.java index 04df42b3d5..a9c2971171 100644 --- a/src/main/java/de/teamlapen/vampirism/core/ModRegistries.java +++ b/src/main/java/de/teamlapen/vampirism/core/ModRegistries.java @@ -22,6 +22,7 @@ import net.minecraft.core.Registry; import net.minecraft.core.RegistrySetBuilder; import net.minecraft.core.registries.Registries; +import net.neoforged.fml.common.Mod; import net.neoforged.neoforge.registries.DataPackRegistryEvent; import net.neoforged.neoforge.registries.NeoForgeRegistries; import net.neoforged.neoforge.registries.NewRegistryEvent; @@ -59,9 +60,10 @@ public class ModRegistries { .add(SKILL_NODE, ModSkills::createSkillNodes) .add(SKILL_TREE, ModSkills::createSkillTrees) .add(Registries.ENCHANTMENT, ModEnchantments::createEnchantments) - .add(Registries.DIMENSION_TYPE, ModDimensions::bootstrapTypes) - .add(Registries.LEVEL_STEM, ModDimensions::bootstrapLevels) - .add(Registries.NOISE_SETTINGS, ModDimensions::bootstrapSource) + .add(Registries.DIMENSION_TYPE, ModDimensions::bootstrapDimensionTypes) + .add(Registries.LEVEL_STEM, ModDimensions::bootstrapLevelStem) + .add(Registries.NOISE_SETTINGS, ModDimensions::bootstrapNoise) + .add(Registries.DENSITY_FUNCTION, ModDimensions::bootstrapDensityFunctions) ; static void registerRegistries(NewRegistryEvent event) { diff --git a/src/main/java/de/teamlapen/vampirism/core/ModStructures.java b/src/main/java/de/teamlapen/vampirism/core/ModStructures.java index 6678d06e3f..d39b866c14 100644 --- a/src/main/java/de/teamlapen/vampirism/core/ModStructures.java +++ b/src/main/java/de/teamlapen/vampirism/core/ModStructures.java @@ -46,6 +46,8 @@ import net.neoforged.bus.api.IEventBus; import net.neoforged.neoforge.registries.DeferredHolder; import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.holdersets.AndHolderSet; +import net.neoforged.neoforge.registries.holdersets.NotHolderSet; import java.util.List; import java.util.Map; diff --git a/src/main/java/de/teamlapen/vampirism/core/RegistryManager.java b/src/main/java/de/teamlapen/vampirism/core/RegistryManager.java index 58a409cca8..0904fab121 100644 --- a/src/main/java/de/teamlapen/vampirism/core/RegistryManager.java +++ b/src/main/java/de/teamlapen/vampirism/core/RegistryManager.java @@ -10,6 +10,7 @@ import de.teamlapen.vampirism.entity.player.vampire.skills.VampireSkills; import net.neoforged.bus.api.IEventBus; import net.neoforged.bus.api.SubscribeEvent; +import net.neoforged.neoforge.client.event.RegisterDimensionSpecialEffectsEvent; import net.neoforged.neoforge.common.NeoForge; import net.neoforged.neoforge.registries.DataPackRegistryEvent; import net.neoforged.neoforge.registries.datamaps.RegisterDataMapTypesEvent; @@ -82,6 +83,11 @@ public void onRegisterDataMapTypes(RegisterDataMapTypesEvent event) { ModDataMaps.registerDataMaps(event); } + @SubscribeEvent + public void registerDimensionSpecialEffects(RegisterDimensionSpecialEffectsEvent event) { + ModDimensions.registerDimensionEffects(event); + } + public void registerModEventHandler() { this.eventBus.addListener(ModEntities::onModifyEntityTypeAttributes); this.eventBus.addListener(ModEntities::onRegisterEntityTypeAttributes); diff --git a/src/main/java/de/teamlapen/vampirism/data/provider/tags/ModBiomeTagsProvider.java b/src/main/java/de/teamlapen/vampirism/data/provider/tags/ModBiomeTagsProvider.java index 5412f448ca..156ee3fd7a 100644 --- a/src/main/java/de/teamlapen/vampirism/data/provider/tags/ModBiomeTagsProvider.java +++ b/src/main/java/de/teamlapen/vampirism/data/provider/tags/ModBiomeTagsProvider.java @@ -28,7 +28,7 @@ protected void addTags(HolderLookup.@NotNull Provider holderProvider) { tag(ModBiomeTags.HasFaction.IS_FACTION_BIOME).addTags(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME, ModBiomeTags.HasFaction.IS_HUNTER_BIOME); tag(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME).add(ModBiomes.VAMPIRE_FOREST, ModBiomes.UNDERWORLD_VAMPIRE_FOREST); tag(ModBiomeTags.HasFaction.IS_HUNTER_BIOME); - tag(ModBiomeTags.HasStructure.VAMPIRE_ALTAR).addTags(Tags.Biomes.IS_WASTELAND, Tags.Biomes.IS_PLATEAU, Tags.Biomes.IS_RARE, Tags.Biomes.IS_SPOOKY, Tags.Biomes.IS_SWAMP, ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME); + tag(ModBiomeTags.HasStructure.VAMPIRE_ALTAR).addTags(Tags.Biomes.IS_WASTELAND, Tags.Biomes.IS_PLATEAU, Tags.Biomes.IS_RARE, Tags.Biomes.IS_SPOOKY, Tags.Biomes.IS_SWAMP, ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME).remove(ModBiomes.UNDERWORLD_VAMPIRE_FOREST); tag(ModBiomeTags.HasStructure.HUNTER_OUTPOST_PLAINS).addTags(Tags.Biomes.IS_PLAINS, BiomeTags.IS_FOREST); tag(ModBiomeTags.HasStructure.HUNTER_OUTPOST_DESERT).addTags(Tags.Biomes.IS_DESERT); tag(ModBiomeTags.HasStructure.HUNTER_OUTPOST_VAMPIRE_FOREST).add(ModBiomes.VAMPIRE_FOREST); @@ -47,9 +47,9 @@ protected void addTags(HolderLookup.@NotNull Provider holderProvider) { tag(ModBiomeTags.NoSpawn.HUNTER).addTags(ModBiomeTags.HasFaction.IS_FACTION_BIOME); tag(ModBiomeTags.HasSpawn.ADVANCED_HUNTER).addTags(BiomeTags.IS_OVERWORLD); tag(ModBiomeTags.NoSpawn.ADVANCED_HUNTER).addTags(ModBiomeTags.HasFaction.IS_FACTION_BIOME); - tag(ModBiomeTags.HasStructure.VAMPIRE_HUT).addTags(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME); - tag(ModBiomeTags.HasStructure.MOTHER).addTag(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME); - tag(ModBiomeTags.HasStructure.CRYPT).addTag(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME); + tag(ModBiomeTags.HasStructure.VAMPIRE_HUT).addTags(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME).remove(ModBiomes.UNDERWORLD_VAMPIRE_FOREST); + tag(ModBiomeTags.HasStructure.MOTHER).addTag(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME).remove(ModBiomes.UNDERWORLD_VAMPIRE_FOREST); + tag(ModBiomeTags.HasStructure.CRYPT).addTag(ModBiomeTags.HasFaction.IS_VAMPIRE_BIOME).remove(ModBiomes.UNDERWORLD_VAMPIRE_FOREST); tag(Tags.Biomes.NO_DEFAULT_MONSTERS).add(ModBiomes.VAMPIRE_FOREST); } } diff --git a/src/main/java/de/teamlapen/vampirism/mixin/DensityFunctionsMixin.java b/src/main/java/de/teamlapen/vampirism/mixin/DensityFunctionsMixin.java new file mode 100644 index 0000000000..9b8675ba66 --- /dev/null +++ b/src/main/java/de/teamlapen/vampirism/mixin/DensityFunctionsMixin.java @@ -0,0 +1,19 @@ +package de.teamlapen.vampirism.mixin; + +import com.llamalad7.mixinextras.sugar.Local; +import com.llamalad7.mixinextras.sugar.ref.LocalFloatRef; +import net.minecraft.world.level.levelgen.DensityFunctions; +import net.minecraft.world.level.levelgen.synth.SimplexNoise; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +@Mixin(targets = "net.minecraft.world.level.levelgen.DensityFunctions$EndIslandDensityFunction") +public class DensityFunctionsMixin { + + @Inject(method = "getHeightValue", at = @At(value = "INVOKE", target = "Lnet/minecraft/util/Mth;clamp(FFF)F"), cancellable = true) + private static void s(SimplexNoise noise, int x, int z, CallbackInfoReturnable cir, @Local(ordinal = 0) float f) { + cir.setReturnValue(f); + } +} diff --git a/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldDensityFunction.java b/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldDensityFunction.java new file mode 100644 index 0000000000..31b2825657 --- /dev/null +++ b/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldDensityFunction.java @@ -0,0 +1,51 @@ +package de.teamlapen.vampirism.world.dimension; + +import com.mojang.serialization.MapCodec; +import net.minecraft.util.KeyDispatchDataCodec; +import net.minecraft.util.Mth; +import net.minecraft.util.RandomSource; +import net.minecraft.world.level.levelgen.DensityFunction; +import net.minecraft.world.level.levelgen.LegacyRandomSource; +import net.minecraft.world.level.levelgen.synth.SimplexNoise; +import org.jetbrains.annotations.NotNull; + +public class UnderworldDensityFunction implements DensityFunction.SimpleFunction { + public static final KeyDispatchDataCodec CODEC = KeyDispatchDataCodec.of( + MapCodec.unit(new UnderworldDensityFunction(0)) + ); + + private final SimplexNoise islandNoise; + + public UnderworldDensityFunction(long seed) { + RandomSource randomsource = new LegacyRandomSource(seed); + randomsource.consumeCount(45745); + this.islandNoise = new SimplexNoise(randomsource); + } + + private static float getHeightValue(SimplexNoise noise, int x, int z) { + float f = 100.0F - Mth.sqrt((float)(x * x + z * z)) * 4.0F; + f = Mth.clamp(f, -100.0F, 100.0F); + + return f; + } + + @Override + public double compute(DensityFunction.FunctionContext context) { + return ((double)getHeightValue(this.islandNoise, context.blockX() / 8, context.blockZ() / 8) - 8.0) / 128; + } + + @Override + public double minValue() { + return -0.84375; + } + + @Override + public double maxValue() { + return 0.5625; + } + + @Override + public @NotNull KeyDispatchDataCodec codec() { + return CODEC; + } +} diff --git a/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldEffects.java b/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldEffects.java new file mode 100644 index 0000000000..2f83a8fbcc --- /dev/null +++ b/src/main/java/de/teamlapen/vampirism/world/dimension/UnderworldEffects.java @@ -0,0 +1,28 @@ +package de.teamlapen.vampirism.world.dimension; + +import net.minecraft.client.renderer.DimensionSpecialEffects; +import net.minecraft.world.phys.Vec3; +import org.jetbrains.annotations.NotNull; +import org.jetbrains.annotations.Nullable; + +public class UnderworldEffects extends DimensionSpecialEffects { + + public UnderworldEffects() { + super(Float.NaN, false, SkyType.NONE, true, false); + } + + @Override + public @NotNull Vec3 getBrightnessDependentFogColor(Vec3 fogColor, float brightness) { + return fogColor.scale(0.15f); + } + + @Override + public boolean isFoggyAt(int x, int y) { + return false; + } + + @Override + public float @Nullable [] getSunriseColor(float timeOfDay, float partialTicks) { + return null; + } +} diff --git a/src/main/resources/META-INF/accesstransformer.cfg b/src/main/resources/META-INF/accesstransformer.cfg index 9af95d0ad3..5fcd279ef1 100644 --- a/src/main/resources/META-INF/accesstransformer.cfg +++ b/src/main/resources/META-INF/accesstransformer.cfg @@ -38,6 +38,11 @@ public net.minecraft.client.gui.screens.Screen font public net.minecraft.data.recipes.RecipeProvider has(Lnet/minecraft/tags/TagKey;)Lnet/minecraft/advancements/critereon/InventoryChangeTrigger$TriggerInstance; public net.minecraft.world.entity.Entity dimensions public net.minecraft.world.level.NaturalSpawner$SpawnState canSpawnForCategory(Lnet/minecraft/world/entity/MobCategory;Lnet/minecraft/world/level/ChunkPos;)Z +public net.minecraft.world.level.levelgen.NoiseRouterData SHIFT_X # SHIFT_X +public net.minecraft.world.level.levelgen.NoiseRouterData SHIFT_Z # SHIFT_Z +public net.minecraft.world.level.levelgen.NoiseRouterData slideEnd(Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/DensityFunction; # slideEnd +public net.minecraft.world.level.levelgen.NoiseRouterData postProcess(Lnet/minecraft/world/level/levelgen/DensityFunction;)Lnet/minecraft/world/level/levelgen/DensityFunction; # postProcess +public net.minecraft.world.level.levelgen.NoiseRouterData getFunction(Lnet/minecraft/core/HolderGetter;Lnet/minecraft/resources/ResourceKey;)Lnet/minecraft/world/level/levelgen/DensityFunction; # getFunction protected net.minecraft.data.recipes.ShapedRecipeBuilder result #result protected net.minecraft.data.recipes.ShapedRecipeBuilder count #count diff --git a/src/main/resources/vampirism.mixins.json b/src/main/resources/vampirism.mixins.json index ea79ed1239..e9a8b7da95 100644 --- a/src/main/resources/vampirism.mixins.json +++ b/src/main/resources/vampirism.mixins.json @@ -4,6 +4,7 @@ "compatibilityLevel": "JAVA_21", "mixins": [ "AreaEffectCloudMixin", + "DensityFunctionsMixin", "ItemMixin", "MixinBellBlock", "MixinCrossbowItem",