diff --git a/src/main/java/carpet/mixins/DesertPyramidFeatureMixin.java b/src/main/java/carpet/mixins/DesertPyramidFeatureMixin.java new file mode 100644 index 00000000..59b5ea53 --- /dev/null +++ b/src/main/java/carpet/mixins/DesertPyramidFeatureMixin.java @@ -0,0 +1,42 @@ +package carpet.mixins; + +import carpet.settings.CarpetSettings; +import com.google.common.collect.Lists; +import com.mojang.datafixers.Dynamic; +import net.minecraft.entity.EntityType; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.AbstractTempleFeature; +import net.minecraft.world.gen.feature.DefaultFeatureConfig; +import net.minecraft.world.gen.feature.DesertPyramidFeature; +import org.spongepowered.asm.mixin.Mixin; + +import java.util.Collections; +import java.util.List; +import java.util.function.Function; + +@Mixin(DesertPyramidFeature.class) +public abstract class DesertPyramidFeatureMixin extends AbstractTempleFeature +{ + private static final List MONSTER_SPAWNS; + + static + { + MONSTER_SPAWNS = Lists.newArrayList(new Biome.SpawnEntry[]{new Biome.SpawnEntry(EntityType.HUSK, 1, 1, 1)}); + } + + public DesertPyramidFeatureMixin(Function, ? extends DefaultFeatureConfig> function_1) + { + super(function_1); + } + + @Override + public List getMonsterSpawns() + { + if (CarpetSettings.huskSpawningInTemples) + { + return MONSTER_SPAWNS; + } + return Collections.emptyList(); + } +} + diff --git a/src/main/java/carpet/mixins/OverworldChunkGeneratorMixin.java b/src/main/java/carpet/mixins/OverworldChunkGeneratorMixin.java new file mode 100644 index 00000000..7c8f6006 --- /dev/null +++ b/src/main/java/carpet/mixins/OverworldChunkGeneratorMixin.java @@ -0,0 +1,42 @@ +package carpet.mixins; + +import carpet.settings.CarpetSettings; +import net.minecraft.entity.EntityCategory; +import net.minecraft.util.math.BlockPos; +import net.minecraft.world.IWorld; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.biome.source.BiomeSource; +import net.minecraft.world.gen.chunk.OverworldChunkGenerator; +import net.minecraft.world.gen.chunk.OverworldChunkGeneratorConfig; +import net.minecraft.world.gen.chunk.SurfaceChunkGenerator; +import net.minecraft.world.gen.feature.Feature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + +@Mixin(OverworldChunkGenerator.class) +public abstract class OverworldChunkGeneratorMixin extends SurfaceChunkGenerator +{ + public OverworldChunkGeneratorMixin(IWorld iWorld_1, BiomeSource biomeSource_1, int int_1, int int_2, int int_3, OverworldChunkGeneratorConfig chunkGeneratorConfig_1, boolean boolean_1) + { + super(iWorld_1, biomeSource_1, int_1, int_2, int_3, chunkGeneratorConfig_1, boolean_1); + } + + @Inject(method = "getEntitySpawnList", at = @At(value = "INVOKE", ordinal = 1, shift = At.Shift.BEFORE, + target = "Lnet/minecraft/world/gen/feature/StructureFeature;isApproximatelyInsideStructure(Lnet/minecraft/world/IWorld;Lnet/minecraft/util/math/BlockPos;)Z"), + cancellable = true) + private void onGetEntitySpawnList(EntityCategory entityCategory_1, BlockPos blockPos_1, + CallbackInfoReturnable> cir) + { + if (CarpetSettings.huskSpawningInTemples) + { + if (Feature.DESERT_PYRAMID.isApproximatelyInsideStructure(this.world, blockPos_1)) + { + cir.setReturnValue(Feature.DESERT_PYRAMID.getMonsterSpawns()); + } + } + } +} diff --git a/src/main/java/carpet/settings/CarpetSettings.java b/src/main/java/carpet/settings/CarpetSettings.java index 6ac080b9..880a0706 100644 --- a/src/main/java/carpet/settings/CarpetSettings.java +++ b/src/main/java/carpet/settings/CarpetSettings.java @@ -103,7 +103,7 @@ public class CarpetSettings ) public static boolean fastRedstoneDust = false; - @Rule(desc = "Only husks spawn in desert temples", category = FEATURE, validate = Validator.WIP.class) + @Rule(desc = "Only husks spawn in desert temples", category = FEATURE) public static boolean huskSpawningInTemples = false; @Rule( desc = "Shulkers will respawn in end cities", category = FEATURE ) diff --git a/src/main/resources/carpet.mixins.json b/src/main/resources/carpet.mixins.json index 65b70e42..4f4f3f96 100644 --- a/src/main/resources/carpet.mixins.json +++ b/src/main/resources/carpet.mixins.json @@ -54,6 +54,8 @@ "SaplingBlockMixin", "EntityMixin", "GuardianEntityMixin", + "DesertPyramidFeatureMixin", + "OverworldChunkGeneratorMixin", "ServerChunkManagerMixin", "SpawnHelperMixin",