Fixed Worldgen
This commit is contained in:
@@ -5,6 +5,8 @@ import net.fretux.ascend.config.AscendConfig;
|
|||||||
import net.fretux.ascend.network.PacketHandler;
|
import net.fretux.ascend.network.PacketHandler;
|
||||||
import net.fretux.ascend.registry.ModBlocks;
|
import net.fretux.ascend.registry.ModBlocks;
|
||||||
import net.fretux.ascend.registry.ModItems;
|
import net.fretux.ascend.registry.ModItems;
|
||||||
|
import net.fretux.ascend.worldgen.ModStructurePieces;
|
||||||
|
import net.fretux.ascend.worldgen.ModStructures;
|
||||||
import net.minecraftforge.common.MinecraftForge;
|
import net.minecraftforge.common.MinecraftForge;
|
||||||
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
import net.minecraftforge.eventbus.api.SubscribeEvent;
|
||||||
import net.minecraftforge.fml.common.Mod;
|
import net.minecraftforge.fml.common.Mod;
|
||||||
@@ -26,6 +28,8 @@ public class AscendMod {
|
|||||||
net.minecraftforge.fml.ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AscendConfig.COMMON_SPEC);
|
net.minecraftforge.fml.ModLoadingContext.get().registerConfig(ModConfig.Type.COMMON, AscendConfig.COMMON_SPEC);
|
||||||
ModItems.register(modBus);
|
ModItems.register(modBus);
|
||||||
ModBlocks.register(modBus);
|
ModBlocks.register(modBus);
|
||||||
|
ModStructures.STRUCTURE_TYPES.register(modBus);
|
||||||
|
ModStructurePieces.PIECES.register(modBus);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void onCommonSetup(final FMLCommonSetupEvent event) {
|
private void onCommonSetup(final FMLCommonSetupEvent event) {
|
||||||
|
|||||||
@@ -19,10 +19,9 @@ public class AscendDataGenerators {
|
|||||||
public static void gatherData(GatherDataEvent event) {
|
public static void gatherData(GatherDataEvent event) {
|
||||||
DataGenerator generator = event.getGenerator();
|
DataGenerator generator = event.getGenerator();
|
||||||
PackOutput output = generator.getPackOutput();
|
PackOutput output = generator.getPackOutput();
|
||||||
ExistingFileHelper helper = event.getExistingFileHelper();
|
ExistingFileHelper existingFileHelper = event.getExistingFileHelper();
|
||||||
|
generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, existingFileHelper));
|
||||||
generator.addProvider(event.includeClient(), new ModBlockStateProvider(output, helper));
|
generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, existingFileHelper));
|
||||||
generator.addProvider(event.includeClient(), new AscendItemModelProvider(output, helper));
|
|
||||||
generator.addProvider(event.includeServer(), new ModLootTableProvider(output));
|
generator.addProvider(event.includeServer(), new ModLootTableProvider(output));
|
||||||
generator.addProvider(event.includeServer(), new ModWorldGenProvider(output, event.getLookupProvider()));
|
generator.addProvider(event.includeServer(), new ModWorldGenProvider(output, event.getLookupProvider()));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package net.fretux.ascend.worldgen;
|
||||||
|
|
||||||
|
import net.fretux.ascend.AscendMod;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType;
|
||||||
|
import net.minecraftforge.registries.DeferredRegister;
|
||||||
|
import net.minecraftforge.registries.RegistryObject;
|
||||||
|
|
||||||
|
public class ModStructurePieces {
|
||||||
|
|
||||||
|
public static final DeferredRegister<StructurePieceType> PIECES =
|
||||||
|
DeferredRegister.create(Registries.STRUCTURE_PIECE, AscendMod.MODID);
|
||||||
|
|
||||||
|
public static final RegistryObject<StructurePieceType> SHRINE_PIECE =
|
||||||
|
PIECES.register("shrine_piece",
|
||||||
|
() -> ShrinePiece::new);
|
||||||
|
}
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
package net.fretux.ascend.worldgen;
|
||||||
|
|
||||||
|
import net.fretux.ascend.AscendMod;
|
||||||
|
import net.minecraft.core.registries.Registries;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.StructureType;
|
||||||
|
import net.minecraftforge.registries.DeferredRegister;
|
||||||
|
import net.minecraftforge.registries.RegistryObject;
|
||||||
|
|
||||||
|
public class ModStructures {
|
||||||
|
|
||||||
|
public static final DeferredRegister<StructureType<?>> STRUCTURE_TYPES =
|
||||||
|
DeferredRegister.create(Registries.STRUCTURE_TYPE, AscendMod.MODID);
|
||||||
|
|
||||||
|
public static final RegistryObject<StructureType<SimpleShrineStructure>> SHRINE =
|
||||||
|
STRUCTURE_TYPES.register("shrine_of_remembrance",
|
||||||
|
() -> () -> SimpleShrineStructure.CODEC);
|
||||||
|
}
|
||||||
@@ -1,26 +1,26 @@
|
|||||||
package net.fretux.ascend.worldgen;
|
package net.fretux.ascend.worldgen;
|
||||||
|
|
||||||
import com.mojang.serialization.Codec;
|
|
||||||
import net.fretux.ascend.AscendMod;
|
import net.fretux.ascend.AscendMod;
|
||||||
import net.fretux.ascend.registry.ModBlocks;
|
|
||||||
import net.minecraft.core.HolderLookup;
|
import net.minecraft.core.HolderLookup;
|
||||||
import net.minecraft.core.RegistrySetBuilder;
|
import net.minecraft.core.RegistrySetBuilder;
|
||||||
import net.minecraft.core.registries.Registries;
|
import net.minecraft.core.registries.Registries;
|
||||||
import net.minecraft.data.PackOutput;
|
import net.minecraft.data.PackOutput;
|
||||||
import net.minecraft.data.worldgen.BootstapContext;
|
import net.minecraft.data.worldgen.BootstapContext;
|
||||||
import net.minecraft.data.worldgen.placement.PlacementUtils;
|
|
||||||
import net.minecraft.resources.ResourceKey;
|
import net.minecraft.resources.ResourceKey;
|
||||||
import net.minecraft.resources.ResourceLocation;
|
import net.minecraft.resources.ResourceLocation;
|
||||||
|
import net.minecraft.tags.BiomeTags;
|
||||||
|
import net.minecraft.world.level.block.MultifaceSpreader;
|
||||||
import net.minecraft.world.level.levelgen.GenerationStep;
|
import net.minecraft.world.level.levelgen.GenerationStep;
|
||||||
import net.minecraft.world.level.levelgen.feature.ConfiguredFeature;
|
import net.minecraft.world.level.levelgen.structure.Structure;
|
||||||
import net.minecraft.world.level.levelgen.feature.Feature;
|
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
||||||
import net.minecraft.world.level.levelgen.feature.configurations.NoneFeatureConfiguration;
|
import net.minecraft.world.level.levelgen.structure.TerrainAdjustment;
|
||||||
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
|
import net.minecraft.world.level.levelgen.structure.placement.StructurePlacement;
|
||||||
import net.minecraft.world.level.levelgen.placement.RarityFilter;
|
|
||||||
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider;
|
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider;
|
||||||
import net.minecraftforge.registries.ForgeRegistries;
|
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType;
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.concurrent.CompletableFuture;
|
import java.util.concurrent.CompletableFuture;
|
||||||
|
|
||||||
@@ -28,28 +28,50 @@ import java.util.concurrent.CompletableFuture;
|
|||||||
* Generates structure and worldgen JSON entries for the Shrine of Remembrance.
|
* Generates structure and worldgen JSON entries for the Shrine of Remembrance.
|
||||||
*/
|
*/
|
||||||
public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider {
|
public class ModWorldGenProvider extends DatapackBuiltinEntriesProvider {
|
||||||
public static final ResourceKey<ConfiguredFeature<?, ?>> SHRINE_CONFIGURED =
|
|
||||||
ResourceKey.create(Registries.CONFIGURED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance"));
|
public static final ResourceKey<Structure> SHRINE =
|
||||||
public static final ResourceKey<PlacedFeature> SHRINE_PLACED =
|
ResourceKey.create(Registries.STRUCTURE,
|
||||||
ResourceKey.create(Registries.PLACED_FEATURE, new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance"));
|
new ResourceLocation(AscendMod.MODID, "shrine_of_remembrance"));
|
||||||
|
|
||||||
|
public static final ResourceKey<StructureSet> SHRINE_SET =
|
||||||
|
ResourceKey.create(Registries.STRUCTURE_SET,
|
||||||
|
new ResourceLocation(AscendMod.MODID, "shrine_set"));
|
||||||
|
|
||||||
public ModWorldGenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
|
public ModWorldGenProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> registries) {
|
||||||
super(output, registries, new RegistrySetBuilder()
|
super(output, registries, new RegistrySetBuilder()
|
||||||
.add(Registries.CONFIGURED_FEATURE, ModWorldGenProvider::bootstrapConfigured)
|
.add(Registries.STRUCTURE, ModWorldGenProvider::bootstrapStructures)
|
||||||
.add(Registries.PLACED_FEATURE, ModWorldGenProvider::bootstrapPlaced),
|
.add(Registries.STRUCTURE_SET, ModWorldGenProvider::bootstrapStructureSets),
|
||||||
Set.of(AscendMod.MODID));
|
Set.of(AscendMod.MODID));
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void bootstrapConfigured(BootstapContext<ConfiguredFeature<?, ?>> ctx) {
|
private static void bootstrapStructures(BootstapContext<Structure> ctx) {
|
||||||
ctx.register(SHRINE_CONFIGURED,
|
ctx.register(
|
||||||
new ConfiguredFeature<>(Feature.NO_OP, NoneFeatureConfiguration.INSTANCE));
|
SHRINE,
|
||||||
|
new SimpleShrineStructure(
|
||||||
|
new Structure.StructureSettings(
|
||||||
|
ctx.lookup(Registries.BIOME)
|
||||||
|
.getOrThrow(BiomeTags.IS_OVERWORLD),
|
||||||
|
Map.of(),
|
||||||
|
GenerationStep.Decoration.SURFACE_STRUCTURES,
|
||||||
|
TerrainAdjustment.NONE
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static void bootstrapPlaced(BootstapContext<PlacedFeature> ctx) {
|
private static void bootstrapStructureSets(BootstapContext<StructureSet> ctx) {
|
||||||
var configured = ctx.lookup(Registries.CONFIGURED_FEATURE).getOrThrow(SHRINE_CONFIGURED);
|
ctx.register(
|
||||||
ctx.register(SHRINE_PLACED,
|
SHRINE_SET,
|
||||||
new PlacedFeature(configured, List.of(
|
new StructureSet(
|
||||||
RarityFilter.onAverageOnceEvery(400) // roughly like mineshafts
|
List.of(new StructureSet.StructureSelectionEntry(
|
||||||
)));
|
ctx.lookup(Registries.STRUCTURE).getOrThrow(SHRINE), 1)),
|
||||||
|
new RandomSpreadStructurePlacement(
|
||||||
|
32,
|
||||||
|
8,
|
||||||
|
RandomSpreadType.LINEAR,
|
||||||
|
1234567
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,56 @@
|
|||||||
|
package net.fretux.ascend.worldgen;
|
||||||
|
|
||||||
|
import net.fretux.ascend.registry.ModBlocks;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.nbt.CompoundTag;
|
||||||
|
import net.minecraft.util.RandomSource;
|
||||||
|
import net.minecraft.world.level.ChunkPos;
|
||||||
|
import net.minecraft.world.level.StructureManager;
|
||||||
|
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.StructurePiece;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceSerializationContext;
|
||||||
|
|
||||||
|
public class ShrinePiece extends StructurePiece {
|
||||||
|
|
||||||
|
private final BlockPos pos;
|
||||||
|
|
||||||
|
public ShrinePiece(BlockPos pos) {
|
||||||
|
super(ModStructurePieces.SHRINE_PIECE.get(),
|
||||||
|
0,
|
||||||
|
new BoundingBox(
|
||||||
|
pos.getX(), pos.getY() - 5, pos.getZ(),
|
||||||
|
pos.getX(), pos.getY() + 5, pos.getZ()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
this.pos = pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
public ShrinePiece(StructurePieceSerializationContext ctx, CompoundTag tag) {
|
||||||
|
super(ModStructurePieces.SHRINE_PIECE.get(), tag);
|
||||||
|
this.pos = new BlockPos(tag.getInt("x"), tag.getInt("y"), tag.getInt("z"));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void addAdditionalSaveData(StructurePieceSerializationContext ctx, CompoundTag tag) {
|
||||||
|
tag.putInt("x", pos.getX());
|
||||||
|
tag.putInt("y", pos.getY());
|
||||||
|
tag.putInt("z", pos.getZ());
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void postProcess(
|
||||||
|
WorldGenLevel level,
|
||||||
|
StructureManager manager,
|
||||||
|
ChunkGenerator generator,
|
||||||
|
RandomSource random,
|
||||||
|
BoundingBox box,
|
||||||
|
ChunkPos chunkPos,
|
||||||
|
BlockPos structurePos
|
||||||
|
) {
|
||||||
|
if (box.isInside(pos)) {
|
||||||
|
level.setBlock(pos, ModBlocks.SHRINE_OF_REMEMBRANCE.get().defaultBlockState(), 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
package net.fretux.ascend.worldgen;
|
||||||
|
|
||||||
|
import com.mojang.serialization.Codec;
|
||||||
|
import net.minecraft.core.BlockPos;
|
||||||
|
import net.minecraft.world.level.levelgen.Heightmap;
|
||||||
|
import net.minecraft.world.level.levelgen.structure.*;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public class SimpleShrineStructure extends Structure {
|
||||||
|
public static final Codec<SimpleShrineStructure> CODEC =
|
||||||
|
simpleCodec(SimpleShrineStructure::new);
|
||||||
|
|
||||||
|
public SimpleShrineStructure(StructureSettings settings) {
|
||||||
|
super(settings);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public StructureType<?> type() {
|
||||||
|
return ModStructures.SHRINE.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Optional<GenerationStub> findGenerationPoint(GenerationContext ctx) {
|
||||||
|
BlockPos pos = ctx.chunkPos().getMiddleBlockPosition(0);
|
||||||
|
int y = ctx.chunkGenerator().getFirstFreeHeight(
|
||||||
|
pos.getX(),
|
||||||
|
pos.getZ(),
|
||||||
|
Heightmap.Types.WORLD_SURFACE_WG,
|
||||||
|
ctx.heightAccessor(),
|
||||||
|
ctx.randomState()
|
||||||
|
);
|
||||||
|
BlockPos finalPos = new BlockPos(pos.getX(), y, pos.getZ());
|
||||||
|
return Optional.of(new GenerationStub(finalPos, builder -> {
|
||||||
|
builder.addPiece(new ShrinePiece(finalPos));
|
||||||
|
}));
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user