Fixed a crash found in #25 relating to spawn configuration registration

Actually defined hitbox sizes
Made size adjustments to several creatures
Added the Achillobator, Chilesaurus, Mussaurus, Suchomimus, Thescelosaurus and it's items
Improved swimming behavior for terrestrial and avian creatures
Made Dilophosaurus animation fixes relating to its frill
Added natural breeding as life finds a way
Added a short amount of health regeneration after full hunger so dinos don't die from hunting too much
Fixed avian AI to not select the Idle state while flying, and generally improved their behavior
Increased the chance and timespan of which dinos select a new place to move
Increased the minimum speed for dinos to move when roaming to stop animations not playing
Set a minimum speed when a dino is on Ice so it actaully moves
Add random setting to spawn egg item Fix entities not middle-mouse-clickable
Drastically reduced spawn rate of many creatures
Fixes hand feeding, and thereby being able to put entities in the breeding state
Replaces machine models
Changed AI to ignore creepers
Adds tags for each entity in the forge namespace to have compatibility with other mods that add the same entity, as long as they support this too
Fixes machine input and export logic with pipes and hoppers
Fixes inworld water input via bucket with fossil cleaner
Fixes pipe logic to actually select a new fill point Fixes herbivores not being able to self feed
This commit is contained in:
2026-06-05 23:08:50 -04:00
parent e6a57740b2
commit 4d2921a925
279 changed files with 28229 additions and 3415 deletions
@@ -58,6 +58,15 @@ public final class JRClothConfigScreens {
.build()
);
general.addEntry(
eb.startBooleanToggle(Component.literal("Dinosaur Natural Breeding"), cfg.naturalBreeding)
.setDefaultValue(false)
.setTooltip(Component.literal("When enabled, dinosaurs have a chance to breed naturally over time. Disabled by default. Life finds a way..."))
.setSaveConsumer(v -> cfg.naturalBreeding = v)
.requireRestart()
.build()
);
general.addEntry(
eb.startIntField(Component.literal("FE Per Second"), cfg.fePerSecond)
.setDefaultValue(1000)
@@ -32,6 +32,7 @@ public class DataGenerators {
BlockTagsProvider blockTagsProvider = new NeoForgeBlockTagProvider(packOutput, lookupProvider, existingFileHelper);
generator.addProvider(event.includeServer(), blockTagsProvider);
generator.addProvider(event.includeServer(), new NeoForgeItemTagProvider(packOutput, lookupProvider, blockTagsProvider.contentsGetter(), existingFileHelper));
generator.addProvider(event.includeServer(), new NeoForgeEntityTagProvider(packOutput, lookupProvider, existingFileHelper));
generator.addProvider(event.includeServer(), new LootTableProvider(packOutput, Collections.emptySet(),
List.of(
@@ -0,0 +1,29 @@
package net.cmr.jurassicrevived.datagen;
import net.cmr.jurassicrevived.Constants;
import net.minecraft.core.HolderLookup;
import net.minecraft.data.PackOutput;
import net.minecraft.data.tags.EntityTypeTagsProvider;
import net.minecraft.tags.TagKey;
import net.minecraft.world.entity.EntityType;
import net.neoforged.neoforge.common.data.ExistingFileHelper;
import org.jetbrains.annotations.Nullable;
import java.util.concurrent.CompletableFuture;
public class NeoForgeEntityTagProvider extends EntityTypeTagsProvider implements ModEntityTagProvider.EntityTagHelper {
public NeoForgeEntityTagProvider(PackOutput output, CompletableFuture<HolderLookup.Provider> lookupProvider, @Nullable ExistingFileHelper existingFileHelper) {
super(output, lookupProvider, Constants.MOD_ID, existingFileHelper);
}
@Override
protected void addTags(HolderLookup.Provider provider) {
ModEntityTagProvider.registerEntityTags(this);
}
@Override
public void tag(TagKey<EntityType<?>> tag, EntityType<?>... entityTypes) {
tag(tag).add(entityTypes);
}
}
@@ -5,6 +5,7 @@ import net.cmr.jurassicrevived.block.entity.ModBlockEntities;
import net.cmr.jurassicrevived.block.entity.custom.*;
import net.cmr.jurassicrevived.config.JRConfigManager;
import net.cmr.jurassicrevived.neoforge.capabilities.NeoForgeEnergyStorage;
import net.cmr.jurassicrevived.platform.transfer.InternalFluidHandler;
import net.neoforged.bus.api.SubscribeEvent;
import net.neoforged.fml.common.EventBusSubscriber;
import net.neoforged.neoforge.capabilities.Capabilities;
@@ -17,18 +18,33 @@ public class NeoForgeEvents
{
@SubscribeEvent
public static void registerCapabilities(RegisterCapabilitiesEvent event) {
/* Items
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.GENERATOR_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_EXTRACTOR_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_ANALYZER_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_HYBRIDIZER_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.FOSSIL_CLEANER_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.FOSSIL_GRINDER_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.EMBRYONIC_MACHINE_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.EMBRYO_CALCIFICATION_MACHINE_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.CRATE_BE.get(), (be, side) -> be.getItemHandler(side));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.INCUBATOR_BE.get(), (be, side) -> be.getItemHandler(side));
*/
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.GENERATOR_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((GeneratorBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_EXTRACTOR_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((DNAExtractorBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_ANALYZER_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((DNAAnalyzerBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.DNA_HYBRIDIZER_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((DNAHybridizerBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.FOSSIL_CLEANER_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((FossilCleanerBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.FOSSIL_GRINDER_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((FossilGrinderBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.EMBRYONIC_MACHINE_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((EmbryonicMachineBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.EMBRYO_CALCIFICATION_MACHINE_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((EmbryoCalcificationMachineBlockEntity) be).itemHandler));
event.registerBlockEntity(Capabilities.ItemHandler.BLOCK, ModBlockEntities.INCUBATOR_BE.get(),
(be, side) -> new net.neoforged.neoforge.items.wrapper.InvWrapper(((IncubatorBlockEntity) be).itemHandler));
// Energy
event.registerBlockEntity(Capabilities.EnergyStorage.BLOCK, ModBlockEntities.POWER_CELL_BE.get(),
@@ -63,10 +79,13 @@ public class NeoForgeEvents
// Fluids
event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, ModBlockEntities.TANK_BE.get(),
(be, side) -> new TankFluidAdapter(((TankBlockEntity) be).getTank(side)));
(be, side) -> new TankFluidAdapter(((TankBlockEntity) be).getFluidHandler(side)));
event.registerBlockEntity(Capabilities.FluidHandler.BLOCK, ModBlockEntities.FOSSIL_CLEANER_BE.get(),
(be, side) -> new TankFluidAdapter(((FossilCleanerBlockEntity) be).getFluidHandler(side)));
}
private record TankFluidAdapter(TankBlockEntity.TankFluidHandler tank) implements IFluidHandler {
private record TankFluidAdapter(InternalFluidHandler tank) implements IFluidHandler {
@Override
public int getTanks() {