[Feature] End Structure Pool element that prevent Pool elements from spawning below y-5

This commit is contained in:
Frank 2023-06-11 18:56:47 +02:00
parent 671fea6c2e
commit ebbd975bab
2 changed files with 116 additions and 0 deletions

View file

@ -0,0 +1,27 @@
package org.betterx.bclib.api.v2.levelgen.structures;
import org.betterx.bclib.BCLib;
import com.mojang.serialization.Codec;
import net.minecraft.core.Registry;
import net.minecraft.core.registries.BuiltInRegistries;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElementType;
public class BCLStructurePoolElementTypes {
public static final StructurePoolElementType<SingleEndPoolElement> END = register(
BCLib.makeID("single_end_pool_element"), SingleEndPoolElement.CODEC);
public static <P extends StructurePoolElement> StructurePoolElementType<P> register(
ResourceLocation id,
Codec<P> codec
) {
return Registry.register(BuiltInRegistries.STRUCTURE_POOL_ELEMENT, id, () -> codec);
}
public static void ensureStaticallyLoaded() {
// NO-OP
}
}

View file

@ -0,0 +1,89 @@
package org.betterx.bclib.api.v2.levelgen.structures;
import com.mojang.datafixers.util.Either;
import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Holder;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.util.RandomSource;
import net.minecraft.world.level.StructureManager;
import net.minecraft.world.level.WorldGenLevel;
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.pools.SinglePoolElement;
import net.minecraft.world.level.levelgen.structure.pools.StructurePoolElementType;
import net.minecraft.world.level.levelgen.structure.pools.StructureTemplatePool;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureProcessorList;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplate;
import net.minecraft.world.level.levelgen.structure.templatesystem.StructureTemplateManager;
import java.util.function.Function;
public class SingleEndPoolElement extends SinglePoolElement {
public static final Codec<SingleEndPoolElement> CODEC = RecordCodecBuilder.create(instance -> instance.group(
SingleEndPoolElement.templateCodec(),
SingleEndPoolElement.processorsCodec(),
SingleEndPoolElement.projectionCodec()
).apply(instance, SingleEndPoolElement::new));
public SingleEndPoolElement(
Either<ResourceLocation, StructureTemplate> either,
Holder<StructureProcessorList> holder,
StructureTemplatePool.Projection projection
) {
super(either, holder, projection);
}
public static Function<StructureTemplatePool.Projection, SingleEndPoolElement> end(
ResourceLocation id,
Holder<StructureProcessorList> holder
) {
return projection -> new SingleEndPoolElement(
Either.left(id),
holder,
projection
);
}
@Override
public boolean place(
StructureTemplateManager structureTemplateManager,
WorldGenLevel worldGenLevel,
StructureManager structureManager,
ChunkGenerator chunkGenerator,
BlockPos blockPos,
BlockPos blockPos2,
Rotation rotation,
BoundingBox boundingBox,
RandomSource randomSource,
boolean bl
) {
//in the end, we don't want to generate anything below y=5
if (blockPos.getY() < 5) return false;
return super.place(
structureTemplateManager,
worldGenLevel,
structureManager,
chunkGenerator,
blockPos,
blockPos2,
rotation,
boundingBox,
randomSource,
bl
);
}
@Override
public StructurePoolElementType<?> getType() {
return BCLStructurePoolElementTypes.END;
}
@Override
public String toString() {
return "SingleEnd[" + this.template + "]";
}
}