Skip to content

Commit

Permalink
Geode
Browse files Browse the repository at this point in the history
  • Loading branch information
Edivad99 committed Aug 29, 2023
1 parent 7bab42a commit a072e60
Show file tree
Hide file tree
Showing 11 changed files with 275 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// 1.20.1 2023-07-26T15:10:45.011469 Registries
// 1.20.1 2023-08-29T14:43:55.596827 Registries
febb98aea6d16a6b3ef939bd3fb613f874ea974a data/railcraft/damage_type/bore.json
bd26d74b84c1805b9ee7dabf21ed62cf44609f5e data/railcraft/damage_type/creosote.json
bcc0737ada4e58124e8650c74c9e1a9aae4813b2 data/railcraft/damage_type/crusher.json
Expand Down Expand Up @@ -47,3 +47,5 @@ e51f07523b15de8fbd5a18ffe47d07ad47e4edaf data/railcraft/worldgen/placed_feature/
c201091adbb6cf9f1c5bc20966f6f3b51f7a41c7 data/railcraft/worldgen/placed_feature/tin_ore_large.json
0095b19af5e9a322e0c88bb580498ec83066d22c data/railcraft/worldgen/placed_feature/tin_ore_small.json
cd761e1dd22bba54411e81e8314541563b012e76 data/railcraft/worldgen/placed_feature/zinc_ore.json
b2586582292380f39956956234bc6fb47a9e2c3c data/railcraft/worldgen/structure/geode.json
c0dc7adafebd391c0cb05f9f822de126c498927e data/railcraft/worldgen/structure_set/geode.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"type": "railcraft:geode",
"biomes": "#minecraft:is_deep_ocean",
"spawn_overrides": {},
"step": "surface_structures"
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"placement": {
"type": "minecraft:random_spread",
"salt": 73927265,
"separation": 4,
"spacing": 16,
"spread_type": "triangular"
},
"structures": [
{
"structure": "railcraft:geode",
"weight": 1
}
]
}
10 changes: 9 additions & 1 deletion src/main/java/mods/railcraft/Railcraft.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,8 @@
import mods.railcraft.data.recipes.RailcraftRecipeProvider;
import mods.railcraft.data.recipes.builders.BrewingRecipe;
import mods.railcraft.data.worldgen.RailcraftBiomeModifiers;
import mods.railcraft.data.worldgen.RailcraftStructureSets;
import mods.railcraft.data.worldgen.RailcraftStructures;
import mods.railcraft.data.worldgen.features.RailcraftOreFeatures;
import mods.railcraft.data.worldgen.placements.RailcraftOrePlacements;
import mods.railcraft.fuel.FuelManagerImpl;
Expand Down Expand Up @@ -59,6 +61,8 @@
import mods.railcraft.world.level.block.track.TrackTypes;
import mods.railcraft.world.level.gameevent.RailcraftGameEvents;
import mods.railcraft.world.level.levelgen.structure.ComponentWorkshop;
import mods.railcraft.world.level.levelgen.structure.RailcraftStructurePieces;
import mods.railcraft.world.level.levelgen.structure.RailcraftStructureTypes;
import mods.railcraft.world.level.material.RailcraftFluidTypes;
import mods.railcraft.world.level.material.RailcraftFluids;
import mods.railcraft.world.signal.TokenRingManager;
Expand Down Expand Up @@ -157,6 +161,8 @@ public Railcraft() {
RailcraftPoiTypes.register(modEventBus);
RailcraftVillagerProfession.register(modEventBus);
RailcraftLootModifiers.register(modEventBus);
RailcraftStructureTypes.register(modEventBus);
RailcraftStructurePieces.register(modEventBus);
}

