diff --git a/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java b/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java index e941d9d..1ef66e6 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java +++ b/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java @@ -67,6 +67,9 @@ public class CommonClass ModSounds.register(); ModPackets.register(); - ModWorldGeneration.generateWorldGen(); + + if (Services.PLATFORM.getPlatformName().equals("FabricMC")) { + ModWorldGeneration.generateWorldGen(); + } } } \ No newline at end of file diff --git a/common/src/main/java/net/cmr/jurassicrevived/config/JRConfig.java b/common/src/main/java/net/cmr/jurassicrevived/config/JRConfig.java index 27c784d..04d0005 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/config/JRConfig.java +++ b/common/src/main/java/net/cmr/jurassicrevived/config/JRConfig.java @@ -5,7 +5,7 @@ public final class JRConfig { * When false, machines do not require/consume power, machine GUIs hide their power bars, * and energy pipes do not connect to machines. Generator and power cell behavior is unchanged. */ - public boolean requirePower = true; + public boolean requirePower = false; /** * Controls whether dinosaurs should naturally spawn. diff --git a/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java new file mode 100644 index 0000000..64faa90 --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/datagen/ModWorldgenProvider.java @@ -0,0 +1,199 @@ +package net.cmr.jurassicrevived.datagen; + +import com.google.gson.JsonArray; +import com.google.gson.JsonObject; +import net.cmr.jurassicrevived.Constants; +import net.cmr.jurassicrevived.worldgen.ModSpawnDefinitions; +import net.cmr.jurassicrevived.worldgen.ModWorldgenDefinitions; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.data.CachedOutput; +import net.minecraft.data.DataProvider; +import net.minecraft.data.PackOutput; +import net.minecraft.resources.ResourceLocation; +import net.minecraft.world.entity.EntityType; + +import java.nio.file.Path; +import java.util.concurrent.CompletableFuture; + +public class ModWorldgenProvider implements DataProvider { + private final PackOutput output; + + public ModWorldgenProvider(PackOutput output) { + this.output = output; + } + + @Override + public CompletableFuture run(CachedOutput cachedOutput) { + CompletableFuture[] oreFutures = ModWorldgenDefinitions.ORES.stream() + .flatMap(ore -> java.util.stream.Stream.of( + saveConfiguredFeature(cachedOutput, ore), + savePlacedFeature(cachedOutput, ore), + saveForgeAddFeatureBiomeModifier(cachedOutput, ore), + saveNeoForgeAddFeatureBiomeModifier(cachedOutput, ore) + )) + .toArray(CompletableFuture[]::new); + + CompletableFuture[] spawnFutures = ModSpawnDefinitions.NATURAL_SPAWNS.stream() + .flatMap(spawn -> java.util.stream.Stream.concat( + java.util.stream.IntStream.range(0, spawn.biomeTags().size()) + .mapToObj(index -> saveForgeAddSpawnBiomeModifier(cachedOutput, spawn, index)), + java.util.stream.IntStream.range(0, spawn.biomeTags().size()) + .mapToObj(index -> saveNeoForgeAddSpawnBiomeModifier(cachedOutput, spawn, index)) + )) + .toArray(CompletableFuture[]::new); + + return CompletableFuture.allOf( + java.util.stream.Stream.concat( + java.util.Arrays.stream(oreFutures), + java.util.Arrays.stream(spawnFutures) + ).toArray(CompletableFuture[]::new) + ); + } + + private CompletableFuture saveForgeAddFeatureBiomeModifier(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { + JsonObject root = new JsonObject(); + root.addProperty("type", "forge:add_features"); + root.addProperty("biomes", "#minecraft:is_overworld"); + root.addProperty("features", Constants.rl(ore.name() + "_placed").toString()); + root.addProperty("step", "underground_ores"); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/forge/biome_modifier/add_" + ore.name() + ".json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + private CompletableFuture saveNeoForgeAddFeatureBiomeModifier(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { + JsonObject root = new JsonObject(); + root.addProperty("type", "neoforge:add_features"); + root.addProperty("biomes", "#minecraft:is_overworld"); + root.addProperty("features", Constants.rl(ore.name() + "_placed").toString()); + root.addProperty("step", "underground_ores"); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/neoforge/biome_modifier/add_" + ore.name() + ".json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + private CompletableFuture saveForgeAddSpawnBiomeModifier(CachedOutput cachedOutput, ModSpawnDefinitions.SpawnDefinition spawn, int biomeTagIndex) { + JsonObject root = createConditionalAddSpawnBiomeModifier(spawn, biomeTagIndex); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/forge/biome_modifier/spawn_" + spawn.name() + "_" + biomeTagIndex + ".json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + private CompletableFuture saveNeoForgeAddSpawnBiomeModifier(CachedOutput cachedOutput, ModSpawnDefinitions.SpawnDefinition spawn, int biomeTagIndex) { + JsonObject root = createConditionalAddSpawnBiomeModifier(spawn, biomeTagIndex); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/neoforge/biome_modifier/spawn_" + spawn.name() + "_" + biomeTagIndex + ".json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + private JsonObject createConditionalAddSpawnBiomeModifier(ModSpawnDefinitions.SpawnDefinition spawn, int biomeTagIndex) { + JsonObject root = new JsonObject(); + root.addProperty("type", Constants.rl("conditional_add_spawns").toString()); + root.addProperty("biomes", "#" + spawn.biomeTags().get(biomeTagIndex).location()); + + JsonArray spawners = new JsonArray(); + JsonObject spawner = new JsonObject(); + + EntityType entityType = spawn.entityType().get(); + spawner.addProperty("type", BuiltInRegistries.ENTITY_TYPE.getKey(entityType).toString()); + spawner.addProperty("weight", spawn.weight()); + spawner.addProperty("minCount", spawn.minCount()); + spawner.addProperty("maxCount", spawn.maxCount()); + + spawners.add(spawner); + root.add("spawners", spawners); + + return root; + } + + private CompletableFuture saveConfiguredFeature(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { + JsonObject root = new JsonObject(); + root.addProperty("type", "minecraft:ore"); + + JsonObject config = new JsonObject(); + config.addProperty("discard_chance_on_air_exposure", 0.0); + config.addProperty("size", ore.veinSize()); + + JsonArray targets = new JsonArray(); + + JsonObject targetEntry = new JsonObject(); + + JsonObject state = new JsonObject(); + ResourceLocation blockId = BuiltInRegistries.BLOCK.getKey(ore.block().get()); + state.addProperty("Name", blockId.toString()); + targetEntry.add("state", state); + + JsonObject target = new JsonObject(); + target.addProperty("predicate_type", "minecraft:tag_match"); + target.addProperty("tag", ore.replaceableTag().location().toString()); + targetEntry.add("target", target); + + targets.add(targetEntry); + config.add("targets", targets); + + root.add("config", config); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/worldgen/configured_feature/" + ore.name() + ".json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + private CompletableFuture savePlacedFeature(CachedOutput cachedOutput, ModWorldgenDefinitions.OreDefinition ore) { + JsonObject root = new JsonObject(); + root.addProperty("feature", Constants.rl(ore.name()).toString()); + + JsonArray placement = new JsonArray(); + + JsonObject count = new JsonObject(); + count.addProperty("type", "minecraft:count"); + count.addProperty("count", ore.count()); + placement.add(count); + + JsonObject inSquare = new JsonObject(); + inSquare.addProperty("type", "minecraft:in_square"); + placement.add(inSquare); + + JsonObject heightRange = new JsonObject(); + heightRange.addProperty("type", "minecraft:height_range"); + + JsonObject height = new JsonObject(); + height.addProperty("type", "minecraft:uniform"); + + JsonObject min = new JsonObject(); + min.addProperty("absolute", ore.minY()); + + JsonObject max = new JsonObject(); + max.addProperty("absolute", ore.maxY()); + + height.add("min_inclusive", min); + height.add("max_inclusive", max); + + heightRange.add("height", height); + placement.add(heightRange); + + JsonObject biome = new JsonObject(); + biome.addProperty("type", "minecraft:biome"); + placement.add(biome); + + root.add("placement", placement); + + Path path = output.getOutputFolder() + .resolve("data/" + Constants.MOD_ID + "/worldgen/placed_feature/" + ore.name() + "_placed.json"); + + return DataProvider.saveStable(cachedOutput, root, path); + } + + @Override + public String getName() { + return "Jurassic Revived Worldgen"; + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java b/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java index e98c5a8..418a7dd 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java @@ -495,10 +495,10 @@ public class ModEntities { private static void registerGroundAnimalSpawn(RegistrySupplier> entityType) { /*? if >1.20.1 {*/ /*SpawnPlacementsRegistry.register(entityType, SpawnPlacementTypes.ON_GROUND, - Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, (type, level, reason, pos, random) -> true); *//*?} else {*/ SpawnPlacementsRegistry.register(entityType, SpawnPlacements.Type.ON_GROUND, - Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, (type, level, reason, pos, random) -> true); /*?}*/ } diff --git a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModSpawnDefinitions.java b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModSpawnDefinitions.java new file mode 100644 index 0000000..43f729a --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModSpawnDefinitions.java @@ -0,0 +1,103 @@ +package net.cmr.jurassicrevived.worldgen; + +import net.cmr.jurassicrevived.entity.ModEntities; +import net.minecraft.tags.BiomeTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.entity.EntityType; +import net.minecraft.world.level.biome.Biome; + +import java.util.List; +import java.util.function.Supplier; + +public final class ModSpawnDefinitions { + private ModSpawnDefinitions() { + } + + public static final List NATURAL_SPAWNS = List.of( + spawn("albertosaurus", ModEntities.ALBERTOSAURUS, 12, 1, 2, BiomeTags.IS_TAIGA), + spawn("allosaurus", ModEntities.ALLOSAURUS, 10, 1, 2, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("alvarezsaurus", ModEntities.ALVAREZSAURUS, 28, 2, 4, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("ankylosaurus", ModEntities.ANKYLOSAURUS, 14, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("apatosaurus", ModEntities.APATOSAURUS, 10, 1, 2, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("arambourgiania", ModEntities.ARAMBOURGIANIA, 6, 2, 3, BiomeTags.IS_MOUNTAIN), + spawn("baryonyx", ModEntities.BARYONYX, 8, 1, 2, BiomeTags.IS_OVERWORLD), + spawn("brachiosaurus", ModEntities.BRACHIOSAURUS, 7, 1, 2, BiomeTags.IS_FOREST, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("carcharodontosaurus", ModEntities.CARCHARODONTOSAURUS, 6, 1, 2, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("carnotaurus", ModEntities.CARNOTAURUS, 11, 2, 3, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("cearadactylus", ModEntities.CEARADACTYLUS, 6, 2, 4, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN), + spawn("ceratosaurus", ModEntities.CERATOSAURUS, 9, 1, 2, BiomeTags.IS_JUNGLE, BiomeTags.IS_OVERWORLD), + spawn("chasmosaurus", ModEntities.CHASMOSAURUS, 18, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("coelophysis", ModEntities.COELOPHYSIS, 30, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_TAIGA), + spawn("coelurus", ModEntities.COELURUS, 28, 2, 4, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("compsognathus", ModEntities.COMPSOGNATHUS, 36, 3, 6, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("concavenator", ModEntities.CONCAVENATOR, 10, 2, 3, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("corythosaurus", ModEntities.CORYTHOSAURUS, 24, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("deinonychus", ModEntities.DEINONYCHUS, 14, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("dilophosaurus", ModEntities.DILOPHOSAURUS, 22, 2, 3, BiomeTags.IS_JUNGLE), + spawn("dimorphodon", ModEntities.DIMORPHODON, 7, 2, 4, BiomeTags.IS_MOUNTAIN), + spawn("diplodocus", ModEntities.DIPLODOCUS, 8, 1, 2, BiomeTags.IS_FOREST, BiomeTags.IS_TAIGA), + spawn("dryosaurus", ModEntities.DRYOSAURUS, 32, 3, 6, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("edmontosaurus", ModEntities.EDMONTOSAURUS, 22, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("gallimimus", ModEntities.GALLIMIMUS, 36, 3, 6, BiomeTags.IS_OVERWORLD), + spawn("geosternbergia", ModEntities.GEOSTERNBERGIA, 7, 2, 4, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN), + spawn("giganotosaurus", ModEntities.GIGANOTOSAURUS, 3, 1, 2, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("guanlong", ModEntities.GUANLONG, 20, 2, 3, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("guidraco", ModEntities.GUIDRACO, 7, 2, 3, BiomeTags.IS_MOUNTAIN), + spawn("hadrosaurus", ModEntities.HADROSAURUS, 26, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("herrerasaurus", ModEntities.HERRERASAURUS, 24, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("hypsilophodon", ModEntities.HYPSILOPHODON, 34, 3, 6, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("inostrancevia", ModEntities.INOSTRANCEVIA, 5, 2, 3, BiomeTags.IS_TAIGA), + spawn("lambeosaurus", ModEntities.LAMBEOSAURUS, 24, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("ludodactylus", ModEntities.LUDODACTYLUS, 6, 2, 4, BiomeTags.IS_JUNGLE, BiomeTags.IS_MOUNTAIN), + spawn("majungasaurus", ModEntities.MAJUNGASAURUS, 8, 1, 2, BiomeTags.IS_JUNGLE, BiomeTags.IS_OVERWORLD), + spawn("mamenchisaurus", ModEntities.MAMENCHISAURUS, 7, 1, 2, BiomeTags.IS_JUNGLE), + spawn("metriacanthosaurus", ModEntities.METRIACANTHOSAURUS, 10, 2, 3, BiomeTags.IS_JUNGLE, BiomeTags.IS_FOREST), + spawn("moganopterus", ModEntities.MOGANOPTERUS, 7, 2, 3, BiomeTags.IS_JUNGLE, BiomeTags.IS_MOUNTAIN), + spawn("nyctosaurus", ModEntities.NYCTOSAURUS, 6, 2, 3, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN), + spawn("ornitholestes", ModEntities.ORNITHOLESTES, 30, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("ornithomimus", ModEntities.ORNITHOMIMUS, 30, 3, 6, BiomeTags.IS_OVERWORLD), + spawn("ouranosaurus", ModEntities.OURANOSAURUS, 22, 3, 5, BiomeTags.IS_OVERWORLD), + spawn("oviraptor", ModEntities.OVIRAPTOR, 34, 3, 5, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("pachycephalosaurus", ModEntities.PACHYCEPHALOSAURUS, 22, 2, 4, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("parasaurolophus", ModEntities.PARASAUROLOPHUS, 22, 3, 5, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("proceratosaurus", ModEntities.PROCERATOSAURUS, 24, 2, 4, BiomeTags.IS_FOREST, BiomeTags.IS_TAIGA), + spawn("procompsognathus", ModEntities.PROCOMPSOGNATHUS, 34, 3, 5, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("protoceratops", ModEntities.PROTOCERATOPS, 28, 3, 5, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("pteranodon", ModEntities.PTERANODON, 8, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN), + spawn("pterodaustro", ModEntities.PTERODAUSTRO, 12, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_OVERWORLD), + spawn("quetzalcoatlus", ModEntities.QUETZALCOATLUS, 4, 1, 2, BiomeTags.IS_MOUNTAIN), + spawn("rajasaurus", ModEntities.RAJASAURUS, 10, 2, 3, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("rugops", ModEntities.RUGOPS, 10, 2, 3, BiomeTags.IS_FOREST, BiomeTags.IS_OVERWORLD), + spawn("segisaurus", ModEntities.SEGISAURUS, 36, 3, 6, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("shantungosaurus", ModEntities.SHANTUNGOSAURUS, 8, 2, 4, BiomeTags.IS_JUNGLE, BiomeTags.IS_FOREST), + spawn("spinosaurus", ModEntities.SPINOSAURUS, 3, 1, 2, BiomeTags.IS_OVERWORLD), + spawn("stegosaurus", ModEntities.STEGOSAURUS, 14, 2, 4, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("styracosaurus", ModEntities.STYRACOSAURUS, 22, 2, 5, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("tapejara", ModEntities.TAPEJARA, 6, 2, 5, BiomeTags.IS_JUNGLE, BiomeTags.IS_MOUNTAIN), + spawn("therizinosaurus", ModEntities.THERIZINOSAURUS, 8, 1, 2, BiomeTags.IS_JUNGLE, BiomeTags.IS_FOREST), + spawn("titanosaurus", ModEntities.TITANOSAURUS, 7, 1, 2, BiomeTags.IS_JUNGLE, BiomeTags.IS_OVERWORLD), + spawn("triceratops", ModEntities.TRICERATOPS, 20, 3, 5, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("troodon", ModEntities.TROODON, 28, 3, 6, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("tropeognathus", ModEntities.TROPEOGNATHUS, 6, 2, 4, BiomeTags.IS_MOUNTAIN), + spawn("tupuxuara", ModEntities.TUPUXUARA, 6, 2, 5, BiomeTags.IS_JUNGLE, BiomeTags.IS_MOUNTAIN), + spawn("tyrannosaurus_rex", ModEntities.TYRANNOSAURUS_REX, 5, 1, 2, BiomeTags.IS_TAIGA, BiomeTags.IS_OVERWORLD), + spawn("utahraptor", ModEntities.UTAHRAPTOR, 16, 1, 3, BiomeTags.IS_TAIGA, BiomeTags.IS_FOREST), + spawn("velociraptor", ModEntities.VELOCIRAPTOR, 26, 2, 4, BiomeTags.IS_BADLANDS, BiomeTags.IS_OVERWORLD), + spawn("zhenyuanopterus", ModEntities.ZHENYUANOPTERUS, 7, 2, 5, BiomeTags.IS_BEACH, BiomeTags.IS_MOUNTAIN) + ); + + @SafeVarargs + private static SpawnDefinition spawn(String name, Supplier> entityType, int weight, int minCount, int maxCount, TagKey... biomeTags) { + return new SpawnDefinition(name, entityType, weight, minCount, maxCount, List.of(biomeTags)); + } + + public record SpawnDefinition( + String name, + Supplier> entityType, + int weight, + int minCount, + int maxCount, + List> biomeTags + ) { + } +} diff --git a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java index 57ccdbf..8e962f4 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java +++ b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java @@ -1,92 +1,28 @@ package net.cmr.jurassicrevived.worldgen; import dev.architectury.registry.level.biome.BiomeModifications; -import net.cmr.jurassicrevived.block.ModBlocks; import net.cmr.jurassicrevived.Constants; import net.cmr.jurassicrevived.config.JRConfigManager; import net.cmr.jurassicrevived.entity.ModEntities; -import net.minecraft.core.Holder; +import net.minecraft.core.registries.Registries; import net.minecraft.resources.ResourceKey; import net.minecraft.tags.BiomeTags; -import net.minecraft.tags.BlockTags; import net.minecraft.world.entity.EntityType; import net.minecraft.world.entity.MobCategory; -import net.minecraft.world.level.biome.Biome; -import net.minecraft.world.level.biome.Biomes; import net.minecraft.world.level.biome.MobSpawnSettings; -import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.GenerationStep; -import net.minecraft.world.level.levelgen.VerticalAnchor; -import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; -import net.minecraft.world.level.levelgen.feature.Feature; -import net.minecraft.world.level.levelgen.feature.configurations.OreConfiguration; -import net.minecraft.world.level.levelgen.placement.BiomeFilter; -import net.minecraft.world.level.levelgen.placement.CountPlacement; -import net.minecraft.world.level.levelgen.placement.HeightRangePlacement; -import net.minecraft.world.level.levelgen.placement.InSquarePlacement; import net.minecraft.world.level.levelgen.placement.PlacedFeature; -import net.minecraft.world.level.levelgen.structure.templatesystem.RuleTest; -import net.minecraft.world.level.levelgen.structure.templatesystem.TagMatchTest; import java.util.List; import java.util.function.Predicate; import java.util.function.Supplier; public class ModWorldGeneration { - private static final RuleTest STONE_REPLACEABLES = new TagMatchTest(BlockTags.STONE_ORE_REPLACEABLES); - private static final RuleTest DEEPSLATE_REPLACEABLES = new TagMatchTest(BlockTags.DEEPSLATE_ORE_REPLACEABLES); - - private static final Supplier GYPSUM_STONE = () -> oreFeature( - STONE_REPLACEABLES, - () -> ModBlocks.GYPSUM_STONE.get().defaultBlockState(), - 18, - 20, - 32, - 64 - ); - - private static final Supplier STONE_FOSSIL = () -> oreFeature( - STONE_REPLACEABLES, - () -> ModBlocks.STONE_FOSSIL.get().defaultBlockState(), - 8, - 15, - 0, - 64 - ); - - private static final Supplier DEEPSLATE_FOSSIL = () -> oreFeature( - DEEPSLATE_REPLACEABLES, - () -> ModBlocks.DEEPSLATE_FOSSIL.get().defaultBlockState(), - 8, - 15, - -32, - 0 - ); - - private static final Supplier AMBER_ORE = () -> oreFeature( - STONE_REPLACEABLES, - () -> ModBlocks.AMBER_ORE.get().defaultBlockState(), - 3, - 4, - 0, - 32 - ); - - private static final Supplier DEEPSLATE_ICE_SHARD_ORE = () -> oreFeature( - DEEPSLATE_REPLACEABLES, - () -> ModBlocks.DEEPSLATE_ICE_SHARD_ORE.get().defaultBlockState(), - 3, - 6, - -32, - 0 - ); public static void generateWorldGen() { - addOverworldOre(GYPSUM_STONE); - addOverworldOre(STONE_FOSSIL); - addOverworldOre(DEEPSLATE_FOSSIL); - addOverworldOre(AMBER_ORE); - addOverworldOre(DEEPSLATE_ICE_SHARD_ORE); + for (ModWorldgenDefinitions.OreDefinition ore : ModWorldgenDefinitions.ORES) { + addOverworldOre(ore.placedFeatureKey()); + } Constants.LOG.info("Natural dinosaur spawning config loaded as: {}", JRConfigManager.get().naturallySpawning); @@ -98,109 +34,24 @@ public class ModWorldGeneration { } } - private static void addOverworldOre(Supplier placedFeature) { + private static void addOverworldOre(ResourceKey placedFeature) { BiomeModifications.addProperties( context -> context.hasTag(BiomeTags.IS_OVERWORLD), (context, properties) -> properties.getGenerationProperties() - .addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, Holder.direct(placedFeature.get())) - ); - } - - private static PlacedFeature oreFeature(RuleTest replaceables, Supplier blockState, int veinSize, int count, int minY, int maxY) { - ConfiguredFeature configuredFeature = new ConfiguredFeature<>( - Feature.ORE, - new OreConfiguration( - List.of(OreConfiguration.target(replaceables, blockState.get())), - veinSize - ) - ); - - return new PlacedFeature( - Holder.direct(configuredFeature), - List.of( - CountPlacement.of(count), - InSquarePlacement.spread(), - HeightRangePlacement.uniform(VerticalAnchor.absolute(minY), VerticalAnchor.absolute(maxY)), - BiomeFilter.biome() - ) + .addFeature(GenerationStep.Decoration.UNDERGROUND_ORES, placedFeature) ); } private static void addSpawns() { - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA), ModEntities.ALBERTOSAURUS, 12, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.ALLOSAURUS, 10, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.ALVAREZSAURUS, 28, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.ANKYLOSAURUS, 14, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.APATOSAURUS, 10, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.ARAMBOURGIANIA, 6, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.BARYONYX, 8, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.BRACHIOSAURUS, 7, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CARCHARODONTOSAURUS, 6, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CARNOTAURUS, 11, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.CEARADACTYLUS, 6, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CERATOSAURUS, 9, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CHASMOSAURUS, 18, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_TAIGA), ModEntities.COELOPHYSIS, 30, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.COELURUS, 28, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.COMPSOGNATHUS, 36, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CONCAVENATOR, 10, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.CORYTHOSAURUS, 24, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.DEINONYCHUS, 14, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE), ModEntities.DILOPHOSAURUS, 22, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.DIMORPHODON, 7, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_TAIGA), ModEntities.DIPLODOCUS, 8, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.DRYOSAURUS, 32, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.EDMONTOSAURUS, 22, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.GALLIMIMUS, 36, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.GEOSTERNBERGIA, 7, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.GIGANOTOSAURUS, 3, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.GUANLONG, 20, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.GUIDRACO, 7, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.HADROSAURUS, 26, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.HERRERASAURUS, 24, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.HYPSILOPHODON, 34, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA), ModEntities.INOSTRANCEVIA, 5, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.LAMBEOSAURUS, 24, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.LUDODACTYLUS, 6, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.MAJUNGASAURUS, 8, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE), ModEntities.MAMENCHISAURUS, 7, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.METRIACANTHOSAURUS, 10, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.MOGANOPTERUS, 7, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.NYCTOSAURUS, 6, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.ORNITHOLESTES, 30, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.ORNITHOMIMUS, 30, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.OURANOSAURUS, 22, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.OVIRAPTOR, 34, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.PACHYCEPHALOSAURUS, 22, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.PARASAUROLOPHUS, 22, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_TAIGA), ModEntities.PROCERATOSAURUS, 24, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.PROCOMPSOGNATHUS, 34, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.PROTOCERATOPS, 28, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.PTERANODON, 8, 2, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.PTERODAUSTRO, 12, 2, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.QUETZALCOATLUS, 4, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.RAJASAURUS, 10, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_FOREST) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.RUGOPS, 10, 2, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.SEGISAURUS, 36, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.SHANTUNGOSAURUS, 8, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.SPINOSAURUS, 3, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.STEGOSAURUS, 14, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.STYRACOSAURUS, 22, 2, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.TAPEJARA, 6, 2, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.THERIZINOSAURUS, 8, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.TITANOSAURUS, 7, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.TRICERATOPS, 20, 3, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.TROODON, 28, 3, 6); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.TROPEOGNATHUS, 6, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_JUNGLE) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.TUPUXUARA, 6, 2, 5); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.TYRANNOSAURUS_REX, 5, 1, 2); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_TAIGA) || biome.hasTag(BiomeTags.IS_FOREST), ModEntities.UTAHRAPTOR, 16, 1, 3); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BADLANDS) || biome.hasTag(BiomeTags.IS_OVERWORLD), ModEntities.VELOCIRAPTOR, 26, 2, 4); - addSpawn(biome -> biome.hasTag(BiomeTags.IS_BEACH) || biome.hasTag(BiomeTags.IS_MOUNTAIN), ModEntities.ZHENYUANOPTERUS, 7, 2, 5); - } - - private static boolean is(BiomeModifications.BiomeContext biome, ResourceKey key) { - return biome.hasTag(BiomeTags.IS_TAIGA) || biome.getKey().equals(key); + for (ModSpawnDefinitions.SpawnDefinition spawn : ModSpawnDefinitions.NATURAL_SPAWNS) { + addSpawn( + biome -> spawn.biomeTags().stream().anyMatch(biome::hasTag), + spawn.entityType(), + spawn.weight(), + spawn.minCount(), + spawn.maxCount() + ); + } } private static void addSpawn(Predicate biomeSelector, Supplier> entityType, int weight, int minCount, int maxCount) { diff --git a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java new file mode 100644 index 0000000..e8fe00c --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldgenDefinitions.java @@ -0,0 +1,85 @@ +package net.cmr.jurassicrevived.worldgen; + +import net.cmr.jurassicrevived.Constants; +import net.cmr.jurassicrevived.block.ModBlocks; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.tags.BlockTags; +import net.minecraft.tags.TagKey; +import net.minecraft.world.level.block.Block; +import net.minecraft.world.level.levelgen.feature.ConfiguredFeature; +import net.minecraft.world.level.levelgen.placement.PlacedFeature; + +import java.util.List; +import java.util.function.Supplier; + +public final class ModWorldgenDefinitions { + private ModWorldgenDefinitions() { + } + + public static final List ORES = List.of( + new OreDefinition( + "gypsum_stone", + ModBlocks.GYPSUM_STONE, + BlockTags.STONE_ORE_REPLACEABLES, + 18, + 20, + 32, + 64 + ), + new OreDefinition( + "stone_fossil", + ModBlocks.STONE_FOSSIL, + BlockTags.STONE_ORE_REPLACEABLES, + 8, + 15, + 0, + 64 + ), + new OreDefinition( + "deepslate_fossil", + ModBlocks.DEEPSLATE_FOSSIL, + BlockTags.DEEPSLATE_ORE_REPLACEABLES, + 8, + 15, + -32, + 0 + ), + new OreDefinition( + "amber_ore", + ModBlocks.AMBER_ORE, + BlockTags.STONE_ORE_REPLACEABLES, + 3, + 4, + 0, + 32 + ), + new OreDefinition( + "deepslate_ice_shard_ore", + ModBlocks.DEEPSLATE_ICE_SHARD_ORE, + BlockTags.DEEPSLATE_ORE_REPLACEABLES, + 3, + 6, + -32, + 0 + ) + ); + + public record OreDefinition( + String name, + Supplier block, + TagKey replaceableTag, + int veinSize, + int count, + int minY, + int maxY + ) { + public ResourceKey> configuredFeatureKey() { + return ResourceKey.create(Registries.CONFIGURED_FEATURE, Constants.rl(name)); + } + + public ResourceKey placedFeatureKey() { + return ResourceKey.create(Registries.PLACED_FEATURE, Constants.rl(name + "_placed")); + } + } +} diff --git a/fabricmc/build.gradle.kts b/fabricmc/build.gradle.kts index a35001c..087dc83 100755 --- a/fabricmc/build.gradle.kts +++ b/fabricmc/build.gradle.kts @@ -67,7 +67,7 @@ dependencies { commonMod.prop("teamreborn_energy_1_21_1") } - modImplementation("teamreborn:energy:$energyVersion") + modImplementation(include("teamreborn:energy:$energyVersion")!!) modImplementation("net.fabricmc:fabric-loader:${commonMod.prop("fabric_loader_version")}") modApi("net.fabricmc.fabric-api:fabric-api:${commonMod.prop("fabric_api_version")}") @@ -94,6 +94,10 @@ loom { accessWidenerPath = common.project.file("../../src/main/resources/accesswideners/${commonMod.minecraft_version}-${mod.id}.accesswidener") + mixin { + defaultRefmapName.set("${commonMod.id}.refmap.json") + } + runs { named("client") { client() diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java index 12d1924..fc941f5 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java @@ -24,7 +24,7 @@ public final class JRClothConfigScreens { general.addEntry( eb.startBooleanToggle(Component.literal("Require Power"), cfg.requirePower) - .setDefaultValue(true) + .setDefaultValue(false) .setTooltip(Component.literal("When disabled, machines do not consume power, hide power bars, and energy pipes do not connect to machines.")) .setSaveConsumer(v -> cfg.requirePower = v) .requireRestart() diff --git a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index dd4e21d..1bcceee 100755 --- a/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/fabricmc/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -14,5 +14,6 @@ public class DataGenerators implements DataGeneratorEntrypoint { pack.addProvider(FabricBlockLootTableProvider::new); pack.addProvider(FabricEntityLootTableProvider::new); pack.addProvider(FabricRecipeProvider::new); + pack.addProvider((output, registriesFuture) -> new ModWorldgenProvider(output)); } } diff --git a/fabricmc/src/main/resources/fabric.mod.json b/fabricmc/src/main/resources/fabric.mod.json index 7c7cafa..6be7f62 100755 --- a/fabricmc/src/main/resources/fabric.mod.json +++ b/fabricmc/src/main/resources/fabric.mod.json @@ -48,7 +48,8 @@ "architectury": ">=${architectury_version}", "cloth-config": ">=${cloth_config_version}", "geckolib": ">=${geckolib_version}", - "modmenu": ">=${modmenu_version}" + "modmenu": ">=${modmenu_version}", + "team_reborn_energy": "*" }, "suggests": { "another-mod": "*" diff --git a/gradle.properties b/gradle.properties index d7a2b74..9c8ad18 100755 --- a/gradle.properties +++ b/gradle.properties @@ -10,7 +10,7 @@ fabric.loom.multiProjectOptimisation=true mod.name=Jurassic Revived mod.id=jurassicrevived mod.group=net.cmr.jurassicrevived -mod.version=0.200.0 +mod.version=0.202.0 mod.author=CMR Team, Eli Gibbs mod.description=A Minecraft mod that brings dinosaurs back to life using ancient DNA and modern technology\nBreed, study, and build your own prehistoric park with a wide variety of creatures... mod.license=CC-BY-ND-4.0 diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/JRMod.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/JRMod.java index 55eddeb..0b2c2cd 100755 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/JRMod.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/JRMod.java @@ -2,8 +2,10 @@ package net.cmr.jurassicrevived; import dev.architectury.platform.forge.EventBuses; import net.cmr.jurassicrevived.client.config.JRClothConfigScreens; +import net.cmr.jurassicrevived.worldgen.ForgeBiomeModifiers; import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.client.ConfigScreenHandler; +import net.minecraftforge.eventbus.api.IEventBus; import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.ModLoadingContext; import net.minecraftforge.fml.common.Mod; @@ -13,30 +15,26 @@ import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext; @Mod(Constants.MOD_ID) public class JRMod { - @SuppressWarnings({"deprecation", "removal"}) - public JRMod() { + @SuppressWarnings({"deprecation", "removal"}) + public JRMod() { + IEventBus modEventBus = FMLJavaModLoadingContext.get().getModEventBus(); - // This method is invoked by the Forge mod loader when it is ready - // to load your mod. You can access Forge and Common code in this - // project. + EventBuses.registerModEventBus(Constants.MOD_ID, modEventBus); + ForgeBiomeModifiers.register(modEventBus); - EventBuses.registerModEventBus(Constants.MOD_ID, FMLJavaModLoadingContext.get().getModEventBus()); - - // Use Forge to bootstrap the Common mod. - CommonClass.init(); + CommonClass.init(); DistExecutor.safeRunWhenOn(Dist.CLIENT, () -> CommonClientClass::init); - FMLJavaModLoadingContext.get().getModEventBus().addListener(this::clientSetup); + modEventBus.addListener(this::clientSetup); ModLoadingContext.get().registerExtensionPoint( ConfigScreenHandler.ConfigScreenFactory.class, () -> new ConfigScreenHandler.ConfigScreenFactory( - (mc, parent) -> JRClothConfigScreens.create(parent) - ) + (mc, parent) -> JRClothConfigScreens.create(parent) + ) ); - - } + } private void clientSetup(FMLClientSetupEvent event) { event.enqueueWork(CommonClientClass::registerScreens); diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java index 12d1924..fc941f5 100755 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java @@ -24,7 +24,7 @@ public final class JRClothConfigScreens { general.addEntry( eb.startBooleanToggle(Component.literal("Require Power"), cfg.requirePower) - .setDefaultValue(true) + .setDefaultValue(false) .setTooltip(Component.literal("When disabled, machines do not consume power, hide power bars, and energy pipes do not connect to machines.")) .setSaveConsumer(v -> cfg.requirePower = v) .requireRestart() diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index 002daf3..d31523e 100755 --- a/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -40,5 +40,6 @@ public class DataGenerators { ) )); generator.addProvider(event.includeServer(), new ForgeRecipeProvider(packOutput)); + generator.addProvider(event.includeServer(), new ModWorldgenProvider(packOutput)); } } diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java new file mode 100644 index 0000000..d4a53b6 --- /dev/null +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java @@ -0,0 +1,64 @@ +package net.cmr.jurassicrevived.worldgen; + +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.cmr.jurassicrevived.config.JRConfigManager; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.world.entity.MobCategory; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.minecraftforge.common.world.BiomeModifier; +import net.minecraftforge.common.world.ModifiableBiomeInfo; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public final class ConditionalAddSpawnsBiomeModifier implements BiomeModifier { + public static final Codec CODEC = RecordCodecBuilder.create(instance -> + instance.group( + Biome.LIST_CODEC.fieldOf("biomes").forGetter(ConditionalAddSpawnsBiomeModifier::biomes), + MobSpawnSettings.SpawnerData.CODEC.listOf().fieldOf("spawners").forGetter(ConditionalAddSpawnsBiomeModifier::spawners) + ).apply(instance, ConditionalAddSpawnsBiomeModifier::new) + ); + + private final HolderSet biomes; + private final List spawners; + + public ConditionalAddSpawnsBiomeModifier(HolderSet biomes, List spawners) { + this.biomes = biomes; + this.spawners = spawners; + } + + public HolderSet biomes() { + return biomes; + } + + public List spawners() { + return spawners; + } + + @Override + public void modify(@NotNull Holder biome, @NotNull Phase phase, @NotNull ModifiableBiomeInfo.BiomeInfo.Builder builder) { + if (phase != Phase.ADD) { + return; + } + + if (!JRConfigManager.get().naturallySpawning) { + return; + } + + if (!biomes.contains(biome)) { + return; + } + + for (MobSpawnSettings.SpawnerData spawner : spawners) { + builder.getMobSpawnSettings().addSpawn(MobCategory.CREATURE, spawner); + } + } + + @Override + public @NotNull Codec codec() { + return ForgeBiomeModifiers.CONDITIONAL_ADD_SPAWNS.get(); + } +} \ No newline at end of file diff --git a/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ForgeBiomeModifiers.java b/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ForgeBiomeModifiers.java new file mode 100644 index 0000000..f3e647b --- /dev/null +++ b/minecraftforge/src/main/java/net/cmr/jurassicrevived/worldgen/ForgeBiomeModifiers.java @@ -0,0 +1,24 @@ +package net.cmr.jurassicrevived.worldgen; + +import com.mojang.serialization.Codec; +import net.cmr.jurassicrevived.Constants; +import net.minecraftforge.common.world.BiomeModifier; +import net.minecraftforge.eventbus.api.IEventBus; +import net.minecraftforge.registries.DeferredRegister; +import net.minecraftforge.registries.ForgeRegistries; +import net.minecraftforge.registries.RegistryObject; + +public final class ForgeBiomeModifiers { + private ForgeBiomeModifiers() { + } + + public static final DeferredRegister> BIOME_MODIFIER_SERIALIZERS = + DeferredRegister.create(ForgeRegistries.Keys.BIOME_MODIFIER_SERIALIZERS, Constants.MOD_ID); + + public static final RegistryObject> CONDITIONAL_ADD_SPAWNS = + BIOME_MODIFIER_SERIALIZERS.register("conditional_add_spawns", () -> ConditionalAddSpawnsBiomeModifier.CODEC); + + public static void register(IEventBus eventBus) { + BIOME_MODIFIER_SERIALIZERS.register(eventBus); + } +} diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/JRMod.java b/neoforge/src/main/java/net/cmr/jurassicrevived/JRMod.java index 371cde4..78eb868 100755 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/JRMod.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/JRMod.java @@ -1,6 +1,7 @@ package net.cmr.jurassicrevived; import net.cmr.jurassicrevived.client.config.JRClothConfigScreens; +import net.cmr.jurassicrevived.worldgen.NeoForgeBiomeModifiers; import net.neoforged.bus.api.IEventBus; import net.neoforged.fml.ModLoadingContext; import net.neoforged.fml.common.Mod; @@ -13,6 +14,8 @@ import java.util.function.Supplier; public class JRMod { public JRMod(IEventBus eventBus) { + NeoForgeBiomeModifiers.register(eventBus); + CommonClass.init(); ModLoadingContext.get().getActiveContainer().registerExtensionPoint( diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java b/neoforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java index 12d1924..fc941f5 100755 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/client/config/JRClothConfigScreens.java @@ -24,7 +24,7 @@ public final class JRClothConfigScreens { general.addEntry( eb.startBooleanToggle(Component.literal("Require Power"), cfg.requirePower) - .setDefaultValue(true) + .setDefaultValue(false) .setTooltip(Component.literal("When disabled, machines do not consume power, hide power bars, and energy pipes do not connect to machines.")) .setSaveConsumer(v -> cfg.requirePower = v) .requireRestart() diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java index 1ef5dfe..d05a792 100755 --- a/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/datagen/DataGenerators.java @@ -41,5 +41,6 @@ public class DataGenerators { lookupProvider )); generator.addProvider(event.includeServer(), new NeoForgeRecipeProvider(packOutput, lookupProvider)); + generator.addProvider(event.includeServer(), new ModWorldgenProvider(packOutput)); } } diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java b/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java new file mode 100644 index 0000000..82432c1 --- /dev/null +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/ConditionalAddSpawnsBiomeModifier.java @@ -0,0 +1,42 @@ +package net.cmr.jurassicrevived.worldgen; + +import com.mojang.serialization.MapCodec; +import com.mojang.serialization.codecs.RecordCodecBuilder; +import net.cmr.jurassicrevived.config.JRConfigManager; +import net.minecraft.core.Holder; +import net.minecraft.core.HolderSet; +import net.minecraft.world.level.biome.Biome; +import net.minecraft.world.level.biome.MobSpawnSettings; +import net.neoforged.neoforge.common.world.BiomeModifier; +import net.neoforged.neoforge.common.world.BiomeModifiers; +import net.neoforged.neoforge.common.world.ModifiableBiomeInfo; +import org.jetbrains.annotations.NotNull; + +import java.util.List; + +public final class ConditionalAddSpawnsBiomeModifier implements BiomeModifier { + public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> + instance.group( + Biome.LIST_CODEC.fieldOf("biomes").forGetter(modifier -> modifier.delegate.biomes()), + MobSpawnSettings.SpawnerData.CODEC.listOf().fieldOf("spawners").forGetter(modifier -> modifier.delegate.spawners()) + ).apply(instance, ConditionalAddSpawnsBiomeModifier::new) + ); + + private final BiomeModifiers.AddSpawnsBiomeModifier delegate; + + public ConditionalAddSpawnsBiomeModifier(HolderSet biomes, List spawners) { + this.delegate = new BiomeModifiers.AddSpawnsBiomeModifier(biomes, spawners); + } + + @Override + public void modify(@NotNull Holder biome, @NotNull Phase phase, @NotNull ModifiableBiomeInfo.BiomeInfo.Builder builder) { + if (JRConfigManager.get().naturallySpawning) { + delegate.modify(biome, phase, builder); + } + } + + @Override + public @NotNull MapCodec codec() { + return NeoForgeBiomeModifiers.CONDITIONAL_ADD_SPAWNS.get(); + } +} diff --git a/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/NeoForgeBiomeModifiers.java b/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/NeoForgeBiomeModifiers.java new file mode 100644 index 0000000..fbb6dd2 --- /dev/null +++ b/neoforge/src/main/java/net/cmr/jurassicrevived/worldgen/NeoForgeBiomeModifiers.java @@ -0,0 +1,25 @@ +package net.cmr.jurassicrevived.worldgen; + +import com.mojang.serialization.MapCodec; +import net.cmr.jurassicrevived.Constants; +import net.neoforged.bus.api.IEventBus; +import net.neoforged.neoforge.common.world.BiomeModifier; +import net.neoforged.neoforge.registries.DeferredRegister; +import net.neoforged.neoforge.registries.NeoForgeRegistries; + +import java.util.function.Supplier; + +public final class NeoForgeBiomeModifiers { + private NeoForgeBiomeModifiers() { + } + + public static final DeferredRegister> BIOME_MODIFIER_SERIALIZERS = + DeferredRegister.create(NeoForgeRegistries.Keys.BIOME_MODIFIER_SERIALIZERS, Constants.MOD_ID); + + public static final Supplier> CONDITIONAL_ADD_SPAWNS = + BIOME_MODIFIER_SERIALIZERS.register("conditional_add_spawns", () -> ConditionalAddSpawnsBiomeModifier.CODEC); + + public static void register(IEventBus eventBus) { + BIOME_MODIFIER_SERIALIZERS.register(eventBus); + } +}