From f9f300cde71cddbc972ceabe187ec821b149aca0 Mon Sep 17 00:00:00 2001 From: Eli Gibbs Date: Thu, 21 May 2026 01:36:47 -0400 Subject: [PATCH] Swap entity models -quetz Adds ore generation Adds natural spawning Should be parity to 0.102.0! --- .../net/cmr/jurassicrevived/CommonClass.java | 5 +- .../jurassicrevived/entity/ModEntities.java | 99 +++++++- .../worldgen/ModWorldGeneration.java | 215 ++++++++++++++++++ .../textures/block/corythosaurus_egg.png | Bin 622 -> 463 bytes .../textures/block/diplodocus_egg.png | Bin 536 -> 407 bytes .../textures/block/distortus_rex_egg.png | Bin 687 -> 423 bytes .../block/incubated_corythosaurus_egg.png | Bin 638 -> 499 bytes .../block/incubated_diplodocus_egg.png | Bin 548 -> 442 bytes .../block/incubated_distortus_rex_egg.png | Bin 700 -> 444 bytes .../block/incubated_titanosaurus_egg.png | Bin 683 -> 449 bytes .../textures/block/titanosaurus_egg.png | Bin 658 -> 401 bytes .../textures/item/corythosaurus_dna.png | Bin 741 -> 504 bytes .../textures/item/diplodocus_dna.png | Bin 652 -> 430 bytes .../textures/item/distortus_rex_dna.png | Bin 727 -> 444 bytes .../textures/item/titanosaurus_dna.png | Bin 710 -> 422 bytes 15 files changed, 308 insertions(+), 11 deletions(-) create mode 100644 common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java diff --git a/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java b/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java index 2d582d6..e941d9d 100755 --- a/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java +++ b/common/src/main/java/net/cmr/jurassicrevived/CommonClass.java @@ -14,6 +14,7 @@ import net.cmr.jurassicrevived.screen.ModMenuTypes; import net.cmr.jurassicrevived.sound.ModSounds; import net.cmr.jurassicrevived.util.FenceClimbHandler; import net.cmr.jurassicrevived.util.ModEvents; +import net.cmr.jurassicrevived.worldgen.ModWorldGeneration; import net.minecraft.core.registries.BuiltInRegistries; import net.minecraft.world.item.Items; @@ -54,7 +55,7 @@ public class CommonClass LifecycleEvent.SETUP.register(() -> { ModBlocks.setupPots(); - //ModEntities.registerSpawnPlacements(); + ModEntities.registerSpawnPlacements(); }); ModBlockEntities.register(); @@ -65,5 +66,7 @@ public class CommonClass ModSounds.register(); ModPackets.register(); + + ModWorldGeneration.generateWorldGen(); } } \ No newline at end of file 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 b82398f..e98c5a8 100644 --- a/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java +++ b/common/src/main/java/net/cmr/jurassicrevived/entity/ModEntities.java @@ -409,18 +409,97 @@ public class ModEntities { EntityAttributeRegistry.register(TROODON, TroodonEntity::createAttributes); EntityAttributeRegistry.register(UTAHRAPTOR, UtahraptorEntity::createAttributes); } - + public static void registerSpawnPlacements() { - if (!JRConfigManager.get().enableDinosaurs) { -/*? if >1.20.1 {*/ - /*SpawnPlacementsRegistry.register(ALBERTOSAURUS, SpawnPlacementTypes.ON_GROUND, - Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); -*//*?} else {*/ - SpawnPlacementsRegistry.register(ALBERTOSAURUS, SpawnPlacements.Type.ON_GROUND, - Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); -/*?}*/ - // ... repeat for all your dinos ... + Constants.LOG.info("Natural dinosaur spawn placement config loaded as: {}", JRConfigManager.get().naturallySpawning); + + if (!JRConfigManager.get().naturallySpawning) { + Constants.LOG.info("Skipping dinosaur spawn placement registration"); + return; } + + Constants.LOG.info("Registering dinosaur spawn placements"); + + registerGroundAnimalSpawn(ALBERTOSAURUS); + registerGroundAnimalSpawn(ALLOSAURUS); + registerGroundAnimalSpawn(ALVAREZSAURUS); + registerGroundAnimalSpawn(ANKYLOSAURUS); + registerGroundAnimalSpawn(APATOSAURUS); + registerGroundAnimalSpawn(ARAMBOURGIANIA); + registerGroundAnimalSpawn(BARYONYX); + registerGroundAnimalSpawn(BRACHIOSAURUS); + registerGroundAnimalSpawn(CARCHARODONTOSAURUS); + registerGroundAnimalSpawn(CARNOTAURUS); + registerGroundAnimalSpawn(CEARADACTYLUS); + registerGroundAnimalSpawn(CERATOSAURUS); + registerGroundAnimalSpawn(CHASMOSAURUS); + registerGroundAnimalSpawn(COELOPHYSIS); + registerGroundAnimalSpawn(COELURUS); + registerGroundAnimalSpawn(COMPSOGNATHUS); + registerGroundAnimalSpawn(CONCAVENATOR); + registerGroundAnimalSpawn(CORYTHOSAURUS); + registerGroundAnimalSpawn(DEINONYCHUS); + registerGroundAnimalSpawn(DILOPHOSAURUS); + registerGroundAnimalSpawn(DIMORPHODON); + registerGroundAnimalSpawn(DIPLODOCUS); + registerGroundAnimalSpawn(DRYOSAURUS); + registerGroundAnimalSpawn(EDMONTOSAURUS); + registerGroundAnimalSpawn(GALLIMIMUS); + registerGroundAnimalSpawn(GEOSTERNBERGIA); + registerGroundAnimalSpawn(GIGANOTOSAURUS); + registerGroundAnimalSpawn(GUANLONG); + registerGroundAnimalSpawn(GUIDRACO); + registerGroundAnimalSpawn(HADROSAURUS); + registerGroundAnimalSpawn(HERRERASAURUS); + registerGroundAnimalSpawn(HYPSILOPHODON); + registerGroundAnimalSpawn(INOSTRANCEVIA); + registerGroundAnimalSpawn(LAMBEOSAURUS); + registerGroundAnimalSpawn(LUDODACTYLUS); + registerGroundAnimalSpawn(MAJUNGASAURUS); + registerGroundAnimalSpawn(MAMENCHISAURUS); + registerGroundAnimalSpawn(METRIACANTHOSAURUS); + registerGroundAnimalSpawn(MOGANOPTERUS); + registerGroundAnimalSpawn(NYCTOSAURUS); + registerGroundAnimalSpawn(ORNITHOLESTES); + registerGroundAnimalSpawn(ORNITHOMIMUS); + registerGroundAnimalSpawn(OURANOSAURUS); + registerGroundAnimalSpawn(OVIRAPTOR); + registerGroundAnimalSpawn(PACHYCEPHALOSAURUS); + registerGroundAnimalSpawn(PARASAUROLOPHUS); + registerGroundAnimalSpawn(PROCERATOSAURUS); + registerGroundAnimalSpawn(PROCOMPSOGNATHUS); + registerGroundAnimalSpawn(PROTOCERATOPS); + registerGroundAnimalSpawn(PTERANODON); + registerGroundAnimalSpawn(PTERODAUSTRO); + registerGroundAnimalSpawn(QUETZALCOATLUS); + registerGroundAnimalSpawn(RAJASAURUS); + registerGroundAnimalSpawn(RUGOPS); + registerGroundAnimalSpawn(SEGISAURUS); + registerGroundAnimalSpawn(SHANTUNGOSAURUS); + registerGroundAnimalSpawn(SPINOSAURUS); + registerGroundAnimalSpawn(STEGOSAURUS); + registerGroundAnimalSpawn(STYRACOSAURUS); + registerGroundAnimalSpawn(TAPEJARA); + registerGroundAnimalSpawn(THERIZINOSAURUS); + registerGroundAnimalSpawn(TITANOSAURUS); + registerGroundAnimalSpawn(TRICERATOPS); + registerGroundAnimalSpawn(TROODON); + registerGroundAnimalSpawn(TROPEOGNATHUS); + registerGroundAnimalSpawn(TUPUXUARA); + registerGroundAnimalSpawn(TYRANNOSAURUS_REX); + registerGroundAnimalSpawn(UTAHRAPTOR); + registerGroundAnimalSpawn(VELOCIRAPTOR); + registerGroundAnimalSpawn(ZHENYUANOPTERUS); + } + + private static void registerGroundAnimalSpawn(RegistrySupplier> entityType) { +/*? if >1.20.1 {*/ + /*SpawnPlacementsRegistry.register(entityType, SpawnPlacementTypes.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); +*//*?} else {*/ + SpawnPlacementsRegistry.register(entityType, SpawnPlacements.Type.ON_GROUND, + Heightmap.Types.MOTION_BLOCKING_NO_LEAVES, Animal::checkAnimalSpawnRules); +/*?}*/ } public static void register() { diff --git a/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java new file mode 100644 index 0000000..57ccdbf --- /dev/null +++ b/common/src/main/java/net/cmr/jurassicrevived/worldgen/ModWorldGeneration.java @@ -0,0 +1,215 @@ +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.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); + + Constants.LOG.info("Natural dinosaur spawning config loaded as: {}", JRConfigManager.get().naturallySpawning); + + if (JRConfigManager.get().naturallySpawning) { + Constants.LOG.info("Registering natural dinosaur biome spawns"); + addSpawns(); + } else { + Constants.LOG.info("Skipping natural dinosaur biome spawns"); + } + } + + private static void addOverworldOre(Supplier 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() + ) + ); + } + + 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); + } + + private static void addSpawn(Predicate biomeSelector, Supplier> entityType, int weight, int minCount, int maxCount) { + BiomeModifications.addProperties( + biomeSelector, + (context, properties) -> properties.getSpawnProperties().addSpawn( + MobCategory.CREATURE, + new MobSpawnSettings.SpawnerData(entityType.get(), weight, minCount, maxCount) + ) + ); + } +} \ No newline at end of file diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/corythosaurus_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/corythosaurus_egg.png index fecb435b06c21733da985c604a20f430724899fe..11f984fa443d7720ff1c2a94ba29d5367932c960 100644 GIT binary patch delta 448 zcmV;x0YCok1kVGI8Gi-<001BJ|6u?C0fb3JK~#7Fq>;Z%0$~`(zn~E9!<~LLF%(wao-%G8bJ*BifnsTaAaIZ*1%?9ND!^gq zFtsqlnv-KboS!`)67eG(YQ^;2lCeOpNN_uCkmU;IlR3+X#Rd?M2H~n6r*CiqJa5Gh q00030{}!|}UH||921!IgR09AxCXA^+y(%040000NS%LiI0G|-oeX~nebom}yRI{MPbLZrYDV5HfJ0iFCB&=-=h&I*n)KvD+RCZNY zv{RDv(^a+75ce<_ax)WhFc2_O6m>I{0UEPxPKuj_s-3oMYeig2m{n4sT4PCcUaWmy zjB!tWGEhOY_i+s%rC1W=7yO?9V3>dKf+A2cXMsm#F#`kNVGw3Kp1&dmC@5Lt8c`CQ zpH@C!ZXd&Q;UHE$YEuWVq|4t1hTw< zSQ^R(1(gOPGgzDn$TnnTVh{w0w;}F>4x-4FXI+lbFCNgDfq8ET}F+0|Suk&E>PEp4`qI4`kMPx;Tbt z1jn9>7HTr!VZE@#M03Fx)~?VC@9L)pZPA_8@AGb^kD9>$EcOGhGMyBqes)?nI4~?= znqlOr$G{}Das^XUNY|}=Kl2$P)8{A{J@1ab%AWM**IL;JSLW}Qm)LUcuwYN=wcR{v vbM8E~vY!7it!ew`zZ<9YW^%s%Rnuy|{EWo(9USeAAXj<1`njxgN@xNAE3CLP diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/diplodocus_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/diplodocus_egg.png index 5ea6348c4050ac486b0f56dd3a2262befdee9dc7..d7e2658f7444a43b0d287258a9fba10a275191dc 100644 GIT binary patch delta 392 zcmV;30eAkG1eXJl8Gi-<001BJ|6u?C0Zd6mK~#7Ftdc)31W^>l@60^2hTRO&lF%r$ zqEu@9t+voABt$}CKZ1&aL`Zx94GpbUMN~wgA(Y6F>_6k}K6~!wz05GPD`Ap5@7?>( z`Ms0O*!0Ke{{eR=yXy96Q(Yf!aJ35IF?G4WmY9SAnQotjvRrJg5wrX#^DOPffasyVx%L@G$Eo`m zK%2E%R!d|%Lbr)41BT~Ttm@md5$N0NvYDb@lQg!pZ5csi!vORn`2q{H8J`gIR%V^sNS%G}B0G|-oTN|fbTitzmS?k$ZCHHnOI6trI^z?$#B=3n?em=goKvf0ddZCeC zO^F`1b_Q`tfswI3K*4?2epCP{p^_lK;Q#1=;nDv6LO@y00*}aI1_r*vAk26?e?cG`g(}48S0p zz|Oz|RAXRdY{0kxVlGGz>jH>b(|~LcU;>)N1XdYjX#r$Gbr~8MfMjnjpEdR5cJ6o} zGsV-zF+?Lc_RLMO1_ch+i`uHS1JJ9dW7W!`bBU@NoG1k3wO zkEb|`~q!$26t-z8^~YAe#TtNs_x z;^wa4)I|^%7dM@C5V|PXMMObF1rZlr1b4wf5CvBeU5d5#k~VGb&Rm8PrA-fg)4|<) zzxRC{#Xn{AyLh@emJip55`PJ}J=>Jjc3_$m_m{h=A+#4+nSaBeh3e}ghO_mX5Mb0?Kdzvw?ecUB+0e+=jiN1M>I(fd={H??l?Npc@VwZ zpi7TxD>Dz8U|(<0QQW}JNS%Lh?0X`wF*Y+*HynFG-@JmQ<#N)aS-j zXGB(}g=Iy1Rb@n^Mfm2%1r#O*7A5&5hB{?Lxz%Jvq=b2A#`u>c2gC(C#fCWK#Cepb zh2$sr11;Gz*(K1^GAZ0CH_kIN#v?Y+AtTnKsvx?qB(b$B<y)37&w3&Rt70XRt82O%L|C5 zp=?l4YcMi{#hHL?Lq;YBK_DFk#F_0ZU~!N~Kp+8#LHc1dx~&Wh!04L5&cFgxV_;-# zz_ygQu&X%Q~loCIErr>AC;_ diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_corythosaurus_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_corythosaurus_egg.png index 526897e6aaa60353b9de62b5307a207225e008f5..5b0becd5173c38207f8c882e10ce0ed1658e6c4b 100644 GIT binary patch delta 484 zcmVvv4eokg)X+XwU6ruCx5p0j&Qg*#{NPA0ChY+ zyF*874$Lt|=nZfRmq zfsU#o^KjqXwtr@rU=GlMI?=oozJ0bMlrZH20KE`GYkdCr$Ie5Q#jK++JLsbhobnL|Zq8Nrx00030|5FS?Q2+n{21!Ig aR09Bxzmln$o8X@S0000NS%LhV0G|-oeX~pQ{0&xg`Nq3ydYUTioSab_Za$^b`Ou=8%^i_jdlJ?*21J|c zcxozpXezs^E7~c^`RS@!X^4B63%QvIIT#2SDT=xo$^gwz{uEuaRJ0!kRH|r5VNKM*&x6KG>HkUGRV>b$b#xJG%x_k-dsLw>dEcg z@jzyir;B5VMsV!8n?g+nJggT=7B6YKPGX%b5+w1&T%i_>31%D$IJ(BOX|<0CeJy%$tM0Guc)we(w_Xl`5>2hy85}S Ib4q9e0LALP5R6D3aw11K(;tx2W)JL0|lR>}Lx)}mt)2GCUM(lXDW>13t^ z^aMlC)0L|jVBHdkrcfOYyfMz{-LtLC}@!59sKXMFraU8UMRd}AVp%_ zCkDg3SBzqHFMk^toLv*R__Z*A&XTFL5QxT5E>%s%&uWT_hnaje02KrwBZ=yIX6ms4 z=wM)GRj}j~J3T#WuFp-d#>R)tKLCO_$ucE^ek^Pr;P&MX!<{iS1V~Mdm`AFC!$%dl zuOfb6=xOW5-o-;>09g(|6n%)cDmcz+3?j3lMDYy(03`qa6k?dr00006NklNS%G|;0G|-oTN|fbTitzmS?kG3nP+E}+}pk2NJsSfc~z&U7nCM>Pt5Z3@wEl2 zEeO{Ojr3|t^su!vh)W8LjP(Hu2A#ga52Qp&g8YL2V*&<$|L1~0dCmfl$YKTtzQZ8Q zcszea3Q$n8#5JNMI6tkVJh3R1As{g`uSCz!HAKNw&rr|MNSM*R1gL07YJ_K+r>7PJ z2av3CK2NWMTkW8U@6e?JQvN93UG65`Y+_A4a3w z%D?~&x(VzIEI>5|M#ct=3n1o#^sp{~m^BT^1_36ZNlajsL6#Ok7F3s^fdNSN=JHun zPj2Uq2Qo7}T^vI+f^$!M3N;vTxLjoOS@ht{-}hOMrc6nF|4+N2{u{r-v(2Bl8XPah z#xgJpS>9!OE+C-kT+htJ?fOz$gIz{i!0YE@*5y<9=jlDjo&O;AE%!X$Ro5C;^-T_& jkscj#o$L0#*=x%fOuzGgTe~DWM4fvLlzu diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_distortus_rex_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_distortus_rex_egg.png index f6fa3331bd53871722eaab28e9ec1bba5ecbd3e1..6ff4642006df660d7a363acac5bad1ab33be11c3 100644 GIT binary patch delta 429 zcmV;e0aE_F1-t{08Gi-<001BJ|6u?C0dYx0K~#90q*6af0#O|P?tFPCDMV*~L~wF! zZjQG0f+m+BT3Xs_t|73YAeV@QhzcTFYzf+fh9GLGNw6#=Gw)7M@4eT(gTx~BQQ!3A zz4!h5@d*A2wbMl|yTNZS_Bs9{aCNfIU!IG|7hZ9b+vzGoet&bmdnjTgHj0Q^hU*YW zC%C^n9$lYq zazPZ%KgrAU(|q$W>TOO>yCFT6Oe? zbqpGY=N|McNhMg@%EGQW*xozFP&5i%(+~-VpzAt50VV(d|NllQEW!W)00v1!K~w_( Xg|4K-cLlfV00000NkvXXu0mjf`YykE literal 700 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LhS0X`wFTNm_R-o5zbn$CIcr5Co&KD4Oj%({u!_ANiPy6@J}_2;+F+BdhP zGA*P&H>NrxvNA0!E843nBO)!rH#aVzFfp(w$uBX~DI?0QCMzN(%sVs2za%*zF4!qH z#33inqdYAnKfxbp)t<>Nfu5F0;ZC`6o|!Qov4IX5u^v?g(RC$>tyL+XKD>+%cC0Oo zX(~_ZZpi9w$^mMzj-1I3q>M{~{DS|J3>XUM?d=0<=PdAuEM{QfI}E~%$MaXD00kvW zTq82!0mNL89@YgAv!(&rAixAPi3zMS$kGDHg6c9fFaXKkTs~{+$?e?nKxT`l zi(`mJaO|1uVuuuX8XhueX1-oky?)o$b^HDwj$|^GD`x(GoHO8`FGIk;HIC8_`&by5 zCqDh+AT_14)_MU8&$YJ>!COBtPg$Yyw~Td`!Pedhd;tq}KFFIr`<}M??n#M5CDnfq z7MO_5@JauCv`95zo%!vW?cx?P{?AW;RSUS&ef;y+e+=Re)pG1-i`)ab&C}J-Wt~$( F69B09^B4dC diff --git a/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_titanosaurus_egg.png b/common/src/main/resources/assets/jurassicrevived/textures/block/incubated_titanosaurus_egg.png index 8e9fa3777ffa25260af1f3aa6f7a2367b09be581..59faf1decb5db32cc43d68a05a3e216d05e89333 100644 GIT binary patch delta 434 zcmV;j0Zsm^1;GQ58Gi-<001BJ|6u?C0d`45K~#90q?0*I15p%(&#YM{!6=G?3z7wl z5`;7giiHT4qF@kGSlR__0)l-S!B#7OgQcx#AqaL_7$s=L#2w5sGf8~Tdoq%B81ZX{ zxy(8D+&k}y_$Oj>;b1jDbX|j{me_mZ=#8^7;G4y=(}nci1AiP&H><5EAXWxkz4+!n z4^1m#Jm|+|`W7Fr1mU0u)vAuXfOy2_p>M60Tokbr#$uz%=mP6O0}Z1`K|a}%>L34k!1(!f1z6biC?Q# zuysl}O9Rv7FMr~lg$dFy!p32iqe464fxcdnDM_$AW%VT1V}=ufqpKT&z~i$}g23~w zOKdBSFB3@=AQ`7qQ52+h_pq7VhN^0<{9 literal 683 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%Lfs0X`wF^Fx(q`pZmm7g`#tQ)qB zV`Y#RAC?~m$!T(7E3`t8bQ~>pI7I;J!GcfQS0Aa?gYn_}xLCF%=h?3y^w370~qEv=} z#LT=BJwMkF1yemkJwqd5M)wk+q8+Ibo@t(*S_~XO4l9EcBP#imtTM>b0?2~uGBhv%$#S-DX|(7mQ3f*WJzX3_G=gK#h4URY z;9(B%Dr~d9ysX;%?&a_MV|Cd#_I~Q;XHl84--5w#cbam8i{Nr!aff9KJ~?e~IKp?r z>9{l7Da&4lfHNPR*jm3Oc&ytNd*I04*K(KlegDNbi>K{rMhxo=pY+d1i$oLl-hB71 pJ-Ojm$-a>5(G9;J|E#LtXMgRh{7U9YiVh%WdAj?{N!$26upIk0U+gPli;NYYP zf{2hw5ITt9C=M2(gE+YrTm-?rAcCt-egG#&KY$-Ya1cyYR5a$#HT6sn4tmj~kv`kK zcfaS}d+(tbQ8Zn++@9l%MTkOQtXns)TAl$(!)B=r)3jifDu1HZUe$OZ0|~P*P!3p@ zjgz{`a}6Xc)qg@-S)EX1NX}rG6oYj8|27aN13wUV8RD4b8i*O}UEOKk$NR5M3HN$k z9NqFizf&n*Y|e0bdl+~_;nVd+uH<0<`a$c1Md0bFNq+Ae$W7UxTDy(JiNhM7fUXmK zdOmbQ)FfuY&3Y|vP#s2+PTRK8K0C+3;W5H6%FclzqQgw!O06bt-&m`oxzhlpv{(n< z)WF+U0M~uOqx+17`B_xTN$ew5Yz8aNGEW4e5z&F;ETPkRLA5%D9{>OV|NmIfi5&m{ f00v1!K~w_(e~*7K;VIIL00000NkvXXu0mjf9>lLn literal 658 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJV{wqX6T`Z5GB1G~mUKs7M+SzC z{oH>NS%LhP0G|-o`Ju`){beS(3oVV+X}4zVbK>c;W9xCzmJk)mu`GBjmu9@$cqjvPL3=|k8i9j1e$U8_O0~z$h_E)%IxIk>f*M#Qgrazu^DG z1BT<*ID3HlI14-?iy0XB4uUY_j)~cCfr64Ht`Q}{`DrEPiAAXl0g0J;C3=3YAqu8? zhI)oZ!i?@EKt(%JBRtbQJ+&A(fE-o^DMnTXMj*=zh^3)yP_Sw+GK0mLfNVoXCI&$u z9Ru5irC1RQWyiw8(%wuM&GXJZ<~zF6Wjs@E_kYi=@BDt}JLd@a z0fnF(>)Hi+YO7w!ZgW`1dCfI>~e1jr+=ICuntUXEFZrWtnQvO zQ+kShcxu7UiO@$c`BJccaKTcO62oAheHL@0?FLH7!{1K@1b3AfZ>?GC1m*tWae1=8 z(ZDI)=R<)8YxDMRJOv}Y^${@DBLq7qSBzGsB8A|g&RPx+RF$&UqTKKeQ2mX7V5^zk zQh}m}Z6VP4?0{74tR|YJ_-p>kgJm!7tjh?7LM-12Uc5{&MLFhm|S6E@d*JOUpg^3+ym8+ z0!b3!_p9InT8%);{8$%1FcOMU5@KTnG_*AG$+ntgY*?(F!E8>0DKiz;rnXlBO(u{+ z|5}uwAMwU$C`u5`whrXym!U8(197446qnaQ6r=D000960V|$zS00006Nkl Vp{dLT^V9$U002ovPDHLkV1hPT-Bgv-|F>s$ZHQpbTAu&&{j+Cm z#{v`$5}Gc#Fn&H@)0TgKpW%%gHxBSBo@(Gc{q3*)&N`vP|CY+~^j#DU2;@-6IMB1T z{U7(|!nC8$Ow$}&19%wOm6Vm0r*v~Y%d`15zjvnKx{q&{zrW12Xik90V-toYH-o4C zRGV^o!^>a(Uwaa)d0HcQ9j@>B`z`)!O1<`)b4Lsk&hF#>zgDGAXsIMi0Mo)f0F>;L^r`oLF^eq(R4Ff+Tg@L_wmL^eyyz_$AR_YF>H&wgai z@PtXuFN`fay_!u-EUj(2zr2&mzxu=p!Db0RettG*W_Ubp_g%jmM>;_f<>~6@vd$@? F2>?-z0E7Sl diff --git a/common/src/main/resources/assets/jurassicrevived/textures/item/diplodocus_dna.png b/common/src/main/resources/assets/jurassicrevived/textures/item/diplodocus_dna.png index 08b85b74f076d9da14896437adef9ecaabb8f13c..3b99e342f0bb135804ff4218ab83e5b5b11022b3 100644 GIT binary patch delta 405 zcmV;G0c!q?1+D{-BYy#7Nkl2*bf@UbGRB)-cse?a2kSIhjgI2Am zgSsh*2DC1si;FIWF6vNS9Cfkc1;Ih6AR_3bphG8bYo!)31rd*V4AFs`EHk^Lq+n$`#eXjM*64IAM#|`do#ppM z1sl6(ELa=RCg$TBpEfRq5?8_I!3C@FOBOh&Ez$B+*n=1z>vR+Vjx>vDrQs`zWL|TL z*^v&9McHnC2~60W*}uz&CI{LbVa)sxBvaQ6E8_(Mc)YLG6~>Gu0IbxrG#(=5z?kC# z)V9MrH*cX*D}Mt<1pF#{ZNSC8d2Xzmt!lkI;hr|e8^DCbj~`t(%!Gnf6%|2;c|lM4lzLw{@>qU-+XhveGSWHdHcGw2hX3UGBAjIo}A}))^Zjo OJUw0gT-G@yGywouP{{uP diff --git a/common/src/main/resources/assets/jurassicrevived/textures/item/distortus_rex_dna.png b/common/src/main/resources/assets/jurassicrevived/textures/item/distortus_rex_dna.png index 69f7166b9fd04a81ee065b93b29d2cca7a6a04ac..3da47e78446da427ed49f0d7999fb55c91b5ccc2 100644 GIT binary patch delta 419 zcmV;U0bKsq1-t{0BYy#LNkl?E6=XeMS^9488A_Tz^S~YM~=eAOJH+1#eXgjw{R8@!7&>|TMl*( z&RJit?Ds8){iU~R5w0FNc67nItd=tIKK&eBoN@lC=jxH&1JZ5jzIXj*o1Yl2S<5ve zCvVYh15 z@$i^|z?(o#9DhWCVs6UG1TzIOM%64Zq7PfsG~_h~6JdDDD9AGnl#5R4>?>lq5TYX%nZj56bQCHn!3RYZ?0>%a5GmKr8p z!s|<#1-#RU#1aUvEy2w5kR(xWjo=#q0RR6?e|}j202}}YNkl$zNUTm1 zSaGW3$Ny)C!`aHr(%8h(+!nOfOWv#hcj&;mQ%y7Z)ZW&v<6H7zmSY3widXmd*Yni> z`)Zr0wherp?%qpnQ1VNj;w6 z?X{@_PaYqU>wTeMe(tmViEsMx^#%o>3k*0oxtVj*nX5Zj?73i-$#{7Cdwa=c=i*N) qXek{!aPZu@1E&w4JaF*fK?VlfKbLh*2~7Zp`1>FL diff --git a/common/src/main/resources/assets/jurassicrevived/textures/item/titanosaurus_dna.png b/common/src/main/resources/assets/jurassicrevived/textures/item/titanosaurus_dna.png index 8fd48e4a93e27d573772b9fa8f5b8b54b8191dc1..242ca8bf30e9236906f16f18b1c5f573c7c39a98 100644 GIT binary patch delta 397 zcmV;80doGv1*QX#BYy!~Nkl3__&(T7Y3<}zVmgol?iV!Igo1#RJ z$|0hqp`?~@s5ytAs6m(7l7^(;*}x$P8l-5bsa0?YvWr3Rb?%L>+KtOqUpT`#e9w2@ z?}wvFaWpB}YT#D#nu5Wgb{a~cY9thcqA2isy;N6%y>yoD&VTlCbDY3LG>*C)q%t|0 z@(mz)l-A#>lSpRp;l(YD5BKW#tK0+D=KVE{WCn+a-1`0GzKG?p&k!$Jfiw9xEKQI7 z8*A8u(`=psJ$6g*PN0u?qi}auC%r1RiUZYlHT<{c*g}LP5L((hz?h8pk^&~nKVwu! zW!A7*G(}aJ#kNC;dJ|XCvU8 zSEdj@IM>$G01K@w&e4}BfH5X=i6bH&pPo@FeV8xOuSPwCBqTstbKvpxqfjWq r00030|1M=wlmGw#21!IgR09CMHF{+BU_pTZ0000