// ================================================================================
Expand Down Expand Up @@ -220,7 +226,9 @@ private void handleGatherData(GatherDataEvent event) {
.add(Registries.CONFIGURED_FEATURE, RailcraftOreFeatures::bootstrap)
.add(Registries.PLACED_FEATURE, RailcraftOrePlacements::bootstrap)
.add(ForgeRegistries.Keys.BIOME_MODIFIERS, RailcraftBiomeModifiers::bootstrap)
.add(Registries.DAMAGE_TYPE, RailcraftDamageType::bootstrap);
.add(Registries.DAMAGE_TYPE, RailcraftDamageType::bootstrap)
.add(Registries.STRUCTURE, RailcraftStructures::bootstrap)
.add(Registries.STRUCTURE_SET, RailcraftStructureSets::bootstrap);

generator.addProvider(event.includeServer(),
(DataProvider.Factory<DatapackBuiltinEntriesProvider>) output ->
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
package mods.railcraft.data.worldgen;

import mods.railcraft.Railcraft;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.world.level.levelgen.structure.StructureSet;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadStructurePlacement;
import net.minecraft.world.level.levelgen.structure.placement.RandomSpreadType;

public class RailcraftStructureSets {

private static final ResourceKey<StructureSet> GEODE = ResourceKey
.create(Registries.STRUCTURE_SET, new ResourceLocation(Railcraft.ID, "geode"));

public static void bootstrap(BootstapContext<StructureSet> context) {
var holdergetter = context.lookup(Registries.STRUCTURE);
context.register(GEODE, new StructureSet(holdergetter.getOrThrow(RailcraftStructures.GEODE),
new RandomSpreadStructurePlacement(16, 4, RandomSpreadType.TRIANGULAR, 73927265)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package mods.railcraft.data.worldgen;

import mods.railcraft.Railcraft;
import mods.railcraft.world.level.levelgen.structure.GeodeStructure;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.worldgen.BootstapContext;
import net.minecraft.data.worldgen.Structures;
import net.minecraft.resources.ResourceKey;
import net.minecraft.resources.ResourceLocation;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.levelgen.GenerationStep;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.TerrainAdjustment;

public class RailcraftStructures {

public static final ResourceKey<Structure> GEODE = ResourceKey
.create(Registries.STRUCTURE, new ResourceLocation(Railcraft.ID, "geode"));

public static void bootstrap(BootstapContext<Structure> context) {
var holdergetter = context.lookup(Registries.BIOME);

context.register(GEODE, new GeodeStructure(Structures
.structure(holdergetter.getOrThrow(BiomeTags.IS_DEEP_OCEAN),
GenerationStep.Decoration.SURFACE_STRUCTURES, TerrainAdjustment.NONE)));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package mods.railcraft.world.level.levelgen.structure;

import java.util.Optional;
import net.minecraft.tags.BiomeTags;
import net.minecraft.world.level.levelgen.Heightmap;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePiecesBuilder;

public class GeodeStructure extends Structure {

public GeodeStructure(StructureSettings settings) {
super(settings);
}

@Override
protected Optional<GenerationStub> findGenerationPoint(GenerationContext context) {
int x = context.chunkPos().getBlockX(9);
int z = context.chunkPos().getBlockZ(9);

for(var holder : context.biomeSource().getBiomesWithin(x,
context.chunkGenerator().getSeaLevel(),z, 29, context.randomState().sampler())) {
if (!holder.is(BiomeTags.IS_DEEP_OCEAN)) {
return Optional.empty();
}
}
return onTopOfChunkCenter(context, Heightmap.Types.OCEAN_FLOOR_WG, (structurePiecesBuilder) -> {
generatePieces(structurePiecesBuilder, context);
});
}

private void generatePieces(StructurePiecesBuilder builder, GenerationContext context) {
var chunkPos = context.chunkPos();
var generator = context.chunkGenerator();
var heightAccessor = context.heightAccessor();
var random = context.random();
var state = context.randomState();

int x = chunkPos.getBlockX(random.nextInt(16));
int z = chunkPos.getBlockZ(random.nextInt(16));
int y = generator.getBaseHeight(x, z, Heightmap.Types.OCEAN_FLOOR, heightAccessor, state);
builder.addPiece(new GeodeStructurePiece(x, y - 6, z));
}

@Override
public StructureType<?> type() {
return RailcraftStructureTypes.GEODE.get();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package mods.railcraft.world.level.levelgen.structure;

import mods.railcraft.world.level.block.RailcraftBlocks;
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.block.Blocks;
import net.minecraft.world.level.block.state.BlockState;
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 GeodeStructurePiece extends StructurePiece {

private static final int DISTANCE_OUTER_SQ = 8 * 8;
private static final int DISTANCE_ORE_SQ = 5 * 5;
private static final int DISTANCE_INNER_SQ = 4 * 4;

public GeodeStructurePiece(int minX, int y, int minZ) {
super(RailcraftStructurePieces.GEODE.get(), 0, createBoundingBox(minX, y, minZ));
this.setOrientation(null);
}

private static BoundingBox createBoundingBox(int minX, int y, int minZ) {
return new BoundingBox(minX, y, minZ, minX + 16, y + 16, minZ + 16);
}

public GeodeStructurePiece(CompoundTag tag) {
super(RailcraftStructurePieces.GEODE.get(), tag);
}

@Override
protected void addAdditionalSaveData(StructurePieceSerializationContext context,
CompoundTag tag) {
}

@Override
public void postProcess(WorldGenLevel level, StructureManager structureManager,
ChunkGenerator generator, RandomSource random, BoundingBox box, ChunkPos chunkPos,
BlockPos pos) {
for (int x = -8; x < 8; x++) {
for (int y = -8; y < 8; y++) {
for (int z = -8; z < 8; z++) {
int distSq = x * x + y * y + z * z;
var targetPos = pos.offset(x, 9 + y, z);
if (distSq <= DISTANCE_INNER_SQ) {
placeAir(level, targetPos);
} else if (distSq <= DISTANCE_OUTER_SQ) {
placeStone(level, targetPos, random);
}
var existingState = level.getBlockState(targetPos);
if (distSq > DISTANCE_INNER_SQ && distSq <= DISTANCE_ORE_SQ) {
placeOre(level, existingState, random, targetPos);
}
}
}
}
}

private void placeAir(WorldGenLevel level, BlockPos pos) {
if (this.canBeReplaced(level, pos.getX(), pos.getY(), pos.getZ(), new BoundingBox(pos))) {
this.placeBlock(level, Blocks.AIR.defaultBlockState(), pos.getX(), pos.getY(), pos.getZ(),
new BoundingBox(pos));
}
}

private void placeStone(WorldGenLevel level, BlockPos pos, RandomSource random) {
if (this.canBeReplaced(level, pos.getX(), pos.getY(), pos.getZ(), new BoundingBox(pos))) {
var state = random.nextDouble() < 0.2
? random.nextDouble() < 0.5
? Blocks.DEEPSLATE.defaultBlockState()
: Blocks.SMOOTH_BASALT.defaultBlockState()
: RailcraftBlocks.ABYSSAL_STONE.get().defaultBlockState();
this.placeBlock(level, state, pos.getX(), pos.getY(), pos.getZ(), new BoundingBox(pos));
}
}

private void placeOre(WorldGenLevel level, BlockState existingState, RandomSource random,
BlockPos pos) {
if (existingState.is(RailcraftBlocks.ABYSSAL_STONE.get())) {
double chance = random.nextDouble();
BlockState oreState = null;
if (chance <= 0.004) {
oreState = Blocks.DEEPSLATE_DIAMOND_ORE.defaultBlockState();
} else if (chance <= 0.008) {
oreState = Blocks.DEEPSLATE_EMERALD_ORE.defaultBlockState();
} else if (chance <= 0.02) {
oreState = Blocks.DEEPSLATE_LAPIS_ORE.defaultBlockState();
}
if (oreState != null) {
this.placeBlock(level, oreState, pos.getX(), pos.getY(), pos.getZ(), new BoundingBox(pos));
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package mods.railcraft.world.level.levelgen.structure;

import mods.railcraft.Railcraft;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.level.levelgen.structure.pieces.StructurePieceType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;

public class RailcraftStructurePieces {

private static final DeferredRegister<StructurePieceType> deferredRegister =
DeferredRegister.create(Registries.STRUCTURE_PIECE, Railcraft.ID);

public static final RegistryObject<StructurePieceType.ContextlessType> GEODE =
deferredRegister.register("geode", () -> GeodeStructurePiece::new);

public static void register(IEventBus modEventBus) {
deferredRegister.register(modEventBus);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package mods.railcraft.world.level.levelgen.structure;

import mods.railcraft.Railcraft;
import net.minecraft.core.registries.Registries;
import net.minecraft.world.level.levelgen.structure.Structure;
import net.minecraft.world.level.levelgen.structure.StructureType;
import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.registries.DeferredRegister;
import net.minecraftforge.registries.RegistryObject;

public class RailcraftStructureTypes {

private static final DeferredRegister<StructureType<?>> deferredRegister =
DeferredRegister.create(Registries.STRUCTURE_TYPE, Railcraft.ID);

public static final RegistryObject<StructureType<GeodeStructure>> GEODE =
deferredRegister.register("geode",
() -> () -> Structure.simpleCodec(GeodeStructure::new));

public static void register(IEventBus modEventBus) {
deferredRegister.register(modEventBus);
}
}
1 change: 1 addition & 0 deletions src/main/resources/META-INF/accesstransformer.cfg
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public net.minecraft.data.models.blockstates.Condition$TerminalCondition f_12516
public net.minecraft.data.worldgen.placement.OrePlacements m_195346_(Lnet/minecraft/world/level/levelgen/placement/PlacementModifier;Lnet/minecraft/world/level/levelgen/placement/PlacementModifier;)Ljava/util/List; # orePlacement
public net.minecraft.data.worldgen.placement.OrePlacements m_195343_(ILnet/minecraft/world/level/levelgen/placement/PlacementModifier;)Ljava/util/List; # commonOrePlacement
public net.minecraft.data.worldgen.placement.OrePlacements m_195349_(ILnet/minecraft/world/level/levelgen/placement/PlacementModifier;)Ljava/util/List; # rareOrePlacement
public-f net.minecraft.data.worldgen.Structures m_255131_(Lnet/minecraft/core/HolderSet;Lnet/minecraft/world/level/levelgen/GenerationStep$Decoration;Lnet/minecraft/world/level/levelgen/structure/TerrainAdjustment;)Lnet/minecraft/world/level/levelgen/structure/Structure$StructureSettings; # structure

public net.minecraft.world.entity.vehicle.AbstractMinecart f_38068_ # flipped

Expand Down

0 comments on commit a072e60

Please sign in to comment.